diff --git a/app/build.gradle b/app/build.gradle index 81dccf6..defbef7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,12 +2,11 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' android { signingConfigs { release { - storeFile file('/Users/a203/Desktop/AndroidProjects/CasicSmartTube/app/CasicSmartTube.jks') + storeFile file('CasicSmartTube.jks') storePassword '123456789' keyAlias 'key0' keyPassword '123456789' @@ -21,8 +20,6 @@ targetSdkVersion 33 versionCode 2 versionName "1.0.1" - - ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -47,6 +44,10 @@ } } + viewBinding { + enabled true + } + applicationVariants.configureEach { variant -> variant.outputs.configureEach { outputFileName = "GT_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" @@ -61,7 +62,7 @@ dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.5' implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.6.1' diff --git a/app/build.gradle b/app/build.gradle index 81dccf6..defbef7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,12 +2,11 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' android { signingConfigs { release { - storeFile file('/Users/a203/Desktop/AndroidProjects/CasicSmartTube/app/CasicSmartTube.jks') + storeFile file('CasicSmartTube.jks') storePassword '123456789' keyAlias 'key0' keyPassword '123456789' @@ -21,8 +20,6 @@ targetSdkVersion 33 versionCode 2 versionName "1.0.1" - - ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -47,6 +44,10 @@ } } + viewBinding { + enabled true + } + applicationVariants.configureEach { variant -> variant.outputs.configureEach { outputFileName = "GT_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" @@ -61,7 +62,7 @@ dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.5' implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.6.1' diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/build.gradle b/app/build.gradle index 81dccf6..defbef7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,12 +2,11 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' android { signingConfigs { release { - storeFile file('/Users/a203/Desktop/AndroidProjects/CasicSmartTube/app/CasicSmartTube.jks') + storeFile file('CasicSmartTube.jks') storePassword '123456789' keyAlias 'key0' keyPassword '123456789' @@ -21,8 +20,6 @@ targetSdkVersion 33 versionCode 2 versionName "1.0.1" - - ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -47,6 +44,10 @@ } } + viewBinding { + enabled true + } + applicationVariants.configureEach { variant -> variant.outputs.configureEach { outputFileName = "GT_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" @@ -61,7 +62,7 @@ dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.5' implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.6.1' diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cccda6d..fd9277c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,7 +81,7 @@ + android:value="a6907c8bb931727374aa5fd500cda107" /> variant.outputs.configureEach { outputFileName = "GT_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" @@ -61,7 +62,7 @@ dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.5' implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.6.1' diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cccda6d..fd9277c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,7 +81,7 @@ + android:value="a6907c8bb931727374aa5fd500cda107" /> variant.outputs.configureEach { outputFileName = "GT_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" @@ -61,7 +62,7 @@ dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.5' implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.6.1' diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cccda6d..fd9277c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,7 +81,7 @@ + android:value="a6907c8bb931727374aa5fd500cda107" /> (), Handler.Callback, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { private val kTag = "HomePageFragment" private val geocoderSearch by lazy { GeocodeSearch(requireContext()) } - private lateinit var homeView: View private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var easyPopupWindow: EasyPopupWindow private lateinit var aMap: AMap private lateinit var deviceViewModel: DeviceViewModel private lateinit var groupViewModel: ProjectGroupViewModel @@ -83,34 +89,34 @@ * */ private var mapZooms = ArrayList() - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View { - homeView = inflater.inflate(R.layout.fragment_home, container, false) + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } - weakReferenceHandler = WeakReferenceHandler(callback) - val easyPopupWindow = EasyPopupWindow(requireContext()) - easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) - homeView.rightOptionView.setOnClickListener { - easyPopupWindow.setOnPopupWindowClickListener(object : - EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - easyPopupWindow.setBackgroundDrawable(null) - val x: Int = homeView.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(homeView.rightOptionView, x, 0) + override fun setupTopBarLayout() { + + } + + override fun observeRequestState() { + groupViewModel.loadState.observe(this) { state -> + when (state) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") + else -> LoadingDialogHub.dismiss() + } } + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + weakReferenceHandler = WeakReferenceHandler(this) + + easyPopupWindow = EasyPopupWindow(requireContext()) + easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) //初始化vm - deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) - groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) - - observeRequestState() + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java] //默认数据 groupViewModel.obtainProGroupList() @@ -119,12 +125,8 @@ mapZooms.add(13f) initMap(savedInstanceState) - homeView.addDeviceButton.setOnClickListener { - requireContext().navigatePageTo() - } - //数据监听 - deviceViewModel.mapDeviceModel.observe(this, { + deviceViewModel.mapDeviceModel.observe(this) { if (it.code == 200) { if (allMarkerOptions.isNotEmpty()) { allMarkerOptions.clear() @@ -149,10 +151,8 @@ longitudeList.add(longitude) //将所有设备信息转化缓存为Marker点 allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(device.devcode) - .snippet(device.modelName) + MarkerOptions().position(LatLng(latitude, longitude)) + .title(device.devcode).snippet(device.modelName) ) } } @@ -160,8 +160,8 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 13f) } - }) - groupViewModel.groupModel.observe(this, { + } + groupViewModel.groupModel.observe(this) { if (it.code == 200) { val dataRows = it.data when { @@ -170,14 +170,15 @@ dataBeans = dataRows!! isRefresh = false } + else -> { dataBeans = dataRows!! } } weakReferenceHandler.sendEmptyMessage(2022090201) } - }) - groupViewModel.groupDeviceModel.observe(this, { + } + groupViewModel.groupDeviceModel.observe(this) { if (it.code == 200) { val latitudeList: MutableList = ArrayList() val longitudeList: MutableList = ArrayList() @@ -199,22 +200,33 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 16f) } - }) - return homeView + } } - private fun observeRequestState() { - groupViewModel.loadState.observe(this, { state -> - when (state) { - LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") - else -> LoadingDialogHub.dismiss() - } - }) + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + easyPopupWindow.setOnPopupWindowClickListener(object : + EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + easyPopupWindow.setBackgroundDrawable(null) + val x: Int = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + binding.addDeviceButton.setOnClickListener { + requireContext().navigatePageTo() + } } override fun onResume() { super.onResume() - homeView.mapView.onResume() + binding.mapView.onResume() //获取所有设备数据 deviceViewModel.obtainMapDeviceList() @@ -222,16 +234,16 @@ groupViewModel.obtainProGroupList() } - private val callback = Handler.Callback { - if (it.what == 2022090201) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022090201) { if (isRefresh) { groupListAdapter.notifyDataSetChanged() } else { groupListAdapter = GroupListAdapter(requireContext(), dataBeans) - homeView.homeRecyclerView!!.addItemDecoration( + binding.homeRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - homeView.homeRecyclerView!!.adapter = groupListAdapter + binding.homeRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : GroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { @@ -241,12 +253,12 @@ }) } } - true + return true } private fun initMap(savedInstanceState: Bundle?) { - homeView.mapView.onCreate(savedInstanceState) - aMap = homeView.mapView.map + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val uiSettings = aMap.uiSettings uiSettings.isCompassEnabled = true @@ -322,10 +334,7 @@ if (!isInRange) { clustersMarkers.add( GaoDeClusterMarkerView( - requireContext(), - it, - proj, - LocaleConstant.RADIUS_SIZE + requireContext(), it, proj, LocaleConstant.RADIUS_SIZE ) )//相距多少才聚合 } @@ -363,9 +372,7 @@ //绑定数据 val clickedLatLng = marker?.position!! for (device in deviceModels) { - if (clickedLatLng.latitude == device.latGaode!!.toDouble() - && clickedLatLng.longitude == device.lngGaode!!.toDouble() - ) { + if (clickedLatLng.latitude == device.latGaode!!.toDouble() && clickedLatLng.longitude == device.lngGaode!!.toDouble()) { deviceCodeView.text = String.format("设备编号: ${device.devcode}") deviceModelView.text = String.format("设备模型: ${device.modelName}") //获取设备最新浓度信息 @@ -395,8 +402,7 @@ val address = result?.regeocodeAddress?.formatAddress val temp = StringBuilder() if (address!!.length > 16) { - temp.append(address.substring(0, 14)) - .append("\r\n") + temp.append(address.substring(0, 14)).append("\r\n") .append(address.substring(16)) } else { temp.append(address) @@ -430,9 +436,7 @@ } } //查看聚合点,单独开页面导航过去 - BottomActionSheet.Builder() - .setContext(requireContext()) - .setActionItemTitle(multiDevice) + BottomActionSheet.Builder().setContext(requireContext()).setActionItemTitle(multiDevice) .setItemTextColor(Color.BLUE) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { @@ -455,12 +459,8 @@ override fun onInfoWindowClick(p0: Marker?) { if (p0 != null) { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -487,16 +487,16 @@ 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 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 81dccf6..defbef7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,12 +2,11 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' android { signingConfigs { release { - storeFile file('/Users/a203/Desktop/AndroidProjects/CasicSmartTube/app/CasicSmartTube.jks') + storeFile file('CasicSmartTube.jks') storePassword '123456789' keyAlias 'key0' keyPassword '123456789' @@ -21,8 +20,6 @@ targetSdkVersion 33 versionCode 2 versionName "1.0.1" - - ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -47,6 +44,10 @@ } } + viewBinding { + enabled true + } + applicationVariants.configureEach { variant -> variant.outputs.configureEach { outputFileName = "GT_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" @@ -61,7 +62,7 @@ dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.5' implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.6.1' diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cccda6d..fd9277c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,7 +81,7 @@ + android:value="a6907c8bb931727374aa5fd500cda107" /> (), Handler.Callback, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { private val kTag = "HomePageFragment" private val geocoderSearch by lazy { GeocodeSearch(requireContext()) } - private lateinit var homeView: View private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var easyPopupWindow: EasyPopupWindow private lateinit var aMap: AMap private lateinit var deviceViewModel: DeviceViewModel private lateinit var groupViewModel: ProjectGroupViewModel @@ -83,34 +89,34 @@ * */ private var mapZooms = ArrayList() - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View { - homeView = inflater.inflate(R.layout.fragment_home, container, false) + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } - weakReferenceHandler = WeakReferenceHandler(callback) - val easyPopupWindow = EasyPopupWindow(requireContext()) - easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) - homeView.rightOptionView.setOnClickListener { - easyPopupWindow.setOnPopupWindowClickListener(object : - EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - easyPopupWindow.setBackgroundDrawable(null) - val x: Int = homeView.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(homeView.rightOptionView, x, 0) + override fun setupTopBarLayout() { + + } + + override fun observeRequestState() { + groupViewModel.loadState.observe(this) { state -> + when (state) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") + else -> LoadingDialogHub.dismiss() + } } + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + weakReferenceHandler = WeakReferenceHandler(this) + + easyPopupWindow = EasyPopupWindow(requireContext()) + easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) //初始化vm - deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) - groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) - - observeRequestState() + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java] //默认数据 groupViewModel.obtainProGroupList() @@ -119,12 +125,8 @@ mapZooms.add(13f) initMap(savedInstanceState) - homeView.addDeviceButton.setOnClickListener { - requireContext().navigatePageTo() - } - //数据监听 - deviceViewModel.mapDeviceModel.observe(this, { + deviceViewModel.mapDeviceModel.observe(this) { if (it.code == 200) { if (allMarkerOptions.isNotEmpty()) { allMarkerOptions.clear() @@ -149,10 +151,8 @@ longitudeList.add(longitude) //将所有设备信息转化缓存为Marker点 allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(device.devcode) - .snippet(device.modelName) + MarkerOptions().position(LatLng(latitude, longitude)) + .title(device.devcode).snippet(device.modelName) ) } } @@ -160,8 +160,8 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 13f) } - }) - groupViewModel.groupModel.observe(this, { + } + groupViewModel.groupModel.observe(this) { if (it.code == 200) { val dataRows = it.data when { @@ -170,14 +170,15 @@ dataBeans = dataRows!! isRefresh = false } + else -> { dataBeans = dataRows!! } } weakReferenceHandler.sendEmptyMessage(2022090201) } - }) - groupViewModel.groupDeviceModel.observe(this, { + } + groupViewModel.groupDeviceModel.observe(this) { if (it.code == 200) { val latitudeList: MutableList = ArrayList() val longitudeList: MutableList = ArrayList() @@ -199,22 +200,33 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 16f) } - }) - return homeView + } } - private fun observeRequestState() { - groupViewModel.loadState.observe(this, { state -> - when (state) { - LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") - else -> LoadingDialogHub.dismiss() - } - }) + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + easyPopupWindow.setOnPopupWindowClickListener(object : + EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + easyPopupWindow.setBackgroundDrawable(null) + val x: Int = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + binding.addDeviceButton.setOnClickListener { + requireContext().navigatePageTo() + } } override fun onResume() { super.onResume() - homeView.mapView.onResume() + binding.mapView.onResume() //获取所有设备数据 deviceViewModel.obtainMapDeviceList() @@ -222,16 +234,16 @@ groupViewModel.obtainProGroupList() } - private val callback = Handler.Callback { - if (it.what == 2022090201) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022090201) { if (isRefresh) { groupListAdapter.notifyDataSetChanged() } else { groupListAdapter = GroupListAdapter(requireContext(), dataBeans) - homeView.homeRecyclerView!!.addItemDecoration( + binding.homeRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - homeView.homeRecyclerView!!.adapter = groupListAdapter + binding.homeRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : GroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { @@ -241,12 +253,12 @@ }) } } - true + return true } private fun initMap(savedInstanceState: Bundle?) { - homeView.mapView.onCreate(savedInstanceState) - aMap = homeView.mapView.map + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val uiSettings = aMap.uiSettings uiSettings.isCompassEnabled = true @@ -322,10 +334,7 @@ if (!isInRange) { clustersMarkers.add( GaoDeClusterMarkerView( - requireContext(), - it, - proj, - LocaleConstant.RADIUS_SIZE + requireContext(), it, proj, LocaleConstant.RADIUS_SIZE ) )//相距多少才聚合 } @@ -363,9 +372,7 @@ //绑定数据 val clickedLatLng = marker?.position!! for (device in deviceModels) { - if (clickedLatLng.latitude == device.latGaode!!.toDouble() - && clickedLatLng.longitude == device.lngGaode!!.toDouble() - ) { + if (clickedLatLng.latitude == device.latGaode!!.toDouble() && clickedLatLng.longitude == device.lngGaode!!.toDouble()) { deviceCodeView.text = String.format("设备编号: ${device.devcode}") deviceModelView.text = String.format("设备模型: ${device.modelName}") //获取设备最新浓度信息 @@ -395,8 +402,7 @@ val address = result?.regeocodeAddress?.formatAddress val temp = StringBuilder() if (address!!.length > 16) { - temp.append(address.substring(0, 14)) - .append("\r\n") + temp.append(address.substring(0, 14)).append("\r\n") .append(address.substring(16)) } else { temp.append(address) @@ -430,9 +436,7 @@ } } //查看聚合点,单独开页面导航过去 - BottomActionSheet.Builder() - .setContext(requireContext()) - .setActionItemTitle(multiDevice) + BottomActionSheet.Builder().setContext(requireContext()).setActionItemTitle(multiDevice) .setItemTextColor(Color.BLUE) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { @@ -455,12 +459,8 @@ override fun onInfoWindowClick(p0: Marker?) { if (p0 != null) { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -487,16 +487,16 @@ 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 onDestroy() { super.onDestroy() - homeView.mapView.onDestroy() + binding.mapView.onDestroy() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt index a4e964c..cc35197 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt @@ -4,11 +4,15 @@ import android.content.Intent import android.net.Uri import android.os.Build +import android.os.Bundle import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider import com.casic.smarttube.BuildConfig import com.casic.smarttube.R +import com.casic.smarttube.databinding.FragmentMineBinding import com.casic.smarttube.extensions.appendDownloadUrl import com.casic.smarttube.model.UserDetailModel import com.casic.smarttube.utils.AuthenticationHelper @@ -36,22 +40,10 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.ChangePasswordDialog -import kotlinx.android.synthetic.main.fragment_mine.aboutUsLayout -import kotlinx.android.synthetic.main.fragment_mine.cacheSizeView -import kotlinx.android.synthetic.main.fragment_mine.changePwdLayout -import kotlinx.android.synthetic.main.fragment_mine.clearCacheLayout -import kotlinx.android.synthetic.main.fragment_mine.loginOutButton -import kotlinx.android.synthetic.main.fragment_mine.updateLogLayout -import kotlinx.android.synthetic.main.fragment_mine.updateUserButton -import kotlinx.android.synthetic.main.fragment_mine.updateVersionLayout -import kotlinx.android.synthetic.main.fragment_mine.userDeptView -import kotlinx.android.synthetic.main.fragment_mine.userImageView -import kotlinx.android.synthetic.main.fragment_mine.userNameView -import kotlinx.android.synthetic.main.fragment_mine.userPhoneView import java.io.File import java.nio.charset.StandardCharsets -class MinePageFragment : KotlinBaseFragment() { +class MinePageFragment : KotlinBaseFragment() { private val kTag = "MinePageFragment" private lateinit var userData: UserDetailModel.Data @@ -60,13 +52,17 @@ private lateinit var versionViewModel: VersionViewModel private lateinit var progressDialog: ProgressDialog - override fun initLayoutView(): Int = R.layout.fragment_mine + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentMineBinding { + return FragmentMineBinding.inflate(inflater, container, false) + } override fun setupTopBarLayout() { } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java] @@ -98,8 +94,7 @@ versionViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show( - requireActivity(), - "检查版本中,请稍后" + requireActivity(), "检查版本中,请稍后" ) else -> LoadingDialogHub.dismiss() @@ -108,49 +103,45 @@ } override fun initEvent() { - userImageView.setOnClickListener { + binding.userImageView.setOnClickListener { "尽情期待~".show(requireContext()) } - updateUserButton.setOnClickListener { + binding.updateUserButton.setOnClickListener { LoadingDialogHub.show(requireActivity(), "同步中,请稍后...") userViewModel.obtainUserDetail() } - changePwdLayout.setOnClickListener { - ChangePasswordDialog.Builder() - .setContext(requireContext()) + binding.changePwdLayout.setOnClickListener { + ChangePasswordDialog.Builder().setContext(requireContext()) .setOnDialogButtonClickListener(object : ChangePasswordDialog.OnDialogButtonClickListener { override fun onConfirmClick(oldPwd: String, newPwd: String) { - val publicKey = - RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! val oldPassKey = RSAUtils.encryptDataByPublicKey( - oldPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + oldPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) val newPassKey = RSAUtils.encryptDataByPublicKey( - newPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + newPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) userViewModel.changePassword(oldPassKey, newPassKey) } }).build().show() } - aboutUsLayout.setOnClickListener { + binding.aboutUsLayout.setOnClickListener { requireContext().navigatePageTo() } - updateVersionLayout.setOnClickListener { + binding.updateVersionLayout.setOnClickListener { versionViewModel.updateVersion() } - updateLogLayout.setOnClickListener { + binding.updateLogLayout.setOnClickListener { "尽情期待~".show(requireContext()) } - clearCacheLayout.setOnClickListener { + binding.clearCacheLayout.setOnClickListener { //删除缓存之后在设置缓存大小 LoadingDialogHub.show(requireActivity(), "清理中,请稍后") File(requireContext().cacheDir.path).deleteFile() @@ -161,18 +152,14 @@ override fun onFinish() { LoadingDialogHub.dismiss() - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() } }.start() } - loginOutButton.setOnClickListener { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("退出登录") - .setMessage("确定要退出吗?") - .setNegativeButton("取消") - .setPositiveButton("确定") + binding.loginOutButton.setOnClickListener { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("退出登录") + .setMessage("确定要退出吗?").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -203,13 +190,9 @@ if (BuildConfig.VERSION_NAME == it.version) { "已是最新版本,无需更新".show(requireContext()) } else { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("提示") - .setMessage("有新版本,是否更新?") - .setNegativeButton("稍后再说") - .setPositiveButton("立即下载") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(requireContext()).setTitle("提示") + .setMessage("有新版本,是否更新?").setNegativeButton("稍后再说") + .setPositiveButton("立即下载").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { downloadApk(it.downloadUrl) @@ -244,7 +227,7 @@ updateUserInfo() } //缓存 - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() super.onResume() } @@ -258,9 +241,9 @@ // R.color.mainThemeColor.convertColor(requireContext()) // ) // userImageView.setImageDrawable(roundDrawable) - userNameView.text = userData.name - userPhoneView.text = String.format("电话:${userData.phone}") - userDeptView.text = String.format("部门:${userData.deptName}") + binding.userNameView.text = userData.name + binding.userPhoneView.text = String.format("电话:${userData.phone}") + binding.userDeptView.text = String.format("部门:${userData.deptName}") } private fun downloadApk(url: String?) { @@ -275,7 +258,8 @@ * */ val downloadPath = url!!.appendDownloadUrl() //开始下载 - downloadPath.downloadFile(requireContext().createDownloadFileDir().toString(), + downloadPath.downloadFile( + requireContext().createDownloadFileDir().toString(), object : OnDownloadListener { override fun onDownloadStart(totalBytes: Long) { progressDialog.max = totalBytes.toInt() diff --git a/app/build.gradle b/app/build.gradle index 81dccf6..defbef7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,12 +2,11 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' android { signingConfigs { release { - storeFile file('/Users/a203/Desktop/AndroidProjects/CasicSmartTube/app/CasicSmartTube.jks') + storeFile file('CasicSmartTube.jks') storePassword '123456789' keyAlias 'key0' keyPassword '123456789' @@ -21,8 +20,6 @@ targetSdkVersion 33 versionCode 2 versionName "1.0.1" - - ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -47,6 +44,10 @@ } } + viewBinding { + enabled true + } + applicationVariants.configureEach { variant -> variant.outputs.configureEach { outputFileName = "GT_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" @@ -61,7 +62,7 @@ dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.5' implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.6.1' diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cccda6d..fd9277c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,7 +81,7 @@ + android:value="a6907c8bb931727374aa5fd500cda107" /> (), Handler.Callback, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { private val kTag = "HomePageFragment" private val geocoderSearch by lazy { GeocodeSearch(requireContext()) } - private lateinit var homeView: View private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var easyPopupWindow: EasyPopupWindow private lateinit var aMap: AMap private lateinit var deviceViewModel: DeviceViewModel private lateinit var groupViewModel: ProjectGroupViewModel @@ -83,34 +89,34 @@ * */ private var mapZooms = ArrayList() - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View { - homeView = inflater.inflate(R.layout.fragment_home, container, false) + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } - weakReferenceHandler = WeakReferenceHandler(callback) - val easyPopupWindow = EasyPopupWindow(requireContext()) - easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) - homeView.rightOptionView.setOnClickListener { - easyPopupWindow.setOnPopupWindowClickListener(object : - EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - easyPopupWindow.setBackgroundDrawable(null) - val x: Int = homeView.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(homeView.rightOptionView, x, 0) + override fun setupTopBarLayout() { + + } + + override fun observeRequestState() { + groupViewModel.loadState.observe(this) { state -> + when (state) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") + else -> LoadingDialogHub.dismiss() + } } + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + weakReferenceHandler = WeakReferenceHandler(this) + + easyPopupWindow = EasyPopupWindow(requireContext()) + easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) //初始化vm - deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) - groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) - - observeRequestState() + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java] //默认数据 groupViewModel.obtainProGroupList() @@ -119,12 +125,8 @@ mapZooms.add(13f) initMap(savedInstanceState) - homeView.addDeviceButton.setOnClickListener { - requireContext().navigatePageTo() - } - //数据监听 - deviceViewModel.mapDeviceModel.observe(this, { + deviceViewModel.mapDeviceModel.observe(this) { if (it.code == 200) { if (allMarkerOptions.isNotEmpty()) { allMarkerOptions.clear() @@ -149,10 +151,8 @@ longitudeList.add(longitude) //将所有设备信息转化缓存为Marker点 allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(device.devcode) - .snippet(device.modelName) + MarkerOptions().position(LatLng(latitude, longitude)) + .title(device.devcode).snippet(device.modelName) ) } } @@ -160,8 +160,8 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 13f) } - }) - groupViewModel.groupModel.observe(this, { + } + groupViewModel.groupModel.observe(this) { if (it.code == 200) { val dataRows = it.data when { @@ -170,14 +170,15 @@ dataBeans = dataRows!! isRefresh = false } + else -> { dataBeans = dataRows!! } } weakReferenceHandler.sendEmptyMessage(2022090201) } - }) - groupViewModel.groupDeviceModel.observe(this, { + } + groupViewModel.groupDeviceModel.observe(this) { if (it.code == 200) { val latitudeList: MutableList = ArrayList() val longitudeList: MutableList = ArrayList() @@ -199,22 +200,33 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 16f) } - }) - return homeView + } } - private fun observeRequestState() { - groupViewModel.loadState.observe(this, { state -> - when (state) { - LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") - else -> LoadingDialogHub.dismiss() - } - }) + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + easyPopupWindow.setOnPopupWindowClickListener(object : + EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + easyPopupWindow.setBackgroundDrawable(null) + val x: Int = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + binding.addDeviceButton.setOnClickListener { + requireContext().navigatePageTo() + } } override fun onResume() { super.onResume() - homeView.mapView.onResume() + binding.mapView.onResume() //获取所有设备数据 deviceViewModel.obtainMapDeviceList() @@ -222,16 +234,16 @@ groupViewModel.obtainProGroupList() } - private val callback = Handler.Callback { - if (it.what == 2022090201) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022090201) { if (isRefresh) { groupListAdapter.notifyDataSetChanged() } else { groupListAdapter = GroupListAdapter(requireContext(), dataBeans) - homeView.homeRecyclerView!!.addItemDecoration( + binding.homeRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - homeView.homeRecyclerView!!.adapter = groupListAdapter + binding.homeRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : GroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { @@ -241,12 +253,12 @@ }) } } - true + return true } private fun initMap(savedInstanceState: Bundle?) { - homeView.mapView.onCreate(savedInstanceState) - aMap = homeView.mapView.map + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val uiSettings = aMap.uiSettings uiSettings.isCompassEnabled = true @@ -322,10 +334,7 @@ if (!isInRange) { clustersMarkers.add( GaoDeClusterMarkerView( - requireContext(), - it, - proj, - LocaleConstant.RADIUS_SIZE + requireContext(), it, proj, LocaleConstant.RADIUS_SIZE ) )//相距多少才聚合 } @@ -363,9 +372,7 @@ //绑定数据 val clickedLatLng = marker?.position!! for (device in deviceModels) { - if (clickedLatLng.latitude == device.latGaode!!.toDouble() - && clickedLatLng.longitude == device.lngGaode!!.toDouble() - ) { + if (clickedLatLng.latitude == device.latGaode!!.toDouble() && clickedLatLng.longitude == device.lngGaode!!.toDouble()) { deviceCodeView.text = String.format("设备编号: ${device.devcode}") deviceModelView.text = String.format("设备模型: ${device.modelName}") //获取设备最新浓度信息 @@ -395,8 +402,7 @@ val address = result?.regeocodeAddress?.formatAddress val temp = StringBuilder() if (address!!.length > 16) { - temp.append(address.substring(0, 14)) - .append("\r\n") + temp.append(address.substring(0, 14)).append("\r\n") .append(address.substring(16)) } else { temp.append(address) @@ -430,9 +436,7 @@ } } //查看聚合点,单独开页面导航过去 - BottomActionSheet.Builder() - .setContext(requireContext()) - .setActionItemTitle(multiDevice) + BottomActionSheet.Builder().setContext(requireContext()).setActionItemTitle(multiDevice) .setItemTextColor(Color.BLUE) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { @@ -455,12 +459,8 @@ override fun onInfoWindowClick(p0: Marker?) { if (p0 != null) { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -487,16 +487,16 @@ 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 onDestroy() { super.onDestroy() - homeView.mapView.onDestroy() + binding.mapView.onDestroy() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt index a4e964c..cc35197 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt @@ -4,11 +4,15 @@ import android.content.Intent import android.net.Uri import android.os.Build +import android.os.Bundle import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider import com.casic.smarttube.BuildConfig import com.casic.smarttube.R +import com.casic.smarttube.databinding.FragmentMineBinding import com.casic.smarttube.extensions.appendDownloadUrl import com.casic.smarttube.model.UserDetailModel import com.casic.smarttube.utils.AuthenticationHelper @@ -36,22 +40,10 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.ChangePasswordDialog -import kotlinx.android.synthetic.main.fragment_mine.aboutUsLayout -import kotlinx.android.synthetic.main.fragment_mine.cacheSizeView -import kotlinx.android.synthetic.main.fragment_mine.changePwdLayout -import kotlinx.android.synthetic.main.fragment_mine.clearCacheLayout -import kotlinx.android.synthetic.main.fragment_mine.loginOutButton -import kotlinx.android.synthetic.main.fragment_mine.updateLogLayout -import kotlinx.android.synthetic.main.fragment_mine.updateUserButton -import kotlinx.android.synthetic.main.fragment_mine.updateVersionLayout -import kotlinx.android.synthetic.main.fragment_mine.userDeptView -import kotlinx.android.synthetic.main.fragment_mine.userImageView -import kotlinx.android.synthetic.main.fragment_mine.userNameView -import kotlinx.android.synthetic.main.fragment_mine.userPhoneView import java.io.File import java.nio.charset.StandardCharsets -class MinePageFragment : KotlinBaseFragment() { +class MinePageFragment : KotlinBaseFragment() { private val kTag = "MinePageFragment" private lateinit var userData: UserDetailModel.Data @@ -60,13 +52,17 @@ private lateinit var versionViewModel: VersionViewModel private lateinit var progressDialog: ProgressDialog - override fun initLayoutView(): Int = R.layout.fragment_mine + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentMineBinding { + return FragmentMineBinding.inflate(inflater, container, false) + } override fun setupTopBarLayout() { } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java] @@ -98,8 +94,7 @@ versionViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show( - requireActivity(), - "检查版本中,请稍后" + requireActivity(), "检查版本中,请稍后" ) else -> LoadingDialogHub.dismiss() @@ -108,49 +103,45 @@ } override fun initEvent() { - userImageView.setOnClickListener { + binding.userImageView.setOnClickListener { "尽情期待~".show(requireContext()) } - updateUserButton.setOnClickListener { + binding.updateUserButton.setOnClickListener { LoadingDialogHub.show(requireActivity(), "同步中,请稍后...") userViewModel.obtainUserDetail() } - changePwdLayout.setOnClickListener { - ChangePasswordDialog.Builder() - .setContext(requireContext()) + binding.changePwdLayout.setOnClickListener { + ChangePasswordDialog.Builder().setContext(requireContext()) .setOnDialogButtonClickListener(object : ChangePasswordDialog.OnDialogButtonClickListener { override fun onConfirmClick(oldPwd: String, newPwd: String) { - val publicKey = - RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! val oldPassKey = RSAUtils.encryptDataByPublicKey( - oldPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + oldPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) val newPassKey = RSAUtils.encryptDataByPublicKey( - newPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + newPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) userViewModel.changePassword(oldPassKey, newPassKey) } }).build().show() } - aboutUsLayout.setOnClickListener { + binding.aboutUsLayout.setOnClickListener { requireContext().navigatePageTo() } - updateVersionLayout.setOnClickListener { + binding.updateVersionLayout.setOnClickListener { versionViewModel.updateVersion() } - updateLogLayout.setOnClickListener { + binding.updateLogLayout.setOnClickListener { "尽情期待~".show(requireContext()) } - clearCacheLayout.setOnClickListener { + binding.clearCacheLayout.setOnClickListener { //删除缓存之后在设置缓存大小 LoadingDialogHub.show(requireActivity(), "清理中,请稍后") File(requireContext().cacheDir.path).deleteFile() @@ -161,18 +152,14 @@ override fun onFinish() { LoadingDialogHub.dismiss() - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() } }.start() } - loginOutButton.setOnClickListener { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("退出登录") - .setMessage("确定要退出吗?") - .setNegativeButton("取消") - .setPositiveButton("确定") + binding.loginOutButton.setOnClickListener { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("退出登录") + .setMessage("确定要退出吗?").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -203,13 +190,9 @@ if (BuildConfig.VERSION_NAME == it.version) { "已是最新版本,无需更新".show(requireContext()) } else { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("提示") - .setMessage("有新版本,是否更新?") - .setNegativeButton("稍后再说") - .setPositiveButton("立即下载") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(requireContext()).setTitle("提示") + .setMessage("有新版本,是否更新?").setNegativeButton("稍后再说") + .setPositiveButton("立即下载").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { downloadApk(it.downloadUrl) @@ -244,7 +227,7 @@ updateUserInfo() } //缓存 - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() super.onResume() } @@ -258,9 +241,9 @@ // R.color.mainThemeColor.convertColor(requireContext()) // ) // userImageView.setImageDrawable(roundDrawable) - userNameView.text = userData.name - userPhoneView.text = String.format("电话:${userData.phone}") - userDeptView.text = String.format("部门:${userData.deptName}") + binding.userNameView.text = userData.name + binding.userPhoneView.text = String.format("电话:${userData.phone}") + binding.userDeptView.text = String.format("部门:${userData.deptName}") } private fun downloadApk(url: String?) { @@ -275,7 +258,8 @@ * */ val downloadPath = url!!.appendDownloadUrl() //开始下载 - downloadPath.downloadFile(requireContext().createDownloadFileDir().toString(), + downloadPath.downloadFile( + requireContext().createDownloadFileDir().toString(), object : OnDownloadListener { override fun onDownloadStart(totalBytes: Long) { progressDialog.max = totalBytes.toInt() diff --git a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt index b009850..c0afcc5 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt @@ -1,8 +1,11 @@ package com.casic.smarttube.fragment +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R import com.casic.smarttube.adapter.OverviewGroupListAdapter +import com.casic.smarttube.databinding.FragmentOverviewBinding import com.casic.smarttube.extensions.showEmptyPage import com.casic.smarttube.model.ProjectGroupModel import com.casic.smarttube.view.GroupDeviceActivity @@ -11,25 +14,25 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.widget.dialog.AlertInputDialog -import kotlinx.android.synthetic.main.fragment_overview.groupRecyclerView -import kotlinx.android.synthetic.main.fragment_overview.rightOptionView -import kotlinx.android.synthetic.main.fragment_overview.titleView -import kotlinx.android.synthetic.main.include_empty_view.emptyView -class OverviewFragment : KotlinBaseFragment() { +class OverviewFragment : KotlinBaseFragment() { private lateinit var groupViewModel: ProjectGroupViewModel private var dataBeans: MutableList = ArrayList() private lateinit var groupListAdapter: OverviewGroupListAdapter private var clickedPosition = 0 - override fun initLayoutView(): Int = R.layout.fragment_overview - - override fun setupTopBarLayout() { - titleView.text = "概览" + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentOverviewBinding { + return FragmentOverviewBinding.inflate(inflater, container, false) } - override fun initData() { + override fun setupTopBarLayout() { + binding.titleView.text = "概览" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) } @@ -43,7 +46,7 @@ } override fun initEvent() { - rightOptionView.setOnClickListener { + binding.rightOptionView.setOnClickListener { groupViewModel.obtainProGroupList() "刷新数据中,请稍后".show(requireContext()) } @@ -51,16 +54,16 @@ groupViewModel.groupModel.observe(this) { if (it.code == 200) { if (it.data.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { groupViewModel.obtainProGroupList() } } else { - emptyView!!.hide() + binding.emptyInclude.emptyView.hide() dataBeans.clear() dataBeans = it.data groupListAdapter = OverviewGroupListAdapter(requireContext(), it.data) - groupRecyclerView!!.adapter = groupListAdapter + binding.groupRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : OverviewGroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { diff --git a/app/build.gradle b/app/build.gradle index 81dccf6..defbef7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,12 +2,11 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' android { signingConfigs { release { - storeFile file('/Users/a203/Desktop/AndroidProjects/CasicSmartTube/app/CasicSmartTube.jks') + storeFile file('CasicSmartTube.jks') storePassword '123456789' keyAlias 'key0' keyPassword '123456789' @@ -21,8 +20,6 @@ targetSdkVersion 33 versionCode 2 versionName "1.0.1" - - ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -47,6 +44,10 @@ } } + viewBinding { + enabled true + } + applicationVariants.configureEach { variant -> variant.outputs.configureEach { outputFileName = "GT_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" @@ -61,7 +62,7 @@ dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.5' implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.6.1' diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cccda6d..fd9277c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,7 +81,7 @@ + android:value="a6907c8bb931727374aa5fd500cda107" /> (), Handler.Callback, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { private val kTag = "HomePageFragment" private val geocoderSearch by lazy { GeocodeSearch(requireContext()) } - private lateinit var homeView: View private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var easyPopupWindow: EasyPopupWindow private lateinit var aMap: AMap private lateinit var deviceViewModel: DeviceViewModel private lateinit var groupViewModel: ProjectGroupViewModel @@ -83,34 +89,34 @@ * */ private var mapZooms = ArrayList() - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View { - homeView = inflater.inflate(R.layout.fragment_home, container, false) + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } - weakReferenceHandler = WeakReferenceHandler(callback) - val easyPopupWindow = EasyPopupWindow(requireContext()) - easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) - homeView.rightOptionView.setOnClickListener { - easyPopupWindow.setOnPopupWindowClickListener(object : - EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - easyPopupWindow.setBackgroundDrawable(null) - val x: Int = homeView.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(homeView.rightOptionView, x, 0) + override fun setupTopBarLayout() { + + } + + override fun observeRequestState() { + groupViewModel.loadState.observe(this) { state -> + when (state) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") + else -> LoadingDialogHub.dismiss() + } } + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + weakReferenceHandler = WeakReferenceHandler(this) + + easyPopupWindow = EasyPopupWindow(requireContext()) + easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) //初始化vm - deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) - groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) - - observeRequestState() + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java] //默认数据 groupViewModel.obtainProGroupList() @@ -119,12 +125,8 @@ mapZooms.add(13f) initMap(savedInstanceState) - homeView.addDeviceButton.setOnClickListener { - requireContext().navigatePageTo() - } - //数据监听 - deviceViewModel.mapDeviceModel.observe(this, { + deviceViewModel.mapDeviceModel.observe(this) { if (it.code == 200) { if (allMarkerOptions.isNotEmpty()) { allMarkerOptions.clear() @@ -149,10 +151,8 @@ longitudeList.add(longitude) //将所有设备信息转化缓存为Marker点 allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(device.devcode) - .snippet(device.modelName) + MarkerOptions().position(LatLng(latitude, longitude)) + .title(device.devcode).snippet(device.modelName) ) } } @@ -160,8 +160,8 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 13f) } - }) - groupViewModel.groupModel.observe(this, { + } + groupViewModel.groupModel.observe(this) { if (it.code == 200) { val dataRows = it.data when { @@ -170,14 +170,15 @@ dataBeans = dataRows!! isRefresh = false } + else -> { dataBeans = dataRows!! } } weakReferenceHandler.sendEmptyMessage(2022090201) } - }) - groupViewModel.groupDeviceModel.observe(this, { + } + groupViewModel.groupDeviceModel.observe(this) { if (it.code == 200) { val latitudeList: MutableList = ArrayList() val longitudeList: MutableList = ArrayList() @@ -199,22 +200,33 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 16f) } - }) - return homeView + } } - private fun observeRequestState() { - groupViewModel.loadState.observe(this, { state -> - when (state) { - LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") - else -> LoadingDialogHub.dismiss() - } - }) + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + easyPopupWindow.setOnPopupWindowClickListener(object : + EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + easyPopupWindow.setBackgroundDrawable(null) + val x: Int = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + binding.addDeviceButton.setOnClickListener { + requireContext().navigatePageTo() + } } override fun onResume() { super.onResume() - homeView.mapView.onResume() + binding.mapView.onResume() //获取所有设备数据 deviceViewModel.obtainMapDeviceList() @@ -222,16 +234,16 @@ groupViewModel.obtainProGroupList() } - private val callback = Handler.Callback { - if (it.what == 2022090201) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022090201) { if (isRefresh) { groupListAdapter.notifyDataSetChanged() } else { groupListAdapter = GroupListAdapter(requireContext(), dataBeans) - homeView.homeRecyclerView!!.addItemDecoration( + binding.homeRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - homeView.homeRecyclerView!!.adapter = groupListAdapter + binding.homeRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : GroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { @@ -241,12 +253,12 @@ }) } } - true + return true } private fun initMap(savedInstanceState: Bundle?) { - homeView.mapView.onCreate(savedInstanceState) - aMap = homeView.mapView.map + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val uiSettings = aMap.uiSettings uiSettings.isCompassEnabled = true @@ -322,10 +334,7 @@ if (!isInRange) { clustersMarkers.add( GaoDeClusterMarkerView( - requireContext(), - it, - proj, - LocaleConstant.RADIUS_SIZE + requireContext(), it, proj, LocaleConstant.RADIUS_SIZE ) )//相距多少才聚合 } @@ -363,9 +372,7 @@ //绑定数据 val clickedLatLng = marker?.position!! for (device in deviceModels) { - if (clickedLatLng.latitude == device.latGaode!!.toDouble() - && clickedLatLng.longitude == device.lngGaode!!.toDouble() - ) { + if (clickedLatLng.latitude == device.latGaode!!.toDouble() && clickedLatLng.longitude == device.lngGaode!!.toDouble()) { deviceCodeView.text = String.format("设备编号: ${device.devcode}") deviceModelView.text = String.format("设备模型: ${device.modelName}") //获取设备最新浓度信息 @@ -395,8 +402,7 @@ val address = result?.regeocodeAddress?.formatAddress val temp = StringBuilder() if (address!!.length > 16) { - temp.append(address.substring(0, 14)) - .append("\r\n") + temp.append(address.substring(0, 14)).append("\r\n") .append(address.substring(16)) } else { temp.append(address) @@ -430,9 +436,7 @@ } } //查看聚合点,单独开页面导航过去 - BottomActionSheet.Builder() - .setContext(requireContext()) - .setActionItemTitle(multiDevice) + BottomActionSheet.Builder().setContext(requireContext()).setActionItemTitle(multiDevice) .setItemTextColor(Color.BLUE) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { @@ -455,12 +459,8 @@ override fun onInfoWindowClick(p0: Marker?) { if (p0 != null) { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -487,16 +487,16 @@ 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 onDestroy() { super.onDestroy() - homeView.mapView.onDestroy() + binding.mapView.onDestroy() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt index a4e964c..cc35197 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt @@ -4,11 +4,15 @@ import android.content.Intent import android.net.Uri import android.os.Build +import android.os.Bundle import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider import com.casic.smarttube.BuildConfig import com.casic.smarttube.R +import com.casic.smarttube.databinding.FragmentMineBinding import com.casic.smarttube.extensions.appendDownloadUrl import com.casic.smarttube.model.UserDetailModel import com.casic.smarttube.utils.AuthenticationHelper @@ -36,22 +40,10 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.ChangePasswordDialog -import kotlinx.android.synthetic.main.fragment_mine.aboutUsLayout -import kotlinx.android.synthetic.main.fragment_mine.cacheSizeView -import kotlinx.android.synthetic.main.fragment_mine.changePwdLayout -import kotlinx.android.synthetic.main.fragment_mine.clearCacheLayout -import kotlinx.android.synthetic.main.fragment_mine.loginOutButton -import kotlinx.android.synthetic.main.fragment_mine.updateLogLayout -import kotlinx.android.synthetic.main.fragment_mine.updateUserButton -import kotlinx.android.synthetic.main.fragment_mine.updateVersionLayout -import kotlinx.android.synthetic.main.fragment_mine.userDeptView -import kotlinx.android.synthetic.main.fragment_mine.userImageView -import kotlinx.android.synthetic.main.fragment_mine.userNameView -import kotlinx.android.synthetic.main.fragment_mine.userPhoneView import java.io.File import java.nio.charset.StandardCharsets -class MinePageFragment : KotlinBaseFragment() { +class MinePageFragment : KotlinBaseFragment() { private val kTag = "MinePageFragment" private lateinit var userData: UserDetailModel.Data @@ -60,13 +52,17 @@ private lateinit var versionViewModel: VersionViewModel private lateinit var progressDialog: ProgressDialog - override fun initLayoutView(): Int = R.layout.fragment_mine + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentMineBinding { + return FragmentMineBinding.inflate(inflater, container, false) + } override fun setupTopBarLayout() { } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java] @@ -98,8 +94,7 @@ versionViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show( - requireActivity(), - "检查版本中,请稍后" + requireActivity(), "检查版本中,请稍后" ) else -> LoadingDialogHub.dismiss() @@ -108,49 +103,45 @@ } override fun initEvent() { - userImageView.setOnClickListener { + binding.userImageView.setOnClickListener { "尽情期待~".show(requireContext()) } - updateUserButton.setOnClickListener { + binding.updateUserButton.setOnClickListener { LoadingDialogHub.show(requireActivity(), "同步中,请稍后...") userViewModel.obtainUserDetail() } - changePwdLayout.setOnClickListener { - ChangePasswordDialog.Builder() - .setContext(requireContext()) + binding.changePwdLayout.setOnClickListener { + ChangePasswordDialog.Builder().setContext(requireContext()) .setOnDialogButtonClickListener(object : ChangePasswordDialog.OnDialogButtonClickListener { override fun onConfirmClick(oldPwd: String, newPwd: String) { - val publicKey = - RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! val oldPassKey = RSAUtils.encryptDataByPublicKey( - oldPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + oldPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) val newPassKey = RSAUtils.encryptDataByPublicKey( - newPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + newPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) userViewModel.changePassword(oldPassKey, newPassKey) } }).build().show() } - aboutUsLayout.setOnClickListener { + binding.aboutUsLayout.setOnClickListener { requireContext().navigatePageTo() } - updateVersionLayout.setOnClickListener { + binding.updateVersionLayout.setOnClickListener { versionViewModel.updateVersion() } - updateLogLayout.setOnClickListener { + binding.updateLogLayout.setOnClickListener { "尽情期待~".show(requireContext()) } - clearCacheLayout.setOnClickListener { + binding.clearCacheLayout.setOnClickListener { //删除缓存之后在设置缓存大小 LoadingDialogHub.show(requireActivity(), "清理中,请稍后") File(requireContext().cacheDir.path).deleteFile() @@ -161,18 +152,14 @@ override fun onFinish() { LoadingDialogHub.dismiss() - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() } }.start() } - loginOutButton.setOnClickListener { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("退出登录") - .setMessage("确定要退出吗?") - .setNegativeButton("取消") - .setPositiveButton("确定") + binding.loginOutButton.setOnClickListener { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("退出登录") + .setMessage("确定要退出吗?").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -203,13 +190,9 @@ if (BuildConfig.VERSION_NAME == it.version) { "已是最新版本,无需更新".show(requireContext()) } else { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("提示") - .setMessage("有新版本,是否更新?") - .setNegativeButton("稍后再说") - .setPositiveButton("立即下载") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(requireContext()).setTitle("提示") + .setMessage("有新版本,是否更新?").setNegativeButton("稍后再说") + .setPositiveButton("立即下载").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { downloadApk(it.downloadUrl) @@ -244,7 +227,7 @@ updateUserInfo() } //缓存 - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() super.onResume() } @@ -258,9 +241,9 @@ // R.color.mainThemeColor.convertColor(requireContext()) // ) // userImageView.setImageDrawable(roundDrawable) - userNameView.text = userData.name - userPhoneView.text = String.format("电话:${userData.phone}") - userDeptView.text = String.format("部门:${userData.deptName}") + binding.userNameView.text = userData.name + binding.userPhoneView.text = String.format("电话:${userData.phone}") + binding.userDeptView.text = String.format("部门:${userData.deptName}") } private fun downloadApk(url: String?) { @@ -275,7 +258,8 @@ * */ val downloadPath = url!!.appendDownloadUrl() //开始下载 - downloadPath.downloadFile(requireContext().createDownloadFileDir().toString(), + downloadPath.downloadFile( + requireContext().createDownloadFileDir().toString(), object : OnDownloadListener { override fun onDownloadStart(totalBytes: Long) { progressDialog.max = totalBytes.toInt() diff --git a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt index b009850..c0afcc5 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt @@ -1,8 +1,11 @@ package com.casic.smarttube.fragment +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R import com.casic.smarttube.adapter.OverviewGroupListAdapter +import com.casic.smarttube.databinding.FragmentOverviewBinding import com.casic.smarttube.extensions.showEmptyPage import com.casic.smarttube.model.ProjectGroupModel import com.casic.smarttube.view.GroupDeviceActivity @@ -11,25 +14,25 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.widget.dialog.AlertInputDialog -import kotlinx.android.synthetic.main.fragment_overview.groupRecyclerView -import kotlinx.android.synthetic.main.fragment_overview.rightOptionView -import kotlinx.android.synthetic.main.fragment_overview.titleView -import kotlinx.android.synthetic.main.include_empty_view.emptyView -class OverviewFragment : KotlinBaseFragment() { +class OverviewFragment : KotlinBaseFragment() { private lateinit var groupViewModel: ProjectGroupViewModel private var dataBeans: MutableList = ArrayList() private lateinit var groupListAdapter: OverviewGroupListAdapter private var clickedPosition = 0 - override fun initLayoutView(): Int = R.layout.fragment_overview - - override fun setupTopBarLayout() { - titleView.text = "概览" + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentOverviewBinding { + return FragmentOverviewBinding.inflate(inflater, container, false) } - override fun initData() { + override fun setupTopBarLayout() { + binding.titleView.text = "概览" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) } @@ -43,7 +46,7 @@ } override fun initEvent() { - rightOptionView.setOnClickListener { + binding.rightOptionView.setOnClickListener { groupViewModel.obtainProGroupList() "刷新数据中,请稍后".show(requireContext()) } @@ -51,16 +54,16 @@ groupViewModel.groupModel.observe(this) { if (it.code == 200) { if (it.data.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { groupViewModel.obtainProGroupList() } } else { - emptyView!!.hide() + binding.emptyInclude.emptyView.hide() dataBeans.clear() dataBeans = it.data groupListAdapter = OverviewGroupListAdapter(requireContext(), it.data) - groupRecyclerView!!.adapter = groupListAdapter + binding.groupRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : OverviewGroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { diff --git a/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt b/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt index e424721..7f036b0 100644 --- a/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt +++ b/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt @@ -4,8 +4,8 @@ import android.graphics.Color import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.Poi -import com.pengxh.kt.lite.extensions.showBusRouteOnMap -import com.pengxh.kt.lite.extensions.showRouteOnMap +import com.casic.smarttube.extensions.showBusRouteOnMap +import com.casic.smarttube.extensions.showRouteOnMap import com.pengxh.kt.lite.widget.dialog.BottomActionSheet object RouteOnMap { diff --git a/app/build.gradle b/app/build.gradle index 81dccf6..defbef7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,12 +2,11 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' android { signingConfigs { release { - storeFile file('/Users/a203/Desktop/AndroidProjects/CasicSmartTube/app/CasicSmartTube.jks') + storeFile file('CasicSmartTube.jks') storePassword '123456789' keyAlias 'key0' keyPassword '123456789' @@ -21,8 +20,6 @@ targetSdkVersion 33 versionCode 2 versionName "1.0.1" - - ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -47,6 +44,10 @@ } } + viewBinding { + enabled true + } + applicationVariants.configureEach { variant -> variant.outputs.configureEach { outputFileName = "GT_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" @@ -61,7 +62,7 @@ dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.5' implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.6.1' diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cccda6d..fd9277c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,7 +81,7 @@ + android:value="a6907c8bb931727374aa5fd500cda107" /> (), Handler.Callback, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { private val kTag = "HomePageFragment" private val geocoderSearch by lazy { GeocodeSearch(requireContext()) } - private lateinit var homeView: View private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var easyPopupWindow: EasyPopupWindow private lateinit var aMap: AMap private lateinit var deviceViewModel: DeviceViewModel private lateinit var groupViewModel: ProjectGroupViewModel @@ -83,34 +89,34 @@ * */ private var mapZooms = ArrayList() - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View { - homeView = inflater.inflate(R.layout.fragment_home, container, false) + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } - weakReferenceHandler = WeakReferenceHandler(callback) - val easyPopupWindow = EasyPopupWindow(requireContext()) - easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) - homeView.rightOptionView.setOnClickListener { - easyPopupWindow.setOnPopupWindowClickListener(object : - EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - easyPopupWindow.setBackgroundDrawable(null) - val x: Int = homeView.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(homeView.rightOptionView, x, 0) + override fun setupTopBarLayout() { + + } + + override fun observeRequestState() { + groupViewModel.loadState.observe(this) { state -> + when (state) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") + else -> LoadingDialogHub.dismiss() + } } + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + weakReferenceHandler = WeakReferenceHandler(this) + + easyPopupWindow = EasyPopupWindow(requireContext()) + easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) //初始化vm - deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) - groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) - - observeRequestState() + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java] //默认数据 groupViewModel.obtainProGroupList() @@ -119,12 +125,8 @@ mapZooms.add(13f) initMap(savedInstanceState) - homeView.addDeviceButton.setOnClickListener { - requireContext().navigatePageTo() - } - //数据监听 - deviceViewModel.mapDeviceModel.observe(this, { + deviceViewModel.mapDeviceModel.observe(this) { if (it.code == 200) { if (allMarkerOptions.isNotEmpty()) { allMarkerOptions.clear() @@ -149,10 +151,8 @@ longitudeList.add(longitude) //将所有设备信息转化缓存为Marker点 allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(device.devcode) - .snippet(device.modelName) + MarkerOptions().position(LatLng(latitude, longitude)) + .title(device.devcode).snippet(device.modelName) ) } } @@ -160,8 +160,8 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 13f) } - }) - groupViewModel.groupModel.observe(this, { + } + groupViewModel.groupModel.observe(this) { if (it.code == 200) { val dataRows = it.data when { @@ -170,14 +170,15 @@ dataBeans = dataRows!! isRefresh = false } + else -> { dataBeans = dataRows!! } } weakReferenceHandler.sendEmptyMessage(2022090201) } - }) - groupViewModel.groupDeviceModel.observe(this, { + } + groupViewModel.groupDeviceModel.observe(this) { if (it.code == 200) { val latitudeList: MutableList = ArrayList() val longitudeList: MutableList = ArrayList() @@ -199,22 +200,33 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 16f) } - }) - return homeView + } } - private fun observeRequestState() { - groupViewModel.loadState.observe(this, { state -> - when (state) { - LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") - else -> LoadingDialogHub.dismiss() - } - }) + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + easyPopupWindow.setOnPopupWindowClickListener(object : + EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + easyPopupWindow.setBackgroundDrawable(null) + val x: Int = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + binding.addDeviceButton.setOnClickListener { + requireContext().navigatePageTo() + } } override fun onResume() { super.onResume() - homeView.mapView.onResume() + binding.mapView.onResume() //获取所有设备数据 deviceViewModel.obtainMapDeviceList() @@ -222,16 +234,16 @@ groupViewModel.obtainProGroupList() } - private val callback = Handler.Callback { - if (it.what == 2022090201) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022090201) { if (isRefresh) { groupListAdapter.notifyDataSetChanged() } else { groupListAdapter = GroupListAdapter(requireContext(), dataBeans) - homeView.homeRecyclerView!!.addItemDecoration( + binding.homeRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - homeView.homeRecyclerView!!.adapter = groupListAdapter + binding.homeRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : GroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { @@ -241,12 +253,12 @@ }) } } - true + return true } private fun initMap(savedInstanceState: Bundle?) { - homeView.mapView.onCreate(savedInstanceState) - aMap = homeView.mapView.map + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val uiSettings = aMap.uiSettings uiSettings.isCompassEnabled = true @@ -322,10 +334,7 @@ if (!isInRange) { clustersMarkers.add( GaoDeClusterMarkerView( - requireContext(), - it, - proj, - LocaleConstant.RADIUS_SIZE + requireContext(), it, proj, LocaleConstant.RADIUS_SIZE ) )//相距多少才聚合 } @@ -363,9 +372,7 @@ //绑定数据 val clickedLatLng = marker?.position!! for (device in deviceModels) { - if (clickedLatLng.latitude == device.latGaode!!.toDouble() - && clickedLatLng.longitude == device.lngGaode!!.toDouble() - ) { + if (clickedLatLng.latitude == device.latGaode!!.toDouble() && clickedLatLng.longitude == device.lngGaode!!.toDouble()) { deviceCodeView.text = String.format("设备编号: ${device.devcode}") deviceModelView.text = String.format("设备模型: ${device.modelName}") //获取设备最新浓度信息 @@ -395,8 +402,7 @@ val address = result?.regeocodeAddress?.formatAddress val temp = StringBuilder() if (address!!.length > 16) { - temp.append(address.substring(0, 14)) - .append("\r\n") + temp.append(address.substring(0, 14)).append("\r\n") .append(address.substring(16)) } else { temp.append(address) @@ -430,9 +436,7 @@ } } //查看聚合点,单独开页面导航过去 - BottomActionSheet.Builder() - .setContext(requireContext()) - .setActionItemTitle(multiDevice) + BottomActionSheet.Builder().setContext(requireContext()).setActionItemTitle(multiDevice) .setItemTextColor(Color.BLUE) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { @@ -455,12 +459,8 @@ override fun onInfoWindowClick(p0: Marker?) { if (p0 != null) { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -487,16 +487,16 @@ 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 onDestroy() { super.onDestroy() - homeView.mapView.onDestroy() + binding.mapView.onDestroy() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt index a4e964c..cc35197 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt @@ -4,11 +4,15 @@ import android.content.Intent import android.net.Uri import android.os.Build +import android.os.Bundle import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider import com.casic.smarttube.BuildConfig import com.casic.smarttube.R +import com.casic.smarttube.databinding.FragmentMineBinding import com.casic.smarttube.extensions.appendDownloadUrl import com.casic.smarttube.model.UserDetailModel import com.casic.smarttube.utils.AuthenticationHelper @@ -36,22 +40,10 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.ChangePasswordDialog -import kotlinx.android.synthetic.main.fragment_mine.aboutUsLayout -import kotlinx.android.synthetic.main.fragment_mine.cacheSizeView -import kotlinx.android.synthetic.main.fragment_mine.changePwdLayout -import kotlinx.android.synthetic.main.fragment_mine.clearCacheLayout -import kotlinx.android.synthetic.main.fragment_mine.loginOutButton -import kotlinx.android.synthetic.main.fragment_mine.updateLogLayout -import kotlinx.android.synthetic.main.fragment_mine.updateUserButton -import kotlinx.android.synthetic.main.fragment_mine.updateVersionLayout -import kotlinx.android.synthetic.main.fragment_mine.userDeptView -import kotlinx.android.synthetic.main.fragment_mine.userImageView -import kotlinx.android.synthetic.main.fragment_mine.userNameView -import kotlinx.android.synthetic.main.fragment_mine.userPhoneView import java.io.File import java.nio.charset.StandardCharsets -class MinePageFragment : KotlinBaseFragment() { +class MinePageFragment : KotlinBaseFragment() { private val kTag = "MinePageFragment" private lateinit var userData: UserDetailModel.Data @@ -60,13 +52,17 @@ private lateinit var versionViewModel: VersionViewModel private lateinit var progressDialog: ProgressDialog - override fun initLayoutView(): Int = R.layout.fragment_mine + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentMineBinding { + return FragmentMineBinding.inflate(inflater, container, false) + } override fun setupTopBarLayout() { } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java] @@ -98,8 +94,7 @@ versionViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show( - requireActivity(), - "检查版本中,请稍后" + requireActivity(), "检查版本中,请稍后" ) else -> LoadingDialogHub.dismiss() @@ -108,49 +103,45 @@ } override fun initEvent() { - userImageView.setOnClickListener { + binding.userImageView.setOnClickListener { "尽情期待~".show(requireContext()) } - updateUserButton.setOnClickListener { + binding.updateUserButton.setOnClickListener { LoadingDialogHub.show(requireActivity(), "同步中,请稍后...") userViewModel.obtainUserDetail() } - changePwdLayout.setOnClickListener { - ChangePasswordDialog.Builder() - .setContext(requireContext()) + binding.changePwdLayout.setOnClickListener { + ChangePasswordDialog.Builder().setContext(requireContext()) .setOnDialogButtonClickListener(object : ChangePasswordDialog.OnDialogButtonClickListener { override fun onConfirmClick(oldPwd: String, newPwd: String) { - val publicKey = - RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! val oldPassKey = RSAUtils.encryptDataByPublicKey( - oldPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + oldPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) val newPassKey = RSAUtils.encryptDataByPublicKey( - newPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + newPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) userViewModel.changePassword(oldPassKey, newPassKey) } }).build().show() } - aboutUsLayout.setOnClickListener { + binding.aboutUsLayout.setOnClickListener { requireContext().navigatePageTo() } - updateVersionLayout.setOnClickListener { + binding.updateVersionLayout.setOnClickListener { versionViewModel.updateVersion() } - updateLogLayout.setOnClickListener { + binding.updateLogLayout.setOnClickListener { "尽情期待~".show(requireContext()) } - clearCacheLayout.setOnClickListener { + binding.clearCacheLayout.setOnClickListener { //删除缓存之后在设置缓存大小 LoadingDialogHub.show(requireActivity(), "清理中,请稍后") File(requireContext().cacheDir.path).deleteFile() @@ -161,18 +152,14 @@ override fun onFinish() { LoadingDialogHub.dismiss() - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() } }.start() } - loginOutButton.setOnClickListener { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("退出登录") - .setMessage("确定要退出吗?") - .setNegativeButton("取消") - .setPositiveButton("确定") + binding.loginOutButton.setOnClickListener { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("退出登录") + .setMessage("确定要退出吗?").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -203,13 +190,9 @@ if (BuildConfig.VERSION_NAME == it.version) { "已是最新版本,无需更新".show(requireContext()) } else { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("提示") - .setMessage("有新版本,是否更新?") - .setNegativeButton("稍后再说") - .setPositiveButton("立即下载") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(requireContext()).setTitle("提示") + .setMessage("有新版本,是否更新?").setNegativeButton("稍后再说") + .setPositiveButton("立即下载").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { downloadApk(it.downloadUrl) @@ -244,7 +227,7 @@ updateUserInfo() } //缓存 - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() super.onResume() } @@ -258,9 +241,9 @@ // R.color.mainThemeColor.convertColor(requireContext()) // ) // userImageView.setImageDrawable(roundDrawable) - userNameView.text = userData.name - userPhoneView.text = String.format("电话:${userData.phone}") - userDeptView.text = String.format("部门:${userData.deptName}") + binding.userNameView.text = userData.name + binding.userPhoneView.text = String.format("电话:${userData.phone}") + binding.userDeptView.text = String.format("部门:${userData.deptName}") } private fun downloadApk(url: String?) { @@ -275,7 +258,8 @@ * */ val downloadPath = url!!.appendDownloadUrl() //开始下载 - downloadPath.downloadFile(requireContext().createDownloadFileDir().toString(), + downloadPath.downloadFile( + requireContext().createDownloadFileDir().toString(), object : OnDownloadListener { override fun onDownloadStart(totalBytes: Long) { progressDialog.max = totalBytes.toInt() diff --git a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt index b009850..c0afcc5 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt @@ -1,8 +1,11 @@ package com.casic.smarttube.fragment +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R import com.casic.smarttube.adapter.OverviewGroupListAdapter +import com.casic.smarttube.databinding.FragmentOverviewBinding import com.casic.smarttube.extensions.showEmptyPage import com.casic.smarttube.model.ProjectGroupModel import com.casic.smarttube.view.GroupDeviceActivity @@ -11,25 +14,25 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.widget.dialog.AlertInputDialog -import kotlinx.android.synthetic.main.fragment_overview.groupRecyclerView -import kotlinx.android.synthetic.main.fragment_overview.rightOptionView -import kotlinx.android.synthetic.main.fragment_overview.titleView -import kotlinx.android.synthetic.main.include_empty_view.emptyView -class OverviewFragment : KotlinBaseFragment() { +class OverviewFragment : KotlinBaseFragment() { private lateinit var groupViewModel: ProjectGroupViewModel private var dataBeans: MutableList = ArrayList() private lateinit var groupListAdapter: OverviewGroupListAdapter private var clickedPosition = 0 - override fun initLayoutView(): Int = R.layout.fragment_overview - - override fun setupTopBarLayout() { - titleView.text = "概览" + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentOverviewBinding { + return FragmentOverviewBinding.inflate(inflater, container, false) } - override fun initData() { + override fun setupTopBarLayout() { + binding.titleView.text = "概览" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) } @@ -43,7 +46,7 @@ } override fun initEvent() { - rightOptionView.setOnClickListener { + binding.rightOptionView.setOnClickListener { groupViewModel.obtainProGroupList() "刷新数据中,请稍后".show(requireContext()) } @@ -51,16 +54,16 @@ groupViewModel.groupModel.observe(this) { if (it.code == 200) { if (it.data.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { groupViewModel.obtainProGroupList() } } else { - emptyView!!.hide() + binding.emptyInclude.emptyView.hide() dataBeans.clear() dataBeans = it.data groupListAdapter = OverviewGroupListAdapter(requireContext(), it.data) - groupRecyclerView!!.adapter = groupListAdapter + binding.groupRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : OverviewGroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { diff --git a/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt b/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt index e424721..7f036b0 100644 --- a/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt +++ b/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt @@ -4,8 +4,8 @@ import android.graphics.Color import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.Poi -import com.pengxh.kt.lite.extensions.showBusRouteOnMap -import com.pengxh.kt.lite.extensions.showRouteOnMap +import com.casic.smarttube.extensions.showBusRouteOnMap +import com.casic.smarttube.extensions.showRouteOnMap import com.pengxh.kt.lite.widget.dialog.BottomActionSheet object RouteOnMap { diff --git a/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt b/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt index 65bba6f..598581a 100644 --- a/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt @@ -1,27 +1,29 @@ package com.casic.smarttube.view +import android.os.Bundle import com.casic.smarttube.BuildConfig import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityAboutUsBinding import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_about_us.* -import kotlinx.android.synthetic.main.include_base_title.* -class AboutUsActivity : KotlinBaseActivity() { +class AboutUsActivity : KotlinBaseActivity() { - override fun initLayoutView(): Int = R.layout.activity_about_us + override fun initViewBinding(): ActivityAboutUsBinding { + return ActivityAboutUsBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "关于我们" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "关于我们" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { - versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + override fun initOnCreate(savedInstanceState: Bundle?) { + binding.versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") } override fun observeRequestState() { diff --git a/app/build.gradle b/app/build.gradle index 81dccf6..defbef7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,12 +2,11 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' android { signingConfigs { release { - storeFile file('/Users/a203/Desktop/AndroidProjects/CasicSmartTube/app/CasicSmartTube.jks') + storeFile file('CasicSmartTube.jks') storePassword '123456789' keyAlias 'key0' keyPassword '123456789' @@ -21,8 +20,6 @@ targetSdkVersion 33 versionCode 2 versionName "1.0.1" - - ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -47,6 +44,10 @@ } } + viewBinding { + enabled true + } + applicationVariants.configureEach { variant -> variant.outputs.configureEach { outputFileName = "GT_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" @@ -61,7 +62,7 @@ dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.5' implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.6.1' diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cccda6d..fd9277c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,7 +81,7 @@ + android:value="a6907c8bb931727374aa5fd500cda107" /> (), Handler.Callback, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { private val kTag = "HomePageFragment" private val geocoderSearch by lazy { GeocodeSearch(requireContext()) } - private lateinit var homeView: View private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var easyPopupWindow: EasyPopupWindow private lateinit var aMap: AMap private lateinit var deviceViewModel: DeviceViewModel private lateinit var groupViewModel: ProjectGroupViewModel @@ -83,34 +89,34 @@ * */ private var mapZooms = ArrayList() - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View { - homeView = inflater.inflate(R.layout.fragment_home, container, false) + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } - weakReferenceHandler = WeakReferenceHandler(callback) - val easyPopupWindow = EasyPopupWindow(requireContext()) - easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) - homeView.rightOptionView.setOnClickListener { - easyPopupWindow.setOnPopupWindowClickListener(object : - EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - easyPopupWindow.setBackgroundDrawable(null) - val x: Int = homeView.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(homeView.rightOptionView, x, 0) + override fun setupTopBarLayout() { + + } + + override fun observeRequestState() { + groupViewModel.loadState.observe(this) { state -> + when (state) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") + else -> LoadingDialogHub.dismiss() + } } + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + weakReferenceHandler = WeakReferenceHandler(this) + + easyPopupWindow = EasyPopupWindow(requireContext()) + easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) //初始化vm - deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) - groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) - - observeRequestState() + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java] //默认数据 groupViewModel.obtainProGroupList() @@ -119,12 +125,8 @@ mapZooms.add(13f) initMap(savedInstanceState) - homeView.addDeviceButton.setOnClickListener { - requireContext().navigatePageTo() - } - //数据监听 - deviceViewModel.mapDeviceModel.observe(this, { + deviceViewModel.mapDeviceModel.observe(this) { if (it.code == 200) { if (allMarkerOptions.isNotEmpty()) { allMarkerOptions.clear() @@ -149,10 +151,8 @@ longitudeList.add(longitude) //将所有设备信息转化缓存为Marker点 allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(device.devcode) - .snippet(device.modelName) + MarkerOptions().position(LatLng(latitude, longitude)) + .title(device.devcode).snippet(device.modelName) ) } } @@ -160,8 +160,8 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 13f) } - }) - groupViewModel.groupModel.observe(this, { + } + groupViewModel.groupModel.observe(this) { if (it.code == 200) { val dataRows = it.data when { @@ -170,14 +170,15 @@ dataBeans = dataRows!! isRefresh = false } + else -> { dataBeans = dataRows!! } } weakReferenceHandler.sendEmptyMessage(2022090201) } - }) - groupViewModel.groupDeviceModel.observe(this, { + } + groupViewModel.groupDeviceModel.observe(this) { if (it.code == 200) { val latitudeList: MutableList = ArrayList() val longitudeList: MutableList = ArrayList() @@ -199,22 +200,33 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 16f) } - }) - return homeView + } } - private fun observeRequestState() { - groupViewModel.loadState.observe(this, { state -> - when (state) { - LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") - else -> LoadingDialogHub.dismiss() - } - }) + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + easyPopupWindow.setOnPopupWindowClickListener(object : + EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + easyPopupWindow.setBackgroundDrawable(null) + val x: Int = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + binding.addDeviceButton.setOnClickListener { + requireContext().navigatePageTo() + } } override fun onResume() { super.onResume() - homeView.mapView.onResume() + binding.mapView.onResume() //获取所有设备数据 deviceViewModel.obtainMapDeviceList() @@ -222,16 +234,16 @@ groupViewModel.obtainProGroupList() } - private val callback = Handler.Callback { - if (it.what == 2022090201) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022090201) { if (isRefresh) { groupListAdapter.notifyDataSetChanged() } else { groupListAdapter = GroupListAdapter(requireContext(), dataBeans) - homeView.homeRecyclerView!!.addItemDecoration( + binding.homeRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - homeView.homeRecyclerView!!.adapter = groupListAdapter + binding.homeRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : GroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { @@ -241,12 +253,12 @@ }) } } - true + return true } private fun initMap(savedInstanceState: Bundle?) { - homeView.mapView.onCreate(savedInstanceState) - aMap = homeView.mapView.map + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val uiSettings = aMap.uiSettings uiSettings.isCompassEnabled = true @@ -322,10 +334,7 @@ if (!isInRange) { clustersMarkers.add( GaoDeClusterMarkerView( - requireContext(), - it, - proj, - LocaleConstant.RADIUS_SIZE + requireContext(), it, proj, LocaleConstant.RADIUS_SIZE ) )//相距多少才聚合 } @@ -363,9 +372,7 @@ //绑定数据 val clickedLatLng = marker?.position!! for (device in deviceModels) { - if (clickedLatLng.latitude == device.latGaode!!.toDouble() - && clickedLatLng.longitude == device.lngGaode!!.toDouble() - ) { + if (clickedLatLng.latitude == device.latGaode!!.toDouble() && clickedLatLng.longitude == device.lngGaode!!.toDouble()) { deviceCodeView.text = String.format("设备编号: ${device.devcode}") deviceModelView.text = String.format("设备模型: ${device.modelName}") //获取设备最新浓度信息 @@ -395,8 +402,7 @@ val address = result?.regeocodeAddress?.formatAddress val temp = StringBuilder() if (address!!.length > 16) { - temp.append(address.substring(0, 14)) - .append("\r\n") + temp.append(address.substring(0, 14)).append("\r\n") .append(address.substring(16)) } else { temp.append(address) @@ -430,9 +436,7 @@ } } //查看聚合点,单独开页面导航过去 - BottomActionSheet.Builder() - .setContext(requireContext()) - .setActionItemTitle(multiDevice) + BottomActionSheet.Builder().setContext(requireContext()).setActionItemTitle(multiDevice) .setItemTextColor(Color.BLUE) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { @@ -455,12 +459,8 @@ override fun onInfoWindowClick(p0: Marker?) { if (p0 != null) { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -487,16 +487,16 @@ 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 onDestroy() { super.onDestroy() - homeView.mapView.onDestroy() + binding.mapView.onDestroy() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt index a4e964c..cc35197 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt @@ -4,11 +4,15 @@ import android.content.Intent import android.net.Uri import android.os.Build +import android.os.Bundle import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider import com.casic.smarttube.BuildConfig import com.casic.smarttube.R +import com.casic.smarttube.databinding.FragmentMineBinding import com.casic.smarttube.extensions.appendDownloadUrl import com.casic.smarttube.model.UserDetailModel import com.casic.smarttube.utils.AuthenticationHelper @@ -36,22 +40,10 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.ChangePasswordDialog -import kotlinx.android.synthetic.main.fragment_mine.aboutUsLayout -import kotlinx.android.synthetic.main.fragment_mine.cacheSizeView -import kotlinx.android.synthetic.main.fragment_mine.changePwdLayout -import kotlinx.android.synthetic.main.fragment_mine.clearCacheLayout -import kotlinx.android.synthetic.main.fragment_mine.loginOutButton -import kotlinx.android.synthetic.main.fragment_mine.updateLogLayout -import kotlinx.android.synthetic.main.fragment_mine.updateUserButton -import kotlinx.android.synthetic.main.fragment_mine.updateVersionLayout -import kotlinx.android.synthetic.main.fragment_mine.userDeptView -import kotlinx.android.synthetic.main.fragment_mine.userImageView -import kotlinx.android.synthetic.main.fragment_mine.userNameView -import kotlinx.android.synthetic.main.fragment_mine.userPhoneView import java.io.File import java.nio.charset.StandardCharsets -class MinePageFragment : KotlinBaseFragment() { +class MinePageFragment : KotlinBaseFragment() { private val kTag = "MinePageFragment" private lateinit var userData: UserDetailModel.Data @@ -60,13 +52,17 @@ private lateinit var versionViewModel: VersionViewModel private lateinit var progressDialog: ProgressDialog - override fun initLayoutView(): Int = R.layout.fragment_mine + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentMineBinding { + return FragmentMineBinding.inflate(inflater, container, false) + } override fun setupTopBarLayout() { } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java] @@ -98,8 +94,7 @@ versionViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show( - requireActivity(), - "检查版本中,请稍后" + requireActivity(), "检查版本中,请稍后" ) else -> LoadingDialogHub.dismiss() @@ -108,49 +103,45 @@ } override fun initEvent() { - userImageView.setOnClickListener { + binding.userImageView.setOnClickListener { "尽情期待~".show(requireContext()) } - updateUserButton.setOnClickListener { + binding.updateUserButton.setOnClickListener { LoadingDialogHub.show(requireActivity(), "同步中,请稍后...") userViewModel.obtainUserDetail() } - changePwdLayout.setOnClickListener { - ChangePasswordDialog.Builder() - .setContext(requireContext()) + binding.changePwdLayout.setOnClickListener { + ChangePasswordDialog.Builder().setContext(requireContext()) .setOnDialogButtonClickListener(object : ChangePasswordDialog.OnDialogButtonClickListener { override fun onConfirmClick(oldPwd: String, newPwd: String) { - val publicKey = - RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! val oldPassKey = RSAUtils.encryptDataByPublicKey( - oldPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + oldPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) val newPassKey = RSAUtils.encryptDataByPublicKey( - newPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + newPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) userViewModel.changePassword(oldPassKey, newPassKey) } }).build().show() } - aboutUsLayout.setOnClickListener { + binding.aboutUsLayout.setOnClickListener { requireContext().navigatePageTo() } - updateVersionLayout.setOnClickListener { + binding.updateVersionLayout.setOnClickListener { versionViewModel.updateVersion() } - updateLogLayout.setOnClickListener { + binding.updateLogLayout.setOnClickListener { "尽情期待~".show(requireContext()) } - clearCacheLayout.setOnClickListener { + binding.clearCacheLayout.setOnClickListener { //删除缓存之后在设置缓存大小 LoadingDialogHub.show(requireActivity(), "清理中,请稍后") File(requireContext().cacheDir.path).deleteFile() @@ -161,18 +152,14 @@ override fun onFinish() { LoadingDialogHub.dismiss() - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() } }.start() } - loginOutButton.setOnClickListener { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("退出登录") - .setMessage("确定要退出吗?") - .setNegativeButton("取消") - .setPositiveButton("确定") + binding.loginOutButton.setOnClickListener { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("退出登录") + .setMessage("确定要退出吗?").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -203,13 +190,9 @@ if (BuildConfig.VERSION_NAME == it.version) { "已是最新版本,无需更新".show(requireContext()) } else { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("提示") - .setMessage("有新版本,是否更新?") - .setNegativeButton("稍后再说") - .setPositiveButton("立即下载") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(requireContext()).setTitle("提示") + .setMessage("有新版本,是否更新?").setNegativeButton("稍后再说") + .setPositiveButton("立即下载").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { downloadApk(it.downloadUrl) @@ -244,7 +227,7 @@ updateUserInfo() } //缓存 - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() super.onResume() } @@ -258,9 +241,9 @@ // R.color.mainThemeColor.convertColor(requireContext()) // ) // userImageView.setImageDrawable(roundDrawable) - userNameView.text = userData.name - userPhoneView.text = String.format("电话:${userData.phone}") - userDeptView.text = String.format("部门:${userData.deptName}") + binding.userNameView.text = userData.name + binding.userPhoneView.text = String.format("电话:${userData.phone}") + binding.userDeptView.text = String.format("部门:${userData.deptName}") } private fun downloadApk(url: String?) { @@ -275,7 +258,8 @@ * */ val downloadPath = url!!.appendDownloadUrl() //开始下载 - downloadPath.downloadFile(requireContext().createDownloadFileDir().toString(), + downloadPath.downloadFile( + requireContext().createDownloadFileDir().toString(), object : OnDownloadListener { override fun onDownloadStart(totalBytes: Long) { progressDialog.max = totalBytes.toInt() diff --git a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt index b009850..c0afcc5 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt @@ -1,8 +1,11 @@ package com.casic.smarttube.fragment +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R import com.casic.smarttube.adapter.OverviewGroupListAdapter +import com.casic.smarttube.databinding.FragmentOverviewBinding import com.casic.smarttube.extensions.showEmptyPage import com.casic.smarttube.model.ProjectGroupModel import com.casic.smarttube.view.GroupDeviceActivity @@ -11,25 +14,25 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.widget.dialog.AlertInputDialog -import kotlinx.android.synthetic.main.fragment_overview.groupRecyclerView -import kotlinx.android.synthetic.main.fragment_overview.rightOptionView -import kotlinx.android.synthetic.main.fragment_overview.titleView -import kotlinx.android.synthetic.main.include_empty_view.emptyView -class OverviewFragment : KotlinBaseFragment() { +class OverviewFragment : KotlinBaseFragment() { private lateinit var groupViewModel: ProjectGroupViewModel private var dataBeans: MutableList = ArrayList() private lateinit var groupListAdapter: OverviewGroupListAdapter private var clickedPosition = 0 - override fun initLayoutView(): Int = R.layout.fragment_overview - - override fun setupTopBarLayout() { - titleView.text = "概览" + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentOverviewBinding { + return FragmentOverviewBinding.inflate(inflater, container, false) } - override fun initData() { + override fun setupTopBarLayout() { + binding.titleView.text = "概览" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) } @@ -43,7 +46,7 @@ } override fun initEvent() { - rightOptionView.setOnClickListener { + binding.rightOptionView.setOnClickListener { groupViewModel.obtainProGroupList() "刷新数据中,请稍后".show(requireContext()) } @@ -51,16 +54,16 @@ groupViewModel.groupModel.observe(this) { if (it.code == 200) { if (it.data.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { groupViewModel.obtainProGroupList() } } else { - emptyView!!.hide() + binding.emptyInclude.emptyView.hide() dataBeans.clear() dataBeans = it.data groupListAdapter = OverviewGroupListAdapter(requireContext(), it.data) - groupRecyclerView!!.adapter = groupListAdapter + binding.groupRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : OverviewGroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { diff --git a/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt b/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt index e424721..7f036b0 100644 --- a/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt +++ b/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt @@ -4,8 +4,8 @@ import android.graphics.Color import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.Poi -import com.pengxh.kt.lite.extensions.showBusRouteOnMap -import com.pengxh.kt.lite.extensions.showRouteOnMap +import com.casic.smarttube.extensions.showBusRouteOnMap +import com.casic.smarttube.extensions.showRouteOnMap import com.pengxh.kt.lite.widget.dialog.BottomActionSheet object RouteOnMap { diff --git a/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt b/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt index 65bba6f..598581a 100644 --- a/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt @@ -1,27 +1,29 @@ package com.casic.smarttube.view +import android.os.Bundle import com.casic.smarttube.BuildConfig import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityAboutUsBinding import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_about_us.* -import kotlinx.android.synthetic.main.include_base_title.* -class AboutUsActivity : KotlinBaseActivity() { +class AboutUsActivity : KotlinBaseActivity() { - override fun initLayoutView(): Int = R.layout.activity_about_us + override fun initViewBinding(): ActivityAboutUsBinding { + return ActivityAboutUsBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "关于我们" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "关于我们" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { - versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + override fun initOnCreate(savedInstanceState: Bundle?) { + binding.versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") } override fun observeRequestState() { diff --git a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt index 415f9dd..80b83bd 100644 --- a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.content.Intent import android.graphics.Color +import android.os.Bundle import android.os.CountDownTimer import android.os.Handler import android.text.Editable @@ -15,6 +16,7 @@ import com.amap.api.location.AMapLocation import com.casic.smarttube.R import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.smarttube.databinding.ActivityAddDeviceBinding import com.casic.smarttube.extensions.combineImagePath import com.casic.smarttube.extensions.compressImage import com.casic.smarttube.extensions.isNumber @@ -47,24 +49,9 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_add_device.addDeviceTimeView -import kotlinx.android.synthetic.main.activity_add_device.addImageRecyclerView -import kotlinx.android.synthetic.main.activity_add_device.collectIntervalView -import kotlinx.android.synthetic.main.activity_add_device.deviceCodeView -import kotlinx.android.synthetic.main.activity_add_device.deviceNameView -import kotlinx.android.synthetic.main.activity_add_device.inputLengthView -import kotlinx.android.synthetic.main.activity_add_device.latitudeView -import kotlinx.android.synthetic.main.activity_add_device.locationImageView -import kotlinx.android.synthetic.main.activity_add_device.longitudeView -import kotlinx.android.synthetic.main.activity_add_device.ownerShipView -import kotlinx.android.synthetic.main.activity_add_device.scannerView -import kotlinx.android.synthetic.main.activity_add_device.sceneEditView -import kotlinx.android.synthetic.main.activity_add_device.submitButton -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView import java.io.File -class AddDeviceActivity : KotlinBaseActivity() { +class AddDeviceActivity : KotlinBaseActivity() { private val kTag = "AddDeviceActivity" private lateinit var imageAdapter: EditableImageAdapter @@ -81,21 +68,23 @@ registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK) { val data = result.data!! - longitudeView.text = data.getStringExtra("longitude") - latitudeView.text = data.getStringExtra("latitude") + binding.longitudeView.text = data.getStringExtra("longitude") + binding.latitudeView.text = data.getStringExtra("latitude") } } - override fun initLayoutView(): Int = R.layout.activity_add_device + override fun initViewBinding(): ActivityAddDeviceBinding { + return ActivityAddDeviceBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "添加设备" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "添加设备" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { weakReferenceHandler = WeakReferenceHandler(callback) uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] @@ -119,17 +108,17 @@ override fun initEvent() { val manager = QrManager.getInstance().init(QrConfigCreator.create(this)) - scannerView.setOnClickListener { + binding.scannerView.setOnClickListener { manager.startScan(this) { if (it.content.isNumber()) { - deviceCodeView.setText(it.content) + binding.deviceCodeView.setText(it.content) } else { "设备编号错误,请检查标签".show(context) } } } - ownerShipView.setOnClickListener { + binding.ownerShipView.setOnClickListener { groupViewModel.obtainGroupList() } groupViewModel.groupListModel.observe(this) { @@ -147,19 +136,14 @@ groups.add("自定义") } if (groups.isNotEmpty()) { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(groups) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { if (groups[position] == "自定义") { - AlertInputDialog.Builder() - .setContext(context) - .setTitle("提示") + AlertInputDialog.Builder().setContext(context).setTitle("提示") .setHintMessage("请输入该设备所属项目名,如:项目203") - .setNegativeButton("取消") - .setPositiveButton("确定") + .setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertInputDialog.OnDialogButtonClickListener { override fun onCancelClick() { @@ -167,12 +151,11 @@ } override fun onConfirmClick(value: String) { - ownerShipView.text = value + binding.ownerShipView.text = value } - }) - .build().show() + }).build().show() } else { - ownerShipView.text = groups[position] + binding.ownerShipView.text = groups[position] } } }).build().show() @@ -180,27 +163,22 @@ } //默认频率1min - collectIntervalView.text = frequency[0] - collectIntervalView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + binding.collectIntervalView.text = frequency[0] + binding.collectIntervalView.setOnClickListener { + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(frequency) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { - collectIntervalView.text = frequency[position] + binding.collectIntervalView.text = frequency[position] } }).build().show() } - locationImageView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(context) - .setItemTextColor(Color.BLUE) + binding.locationImageView.setOnClickListener { + BottomActionSheet.Builder().setContext(context).setItemTextColor(Color.BLUE) .setActionItemTitle(arrayListOf("自动定位", "手动选点")) - .setOnActionSheetListener(object : - BottomActionSheet.OnActionSheetListener { + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { when (position) { 0 -> { @@ -210,30 +188,32 @@ override fun onAMapLocationGet(aMapLocation: AMapLocation?) { LoadingDialogHub.dismiss() if (aMapLocation == null) { - longitudeView.text = "定位失败" - latitudeView.text = "定位失败" + binding.longitudeView.text = "定位失败" + binding.latitudeView.text = "定位失败" - longitudeView.setTextColor( + binding.longitudeView.setTextColor( R.color.redTextColor.convertColor(context) ) - latitudeView.setTextColor( + binding.latitudeView.setTextColor( R.color.redTextColor.convertColor(context) ) } else { - longitudeView.text = + binding.longitudeView.text = aMapLocation.longitude.toString() - latitudeView.text = aMapLocation.latitude.toString() + binding.latitudeView.text = + aMapLocation.latitude.toString() - longitudeView.setTextColor( + binding.longitudeView.setTextColor( R.color.mainTextColor.convertColor(context) ) - latitudeView.setTextColor( + binding.latitudeView.setTextColor( R.color.mainTextColor.convertColor(context) ) } } }) } + 1 -> selectLocationLauncher.launch( Intent(context, SelectLocationActivity::class.java) ) @@ -243,7 +223,7 @@ } imageAdapter = EditableImageAdapter(this, 3, 13f) - addImageRecyclerView.adapter = imageAdapter + binding.addImageRecyclerView.adapter = imageAdapter imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { selectPicture() @@ -281,7 +261,7 @@ } } - sceneEditView.addTextChangedListener(object : TextWatcher { + binding.sceneEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { } @@ -292,31 +272,31 @@ override fun afterTextChanged(s: Editable?) { val text = s.toString().trim() - inputLengthView.text = String.format("${text.length}/100") + binding.inputLengthView.text = String.format("${text.length}/100") if (text.length > 100) { - inputLengthView.setTextColor(R.color.redTextColor.convertColor(context)) + binding.inputLengthView.setTextColor(R.color.redTextColor.convertColor(context)) "现场情况字符不能超过100个字符".show(context) } else { - inputLengthView.setTextColor(R.color.subTextColor.convertColor(context)) + binding.inputLengthView.setTextColor(R.color.subTextColor.convertColor(context)) } } }) - addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() + binding.addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() - submitButton.setOnClickListener { - val deviceCode = deviceCodeView.text.toString().trim() + binding.submitButton.setOnClickListener { + val deviceCode = binding.deviceCodeView.text.toString().trim() if (deviceCode.isBlank()) { "请输入设备编号".show(context) return@setOnClickListener } - val ownerShip = ownerShipView.text.toString().trim() + val ownerShip = binding.ownerShipView.text.toString().trim() if (ownerShip.isBlank()) { "请输入设备所属项目".show(context) return@setOnClickListener } - val longitude = longitudeView.text.toString().trim() - val latitude = latitudeView.text.toString().trim() + val longitude = binding.longitudeView.text.toString().trim() + val latitude = binding.latitudeView.text.toString().trim() if (longitude.isBlank() || latitude.isBlank()) { "请先获取当前经纬度".show(context) return@setOnClickListener @@ -329,14 +309,14 @@ ) deviceViewModel.addDevice( deviceCode, - deviceNameView.text.toString(), + binding.deviceNameView.text.toString(), ownerShip, - collectIntervalView.text.toString(), + binding.collectIntervalView.text.toString(), longitude, latitude, imagePaths.reformat(), - sceneEditView.text.toString().trim(), - addDeviceTimeView.text.toString(), + binding.sceneEditView.text.toString().trim(), + binding.addDeviceTimeView.text.toString(), userData.id.toString(), userData.deptId ) @@ -345,16 +325,13 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(listOf("拍照", "相册")) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { when (position) { 0 -> { - PictureSelector.create(context) - .openCamera(SelectMimeType.ofImage()) + PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { if (result == null) { @@ -362,8 +339,7 @@ return } LoadingDialogHub.show( - this@AddDeviceActivity, - "图片上传中,请稍后..." + this@AddDeviceActivity, "图片上传中,请稍后..." ) selectedImages = result analyticalSelectResults(result[0]) @@ -374,14 +350,11 @@ } }) } + 1 -> { - PictureSelector.create(context) - .openGallery(SelectMimeType.ofImage()) - .isGif(false) - .isMaxSelectEnabledMask(true) - .setFilterMinFileSize(100) - .setMaxSelectNum(3) - .isDisplayCamera(false) + PictureSelector.create(context).openGallery(SelectMimeType.ofImage()) + .isGif(false).isMaxSelectEnabledMask(true).setFilterMinFileSize(100) + .setMaxSelectNum(3).isDisplayCamera(false) .setImageEngine(GlideLoadEngine.instance) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { @@ -390,8 +363,7 @@ return } LoadingDialogHub.show( - this@AddDeviceActivity, - "图片上传中,请稍后..." + this@AddDeviceActivity, "图片上传中,请稍后..." ) selectedImages = result // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 diff --git a/app/build.gradle b/app/build.gradle index 81dccf6..defbef7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,12 +2,11 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' android { signingConfigs { release { - storeFile file('/Users/a203/Desktop/AndroidProjects/CasicSmartTube/app/CasicSmartTube.jks') + storeFile file('CasicSmartTube.jks') storePassword '123456789' keyAlias 'key0' keyPassword '123456789' @@ -21,8 +20,6 @@ targetSdkVersion 33 versionCode 2 versionName "1.0.1" - - ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -47,6 +44,10 @@ } } + viewBinding { + enabled true + } + applicationVariants.configureEach { variant -> variant.outputs.configureEach { outputFileName = "GT_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" @@ -61,7 +62,7 @@ dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.5' implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.6.1' diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cccda6d..fd9277c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,7 +81,7 @@ + android:value="a6907c8bb931727374aa5fd500cda107" /> (), Handler.Callback, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { private val kTag = "HomePageFragment" private val geocoderSearch by lazy { GeocodeSearch(requireContext()) } - private lateinit var homeView: View private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var easyPopupWindow: EasyPopupWindow private lateinit var aMap: AMap private lateinit var deviceViewModel: DeviceViewModel private lateinit var groupViewModel: ProjectGroupViewModel @@ -83,34 +89,34 @@ * */ private var mapZooms = ArrayList() - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View { - homeView = inflater.inflate(R.layout.fragment_home, container, false) + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } - weakReferenceHandler = WeakReferenceHandler(callback) - val easyPopupWindow = EasyPopupWindow(requireContext()) - easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) - homeView.rightOptionView.setOnClickListener { - easyPopupWindow.setOnPopupWindowClickListener(object : - EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - easyPopupWindow.setBackgroundDrawable(null) - val x: Int = homeView.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(homeView.rightOptionView, x, 0) + override fun setupTopBarLayout() { + + } + + override fun observeRequestState() { + groupViewModel.loadState.observe(this) { state -> + when (state) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") + else -> LoadingDialogHub.dismiss() + } } + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + weakReferenceHandler = WeakReferenceHandler(this) + + easyPopupWindow = EasyPopupWindow(requireContext()) + easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) //初始化vm - deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) - groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) - - observeRequestState() + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java] //默认数据 groupViewModel.obtainProGroupList() @@ -119,12 +125,8 @@ mapZooms.add(13f) initMap(savedInstanceState) - homeView.addDeviceButton.setOnClickListener { - requireContext().navigatePageTo() - } - //数据监听 - deviceViewModel.mapDeviceModel.observe(this, { + deviceViewModel.mapDeviceModel.observe(this) { if (it.code == 200) { if (allMarkerOptions.isNotEmpty()) { allMarkerOptions.clear() @@ -149,10 +151,8 @@ longitudeList.add(longitude) //将所有设备信息转化缓存为Marker点 allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(device.devcode) - .snippet(device.modelName) + MarkerOptions().position(LatLng(latitude, longitude)) + .title(device.devcode).snippet(device.modelName) ) } } @@ -160,8 +160,8 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 13f) } - }) - groupViewModel.groupModel.observe(this, { + } + groupViewModel.groupModel.observe(this) { if (it.code == 200) { val dataRows = it.data when { @@ -170,14 +170,15 @@ dataBeans = dataRows!! isRefresh = false } + else -> { dataBeans = dataRows!! } } weakReferenceHandler.sendEmptyMessage(2022090201) } - }) - groupViewModel.groupDeviceModel.observe(this, { + } + groupViewModel.groupDeviceModel.observe(this) { if (it.code == 200) { val latitudeList: MutableList = ArrayList() val longitudeList: MutableList = ArrayList() @@ -199,22 +200,33 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 16f) } - }) - return homeView + } } - private fun observeRequestState() { - groupViewModel.loadState.observe(this, { state -> - when (state) { - LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") - else -> LoadingDialogHub.dismiss() - } - }) + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + easyPopupWindow.setOnPopupWindowClickListener(object : + EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + easyPopupWindow.setBackgroundDrawable(null) + val x: Int = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + binding.addDeviceButton.setOnClickListener { + requireContext().navigatePageTo() + } } override fun onResume() { super.onResume() - homeView.mapView.onResume() + binding.mapView.onResume() //获取所有设备数据 deviceViewModel.obtainMapDeviceList() @@ -222,16 +234,16 @@ groupViewModel.obtainProGroupList() } - private val callback = Handler.Callback { - if (it.what == 2022090201) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022090201) { if (isRefresh) { groupListAdapter.notifyDataSetChanged() } else { groupListAdapter = GroupListAdapter(requireContext(), dataBeans) - homeView.homeRecyclerView!!.addItemDecoration( + binding.homeRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - homeView.homeRecyclerView!!.adapter = groupListAdapter + binding.homeRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : GroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { @@ -241,12 +253,12 @@ }) } } - true + return true } private fun initMap(savedInstanceState: Bundle?) { - homeView.mapView.onCreate(savedInstanceState) - aMap = homeView.mapView.map + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val uiSettings = aMap.uiSettings uiSettings.isCompassEnabled = true @@ -322,10 +334,7 @@ if (!isInRange) { clustersMarkers.add( GaoDeClusterMarkerView( - requireContext(), - it, - proj, - LocaleConstant.RADIUS_SIZE + requireContext(), it, proj, LocaleConstant.RADIUS_SIZE ) )//相距多少才聚合 } @@ -363,9 +372,7 @@ //绑定数据 val clickedLatLng = marker?.position!! for (device in deviceModels) { - if (clickedLatLng.latitude == device.latGaode!!.toDouble() - && clickedLatLng.longitude == device.lngGaode!!.toDouble() - ) { + if (clickedLatLng.latitude == device.latGaode!!.toDouble() && clickedLatLng.longitude == device.lngGaode!!.toDouble()) { deviceCodeView.text = String.format("设备编号: ${device.devcode}") deviceModelView.text = String.format("设备模型: ${device.modelName}") //获取设备最新浓度信息 @@ -395,8 +402,7 @@ val address = result?.regeocodeAddress?.formatAddress val temp = StringBuilder() if (address!!.length > 16) { - temp.append(address.substring(0, 14)) - .append("\r\n") + temp.append(address.substring(0, 14)).append("\r\n") .append(address.substring(16)) } else { temp.append(address) @@ -430,9 +436,7 @@ } } //查看聚合点,单独开页面导航过去 - BottomActionSheet.Builder() - .setContext(requireContext()) - .setActionItemTitle(multiDevice) + BottomActionSheet.Builder().setContext(requireContext()).setActionItemTitle(multiDevice) .setItemTextColor(Color.BLUE) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { @@ -455,12 +459,8 @@ override fun onInfoWindowClick(p0: Marker?) { if (p0 != null) { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -487,16 +487,16 @@ 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 onDestroy() { super.onDestroy() - homeView.mapView.onDestroy() + binding.mapView.onDestroy() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt index a4e964c..cc35197 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt @@ -4,11 +4,15 @@ import android.content.Intent import android.net.Uri import android.os.Build +import android.os.Bundle import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider import com.casic.smarttube.BuildConfig import com.casic.smarttube.R +import com.casic.smarttube.databinding.FragmentMineBinding import com.casic.smarttube.extensions.appendDownloadUrl import com.casic.smarttube.model.UserDetailModel import com.casic.smarttube.utils.AuthenticationHelper @@ -36,22 +40,10 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.ChangePasswordDialog -import kotlinx.android.synthetic.main.fragment_mine.aboutUsLayout -import kotlinx.android.synthetic.main.fragment_mine.cacheSizeView -import kotlinx.android.synthetic.main.fragment_mine.changePwdLayout -import kotlinx.android.synthetic.main.fragment_mine.clearCacheLayout -import kotlinx.android.synthetic.main.fragment_mine.loginOutButton -import kotlinx.android.synthetic.main.fragment_mine.updateLogLayout -import kotlinx.android.synthetic.main.fragment_mine.updateUserButton -import kotlinx.android.synthetic.main.fragment_mine.updateVersionLayout -import kotlinx.android.synthetic.main.fragment_mine.userDeptView -import kotlinx.android.synthetic.main.fragment_mine.userImageView -import kotlinx.android.synthetic.main.fragment_mine.userNameView -import kotlinx.android.synthetic.main.fragment_mine.userPhoneView import java.io.File import java.nio.charset.StandardCharsets -class MinePageFragment : KotlinBaseFragment() { +class MinePageFragment : KotlinBaseFragment() { private val kTag = "MinePageFragment" private lateinit var userData: UserDetailModel.Data @@ -60,13 +52,17 @@ private lateinit var versionViewModel: VersionViewModel private lateinit var progressDialog: ProgressDialog - override fun initLayoutView(): Int = R.layout.fragment_mine + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentMineBinding { + return FragmentMineBinding.inflate(inflater, container, false) + } override fun setupTopBarLayout() { } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java] @@ -98,8 +94,7 @@ versionViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show( - requireActivity(), - "检查版本中,请稍后" + requireActivity(), "检查版本中,请稍后" ) else -> LoadingDialogHub.dismiss() @@ -108,49 +103,45 @@ } override fun initEvent() { - userImageView.setOnClickListener { + binding.userImageView.setOnClickListener { "尽情期待~".show(requireContext()) } - updateUserButton.setOnClickListener { + binding.updateUserButton.setOnClickListener { LoadingDialogHub.show(requireActivity(), "同步中,请稍后...") userViewModel.obtainUserDetail() } - changePwdLayout.setOnClickListener { - ChangePasswordDialog.Builder() - .setContext(requireContext()) + binding.changePwdLayout.setOnClickListener { + ChangePasswordDialog.Builder().setContext(requireContext()) .setOnDialogButtonClickListener(object : ChangePasswordDialog.OnDialogButtonClickListener { override fun onConfirmClick(oldPwd: String, newPwd: String) { - val publicKey = - RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! val oldPassKey = RSAUtils.encryptDataByPublicKey( - oldPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + oldPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) val newPassKey = RSAUtils.encryptDataByPublicKey( - newPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + newPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) userViewModel.changePassword(oldPassKey, newPassKey) } }).build().show() } - aboutUsLayout.setOnClickListener { + binding.aboutUsLayout.setOnClickListener { requireContext().navigatePageTo() } - updateVersionLayout.setOnClickListener { + binding.updateVersionLayout.setOnClickListener { versionViewModel.updateVersion() } - updateLogLayout.setOnClickListener { + binding.updateLogLayout.setOnClickListener { "尽情期待~".show(requireContext()) } - clearCacheLayout.setOnClickListener { + binding.clearCacheLayout.setOnClickListener { //删除缓存之后在设置缓存大小 LoadingDialogHub.show(requireActivity(), "清理中,请稍后") File(requireContext().cacheDir.path).deleteFile() @@ -161,18 +152,14 @@ override fun onFinish() { LoadingDialogHub.dismiss() - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() } }.start() } - loginOutButton.setOnClickListener { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("退出登录") - .setMessage("确定要退出吗?") - .setNegativeButton("取消") - .setPositiveButton("确定") + binding.loginOutButton.setOnClickListener { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("退出登录") + .setMessage("确定要退出吗?").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -203,13 +190,9 @@ if (BuildConfig.VERSION_NAME == it.version) { "已是最新版本,无需更新".show(requireContext()) } else { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("提示") - .setMessage("有新版本,是否更新?") - .setNegativeButton("稍后再说") - .setPositiveButton("立即下载") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(requireContext()).setTitle("提示") + .setMessage("有新版本,是否更新?").setNegativeButton("稍后再说") + .setPositiveButton("立即下载").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { downloadApk(it.downloadUrl) @@ -244,7 +227,7 @@ updateUserInfo() } //缓存 - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() super.onResume() } @@ -258,9 +241,9 @@ // R.color.mainThemeColor.convertColor(requireContext()) // ) // userImageView.setImageDrawable(roundDrawable) - userNameView.text = userData.name - userPhoneView.text = String.format("电话:${userData.phone}") - userDeptView.text = String.format("部门:${userData.deptName}") + binding.userNameView.text = userData.name + binding.userPhoneView.text = String.format("电话:${userData.phone}") + binding.userDeptView.text = String.format("部门:${userData.deptName}") } private fun downloadApk(url: String?) { @@ -275,7 +258,8 @@ * */ val downloadPath = url!!.appendDownloadUrl() //开始下载 - downloadPath.downloadFile(requireContext().createDownloadFileDir().toString(), + downloadPath.downloadFile( + requireContext().createDownloadFileDir().toString(), object : OnDownloadListener { override fun onDownloadStart(totalBytes: Long) { progressDialog.max = totalBytes.toInt() diff --git a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt index b009850..c0afcc5 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt @@ -1,8 +1,11 @@ package com.casic.smarttube.fragment +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R import com.casic.smarttube.adapter.OverviewGroupListAdapter +import com.casic.smarttube.databinding.FragmentOverviewBinding import com.casic.smarttube.extensions.showEmptyPage import com.casic.smarttube.model.ProjectGroupModel import com.casic.smarttube.view.GroupDeviceActivity @@ -11,25 +14,25 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.widget.dialog.AlertInputDialog -import kotlinx.android.synthetic.main.fragment_overview.groupRecyclerView -import kotlinx.android.synthetic.main.fragment_overview.rightOptionView -import kotlinx.android.synthetic.main.fragment_overview.titleView -import kotlinx.android.synthetic.main.include_empty_view.emptyView -class OverviewFragment : KotlinBaseFragment() { +class OverviewFragment : KotlinBaseFragment() { private lateinit var groupViewModel: ProjectGroupViewModel private var dataBeans: MutableList = ArrayList() private lateinit var groupListAdapter: OverviewGroupListAdapter private var clickedPosition = 0 - override fun initLayoutView(): Int = R.layout.fragment_overview - - override fun setupTopBarLayout() { - titleView.text = "概览" + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentOverviewBinding { + return FragmentOverviewBinding.inflate(inflater, container, false) } - override fun initData() { + override fun setupTopBarLayout() { + binding.titleView.text = "概览" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) } @@ -43,7 +46,7 @@ } override fun initEvent() { - rightOptionView.setOnClickListener { + binding.rightOptionView.setOnClickListener { groupViewModel.obtainProGroupList() "刷新数据中,请稍后".show(requireContext()) } @@ -51,16 +54,16 @@ groupViewModel.groupModel.observe(this) { if (it.code == 200) { if (it.data.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { groupViewModel.obtainProGroupList() } } else { - emptyView!!.hide() + binding.emptyInclude.emptyView.hide() dataBeans.clear() dataBeans = it.data groupListAdapter = OverviewGroupListAdapter(requireContext(), it.data) - groupRecyclerView!!.adapter = groupListAdapter + binding.groupRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : OverviewGroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { diff --git a/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt b/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt index e424721..7f036b0 100644 --- a/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt +++ b/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt @@ -4,8 +4,8 @@ import android.graphics.Color import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.Poi -import com.pengxh.kt.lite.extensions.showBusRouteOnMap -import com.pengxh.kt.lite.extensions.showRouteOnMap +import com.casic.smarttube.extensions.showBusRouteOnMap +import com.casic.smarttube.extensions.showRouteOnMap import com.pengxh.kt.lite.widget.dialog.BottomActionSheet object RouteOnMap { diff --git a/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt b/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt index 65bba6f..598581a 100644 --- a/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt @@ -1,27 +1,29 @@ package com.casic.smarttube.view +import android.os.Bundle import com.casic.smarttube.BuildConfig import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityAboutUsBinding import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_about_us.* -import kotlinx.android.synthetic.main.include_base_title.* -class AboutUsActivity : KotlinBaseActivity() { +class AboutUsActivity : KotlinBaseActivity() { - override fun initLayoutView(): Int = R.layout.activity_about_us + override fun initViewBinding(): ActivityAboutUsBinding { + return ActivityAboutUsBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "关于我们" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "关于我们" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { - versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + override fun initOnCreate(savedInstanceState: Bundle?) { + binding.versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") } override fun observeRequestState() { diff --git a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt index 415f9dd..80b83bd 100644 --- a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.content.Intent import android.graphics.Color +import android.os.Bundle import android.os.CountDownTimer import android.os.Handler import android.text.Editable @@ -15,6 +16,7 @@ import com.amap.api.location.AMapLocation import com.casic.smarttube.R import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.smarttube.databinding.ActivityAddDeviceBinding import com.casic.smarttube.extensions.combineImagePath import com.casic.smarttube.extensions.compressImage import com.casic.smarttube.extensions.isNumber @@ -47,24 +49,9 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_add_device.addDeviceTimeView -import kotlinx.android.synthetic.main.activity_add_device.addImageRecyclerView -import kotlinx.android.synthetic.main.activity_add_device.collectIntervalView -import kotlinx.android.synthetic.main.activity_add_device.deviceCodeView -import kotlinx.android.synthetic.main.activity_add_device.deviceNameView -import kotlinx.android.synthetic.main.activity_add_device.inputLengthView -import kotlinx.android.synthetic.main.activity_add_device.latitudeView -import kotlinx.android.synthetic.main.activity_add_device.locationImageView -import kotlinx.android.synthetic.main.activity_add_device.longitudeView -import kotlinx.android.synthetic.main.activity_add_device.ownerShipView -import kotlinx.android.synthetic.main.activity_add_device.scannerView -import kotlinx.android.synthetic.main.activity_add_device.sceneEditView -import kotlinx.android.synthetic.main.activity_add_device.submitButton -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView import java.io.File -class AddDeviceActivity : KotlinBaseActivity() { +class AddDeviceActivity : KotlinBaseActivity() { private val kTag = "AddDeviceActivity" private lateinit var imageAdapter: EditableImageAdapter @@ -81,21 +68,23 @@ registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK) { val data = result.data!! - longitudeView.text = data.getStringExtra("longitude") - latitudeView.text = data.getStringExtra("latitude") + binding.longitudeView.text = data.getStringExtra("longitude") + binding.latitudeView.text = data.getStringExtra("latitude") } } - override fun initLayoutView(): Int = R.layout.activity_add_device + override fun initViewBinding(): ActivityAddDeviceBinding { + return ActivityAddDeviceBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "添加设备" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "添加设备" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { weakReferenceHandler = WeakReferenceHandler(callback) uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] @@ -119,17 +108,17 @@ override fun initEvent() { val manager = QrManager.getInstance().init(QrConfigCreator.create(this)) - scannerView.setOnClickListener { + binding.scannerView.setOnClickListener { manager.startScan(this) { if (it.content.isNumber()) { - deviceCodeView.setText(it.content) + binding.deviceCodeView.setText(it.content) } else { "设备编号错误,请检查标签".show(context) } } } - ownerShipView.setOnClickListener { + binding.ownerShipView.setOnClickListener { groupViewModel.obtainGroupList() } groupViewModel.groupListModel.observe(this) { @@ -147,19 +136,14 @@ groups.add("自定义") } if (groups.isNotEmpty()) { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(groups) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { if (groups[position] == "自定义") { - AlertInputDialog.Builder() - .setContext(context) - .setTitle("提示") + AlertInputDialog.Builder().setContext(context).setTitle("提示") .setHintMessage("请输入该设备所属项目名,如:项目203") - .setNegativeButton("取消") - .setPositiveButton("确定") + .setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertInputDialog.OnDialogButtonClickListener { override fun onCancelClick() { @@ -167,12 +151,11 @@ } override fun onConfirmClick(value: String) { - ownerShipView.text = value + binding.ownerShipView.text = value } - }) - .build().show() + }).build().show() } else { - ownerShipView.text = groups[position] + binding.ownerShipView.text = groups[position] } } }).build().show() @@ -180,27 +163,22 @@ } //默认频率1min - collectIntervalView.text = frequency[0] - collectIntervalView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + binding.collectIntervalView.text = frequency[0] + binding.collectIntervalView.setOnClickListener { + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(frequency) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { - collectIntervalView.text = frequency[position] + binding.collectIntervalView.text = frequency[position] } }).build().show() } - locationImageView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(context) - .setItemTextColor(Color.BLUE) + binding.locationImageView.setOnClickListener { + BottomActionSheet.Builder().setContext(context).setItemTextColor(Color.BLUE) .setActionItemTitle(arrayListOf("自动定位", "手动选点")) - .setOnActionSheetListener(object : - BottomActionSheet.OnActionSheetListener { + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { when (position) { 0 -> { @@ -210,30 +188,32 @@ override fun onAMapLocationGet(aMapLocation: AMapLocation?) { LoadingDialogHub.dismiss() if (aMapLocation == null) { - longitudeView.text = "定位失败" - latitudeView.text = "定位失败" + binding.longitudeView.text = "定位失败" + binding.latitudeView.text = "定位失败" - longitudeView.setTextColor( + binding.longitudeView.setTextColor( R.color.redTextColor.convertColor(context) ) - latitudeView.setTextColor( + binding.latitudeView.setTextColor( R.color.redTextColor.convertColor(context) ) } else { - longitudeView.text = + binding.longitudeView.text = aMapLocation.longitude.toString() - latitudeView.text = aMapLocation.latitude.toString() + binding.latitudeView.text = + aMapLocation.latitude.toString() - longitudeView.setTextColor( + binding.longitudeView.setTextColor( R.color.mainTextColor.convertColor(context) ) - latitudeView.setTextColor( + binding.latitudeView.setTextColor( R.color.mainTextColor.convertColor(context) ) } } }) } + 1 -> selectLocationLauncher.launch( Intent(context, SelectLocationActivity::class.java) ) @@ -243,7 +223,7 @@ } imageAdapter = EditableImageAdapter(this, 3, 13f) - addImageRecyclerView.adapter = imageAdapter + binding.addImageRecyclerView.adapter = imageAdapter imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { selectPicture() @@ -281,7 +261,7 @@ } } - sceneEditView.addTextChangedListener(object : TextWatcher { + binding.sceneEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { } @@ -292,31 +272,31 @@ override fun afterTextChanged(s: Editable?) { val text = s.toString().trim() - inputLengthView.text = String.format("${text.length}/100") + binding.inputLengthView.text = String.format("${text.length}/100") if (text.length > 100) { - inputLengthView.setTextColor(R.color.redTextColor.convertColor(context)) + binding.inputLengthView.setTextColor(R.color.redTextColor.convertColor(context)) "现场情况字符不能超过100个字符".show(context) } else { - inputLengthView.setTextColor(R.color.subTextColor.convertColor(context)) + binding.inputLengthView.setTextColor(R.color.subTextColor.convertColor(context)) } } }) - addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() + binding.addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() - submitButton.setOnClickListener { - val deviceCode = deviceCodeView.text.toString().trim() + binding.submitButton.setOnClickListener { + val deviceCode = binding.deviceCodeView.text.toString().trim() if (deviceCode.isBlank()) { "请输入设备编号".show(context) return@setOnClickListener } - val ownerShip = ownerShipView.text.toString().trim() + val ownerShip = binding.ownerShipView.text.toString().trim() if (ownerShip.isBlank()) { "请输入设备所属项目".show(context) return@setOnClickListener } - val longitude = longitudeView.text.toString().trim() - val latitude = latitudeView.text.toString().trim() + val longitude = binding.longitudeView.text.toString().trim() + val latitude = binding.latitudeView.text.toString().trim() if (longitude.isBlank() || latitude.isBlank()) { "请先获取当前经纬度".show(context) return@setOnClickListener @@ -329,14 +309,14 @@ ) deviceViewModel.addDevice( deviceCode, - deviceNameView.text.toString(), + binding.deviceNameView.text.toString(), ownerShip, - collectIntervalView.text.toString(), + binding.collectIntervalView.text.toString(), longitude, latitude, imagePaths.reformat(), - sceneEditView.text.toString().trim(), - addDeviceTimeView.text.toString(), + binding.sceneEditView.text.toString().trim(), + binding.addDeviceTimeView.text.toString(), userData.id.toString(), userData.deptId ) @@ -345,16 +325,13 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(listOf("拍照", "相册")) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { when (position) { 0 -> { - PictureSelector.create(context) - .openCamera(SelectMimeType.ofImage()) + PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { if (result == null) { @@ -362,8 +339,7 @@ return } LoadingDialogHub.show( - this@AddDeviceActivity, - "图片上传中,请稍后..." + this@AddDeviceActivity, "图片上传中,请稍后..." ) selectedImages = result analyticalSelectResults(result[0]) @@ -374,14 +350,11 @@ } }) } + 1 -> { - PictureSelector.create(context) - .openGallery(SelectMimeType.ofImage()) - .isGif(false) - .isMaxSelectEnabledMask(true) - .setFilterMinFileSize(100) - .setMaxSelectNum(3) - .isDisplayCamera(false) + PictureSelector.create(context).openGallery(SelectMimeType.ofImage()) + .isGif(false).isMaxSelectEnabledMask(true).setFilterMinFileSize(100) + .setMaxSelectNum(3).isDisplayCamera(false) .setImageEngine(GlideLoadEngine.instance) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { @@ -390,8 +363,7 @@ return } LoadingDialogHub.show( - this@AddDeviceActivity, - "图片上传中,请稍后..." + this@AddDeviceActivity, "图片上传中,请稍后..." ) selectedImages = result // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 diff --git a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt index 3864f16..e4f19a4 100644 --- a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.content.Context +import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,19 +11,20 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityBigImageBinding import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager -import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : KotlinBaseActivity() { +class BigImageActivity : KotlinBaseActivity() { - override fun initLayoutView(): Int = R.layout.activity_big_image + override fun initViewBinding(): ActivityBigImageBinding { + return ActivityBigImageBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { PageNavigationManager.addActivity(this) @@ -30,16 +32,16 @@ ImmersionBar.with(this).statusBarDarkFont(false).init() } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) val urls = intent.getStringArrayListExtra(Constant.BIG_IMAGE_INTENT_DATA_KEY) if (urls == null || urls.size == 0) { return } - pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") - imagePagerView.adapter = BigImageAdapter(this, urls) - imagePagerView.currentItem = index - imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + binding.pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + binding.imagePagerView.adapter = BigImageAdapter(this, urls) + binding.imagePagerView.currentItem = index + binding.imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrollStateChanged(state: Int) { } @@ -53,7 +55,8 @@ } override fun onPageSelected(position: Int) { - pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + binding.pageNumberView.text = + String.format("(" + (position + 1) + "/" + urls.size + ")") } }) } @@ -63,7 +66,7 @@ } override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } + binding.leftBackView.setOnClickListener { this.finish() } } class BigImageAdapter(private var context: Context, imageList: ArrayList) : diff --git a/app/build.gradle b/app/build.gradle index 81dccf6..defbef7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,12 +2,11 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' android { signingConfigs { release { - storeFile file('/Users/a203/Desktop/AndroidProjects/CasicSmartTube/app/CasicSmartTube.jks') + storeFile file('CasicSmartTube.jks') storePassword '123456789' keyAlias 'key0' keyPassword '123456789' @@ -21,8 +20,6 @@ targetSdkVersion 33 versionCode 2 versionName "1.0.1" - - ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -47,6 +44,10 @@ } } + viewBinding { + enabled true + } + applicationVariants.configureEach { variant -> variant.outputs.configureEach { outputFileName = "GT_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" @@ -61,7 +62,7 @@ dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.5' implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.6.1' diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cccda6d..fd9277c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,7 +81,7 @@ + android:value="a6907c8bb931727374aa5fd500cda107" /> (), Handler.Callback, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { private val kTag = "HomePageFragment" private val geocoderSearch by lazy { GeocodeSearch(requireContext()) } - private lateinit var homeView: View private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var easyPopupWindow: EasyPopupWindow private lateinit var aMap: AMap private lateinit var deviceViewModel: DeviceViewModel private lateinit var groupViewModel: ProjectGroupViewModel @@ -83,34 +89,34 @@ * */ private var mapZooms = ArrayList() - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View { - homeView = inflater.inflate(R.layout.fragment_home, container, false) + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } - weakReferenceHandler = WeakReferenceHandler(callback) - val easyPopupWindow = EasyPopupWindow(requireContext()) - easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) - homeView.rightOptionView.setOnClickListener { - easyPopupWindow.setOnPopupWindowClickListener(object : - EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - easyPopupWindow.setBackgroundDrawable(null) - val x: Int = homeView.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(homeView.rightOptionView, x, 0) + override fun setupTopBarLayout() { + + } + + override fun observeRequestState() { + groupViewModel.loadState.observe(this) { state -> + when (state) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") + else -> LoadingDialogHub.dismiss() + } } + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + weakReferenceHandler = WeakReferenceHandler(this) + + easyPopupWindow = EasyPopupWindow(requireContext()) + easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) //初始化vm - deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) - groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) - - observeRequestState() + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java] //默认数据 groupViewModel.obtainProGroupList() @@ -119,12 +125,8 @@ mapZooms.add(13f) initMap(savedInstanceState) - homeView.addDeviceButton.setOnClickListener { - requireContext().navigatePageTo() - } - //数据监听 - deviceViewModel.mapDeviceModel.observe(this, { + deviceViewModel.mapDeviceModel.observe(this) { if (it.code == 200) { if (allMarkerOptions.isNotEmpty()) { allMarkerOptions.clear() @@ -149,10 +151,8 @@ longitudeList.add(longitude) //将所有设备信息转化缓存为Marker点 allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(device.devcode) - .snippet(device.modelName) + MarkerOptions().position(LatLng(latitude, longitude)) + .title(device.devcode).snippet(device.modelName) ) } } @@ -160,8 +160,8 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 13f) } - }) - groupViewModel.groupModel.observe(this, { + } + groupViewModel.groupModel.observe(this) { if (it.code == 200) { val dataRows = it.data when { @@ -170,14 +170,15 @@ dataBeans = dataRows!! isRefresh = false } + else -> { dataBeans = dataRows!! } } weakReferenceHandler.sendEmptyMessage(2022090201) } - }) - groupViewModel.groupDeviceModel.observe(this, { + } + groupViewModel.groupDeviceModel.observe(this) { if (it.code == 200) { val latitudeList: MutableList = ArrayList() val longitudeList: MutableList = ArrayList() @@ -199,22 +200,33 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 16f) } - }) - return homeView + } } - private fun observeRequestState() { - groupViewModel.loadState.observe(this, { state -> - when (state) { - LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") - else -> LoadingDialogHub.dismiss() - } - }) + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + easyPopupWindow.setOnPopupWindowClickListener(object : + EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + easyPopupWindow.setBackgroundDrawable(null) + val x: Int = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + binding.addDeviceButton.setOnClickListener { + requireContext().navigatePageTo() + } } override fun onResume() { super.onResume() - homeView.mapView.onResume() + binding.mapView.onResume() //获取所有设备数据 deviceViewModel.obtainMapDeviceList() @@ -222,16 +234,16 @@ groupViewModel.obtainProGroupList() } - private val callback = Handler.Callback { - if (it.what == 2022090201) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022090201) { if (isRefresh) { groupListAdapter.notifyDataSetChanged() } else { groupListAdapter = GroupListAdapter(requireContext(), dataBeans) - homeView.homeRecyclerView!!.addItemDecoration( + binding.homeRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - homeView.homeRecyclerView!!.adapter = groupListAdapter + binding.homeRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : GroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { @@ -241,12 +253,12 @@ }) } } - true + return true } private fun initMap(savedInstanceState: Bundle?) { - homeView.mapView.onCreate(savedInstanceState) - aMap = homeView.mapView.map + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val uiSettings = aMap.uiSettings uiSettings.isCompassEnabled = true @@ -322,10 +334,7 @@ if (!isInRange) { clustersMarkers.add( GaoDeClusterMarkerView( - requireContext(), - it, - proj, - LocaleConstant.RADIUS_SIZE + requireContext(), it, proj, LocaleConstant.RADIUS_SIZE ) )//相距多少才聚合 } @@ -363,9 +372,7 @@ //绑定数据 val clickedLatLng = marker?.position!! for (device in deviceModels) { - if (clickedLatLng.latitude == device.latGaode!!.toDouble() - && clickedLatLng.longitude == device.lngGaode!!.toDouble() - ) { + if (clickedLatLng.latitude == device.latGaode!!.toDouble() && clickedLatLng.longitude == device.lngGaode!!.toDouble()) { deviceCodeView.text = String.format("设备编号: ${device.devcode}") deviceModelView.text = String.format("设备模型: ${device.modelName}") //获取设备最新浓度信息 @@ -395,8 +402,7 @@ val address = result?.regeocodeAddress?.formatAddress val temp = StringBuilder() if (address!!.length > 16) { - temp.append(address.substring(0, 14)) - .append("\r\n") + temp.append(address.substring(0, 14)).append("\r\n") .append(address.substring(16)) } else { temp.append(address) @@ -430,9 +436,7 @@ } } //查看聚合点,单独开页面导航过去 - BottomActionSheet.Builder() - .setContext(requireContext()) - .setActionItemTitle(multiDevice) + BottomActionSheet.Builder().setContext(requireContext()).setActionItemTitle(multiDevice) .setItemTextColor(Color.BLUE) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { @@ -455,12 +459,8 @@ override fun onInfoWindowClick(p0: Marker?) { if (p0 != null) { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -487,16 +487,16 @@ 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 onDestroy() { super.onDestroy() - homeView.mapView.onDestroy() + binding.mapView.onDestroy() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt index a4e964c..cc35197 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt @@ -4,11 +4,15 @@ import android.content.Intent import android.net.Uri import android.os.Build +import android.os.Bundle import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider import com.casic.smarttube.BuildConfig import com.casic.smarttube.R +import com.casic.smarttube.databinding.FragmentMineBinding import com.casic.smarttube.extensions.appendDownloadUrl import com.casic.smarttube.model.UserDetailModel import com.casic.smarttube.utils.AuthenticationHelper @@ -36,22 +40,10 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.ChangePasswordDialog -import kotlinx.android.synthetic.main.fragment_mine.aboutUsLayout -import kotlinx.android.synthetic.main.fragment_mine.cacheSizeView -import kotlinx.android.synthetic.main.fragment_mine.changePwdLayout -import kotlinx.android.synthetic.main.fragment_mine.clearCacheLayout -import kotlinx.android.synthetic.main.fragment_mine.loginOutButton -import kotlinx.android.synthetic.main.fragment_mine.updateLogLayout -import kotlinx.android.synthetic.main.fragment_mine.updateUserButton -import kotlinx.android.synthetic.main.fragment_mine.updateVersionLayout -import kotlinx.android.synthetic.main.fragment_mine.userDeptView -import kotlinx.android.synthetic.main.fragment_mine.userImageView -import kotlinx.android.synthetic.main.fragment_mine.userNameView -import kotlinx.android.synthetic.main.fragment_mine.userPhoneView import java.io.File import java.nio.charset.StandardCharsets -class MinePageFragment : KotlinBaseFragment() { +class MinePageFragment : KotlinBaseFragment() { private val kTag = "MinePageFragment" private lateinit var userData: UserDetailModel.Data @@ -60,13 +52,17 @@ private lateinit var versionViewModel: VersionViewModel private lateinit var progressDialog: ProgressDialog - override fun initLayoutView(): Int = R.layout.fragment_mine + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentMineBinding { + return FragmentMineBinding.inflate(inflater, container, false) + } override fun setupTopBarLayout() { } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java] @@ -98,8 +94,7 @@ versionViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show( - requireActivity(), - "检查版本中,请稍后" + requireActivity(), "检查版本中,请稍后" ) else -> LoadingDialogHub.dismiss() @@ -108,49 +103,45 @@ } override fun initEvent() { - userImageView.setOnClickListener { + binding.userImageView.setOnClickListener { "尽情期待~".show(requireContext()) } - updateUserButton.setOnClickListener { + binding.updateUserButton.setOnClickListener { LoadingDialogHub.show(requireActivity(), "同步中,请稍后...") userViewModel.obtainUserDetail() } - changePwdLayout.setOnClickListener { - ChangePasswordDialog.Builder() - .setContext(requireContext()) + binding.changePwdLayout.setOnClickListener { + ChangePasswordDialog.Builder().setContext(requireContext()) .setOnDialogButtonClickListener(object : ChangePasswordDialog.OnDialogButtonClickListener { override fun onConfirmClick(oldPwd: String, newPwd: String) { - val publicKey = - RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! val oldPassKey = RSAUtils.encryptDataByPublicKey( - oldPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + oldPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) val newPassKey = RSAUtils.encryptDataByPublicKey( - newPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + newPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) userViewModel.changePassword(oldPassKey, newPassKey) } }).build().show() } - aboutUsLayout.setOnClickListener { + binding.aboutUsLayout.setOnClickListener { requireContext().navigatePageTo() } - updateVersionLayout.setOnClickListener { + binding.updateVersionLayout.setOnClickListener { versionViewModel.updateVersion() } - updateLogLayout.setOnClickListener { + binding.updateLogLayout.setOnClickListener { "尽情期待~".show(requireContext()) } - clearCacheLayout.setOnClickListener { + binding.clearCacheLayout.setOnClickListener { //删除缓存之后在设置缓存大小 LoadingDialogHub.show(requireActivity(), "清理中,请稍后") File(requireContext().cacheDir.path).deleteFile() @@ -161,18 +152,14 @@ override fun onFinish() { LoadingDialogHub.dismiss() - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() } }.start() } - loginOutButton.setOnClickListener { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("退出登录") - .setMessage("确定要退出吗?") - .setNegativeButton("取消") - .setPositiveButton("确定") + binding.loginOutButton.setOnClickListener { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("退出登录") + .setMessage("确定要退出吗?").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -203,13 +190,9 @@ if (BuildConfig.VERSION_NAME == it.version) { "已是最新版本,无需更新".show(requireContext()) } else { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("提示") - .setMessage("有新版本,是否更新?") - .setNegativeButton("稍后再说") - .setPositiveButton("立即下载") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(requireContext()).setTitle("提示") + .setMessage("有新版本,是否更新?").setNegativeButton("稍后再说") + .setPositiveButton("立即下载").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { downloadApk(it.downloadUrl) @@ -244,7 +227,7 @@ updateUserInfo() } //缓存 - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() super.onResume() } @@ -258,9 +241,9 @@ // R.color.mainThemeColor.convertColor(requireContext()) // ) // userImageView.setImageDrawable(roundDrawable) - userNameView.text = userData.name - userPhoneView.text = String.format("电话:${userData.phone}") - userDeptView.text = String.format("部门:${userData.deptName}") + binding.userNameView.text = userData.name + binding.userPhoneView.text = String.format("电话:${userData.phone}") + binding.userDeptView.text = String.format("部门:${userData.deptName}") } private fun downloadApk(url: String?) { @@ -275,7 +258,8 @@ * */ val downloadPath = url!!.appendDownloadUrl() //开始下载 - downloadPath.downloadFile(requireContext().createDownloadFileDir().toString(), + downloadPath.downloadFile( + requireContext().createDownloadFileDir().toString(), object : OnDownloadListener { override fun onDownloadStart(totalBytes: Long) { progressDialog.max = totalBytes.toInt() diff --git a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt index b009850..c0afcc5 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt @@ -1,8 +1,11 @@ package com.casic.smarttube.fragment +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R import com.casic.smarttube.adapter.OverviewGroupListAdapter +import com.casic.smarttube.databinding.FragmentOverviewBinding import com.casic.smarttube.extensions.showEmptyPage import com.casic.smarttube.model.ProjectGroupModel import com.casic.smarttube.view.GroupDeviceActivity @@ -11,25 +14,25 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.widget.dialog.AlertInputDialog -import kotlinx.android.synthetic.main.fragment_overview.groupRecyclerView -import kotlinx.android.synthetic.main.fragment_overview.rightOptionView -import kotlinx.android.synthetic.main.fragment_overview.titleView -import kotlinx.android.synthetic.main.include_empty_view.emptyView -class OverviewFragment : KotlinBaseFragment() { +class OverviewFragment : KotlinBaseFragment() { private lateinit var groupViewModel: ProjectGroupViewModel private var dataBeans: MutableList = ArrayList() private lateinit var groupListAdapter: OverviewGroupListAdapter private var clickedPosition = 0 - override fun initLayoutView(): Int = R.layout.fragment_overview - - override fun setupTopBarLayout() { - titleView.text = "概览" + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentOverviewBinding { + return FragmentOverviewBinding.inflate(inflater, container, false) } - override fun initData() { + override fun setupTopBarLayout() { + binding.titleView.text = "概览" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) } @@ -43,7 +46,7 @@ } override fun initEvent() { - rightOptionView.setOnClickListener { + binding.rightOptionView.setOnClickListener { groupViewModel.obtainProGroupList() "刷新数据中,请稍后".show(requireContext()) } @@ -51,16 +54,16 @@ groupViewModel.groupModel.observe(this) { if (it.code == 200) { if (it.data.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { groupViewModel.obtainProGroupList() } } else { - emptyView!!.hide() + binding.emptyInclude.emptyView.hide() dataBeans.clear() dataBeans = it.data groupListAdapter = OverviewGroupListAdapter(requireContext(), it.data) - groupRecyclerView!!.adapter = groupListAdapter + binding.groupRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : OverviewGroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { diff --git a/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt b/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt index e424721..7f036b0 100644 --- a/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt +++ b/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt @@ -4,8 +4,8 @@ import android.graphics.Color import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.Poi -import com.pengxh.kt.lite.extensions.showBusRouteOnMap -import com.pengxh.kt.lite.extensions.showRouteOnMap +import com.casic.smarttube.extensions.showBusRouteOnMap +import com.casic.smarttube.extensions.showRouteOnMap import com.pengxh.kt.lite.widget.dialog.BottomActionSheet object RouteOnMap { diff --git a/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt b/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt index 65bba6f..598581a 100644 --- a/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt @@ -1,27 +1,29 @@ package com.casic.smarttube.view +import android.os.Bundle import com.casic.smarttube.BuildConfig import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityAboutUsBinding import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_about_us.* -import kotlinx.android.synthetic.main.include_base_title.* -class AboutUsActivity : KotlinBaseActivity() { +class AboutUsActivity : KotlinBaseActivity() { - override fun initLayoutView(): Int = R.layout.activity_about_us + override fun initViewBinding(): ActivityAboutUsBinding { + return ActivityAboutUsBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "关于我们" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "关于我们" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { - versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + override fun initOnCreate(savedInstanceState: Bundle?) { + binding.versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") } override fun observeRequestState() { diff --git a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt index 415f9dd..80b83bd 100644 --- a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.content.Intent import android.graphics.Color +import android.os.Bundle import android.os.CountDownTimer import android.os.Handler import android.text.Editable @@ -15,6 +16,7 @@ import com.amap.api.location.AMapLocation import com.casic.smarttube.R import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.smarttube.databinding.ActivityAddDeviceBinding import com.casic.smarttube.extensions.combineImagePath import com.casic.smarttube.extensions.compressImage import com.casic.smarttube.extensions.isNumber @@ -47,24 +49,9 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_add_device.addDeviceTimeView -import kotlinx.android.synthetic.main.activity_add_device.addImageRecyclerView -import kotlinx.android.synthetic.main.activity_add_device.collectIntervalView -import kotlinx.android.synthetic.main.activity_add_device.deviceCodeView -import kotlinx.android.synthetic.main.activity_add_device.deviceNameView -import kotlinx.android.synthetic.main.activity_add_device.inputLengthView -import kotlinx.android.synthetic.main.activity_add_device.latitudeView -import kotlinx.android.synthetic.main.activity_add_device.locationImageView -import kotlinx.android.synthetic.main.activity_add_device.longitudeView -import kotlinx.android.synthetic.main.activity_add_device.ownerShipView -import kotlinx.android.synthetic.main.activity_add_device.scannerView -import kotlinx.android.synthetic.main.activity_add_device.sceneEditView -import kotlinx.android.synthetic.main.activity_add_device.submitButton -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView import java.io.File -class AddDeviceActivity : KotlinBaseActivity() { +class AddDeviceActivity : KotlinBaseActivity() { private val kTag = "AddDeviceActivity" private lateinit var imageAdapter: EditableImageAdapter @@ -81,21 +68,23 @@ registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK) { val data = result.data!! - longitudeView.text = data.getStringExtra("longitude") - latitudeView.text = data.getStringExtra("latitude") + binding.longitudeView.text = data.getStringExtra("longitude") + binding.latitudeView.text = data.getStringExtra("latitude") } } - override fun initLayoutView(): Int = R.layout.activity_add_device + override fun initViewBinding(): ActivityAddDeviceBinding { + return ActivityAddDeviceBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "添加设备" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "添加设备" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { weakReferenceHandler = WeakReferenceHandler(callback) uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] @@ -119,17 +108,17 @@ override fun initEvent() { val manager = QrManager.getInstance().init(QrConfigCreator.create(this)) - scannerView.setOnClickListener { + binding.scannerView.setOnClickListener { manager.startScan(this) { if (it.content.isNumber()) { - deviceCodeView.setText(it.content) + binding.deviceCodeView.setText(it.content) } else { "设备编号错误,请检查标签".show(context) } } } - ownerShipView.setOnClickListener { + binding.ownerShipView.setOnClickListener { groupViewModel.obtainGroupList() } groupViewModel.groupListModel.observe(this) { @@ -147,19 +136,14 @@ groups.add("自定义") } if (groups.isNotEmpty()) { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(groups) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { if (groups[position] == "自定义") { - AlertInputDialog.Builder() - .setContext(context) - .setTitle("提示") + AlertInputDialog.Builder().setContext(context).setTitle("提示") .setHintMessage("请输入该设备所属项目名,如:项目203") - .setNegativeButton("取消") - .setPositiveButton("确定") + .setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertInputDialog.OnDialogButtonClickListener { override fun onCancelClick() { @@ -167,12 +151,11 @@ } override fun onConfirmClick(value: String) { - ownerShipView.text = value + binding.ownerShipView.text = value } - }) - .build().show() + }).build().show() } else { - ownerShipView.text = groups[position] + binding.ownerShipView.text = groups[position] } } }).build().show() @@ -180,27 +163,22 @@ } //默认频率1min - collectIntervalView.text = frequency[0] - collectIntervalView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + binding.collectIntervalView.text = frequency[0] + binding.collectIntervalView.setOnClickListener { + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(frequency) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { - collectIntervalView.text = frequency[position] + binding.collectIntervalView.text = frequency[position] } }).build().show() } - locationImageView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(context) - .setItemTextColor(Color.BLUE) + binding.locationImageView.setOnClickListener { + BottomActionSheet.Builder().setContext(context).setItemTextColor(Color.BLUE) .setActionItemTitle(arrayListOf("自动定位", "手动选点")) - .setOnActionSheetListener(object : - BottomActionSheet.OnActionSheetListener { + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { when (position) { 0 -> { @@ -210,30 +188,32 @@ override fun onAMapLocationGet(aMapLocation: AMapLocation?) { LoadingDialogHub.dismiss() if (aMapLocation == null) { - longitudeView.text = "定位失败" - latitudeView.text = "定位失败" + binding.longitudeView.text = "定位失败" + binding.latitudeView.text = "定位失败" - longitudeView.setTextColor( + binding.longitudeView.setTextColor( R.color.redTextColor.convertColor(context) ) - latitudeView.setTextColor( + binding.latitudeView.setTextColor( R.color.redTextColor.convertColor(context) ) } else { - longitudeView.text = + binding.longitudeView.text = aMapLocation.longitude.toString() - latitudeView.text = aMapLocation.latitude.toString() + binding.latitudeView.text = + aMapLocation.latitude.toString() - longitudeView.setTextColor( + binding.longitudeView.setTextColor( R.color.mainTextColor.convertColor(context) ) - latitudeView.setTextColor( + binding.latitudeView.setTextColor( R.color.mainTextColor.convertColor(context) ) } } }) } + 1 -> selectLocationLauncher.launch( Intent(context, SelectLocationActivity::class.java) ) @@ -243,7 +223,7 @@ } imageAdapter = EditableImageAdapter(this, 3, 13f) - addImageRecyclerView.adapter = imageAdapter + binding.addImageRecyclerView.adapter = imageAdapter imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { selectPicture() @@ -281,7 +261,7 @@ } } - sceneEditView.addTextChangedListener(object : TextWatcher { + binding.sceneEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { } @@ -292,31 +272,31 @@ override fun afterTextChanged(s: Editable?) { val text = s.toString().trim() - inputLengthView.text = String.format("${text.length}/100") + binding.inputLengthView.text = String.format("${text.length}/100") if (text.length > 100) { - inputLengthView.setTextColor(R.color.redTextColor.convertColor(context)) + binding.inputLengthView.setTextColor(R.color.redTextColor.convertColor(context)) "现场情况字符不能超过100个字符".show(context) } else { - inputLengthView.setTextColor(R.color.subTextColor.convertColor(context)) + binding.inputLengthView.setTextColor(R.color.subTextColor.convertColor(context)) } } }) - addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() + binding.addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() - submitButton.setOnClickListener { - val deviceCode = deviceCodeView.text.toString().trim() + binding.submitButton.setOnClickListener { + val deviceCode = binding.deviceCodeView.text.toString().trim() if (deviceCode.isBlank()) { "请输入设备编号".show(context) return@setOnClickListener } - val ownerShip = ownerShipView.text.toString().trim() + val ownerShip = binding.ownerShipView.text.toString().trim() if (ownerShip.isBlank()) { "请输入设备所属项目".show(context) return@setOnClickListener } - val longitude = longitudeView.text.toString().trim() - val latitude = latitudeView.text.toString().trim() + val longitude = binding.longitudeView.text.toString().trim() + val latitude = binding.latitudeView.text.toString().trim() if (longitude.isBlank() || latitude.isBlank()) { "请先获取当前经纬度".show(context) return@setOnClickListener @@ -329,14 +309,14 @@ ) deviceViewModel.addDevice( deviceCode, - deviceNameView.text.toString(), + binding.deviceNameView.text.toString(), ownerShip, - collectIntervalView.text.toString(), + binding.collectIntervalView.text.toString(), longitude, latitude, imagePaths.reformat(), - sceneEditView.text.toString().trim(), - addDeviceTimeView.text.toString(), + binding.sceneEditView.text.toString().trim(), + binding.addDeviceTimeView.text.toString(), userData.id.toString(), userData.deptId ) @@ -345,16 +325,13 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(listOf("拍照", "相册")) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { when (position) { 0 -> { - PictureSelector.create(context) - .openCamera(SelectMimeType.ofImage()) + PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { if (result == null) { @@ -362,8 +339,7 @@ return } LoadingDialogHub.show( - this@AddDeviceActivity, - "图片上传中,请稍后..." + this@AddDeviceActivity, "图片上传中,请稍后..." ) selectedImages = result analyticalSelectResults(result[0]) @@ -374,14 +350,11 @@ } }) } + 1 -> { - PictureSelector.create(context) - .openGallery(SelectMimeType.ofImage()) - .isGif(false) - .isMaxSelectEnabledMask(true) - .setFilterMinFileSize(100) - .setMaxSelectNum(3) - .isDisplayCamera(false) + PictureSelector.create(context).openGallery(SelectMimeType.ofImage()) + .isGif(false).isMaxSelectEnabledMask(true).setFilterMinFileSize(100) + .setMaxSelectNum(3).isDisplayCamera(false) .setImageEngine(GlideLoadEngine.instance) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { @@ -390,8 +363,7 @@ return } LoadingDialogHub.show( - this@AddDeviceActivity, - "图片上传中,请稍后..." + this@AddDeviceActivity, "图片上传中,请稍后..." ) selectedImages = result // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 diff --git a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt index 3864f16..e4f19a4 100644 --- a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.content.Context +import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,19 +11,20 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityBigImageBinding import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager -import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : KotlinBaseActivity() { +class BigImageActivity : KotlinBaseActivity() { - override fun initLayoutView(): Int = R.layout.activity_big_image + override fun initViewBinding(): ActivityBigImageBinding { + return ActivityBigImageBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { PageNavigationManager.addActivity(this) @@ -30,16 +32,16 @@ ImmersionBar.with(this).statusBarDarkFont(false).init() } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) val urls = intent.getStringArrayListExtra(Constant.BIG_IMAGE_INTENT_DATA_KEY) if (urls == null || urls.size == 0) { return } - pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") - imagePagerView.adapter = BigImageAdapter(this, urls) - imagePagerView.currentItem = index - imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + binding.pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + binding.imagePagerView.adapter = BigImageAdapter(this, urls) + binding.imagePagerView.currentItem = index + binding.imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrollStateChanged(state: Int) { } @@ -53,7 +55,8 @@ } override fun onPageSelected(position: Int) { - pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + binding.pageNumberView.text = + String.format("(" + (position + 1) + "/" + urls.size + ")") } }) } @@ -63,7 +66,7 @@ } override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } + binding.leftBackView.setOnClickListener { this.finish() } } class BigImageAdapter(private var context: Context, imageList: ArrayList) : diff --git a/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt b/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt index 072953f..f036a78 100644 --- a/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.graphics.Color +import android.os.Bundle import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -10,6 +11,7 @@ import com.amap.api.services.geocoder.RegeocodeQuery import com.amap.api.services.geocoder.RegeocodeResult import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityDeviceDetailBinding import com.casic.smarttube.extensions.combineImagePath import com.casic.smarttube.extensions.toSignalImage import com.casic.smarttube.model.DeviceDetailModel @@ -25,51 +27,39 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState -import kotlinx.android.synthetic.main.activity_device_detail.densityView -import kotlinx.android.synthetic.main.activity_device_detail.descriptionView -import kotlinx.android.synthetic.main.activity_device_detail.deviceBatteryView -import kotlinx.android.synthetic.main.activity_device_detail.deviceCodeView -import kotlinx.android.synthetic.main.activity_device_detail.deviceNameView -import kotlinx.android.synthetic.main.activity_device_detail.deviceStateView -import kotlinx.android.synthetic.main.activity_device_detail.imageGridView -import kotlinx.android.synthetic.main.activity_device_detail.lastDataView -import kotlinx.android.synthetic.main.activity_device_detail.leftBackView -import kotlinx.android.synthetic.main.activity_device_detail.locationView -import kotlinx.android.synthetic.main.activity_device_detail.projectGroupView -import kotlinx.android.synthetic.main.activity_device_detail.rightOptionView -import kotlinx.android.synthetic.main.activity_device_detail.signalImageView -import kotlinx.android.synthetic.main.activity_device_detail.titleView -class DeviceDetailActivity : KotlinBaseActivity() { +class DeviceDetailActivity : KotlinBaseActivity() { private val kTag = "DeviceDetailActivity" private lateinit var deviceViewModel: DeviceViewModel private lateinit var deviceModel: DeviceDetailModel.DataModel private val geocoderSearch by lazy { GeocodeSearch(this) } - override fun initLayoutView(): Int = R.layout.activity_device_detail + override fun initViewBinding(): ActivityDeviceDetailBinding { + return ActivityDeviceDetailBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "设备详情" - leftBackView.setOnClickListener { finish() } + binding.titleView.text = "设备详情" + binding.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! - deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] deviceViewModel.obtainDeviceDetail(params[0], params[1]) deviceViewModel.deviceDetailModel.observe(this) { if (it.code == 200) { val device = it.data this.deviceModel = device - deviceCodeView.text = device.devcode - deviceNameView.text = device.deviceName - projectGroupView.text = String.format("项目${device.groupId}") + binding.deviceCodeView.text = device.devcode + binding.deviceNameView.text = device.deviceName + binding.projectGroupView.text = String.format("项目${device.groupId}") if (device.latGaode.isBlank() || device.lngGaode.isBlank()) { - locationView.text = "经纬度异常,无法查看具体位置" + binding.locationView.text = "经纬度异常,无法查看具体位置" } else { val queryParam = RegeocodeQuery( LatLonPoint(device.latGaode.toDouble(), device.lngGaode.toDouble()), @@ -81,7 +71,7 @@ GeocodeSearch.OnGeocodeSearchListener { override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { if (rCode == 1000) { - locationView.text = result?.regeocodeAddress?.formatAddress + binding.locationView.text = result?.regeocodeAddress?.formatAddress } } @@ -90,12 +80,12 @@ } }) } - descriptionView.text = device.descn + binding.descriptionView.text = device.descn if (device.photos.toString().isBlank()) { - imageGridView.visibility = View.GONE + binding.imageGridView.visibility = View.GONE } else { - imageGridView.visibility = View.VISIBLE + binding.imageGridView.visibility = View.VISIBLE //处理图片地址 val urls: ArrayList = ArrayList() val imageArray = device.photos.toString().split(",") @@ -104,10 +94,9 @@ urls.add(path.combineImagePath()) } } - val imageAdapter = ReadOnlyImageAdapter(this) - imageAdapter.setImageList(urls) - imageGridView.adapter = imageAdapter - imageGridView.setOnItemClickListener { _, _, position, _ -> + val imageAdapter = ReadOnlyImageAdapter(this, urls) + binding.imageGridView.adapter = imageAdapter + binding.imageGridView.setOnItemClickListener { _, _, position, _ -> if (urls[position].isEmpty()) { "图片加载失败,无法查看大图".show(this) } else { @@ -119,18 +108,18 @@ val value = device.stregnth.toDouble().toInt() val level = "$value%" val ppm = "${value * 500}ppm" - densityView.text = "$level(相当于$ppm)" + binding.densityView.text = "$level(相当于$ppm)" - lastDataView.text = device.uptime + binding.lastDataView.text = device.uptime if (device.onlineState == "0") { - deviceStateView.text = "离线" - deviceStateView.setTextColor(Color.RED) + binding.deviceStateView.text = "离线" + binding.deviceStateView.setTextColor(Color.RED) } else { - deviceStateView.text = "在线" - deviceStateView.setTextColor(Color.GREEN) + binding.deviceStateView.text = "在线" + binding.deviceStateView.setTextColor(Color.GREEN) } - signalImageView.setBackgroundResource(device.rsrp.toSignalImage()) - deviceBatteryView.text = if (device.cell.isNullOrBlank()) { + binding.signalImageView.setBackgroundResource(device.rsrp.toSignalImage()) + binding.deviceBatteryView.text = if (device.cell.isNullOrBlank()) { "0%" } else { device.cell + "%" @@ -149,7 +138,7 @@ } override fun initEvent() { - rightOptionView.setOnClickListener { + binding.rightOptionView.setOnClickListener { val lat = deviceModel.latGaode.toString() val lng = deviceModel.lngGaode.toString() if (lat.isBlank() || lng.isBlank()) { diff --git a/app/build.gradle b/app/build.gradle index 81dccf6..defbef7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,12 +2,11 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' android { signingConfigs { release { - storeFile file('/Users/a203/Desktop/AndroidProjects/CasicSmartTube/app/CasicSmartTube.jks') + storeFile file('CasicSmartTube.jks') storePassword '123456789' keyAlias 'key0' keyPassword '123456789' @@ -21,8 +20,6 @@ targetSdkVersion 33 versionCode 2 versionName "1.0.1" - - ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -47,6 +44,10 @@ } } + viewBinding { + enabled true + } + applicationVariants.configureEach { variant -> variant.outputs.configureEach { outputFileName = "GT_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" @@ -61,7 +62,7 @@ dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.5' implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.6.1' diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cccda6d..fd9277c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,7 +81,7 @@ + android:value="a6907c8bb931727374aa5fd500cda107" /> (), Handler.Callback, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { private val kTag = "HomePageFragment" private val geocoderSearch by lazy { GeocodeSearch(requireContext()) } - private lateinit var homeView: View private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var easyPopupWindow: EasyPopupWindow private lateinit var aMap: AMap private lateinit var deviceViewModel: DeviceViewModel private lateinit var groupViewModel: ProjectGroupViewModel @@ -83,34 +89,34 @@ * */ private var mapZooms = ArrayList() - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View { - homeView = inflater.inflate(R.layout.fragment_home, container, false) + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } - weakReferenceHandler = WeakReferenceHandler(callback) - val easyPopupWindow = EasyPopupWindow(requireContext()) - easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) - homeView.rightOptionView.setOnClickListener { - easyPopupWindow.setOnPopupWindowClickListener(object : - EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - easyPopupWindow.setBackgroundDrawable(null) - val x: Int = homeView.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(homeView.rightOptionView, x, 0) + override fun setupTopBarLayout() { + + } + + override fun observeRequestState() { + groupViewModel.loadState.observe(this) { state -> + when (state) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") + else -> LoadingDialogHub.dismiss() + } } + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + weakReferenceHandler = WeakReferenceHandler(this) + + easyPopupWindow = EasyPopupWindow(requireContext()) + easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) //初始化vm - deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) - groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) - - observeRequestState() + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java] //默认数据 groupViewModel.obtainProGroupList() @@ -119,12 +125,8 @@ mapZooms.add(13f) initMap(savedInstanceState) - homeView.addDeviceButton.setOnClickListener { - requireContext().navigatePageTo() - } - //数据监听 - deviceViewModel.mapDeviceModel.observe(this, { + deviceViewModel.mapDeviceModel.observe(this) { if (it.code == 200) { if (allMarkerOptions.isNotEmpty()) { allMarkerOptions.clear() @@ -149,10 +151,8 @@ longitudeList.add(longitude) //将所有设备信息转化缓存为Marker点 allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(device.devcode) - .snippet(device.modelName) + MarkerOptions().position(LatLng(latitude, longitude)) + .title(device.devcode).snippet(device.modelName) ) } } @@ -160,8 +160,8 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 13f) } - }) - groupViewModel.groupModel.observe(this, { + } + groupViewModel.groupModel.observe(this) { if (it.code == 200) { val dataRows = it.data when { @@ -170,14 +170,15 @@ dataBeans = dataRows!! isRefresh = false } + else -> { dataBeans = dataRows!! } } weakReferenceHandler.sendEmptyMessage(2022090201) } - }) - groupViewModel.groupDeviceModel.observe(this, { + } + groupViewModel.groupDeviceModel.observe(this) { if (it.code == 200) { val latitudeList: MutableList = ArrayList() val longitudeList: MutableList = ArrayList() @@ -199,22 +200,33 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 16f) } - }) - return homeView + } } - private fun observeRequestState() { - groupViewModel.loadState.observe(this, { state -> - when (state) { - LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") - else -> LoadingDialogHub.dismiss() - } - }) + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + easyPopupWindow.setOnPopupWindowClickListener(object : + EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + easyPopupWindow.setBackgroundDrawable(null) + val x: Int = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + binding.addDeviceButton.setOnClickListener { + requireContext().navigatePageTo() + } } override fun onResume() { super.onResume() - homeView.mapView.onResume() + binding.mapView.onResume() //获取所有设备数据 deviceViewModel.obtainMapDeviceList() @@ -222,16 +234,16 @@ groupViewModel.obtainProGroupList() } - private val callback = Handler.Callback { - if (it.what == 2022090201) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022090201) { if (isRefresh) { groupListAdapter.notifyDataSetChanged() } else { groupListAdapter = GroupListAdapter(requireContext(), dataBeans) - homeView.homeRecyclerView!!.addItemDecoration( + binding.homeRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - homeView.homeRecyclerView!!.adapter = groupListAdapter + binding.homeRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : GroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { @@ -241,12 +253,12 @@ }) } } - true + return true } private fun initMap(savedInstanceState: Bundle?) { - homeView.mapView.onCreate(savedInstanceState) - aMap = homeView.mapView.map + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val uiSettings = aMap.uiSettings uiSettings.isCompassEnabled = true @@ -322,10 +334,7 @@ if (!isInRange) { clustersMarkers.add( GaoDeClusterMarkerView( - requireContext(), - it, - proj, - LocaleConstant.RADIUS_SIZE + requireContext(), it, proj, LocaleConstant.RADIUS_SIZE ) )//相距多少才聚合 } @@ -363,9 +372,7 @@ //绑定数据 val clickedLatLng = marker?.position!! for (device in deviceModels) { - if (clickedLatLng.latitude == device.latGaode!!.toDouble() - && clickedLatLng.longitude == device.lngGaode!!.toDouble() - ) { + if (clickedLatLng.latitude == device.latGaode!!.toDouble() && clickedLatLng.longitude == device.lngGaode!!.toDouble()) { deviceCodeView.text = String.format("设备编号: ${device.devcode}") deviceModelView.text = String.format("设备模型: ${device.modelName}") //获取设备最新浓度信息 @@ -395,8 +402,7 @@ val address = result?.regeocodeAddress?.formatAddress val temp = StringBuilder() if (address!!.length > 16) { - temp.append(address.substring(0, 14)) - .append("\r\n") + temp.append(address.substring(0, 14)).append("\r\n") .append(address.substring(16)) } else { temp.append(address) @@ -430,9 +436,7 @@ } } //查看聚合点,单独开页面导航过去 - BottomActionSheet.Builder() - .setContext(requireContext()) - .setActionItemTitle(multiDevice) + BottomActionSheet.Builder().setContext(requireContext()).setActionItemTitle(multiDevice) .setItemTextColor(Color.BLUE) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { @@ -455,12 +459,8 @@ override fun onInfoWindowClick(p0: Marker?) { if (p0 != null) { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -487,16 +487,16 @@ 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 onDestroy() { super.onDestroy() - homeView.mapView.onDestroy() + binding.mapView.onDestroy() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt index a4e964c..cc35197 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt @@ -4,11 +4,15 @@ import android.content.Intent import android.net.Uri import android.os.Build +import android.os.Bundle import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider import com.casic.smarttube.BuildConfig import com.casic.smarttube.R +import com.casic.smarttube.databinding.FragmentMineBinding import com.casic.smarttube.extensions.appendDownloadUrl import com.casic.smarttube.model.UserDetailModel import com.casic.smarttube.utils.AuthenticationHelper @@ -36,22 +40,10 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.ChangePasswordDialog -import kotlinx.android.synthetic.main.fragment_mine.aboutUsLayout -import kotlinx.android.synthetic.main.fragment_mine.cacheSizeView -import kotlinx.android.synthetic.main.fragment_mine.changePwdLayout -import kotlinx.android.synthetic.main.fragment_mine.clearCacheLayout -import kotlinx.android.synthetic.main.fragment_mine.loginOutButton -import kotlinx.android.synthetic.main.fragment_mine.updateLogLayout -import kotlinx.android.synthetic.main.fragment_mine.updateUserButton -import kotlinx.android.synthetic.main.fragment_mine.updateVersionLayout -import kotlinx.android.synthetic.main.fragment_mine.userDeptView -import kotlinx.android.synthetic.main.fragment_mine.userImageView -import kotlinx.android.synthetic.main.fragment_mine.userNameView -import kotlinx.android.synthetic.main.fragment_mine.userPhoneView import java.io.File import java.nio.charset.StandardCharsets -class MinePageFragment : KotlinBaseFragment() { +class MinePageFragment : KotlinBaseFragment() { private val kTag = "MinePageFragment" private lateinit var userData: UserDetailModel.Data @@ -60,13 +52,17 @@ private lateinit var versionViewModel: VersionViewModel private lateinit var progressDialog: ProgressDialog - override fun initLayoutView(): Int = R.layout.fragment_mine + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentMineBinding { + return FragmentMineBinding.inflate(inflater, container, false) + } override fun setupTopBarLayout() { } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java] @@ -98,8 +94,7 @@ versionViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show( - requireActivity(), - "检查版本中,请稍后" + requireActivity(), "检查版本中,请稍后" ) else -> LoadingDialogHub.dismiss() @@ -108,49 +103,45 @@ } override fun initEvent() { - userImageView.setOnClickListener { + binding.userImageView.setOnClickListener { "尽情期待~".show(requireContext()) } - updateUserButton.setOnClickListener { + binding.updateUserButton.setOnClickListener { LoadingDialogHub.show(requireActivity(), "同步中,请稍后...") userViewModel.obtainUserDetail() } - changePwdLayout.setOnClickListener { - ChangePasswordDialog.Builder() - .setContext(requireContext()) + binding.changePwdLayout.setOnClickListener { + ChangePasswordDialog.Builder().setContext(requireContext()) .setOnDialogButtonClickListener(object : ChangePasswordDialog.OnDialogButtonClickListener { override fun onConfirmClick(oldPwd: String, newPwd: String) { - val publicKey = - RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! val oldPassKey = RSAUtils.encryptDataByPublicKey( - oldPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + oldPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) val newPassKey = RSAUtils.encryptDataByPublicKey( - newPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + newPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) userViewModel.changePassword(oldPassKey, newPassKey) } }).build().show() } - aboutUsLayout.setOnClickListener { + binding.aboutUsLayout.setOnClickListener { requireContext().navigatePageTo() } - updateVersionLayout.setOnClickListener { + binding.updateVersionLayout.setOnClickListener { versionViewModel.updateVersion() } - updateLogLayout.setOnClickListener { + binding.updateLogLayout.setOnClickListener { "尽情期待~".show(requireContext()) } - clearCacheLayout.setOnClickListener { + binding.clearCacheLayout.setOnClickListener { //删除缓存之后在设置缓存大小 LoadingDialogHub.show(requireActivity(), "清理中,请稍后") File(requireContext().cacheDir.path).deleteFile() @@ -161,18 +152,14 @@ override fun onFinish() { LoadingDialogHub.dismiss() - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() } }.start() } - loginOutButton.setOnClickListener { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("退出登录") - .setMessage("确定要退出吗?") - .setNegativeButton("取消") - .setPositiveButton("确定") + binding.loginOutButton.setOnClickListener { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("退出登录") + .setMessage("确定要退出吗?").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -203,13 +190,9 @@ if (BuildConfig.VERSION_NAME == it.version) { "已是最新版本,无需更新".show(requireContext()) } else { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("提示") - .setMessage("有新版本,是否更新?") - .setNegativeButton("稍后再说") - .setPositiveButton("立即下载") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(requireContext()).setTitle("提示") + .setMessage("有新版本,是否更新?").setNegativeButton("稍后再说") + .setPositiveButton("立即下载").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { downloadApk(it.downloadUrl) @@ -244,7 +227,7 @@ updateUserInfo() } //缓存 - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() super.onResume() } @@ -258,9 +241,9 @@ // R.color.mainThemeColor.convertColor(requireContext()) // ) // userImageView.setImageDrawable(roundDrawable) - userNameView.text = userData.name - userPhoneView.text = String.format("电话:${userData.phone}") - userDeptView.text = String.format("部门:${userData.deptName}") + binding.userNameView.text = userData.name + binding.userPhoneView.text = String.format("电话:${userData.phone}") + binding.userDeptView.text = String.format("部门:${userData.deptName}") } private fun downloadApk(url: String?) { @@ -275,7 +258,8 @@ * */ val downloadPath = url!!.appendDownloadUrl() //开始下载 - downloadPath.downloadFile(requireContext().createDownloadFileDir().toString(), + downloadPath.downloadFile( + requireContext().createDownloadFileDir().toString(), object : OnDownloadListener { override fun onDownloadStart(totalBytes: Long) { progressDialog.max = totalBytes.toInt() diff --git a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt index b009850..c0afcc5 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt @@ -1,8 +1,11 @@ package com.casic.smarttube.fragment +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R import com.casic.smarttube.adapter.OverviewGroupListAdapter +import com.casic.smarttube.databinding.FragmentOverviewBinding import com.casic.smarttube.extensions.showEmptyPage import com.casic.smarttube.model.ProjectGroupModel import com.casic.smarttube.view.GroupDeviceActivity @@ -11,25 +14,25 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.widget.dialog.AlertInputDialog -import kotlinx.android.synthetic.main.fragment_overview.groupRecyclerView -import kotlinx.android.synthetic.main.fragment_overview.rightOptionView -import kotlinx.android.synthetic.main.fragment_overview.titleView -import kotlinx.android.synthetic.main.include_empty_view.emptyView -class OverviewFragment : KotlinBaseFragment() { +class OverviewFragment : KotlinBaseFragment() { private lateinit var groupViewModel: ProjectGroupViewModel private var dataBeans: MutableList = ArrayList() private lateinit var groupListAdapter: OverviewGroupListAdapter private var clickedPosition = 0 - override fun initLayoutView(): Int = R.layout.fragment_overview - - override fun setupTopBarLayout() { - titleView.text = "概览" + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentOverviewBinding { + return FragmentOverviewBinding.inflate(inflater, container, false) } - override fun initData() { + override fun setupTopBarLayout() { + binding.titleView.text = "概览" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) } @@ -43,7 +46,7 @@ } override fun initEvent() { - rightOptionView.setOnClickListener { + binding.rightOptionView.setOnClickListener { groupViewModel.obtainProGroupList() "刷新数据中,请稍后".show(requireContext()) } @@ -51,16 +54,16 @@ groupViewModel.groupModel.observe(this) { if (it.code == 200) { if (it.data.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { groupViewModel.obtainProGroupList() } } else { - emptyView!!.hide() + binding.emptyInclude.emptyView.hide() dataBeans.clear() dataBeans = it.data groupListAdapter = OverviewGroupListAdapter(requireContext(), it.data) - groupRecyclerView!!.adapter = groupListAdapter + binding.groupRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : OverviewGroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { diff --git a/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt b/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt index e424721..7f036b0 100644 --- a/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt +++ b/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt @@ -4,8 +4,8 @@ import android.graphics.Color import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.Poi -import com.pengxh.kt.lite.extensions.showBusRouteOnMap -import com.pengxh.kt.lite.extensions.showRouteOnMap +import com.casic.smarttube.extensions.showBusRouteOnMap +import com.casic.smarttube.extensions.showRouteOnMap import com.pengxh.kt.lite.widget.dialog.BottomActionSheet object RouteOnMap { diff --git a/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt b/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt index 65bba6f..598581a 100644 --- a/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt @@ -1,27 +1,29 @@ package com.casic.smarttube.view +import android.os.Bundle import com.casic.smarttube.BuildConfig import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityAboutUsBinding import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_about_us.* -import kotlinx.android.synthetic.main.include_base_title.* -class AboutUsActivity : KotlinBaseActivity() { +class AboutUsActivity : KotlinBaseActivity() { - override fun initLayoutView(): Int = R.layout.activity_about_us + override fun initViewBinding(): ActivityAboutUsBinding { + return ActivityAboutUsBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "关于我们" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "关于我们" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { - versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + override fun initOnCreate(savedInstanceState: Bundle?) { + binding.versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") } override fun observeRequestState() { diff --git a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt index 415f9dd..80b83bd 100644 --- a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.content.Intent import android.graphics.Color +import android.os.Bundle import android.os.CountDownTimer import android.os.Handler import android.text.Editable @@ -15,6 +16,7 @@ import com.amap.api.location.AMapLocation import com.casic.smarttube.R import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.smarttube.databinding.ActivityAddDeviceBinding import com.casic.smarttube.extensions.combineImagePath import com.casic.smarttube.extensions.compressImage import com.casic.smarttube.extensions.isNumber @@ -47,24 +49,9 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_add_device.addDeviceTimeView -import kotlinx.android.synthetic.main.activity_add_device.addImageRecyclerView -import kotlinx.android.synthetic.main.activity_add_device.collectIntervalView -import kotlinx.android.synthetic.main.activity_add_device.deviceCodeView -import kotlinx.android.synthetic.main.activity_add_device.deviceNameView -import kotlinx.android.synthetic.main.activity_add_device.inputLengthView -import kotlinx.android.synthetic.main.activity_add_device.latitudeView -import kotlinx.android.synthetic.main.activity_add_device.locationImageView -import kotlinx.android.synthetic.main.activity_add_device.longitudeView -import kotlinx.android.synthetic.main.activity_add_device.ownerShipView -import kotlinx.android.synthetic.main.activity_add_device.scannerView -import kotlinx.android.synthetic.main.activity_add_device.sceneEditView -import kotlinx.android.synthetic.main.activity_add_device.submitButton -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView import java.io.File -class AddDeviceActivity : KotlinBaseActivity() { +class AddDeviceActivity : KotlinBaseActivity() { private val kTag = "AddDeviceActivity" private lateinit var imageAdapter: EditableImageAdapter @@ -81,21 +68,23 @@ registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK) { val data = result.data!! - longitudeView.text = data.getStringExtra("longitude") - latitudeView.text = data.getStringExtra("latitude") + binding.longitudeView.text = data.getStringExtra("longitude") + binding.latitudeView.text = data.getStringExtra("latitude") } } - override fun initLayoutView(): Int = R.layout.activity_add_device + override fun initViewBinding(): ActivityAddDeviceBinding { + return ActivityAddDeviceBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "添加设备" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "添加设备" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { weakReferenceHandler = WeakReferenceHandler(callback) uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] @@ -119,17 +108,17 @@ override fun initEvent() { val manager = QrManager.getInstance().init(QrConfigCreator.create(this)) - scannerView.setOnClickListener { + binding.scannerView.setOnClickListener { manager.startScan(this) { if (it.content.isNumber()) { - deviceCodeView.setText(it.content) + binding.deviceCodeView.setText(it.content) } else { "设备编号错误,请检查标签".show(context) } } } - ownerShipView.setOnClickListener { + binding.ownerShipView.setOnClickListener { groupViewModel.obtainGroupList() } groupViewModel.groupListModel.observe(this) { @@ -147,19 +136,14 @@ groups.add("自定义") } if (groups.isNotEmpty()) { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(groups) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { if (groups[position] == "自定义") { - AlertInputDialog.Builder() - .setContext(context) - .setTitle("提示") + AlertInputDialog.Builder().setContext(context).setTitle("提示") .setHintMessage("请输入该设备所属项目名,如:项目203") - .setNegativeButton("取消") - .setPositiveButton("确定") + .setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertInputDialog.OnDialogButtonClickListener { override fun onCancelClick() { @@ -167,12 +151,11 @@ } override fun onConfirmClick(value: String) { - ownerShipView.text = value + binding.ownerShipView.text = value } - }) - .build().show() + }).build().show() } else { - ownerShipView.text = groups[position] + binding.ownerShipView.text = groups[position] } } }).build().show() @@ -180,27 +163,22 @@ } //默认频率1min - collectIntervalView.text = frequency[0] - collectIntervalView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + binding.collectIntervalView.text = frequency[0] + binding.collectIntervalView.setOnClickListener { + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(frequency) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { - collectIntervalView.text = frequency[position] + binding.collectIntervalView.text = frequency[position] } }).build().show() } - locationImageView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(context) - .setItemTextColor(Color.BLUE) + binding.locationImageView.setOnClickListener { + BottomActionSheet.Builder().setContext(context).setItemTextColor(Color.BLUE) .setActionItemTitle(arrayListOf("自动定位", "手动选点")) - .setOnActionSheetListener(object : - BottomActionSheet.OnActionSheetListener { + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { when (position) { 0 -> { @@ -210,30 +188,32 @@ override fun onAMapLocationGet(aMapLocation: AMapLocation?) { LoadingDialogHub.dismiss() if (aMapLocation == null) { - longitudeView.text = "定位失败" - latitudeView.text = "定位失败" + binding.longitudeView.text = "定位失败" + binding.latitudeView.text = "定位失败" - longitudeView.setTextColor( + binding.longitudeView.setTextColor( R.color.redTextColor.convertColor(context) ) - latitudeView.setTextColor( + binding.latitudeView.setTextColor( R.color.redTextColor.convertColor(context) ) } else { - longitudeView.text = + binding.longitudeView.text = aMapLocation.longitude.toString() - latitudeView.text = aMapLocation.latitude.toString() + binding.latitudeView.text = + aMapLocation.latitude.toString() - longitudeView.setTextColor( + binding.longitudeView.setTextColor( R.color.mainTextColor.convertColor(context) ) - latitudeView.setTextColor( + binding.latitudeView.setTextColor( R.color.mainTextColor.convertColor(context) ) } } }) } + 1 -> selectLocationLauncher.launch( Intent(context, SelectLocationActivity::class.java) ) @@ -243,7 +223,7 @@ } imageAdapter = EditableImageAdapter(this, 3, 13f) - addImageRecyclerView.adapter = imageAdapter + binding.addImageRecyclerView.adapter = imageAdapter imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { selectPicture() @@ -281,7 +261,7 @@ } } - sceneEditView.addTextChangedListener(object : TextWatcher { + binding.sceneEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { } @@ -292,31 +272,31 @@ override fun afterTextChanged(s: Editable?) { val text = s.toString().trim() - inputLengthView.text = String.format("${text.length}/100") + binding.inputLengthView.text = String.format("${text.length}/100") if (text.length > 100) { - inputLengthView.setTextColor(R.color.redTextColor.convertColor(context)) + binding.inputLengthView.setTextColor(R.color.redTextColor.convertColor(context)) "现场情况字符不能超过100个字符".show(context) } else { - inputLengthView.setTextColor(R.color.subTextColor.convertColor(context)) + binding.inputLengthView.setTextColor(R.color.subTextColor.convertColor(context)) } } }) - addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() + binding.addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() - submitButton.setOnClickListener { - val deviceCode = deviceCodeView.text.toString().trim() + binding.submitButton.setOnClickListener { + val deviceCode = binding.deviceCodeView.text.toString().trim() if (deviceCode.isBlank()) { "请输入设备编号".show(context) return@setOnClickListener } - val ownerShip = ownerShipView.text.toString().trim() + val ownerShip = binding.ownerShipView.text.toString().trim() if (ownerShip.isBlank()) { "请输入设备所属项目".show(context) return@setOnClickListener } - val longitude = longitudeView.text.toString().trim() - val latitude = latitudeView.text.toString().trim() + val longitude = binding.longitudeView.text.toString().trim() + val latitude = binding.latitudeView.text.toString().trim() if (longitude.isBlank() || latitude.isBlank()) { "请先获取当前经纬度".show(context) return@setOnClickListener @@ -329,14 +309,14 @@ ) deviceViewModel.addDevice( deviceCode, - deviceNameView.text.toString(), + binding.deviceNameView.text.toString(), ownerShip, - collectIntervalView.text.toString(), + binding.collectIntervalView.text.toString(), longitude, latitude, imagePaths.reformat(), - sceneEditView.text.toString().trim(), - addDeviceTimeView.text.toString(), + binding.sceneEditView.text.toString().trim(), + binding.addDeviceTimeView.text.toString(), userData.id.toString(), userData.deptId ) @@ -345,16 +325,13 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(listOf("拍照", "相册")) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { when (position) { 0 -> { - PictureSelector.create(context) - .openCamera(SelectMimeType.ofImage()) + PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { if (result == null) { @@ -362,8 +339,7 @@ return } LoadingDialogHub.show( - this@AddDeviceActivity, - "图片上传中,请稍后..." + this@AddDeviceActivity, "图片上传中,请稍后..." ) selectedImages = result analyticalSelectResults(result[0]) @@ -374,14 +350,11 @@ } }) } + 1 -> { - PictureSelector.create(context) - .openGallery(SelectMimeType.ofImage()) - .isGif(false) - .isMaxSelectEnabledMask(true) - .setFilterMinFileSize(100) - .setMaxSelectNum(3) - .isDisplayCamera(false) + PictureSelector.create(context).openGallery(SelectMimeType.ofImage()) + .isGif(false).isMaxSelectEnabledMask(true).setFilterMinFileSize(100) + .setMaxSelectNum(3).isDisplayCamera(false) .setImageEngine(GlideLoadEngine.instance) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { @@ -390,8 +363,7 @@ return } LoadingDialogHub.show( - this@AddDeviceActivity, - "图片上传中,请稍后..." + this@AddDeviceActivity, "图片上传中,请稍后..." ) selectedImages = result // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 diff --git a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt index 3864f16..e4f19a4 100644 --- a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.content.Context +import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,19 +11,20 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityBigImageBinding import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager -import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : KotlinBaseActivity() { +class BigImageActivity : KotlinBaseActivity() { - override fun initLayoutView(): Int = R.layout.activity_big_image + override fun initViewBinding(): ActivityBigImageBinding { + return ActivityBigImageBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { PageNavigationManager.addActivity(this) @@ -30,16 +32,16 @@ ImmersionBar.with(this).statusBarDarkFont(false).init() } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) val urls = intent.getStringArrayListExtra(Constant.BIG_IMAGE_INTENT_DATA_KEY) if (urls == null || urls.size == 0) { return } - pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") - imagePagerView.adapter = BigImageAdapter(this, urls) - imagePagerView.currentItem = index - imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + binding.pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + binding.imagePagerView.adapter = BigImageAdapter(this, urls) + binding.imagePagerView.currentItem = index + binding.imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrollStateChanged(state: Int) { } @@ -53,7 +55,8 @@ } override fun onPageSelected(position: Int) { - pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + binding.pageNumberView.text = + String.format("(" + (position + 1) + "/" + urls.size + ")") } }) } @@ -63,7 +66,7 @@ } override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } + binding.leftBackView.setOnClickListener { this.finish() } } class BigImageAdapter(private var context: Context, imageList: ArrayList) : diff --git a/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt b/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt index 072953f..f036a78 100644 --- a/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.graphics.Color +import android.os.Bundle import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -10,6 +11,7 @@ import com.amap.api.services.geocoder.RegeocodeQuery import com.amap.api.services.geocoder.RegeocodeResult import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityDeviceDetailBinding import com.casic.smarttube.extensions.combineImagePath import com.casic.smarttube.extensions.toSignalImage import com.casic.smarttube.model.DeviceDetailModel @@ -25,51 +27,39 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState -import kotlinx.android.synthetic.main.activity_device_detail.densityView -import kotlinx.android.synthetic.main.activity_device_detail.descriptionView -import kotlinx.android.synthetic.main.activity_device_detail.deviceBatteryView -import kotlinx.android.synthetic.main.activity_device_detail.deviceCodeView -import kotlinx.android.synthetic.main.activity_device_detail.deviceNameView -import kotlinx.android.synthetic.main.activity_device_detail.deviceStateView -import kotlinx.android.synthetic.main.activity_device_detail.imageGridView -import kotlinx.android.synthetic.main.activity_device_detail.lastDataView -import kotlinx.android.synthetic.main.activity_device_detail.leftBackView -import kotlinx.android.synthetic.main.activity_device_detail.locationView -import kotlinx.android.synthetic.main.activity_device_detail.projectGroupView -import kotlinx.android.synthetic.main.activity_device_detail.rightOptionView -import kotlinx.android.synthetic.main.activity_device_detail.signalImageView -import kotlinx.android.synthetic.main.activity_device_detail.titleView -class DeviceDetailActivity : KotlinBaseActivity() { +class DeviceDetailActivity : KotlinBaseActivity() { private val kTag = "DeviceDetailActivity" private lateinit var deviceViewModel: DeviceViewModel private lateinit var deviceModel: DeviceDetailModel.DataModel private val geocoderSearch by lazy { GeocodeSearch(this) } - override fun initLayoutView(): Int = R.layout.activity_device_detail + override fun initViewBinding(): ActivityDeviceDetailBinding { + return ActivityDeviceDetailBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "设备详情" - leftBackView.setOnClickListener { finish() } + binding.titleView.text = "设备详情" + binding.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! - deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] deviceViewModel.obtainDeviceDetail(params[0], params[1]) deviceViewModel.deviceDetailModel.observe(this) { if (it.code == 200) { val device = it.data this.deviceModel = device - deviceCodeView.text = device.devcode - deviceNameView.text = device.deviceName - projectGroupView.text = String.format("项目${device.groupId}") + binding.deviceCodeView.text = device.devcode + binding.deviceNameView.text = device.deviceName + binding.projectGroupView.text = String.format("项目${device.groupId}") if (device.latGaode.isBlank() || device.lngGaode.isBlank()) { - locationView.text = "经纬度异常,无法查看具体位置" + binding.locationView.text = "经纬度异常,无法查看具体位置" } else { val queryParam = RegeocodeQuery( LatLonPoint(device.latGaode.toDouble(), device.lngGaode.toDouble()), @@ -81,7 +71,7 @@ GeocodeSearch.OnGeocodeSearchListener { override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { if (rCode == 1000) { - locationView.text = result?.regeocodeAddress?.formatAddress + binding.locationView.text = result?.regeocodeAddress?.formatAddress } } @@ -90,12 +80,12 @@ } }) } - descriptionView.text = device.descn + binding.descriptionView.text = device.descn if (device.photos.toString().isBlank()) { - imageGridView.visibility = View.GONE + binding.imageGridView.visibility = View.GONE } else { - imageGridView.visibility = View.VISIBLE + binding.imageGridView.visibility = View.VISIBLE //处理图片地址 val urls: ArrayList = ArrayList() val imageArray = device.photos.toString().split(",") @@ -104,10 +94,9 @@ urls.add(path.combineImagePath()) } } - val imageAdapter = ReadOnlyImageAdapter(this) - imageAdapter.setImageList(urls) - imageGridView.adapter = imageAdapter - imageGridView.setOnItemClickListener { _, _, position, _ -> + val imageAdapter = ReadOnlyImageAdapter(this, urls) + binding.imageGridView.adapter = imageAdapter + binding.imageGridView.setOnItemClickListener { _, _, position, _ -> if (urls[position].isEmpty()) { "图片加载失败,无法查看大图".show(this) } else { @@ -119,18 +108,18 @@ val value = device.stregnth.toDouble().toInt() val level = "$value%" val ppm = "${value * 500}ppm" - densityView.text = "$level(相当于$ppm)" + binding.densityView.text = "$level(相当于$ppm)" - lastDataView.text = device.uptime + binding.lastDataView.text = device.uptime if (device.onlineState == "0") { - deviceStateView.text = "离线" - deviceStateView.setTextColor(Color.RED) + binding.deviceStateView.text = "离线" + binding.deviceStateView.setTextColor(Color.RED) } else { - deviceStateView.text = "在线" - deviceStateView.setTextColor(Color.GREEN) + binding.deviceStateView.text = "在线" + binding.deviceStateView.setTextColor(Color.GREEN) } - signalImageView.setBackgroundResource(device.rsrp.toSignalImage()) - deviceBatteryView.text = if (device.cell.isNullOrBlank()) { + binding.signalImageView.setBackgroundResource(device.rsrp.toSignalImage()) + binding.deviceBatteryView.text = if (device.cell.isNullOrBlank()) { "0%" } else { device.cell + "%" @@ -149,7 +138,7 @@ } override fun initEvent() { - rightOptionView.setOnClickListener { + binding.rightOptionView.setOnClickListener { val lat = deviceModel.latGaode.toString() val lng = deviceModel.lngGaode.toString() if (lat.isBlank() || lng.isBlank()) { diff --git a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt index 0ae8862..ba52ab8 100644 --- a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.content.Context +import android.os.Bundle import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -8,6 +9,7 @@ import androidx.recyclerview.widget.RecyclerView import com.casic.smarttube.R import com.casic.smarttube.adapter.DeviceListAdapter +import com.casic.smarttube.databinding.ActivityGroupDeviceBinding import com.casic.smarttube.extensions.showEmptyPage import com.casic.smarttube.model.DeviceListModel import com.casic.smarttube.utils.LoadingDialogHub @@ -28,14 +30,8 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.qmuiteam.qmui.recyclerView.QMUIRVItemSwipeAction import com.qmuiteam.qmui.recyclerView.QMUISwipeAction -import kotlinx.android.synthetic.main.activity_group_device.groupDeviceLayout -import kotlinx.android.synthetic.main.activity_group_device.groupDeviceView -import kotlinx.android.synthetic.main.activity_group_device.leftBackView -import kotlinx.android.synthetic.main.activity_group_device.rightOptionView -import kotlinx.android.synthetic.main.activity_group_device.titleView -import kotlinx.android.synthetic.main.include_empty_view.emptyView -class GroupDeviceActivity : KotlinBaseActivity() { +class GroupDeviceActivity : KotlinBaseActivity() { private lateinit var groupId: String private lateinit var weakReferenceHandler: WeakReferenceHandler @@ -51,18 +47,19 @@ private var clickedPosition = 0 private var isDeleteAll = false - override fun initLayoutView(): Int = R.layout.activity_group_device + override fun initViewBinding(): ActivityGroupDeviceBinding { + return ActivityGroupDeviceBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - leftBackView.setOnClickListener { finish() } - rightOptionView.setOnClickListener { + binding.leftBackView.setOnClickListener { finish() } + binding.rightOptionView.setOnClickListener { //改为Popup val easyPopupWindow = EasyPopupWindow(this) easyPopupWindow.setPopupMenuItem( - LocaleConstant.DEVICE_OPERATE_IMAGES, - LocaleConstant.DEVICE_OPERATE_TITLES + LocaleConstant.DEVICE_OPERATE_IMAGES, LocaleConstant.DEVICE_OPERATE_TITLES ) easyPopupWindow.setOnPopupWindowClickListener(object : EasyPopupWindow.OnPopupWindowClickListener { @@ -77,13 +74,11 @@ pageIndex = 1 obtainDeviceListByPage() } + 1 -> { - AlertControlDialog.Builder() - .setContext(context) - .setTitle("提示") + AlertControlDialog.Builder().setContext(context).setTitle("提示") .setMessage("删除后将无法恢复,是否继续?") - .setNegativeButton("容我想想") - .setPositiveButton("已经想好") + .setNegativeButton("容我想想").setPositiveButton("已经想好") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onCancelClick() { @@ -103,13 +98,11 @@ } }).build().show() } + 2 -> { - MultiSelectDialog.Builder() - .setContext(this@GroupDeviceActivity) - .setTitle("选择设备") - .setDataSource(dataBeans) - .setNegativeButton("取消") - .setPositiveButton("选好了") + MultiSelectDialog.Builder().setContext(this@GroupDeviceActivity) + .setTitle("选择设备").setDataSource(dataBeans) + .setNegativeButton("取消").setPositiveButton("选好了") .setOnDialogButtonClickListener(object : MultiSelectDialog.OnDialogButtonClickListener { override fun onConfirmClick(selectedModels: MutableList) { @@ -126,21 +119,20 @@ override fun onCancelClick() { } - }) - .build().show() + }).build().show() } } } }) easyPopupWindow.setBackgroundDrawable(null) - val x: Int = rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(rightOptionView, x, 0) + val x: Int = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { groupId = intent.getStringExtra(Constant.INTENT_PARAM)!! - titleView.text = String.format(groupId + "项目设备列表") + binding.titleView.text = String.format(groupId + "项目设备列表") weakReferenceHandler = WeakReferenceHandler(callback) groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java] deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] @@ -157,13 +149,13 @@ } override fun initEvent() { - groupDeviceLayout.setOnRefreshListener { + binding.groupDeviceLayout.setOnRefreshListener { isRefresh = true //刷新之后页码重置 pageIndex = 1 obtainDeviceListByPage() } - groupDeviceLayout.setOnLoadMoreListener { + binding.groupDeviceLayout.setOnLoadMoreListener { isLoadMore = true pageIndex++ obtainDeviceListByPage() @@ -176,7 +168,7 @@ isRefresh -> { dataBeans.clear() dataBeans = dataRows!! - groupDeviceLayout.finishRefresh() + binding.groupDeviceLayout.finishRefresh() isRefresh = false } @@ -185,7 +177,7 @@ "到底了,别拉了".show(this) } dataBeans.addAll(dataRows!!) - groupDeviceLayout.finishLoadMore() + binding.groupDeviceLayout.finishLoadMore() isLoadMore = false } @@ -211,7 +203,7 @@ ) } if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { pageIndex = 1 obtainDeviceListByPage() } @@ -230,15 +222,15 @@ deviceAdapter.notifyDataSetChanged() } else { if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { pageIndex = 1 obtainDeviceListByPage() } } else { - emptyView!!.hide() + binding.emptyInclude.emptyView.hide() deviceAdapter = DeviceListAdapter(this, dataBeans) //绑定侧滑事件 - swipeAction.attachToRecyclerView(groupDeviceView) + swipeAction.attachToRecyclerView(binding.groupDeviceView) val linearLayoutManager = object : LinearLayoutManager(this) { override fun generateDefaultLayoutParams(): RecyclerView.LayoutParams { return RecyclerView.LayoutParams( @@ -247,8 +239,8 @@ ) } } - groupDeviceView.layoutManager = linearLayoutManager - groupDeviceView.adapter = deviceAdapter + binding.groupDeviceView.layoutManager = linearLayoutManager + binding.groupDeviceView.adapter = deviceAdapter deviceAdapter.setOnItemClickListener(object : DeviceListAdapter.OnItemClickListener { override fun onClicked(position: Int) { @@ -311,13 +303,9 @@ }) private fun deleteItem(adapterPosition: Int) { - AlertControlDialog.Builder() - .setContext(this) - .setTitle("提示") - .setMessage("删除后将无法恢复,是否继续?") - .setNegativeButton("容我想想") - .setPositiveButton("已经想好") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(this).setTitle("提示") + .setMessage("删除后将无法恢复,是否继续?").setNegativeButton("容我想想") + .setPositiveButton("已经想好").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onCancelClick() { diff --git a/app/build.gradle b/app/build.gradle index 81dccf6..defbef7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,12 +2,11 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' android { signingConfigs { release { - storeFile file('/Users/a203/Desktop/AndroidProjects/CasicSmartTube/app/CasicSmartTube.jks') + storeFile file('CasicSmartTube.jks') storePassword '123456789' keyAlias 'key0' keyPassword '123456789' @@ -21,8 +20,6 @@ targetSdkVersion 33 versionCode 2 versionName "1.0.1" - - ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -47,6 +44,10 @@ } } + viewBinding { + enabled true + } + applicationVariants.configureEach { variant -> variant.outputs.configureEach { outputFileName = "GT_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" @@ -61,7 +62,7 @@ dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.5' implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.6.1' diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cccda6d..fd9277c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,7 +81,7 @@ + android:value="a6907c8bb931727374aa5fd500cda107" /> (), Handler.Callback, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { private val kTag = "HomePageFragment" private val geocoderSearch by lazy { GeocodeSearch(requireContext()) } - private lateinit var homeView: View private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var easyPopupWindow: EasyPopupWindow private lateinit var aMap: AMap private lateinit var deviceViewModel: DeviceViewModel private lateinit var groupViewModel: ProjectGroupViewModel @@ -83,34 +89,34 @@ * */ private var mapZooms = ArrayList() - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View { - homeView = inflater.inflate(R.layout.fragment_home, container, false) + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } - weakReferenceHandler = WeakReferenceHandler(callback) - val easyPopupWindow = EasyPopupWindow(requireContext()) - easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) - homeView.rightOptionView.setOnClickListener { - easyPopupWindow.setOnPopupWindowClickListener(object : - EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - easyPopupWindow.setBackgroundDrawable(null) - val x: Int = homeView.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(homeView.rightOptionView, x, 0) + override fun setupTopBarLayout() { + + } + + override fun observeRequestState() { + groupViewModel.loadState.observe(this) { state -> + when (state) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") + else -> LoadingDialogHub.dismiss() + } } + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + weakReferenceHandler = WeakReferenceHandler(this) + + easyPopupWindow = EasyPopupWindow(requireContext()) + easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) //初始化vm - deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) - groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) - - observeRequestState() + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java] //默认数据 groupViewModel.obtainProGroupList() @@ -119,12 +125,8 @@ mapZooms.add(13f) initMap(savedInstanceState) - homeView.addDeviceButton.setOnClickListener { - requireContext().navigatePageTo() - } - //数据监听 - deviceViewModel.mapDeviceModel.observe(this, { + deviceViewModel.mapDeviceModel.observe(this) { if (it.code == 200) { if (allMarkerOptions.isNotEmpty()) { allMarkerOptions.clear() @@ -149,10 +151,8 @@ longitudeList.add(longitude) //将所有设备信息转化缓存为Marker点 allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(device.devcode) - .snippet(device.modelName) + MarkerOptions().position(LatLng(latitude, longitude)) + .title(device.devcode).snippet(device.modelName) ) } } @@ -160,8 +160,8 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 13f) } - }) - groupViewModel.groupModel.observe(this, { + } + groupViewModel.groupModel.observe(this) { if (it.code == 200) { val dataRows = it.data when { @@ -170,14 +170,15 @@ dataBeans = dataRows!! isRefresh = false } + else -> { dataBeans = dataRows!! } } weakReferenceHandler.sendEmptyMessage(2022090201) } - }) - groupViewModel.groupDeviceModel.observe(this, { + } + groupViewModel.groupDeviceModel.observe(this) { if (it.code == 200) { val latitudeList: MutableList = ArrayList() val longitudeList: MutableList = ArrayList() @@ -199,22 +200,33 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 16f) } - }) - return homeView + } } - private fun observeRequestState() { - groupViewModel.loadState.observe(this, { state -> - when (state) { - LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") - else -> LoadingDialogHub.dismiss() - } - }) + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + easyPopupWindow.setOnPopupWindowClickListener(object : + EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + easyPopupWindow.setBackgroundDrawable(null) + val x: Int = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + binding.addDeviceButton.setOnClickListener { + requireContext().navigatePageTo() + } } override fun onResume() { super.onResume() - homeView.mapView.onResume() + binding.mapView.onResume() //获取所有设备数据 deviceViewModel.obtainMapDeviceList() @@ -222,16 +234,16 @@ groupViewModel.obtainProGroupList() } - private val callback = Handler.Callback { - if (it.what == 2022090201) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022090201) { if (isRefresh) { groupListAdapter.notifyDataSetChanged() } else { groupListAdapter = GroupListAdapter(requireContext(), dataBeans) - homeView.homeRecyclerView!!.addItemDecoration( + binding.homeRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - homeView.homeRecyclerView!!.adapter = groupListAdapter + binding.homeRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : GroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { @@ -241,12 +253,12 @@ }) } } - true + return true } private fun initMap(savedInstanceState: Bundle?) { - homeView.mapView.onCreate(savedInstanceState) - aMap = homeView.mapView.map + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val uiSettings = aMap.uiSettings uiSettings.isCompassEnabled = true @@ -322,10 +334,7 @@ if (!isInRange) { clustersMarkers.add( GaoDeClusterMarkerView( - requireContext(), - it, - proj, - LocaleConstant.RADIUS_SIZE + requireContext(), it, proj, LocaleConstant.RADIUS_SIZE ) )//相距多少才聚合 } @@ -363,9 +372,7 @@ //绑定数据 val clickedLatLng = marker?.position!! for (device in deviceModels) { - if (clickedLatLng.latitude == device.latGaode!!.toDouble() - && clickedLatLng.longitude == device.lngGaode!!.toDouble() - ) { + if (clickedLatLng.latitude == device.latGaode!!.toDouble() && clickedLatLng.longitude == device.lngGaode!!.toDouble()) { deviceCodeView.text = String.format("设备编号: ${device.devcode}") deviceModelView.text = String.format("设备模型: ${device.modelName}") //获取设备最新浓度信息 @@ -395,8 +402,7 @@ val address = result?.regeocodeAddress?.formatAddress val temp = StringBuilder() if (address!!.length > 16) { - temp.append(address.substring(0, 14)) - .append("\r\n") + temp.append(address.substring(0, 14)).append("\r\n") .append(address.substring(16)) } else { temp.append(address) @@ -430,9 +436,7 @@ } } //查看聚合点,单独开页面导航过去 - BottomActionSheet.Builder() - .setContext(requireContext()) - .setActionItemTitle(multiDevice) + BottomActionSheet.Builder().setContext(requireContext()).setActionItemTitle(multiDevice) .setItemTextColor(Color.BLUE) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { @@ -455,12 +459,8 @@ override fun onInfoWindowClick(p0: Marker?) { if (p0 != null) { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -487,16 +487,16 @@ 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 onDestroy() { super.onDestroy() - homeView.mapView.onDestroy() + binding.mapView.onDestroy() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt index a4e964c..cc35197 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt @@ -4,11 +4,15 @@ import android.content.Intent import android.net.Uri import android.os.Build +import android.os.Bundle import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider import com.casic.smarttube.BuildConfig import com.casic.smarttube.R +import com.casic.smarttube.databinding.FragmentMineBinding import com.casic.smarttube.extensions.appendDownloadUrl import com.casic.smarttube.model.UserDetailModel import com.casic.smarttube.utils.AuthenticationHelper @@ -36,22 +40,10 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.ChangePasswordDialog -import kotlinx.android.synthetic.main.fragment_mine.aboutUsLayout -import kotlinx.android.synthetic.main.fragment_mine.cacheSizeView -import kotlinx.android.synthetic.main.fragment_mine.changePwdLayout -import kotlinx.android.synthetic.main.fragment_mine.clearCacheLayout -import kotlinx.android.synthetic.main.fragment_mine.loginOutButton -import kotlinx.android.synthetic.main.fragment_mine.updateLogLayout -import kotlinx.android.synthetic.main.fragment_mine.updateUserButton -import kotlinx.android.synthetic.main.fragment_mine.updateVersionLayout -import kotlinx.android.synthetic.main.fragment_mine.userDeptView -import kotlinx.android.synthetic.main.fragment_mine.userImageView -import kotlinx.android.synthetic.main.fragment_mine.userNameView -import kotlinx.android.synthetic.main.fragment_mine.userPhoneView import java.io.File import java.nio.charset.StandardCharsets -class MinePageFragment : KotlinBaseFragment() { +class MinePageFragment : KotlinBaseFragment() { private val kTag = "MinePageFragment" private lateinit var userData: UserDetailModel.Data @@ -60,13 +52,17 @@ private lateinit var versionViewModel: VersionViewModel private lateinit var progressDialog: ProgressDialog - override fun initLayoutView(): Int = R.layout.fragment_mine + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentMineBinding { + return FragmentMineBinding.inflate(inflater, container, false) + } override fun setupTopBarLayout() { } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java] @@ -98,8 +94,7 @@ versionViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show( - requireActivity(), - "检查版本中,请稍后" + requireActivity(), "检查版本中,请稍后" ) else -> LoadingDialogHub.dismiss() @@ -108,49 +103,45 @@ } override fun initEvent() { - userImageView.setOnClickListener { + binding.userImageView.setOnClickListener { "尽情期待~".show(requireContext()) } - updateUserButton.setOnClickListener { + binding.updateUserButton.setOnClickListener { LoadingDialogHub.show(requireActivity(), "同步中,请稍后...") userViewModel.obtainUserDetail() } - changePwdLayout.setOnClickListener { - ChangePasswordDialog.Builder() - .setContext(requireContext()) + binding.changePwdLayout.setOnClickListener { + ChangePasswordDialog.Builder().setContext(requireContext()) .setOnDialogButtonClickListener(object : ChangePasswordDialog.OnDialogButtonClickListener { override fun onConfirmClick(oldPwd: String, newPwd: String) { - val publicKey = - RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! val oldPassKey = RSAUtils.encryptDataByPublicKey( - oldPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + oldPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) val newPassKey = RSAUtils.encryptDataByPublicKey( - newPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + newPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) userViewModel.changePassword(oldPassKey, newPassKey) } }).build().show() } - aboutUsLayout.setOnClickListener { + binding.aboutUsLayout.setOnClickListener { requireContext().navigatePageTo() } - updateVersionLayout.setOnClickListener { + binding.updateVersionLayout.setOnClickListener { versionViewModel.updateVersion() } - updateLogLayout.setOnClickListener { + binding.updateLogLayout.setOnClickListener { "尽情期待~".show(requireContext()) } - clearCacheLayout.setOnClickListener { + binding.clearCacheLayout.setOnClickListener { //删除缓存之后在设置缓存大小 LoadingDialogHub.show(requireActivity(), "清理中,请稍后") File(requireContext().cacheDir.path).deleteFile() @@ -161,18 +152,14 @@ override fun onFinish() { LoadingDialogHub.dismiss() - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() } }.start() } - loginOutButton.setOnClickListener { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("退出登录") - .setMessage("确定要退出吗?") - .setNegativeButton("取消") - .setPositiveButton("确定") + binding.loginOutButton.setOnClickListener { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("退出登录") + .setMessage("确定要退出吗?").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -203,13 +190,9 @@ if (BuildConfig.VERSION_NAME == it.version) { "已是最新版本,无需更新".show(requireContext()) } else { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("提示") - .setMessage("有新版本,是否更新?") - .setNegativeButton("稍后再说") - .setPositiveButton("立即下载") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(requireContext()).setTitle("提示") + .setMessage("有新版本,是否更新?").setNegativeButton("稍后再说") + .setPositiveButton("立即下载").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { downloadApk(it.downloadUrl) @@ -244,7 +227,7 @@ updateUserInfo() } //缓存 - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() super.onResume() } @@ -258,9 +241,9 @@ // R.color.mainThemeColor.convertColor(requireContext()) // ) // userImageView.setImageDrawable(roundDrawable) - userNameView.text = userData.name - userPhoneView.text = String.format("电话:${userData.phone}") - userDeptView.text = String.format("部门:${userData.deptName}") + binding.userNameView.text = userData.name + binding.userPhoneView.text = String.format("电话:${userData.phone}") + binding.userDeptView.text = String.format("部门:${userData.deptName}") } private fun downloadApk(url: String?) { @@ -275,7 +258,8 @@ * */ val downloadPath = url!!.appendDownloadUrl() //开始下载 - downloadPath.downloadFile(requireContext().createDownloadFileDir().toString(), + downloadPath.downloadFile( + requireContext().createDownloadFileDir().toString(), object : OnDownloadListener { override fun onDownloadStart(totalBytes: Long) { progressDialog.max = totalBytes.toInt() diff --git a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt index b009850..c0afcc5 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt @@ -1,8 +1,11 @@ package com.casic.smarttube.fragment +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R import com.casic.smarttube.adapter.OverviewGroupListAdapter +import com.casic.smarttube.databinding.FragmentOverviewBinding import com.casic.smarttube.extensions.showEmptyPage import com.casic.smarttube.model.ProjectGroupModel import com.casic.smarttube.view.GroupDeviceActivity @@ -11,25 +14,25 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.widget.dialog.AlertInputDialog -import kotlinx.android.synthetic.main.fragment_overview.groupRecyclerView -import kotlinx.android.synthetic.main.fragment_overview.rightOptionView -import kotlinx.android.synthetic.main.fragment_overview.titleView -import kotlinx.android.synthetic.main.include_empty_view.emptyView -class OverviewFragment : KotlinBaseFragment() { +class OverviewFragment : KotlinBaseFragment() { private lateinit var groupViewModel: ProjectGroupViewModel private var dataBeans: MutableList = ArrayList() private lateinit var groupListAdapter: OverviewGroupListAdapter private var clickedPosition = 0 - override fun initLayoutView(): Int = R.layout.fragment_overview - - override fun setupTopBarLayout() { - titleView.text = "概览" + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentOverviewBinding { + return FragmentOverviewBinding.inflate(inflater, container, false) } - override fun initData() { + override fun setupTopBarLayout() { + binding.titleView.text = "概览" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) } @@ -43,7 +46,7 @@ } override fun initEvent() { - rightOptionView.setOnClickListener { + binding.rightOptionView.setOnClickListener { groupViewModel.obtainProGroupList() "刷新数据中,请稍后".show(requireContext()) } @@ -51,16 +54,16 @@ groupViewModel.groupModel.observe(this) { if (it.code == 200) { if (it.data.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { groupViewModel.obtainProGroupList() } } else { - emptyView!!.hide() + binding.emptyInclude.emptyView.hide() dataBeans.clear() dataBeans = it.data groupListAdapter = OverviewGroupListAdapter(requireContext(), it.data) - groupRecyclerView!!.adapter = groupListAdapter + binding.groupRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : OverviewGroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { diff --git a/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt b/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt index e424721..7f036b0 100644 --- a/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt +++ b/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt @@ -4,8 +4,8 @@ import android.graphics.Color import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.Poi -import com.pengxh.kt.lite.extensions.showBusRouteOnMap -import com.pengxh.kt.lite.extensions.showRouteOnMap +import com.casic.smarttube.extensions.showBusRouteOnMap +import com.casic.smarttube.extensions.showRouteOnMap import com.pengxh.kt.lite.widget.dialog.BottomActionSheet object RouteOnMap { diff --git a/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt b/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt index 65bba6f..598581a 100644 --- a/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt @@ -1,27 +1,29 @@ package com.casic.smarttube.view +import android.os.Bundle import com.casic.smarttube.BuildConfig import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityAboutUsBinding import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_about_us.* -import kotlinx.android.synthetic.main.include_base_title.* -class AboutUsActivity : KotlinBaseActivity() { +class AboutUsActivity : KotlinBaseActivity() { - override fun initLayoutView(): Int = R.layout.activity_about_us + override fun initViewBinding(): ActivityAboutUsBinding { + return ActivityAboutUsBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "关于我们" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "关于我们" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { - versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + override fun initOnCreate(savedInstanceState: Bundle?) { + binding.versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") } override fun observeRequestState() { diff --git a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt index 415f9dd..80b83bd 100644 --- a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.content.Intent import android.graphics.Color +import android.os.Bundle import android.os.CountDownTimer import android.os.Handler import android.text.Editable @@ -15,6 +16,7 @@ import com.amap.api.location.AMapLocation import com.casic.smarttube.R import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.smarttube.databinding.ActivityAddDeviceBinding import com.casic.smarttube.extensions.combineImagePath import com.casic.smarttube.extensions.compressImage import com.casic.smarttube.extensions.isNumber @@ -47,24 +49,9 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_add_device.addDeviceTimeView -import kotlinx.android.synthetic.main.activity_add_device.addImageRecyclerView -import kotlinx.android.synthetic.main.activity_add_device.collectIntervalView -import kotlinx.android.synthetic.main.activity_add_device.deviceCodeView -import kotlinx.android.synthetic.main.activity_add_device.deviceNameView -import kotlinx.android.synthetic.main.activity_add_device.inputLengthView -import kotlinx.android.synthetic.main.activity_add_device.latitudeView -import kotlinx.android.synthetic.main.activity_add_device.locationImageView -import kotlinx.android.synthetic.main.activity_add_device.longitudeView -import kotlinx.android.synthetic.main.activity_add_device.ownerShipView -import kotlinx.android.synthetic.main.activity_add_device.scannerView -import kotlinx.android.synthetic.main.activity_add_device.sceneEditView -import kotlinx.android.synthetic.main.activity_add_device.submitButton -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView import java.io.File -class AddDeviceActivity : KotlinBaseActivity() { +class AddDeviceActivity : KotlinBaseActivity() { private val kTag = "AddDeviceActivity" private lateinit var imageAdapter: EditableImageAdapter @@ -81,21 +68,23 @@ registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK) { val data = result.data!! - longitudeView.text = data.getStringExtra("longitude") - latitudeView.text = data.getStringExtra("latitude") + binding.longitudeView.text = data.getStringExtra("longitude") + binding.latitudeView.text = data.getStringExtra("latitude") } } - override fun initLayoutView(): Int = R.layout.activity_add_device + override fun initViewBinding(): ActivityAddDeviceBinding { + return ActivityAddDeviceBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "添加设备" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "添加设备" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { weakReferenceHandler = WeakReferenceHandler(callback) uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] @@ -119,17 +108,17 @@ override fun initEvent() { val manager = QrManager.getInstance().init(QrConfigCreator.create(this)) - scannerView.setOnClickListener { + binding.scannerView.setOnClickListener { manager.startScan(this) { if (it.content.isNumber()) { - deviceCodeView.setText(it.content) + binding.deviceCodeView.setText(it.content) } else { "设备编号错误,请检查标签".show(context) } } } - ownerShipView.setOnClickListener { + binding.ownerShipView.setOnClickListener { groupViewModel.obtainGroupList() } groupViewModel.groupListModel.observe(this) { @@ -147,19 +136,14 @@ groups.add("自定义") } if (groups.isNotEmpty()) { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(groups) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { if (groups[position] == "自定义") { - AlertInputDialog.Builder() - .setContext(context) - .setTitle("提示") + AlertInputDialog.Builder().setContext(context).setTitle("提示") .setHintMessage("请输入该设备所属项目名,如:项目203") - .setNegativeButton("取消") - .setPositiveButton("确定") + .setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertInputDialog.OnDialogButtonClickListener { override fun onCancelClick() { @@ -167,12 +151,11 @@ } override fun onConfirmClick(value: String) { - ownerShipView.text = value + binding.ownerShipView.text = value } - }) - .build().show() + }).build().show() } else { - ownerShipView.text = groups[position] + binding.ownerShipView.text = groups[position] } } }).build().show() @@ -180,27 +163,22 @@ } //默认频率1min - collectIntervalView.text = frequency[0] - collectIntervalView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + binding.collectIntervalView.text = frequency[0] + binding.collectIntervalView.setOnClickListener { + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(frequency) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { - collectIntervalView.text = frequency[position] + binding.collectIntervalView.text = frequency[position] } }).build().show() } - locationImageView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(context) - .setItemTextColor(Color.BLUE) + binding.locationImageView.setOnClickListener { + BottomActionSheet.Builder().setContext(context).setItemTextColor(Color.BLUE) .setActionItemTitle(arrayListOf("自动定位", "手动选点")) - .setOnActionSheetListener(object : - BottomActionSheet.OnActionSheetListener { + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { when (position) { 0 -> { @@ -210,30 +188,32 @@ override fun onAMapLocationGet(aMapLocation: AMapLocation?) { LoadingDialogHub.dismiss() if (aMapLocation == null) { - longitudeView.text = "定位失败" - latitudeView.text = "定位失败" + binding.longitudeView.text = "定位失败" + binding.latitudeView.text = "定位失败" - longitudeView.setTextColor( + binding.longitudeView.setTextColor( R.color.redTextColor.convertColor(context) ) - latitudeView.setTextColor( + binding.latitudeView.setTextColor( R.color.redTextColor.convertColor(context) ) } else { - longitudeView.text = + binding.longitudeView.text = aMapLocation.longitude.toString() - latitudeView.text = aMapLocation.latitude.toString() + binding.latitudeView.text = + aMapLocation.latitude.toString() - longitudeView.setTextColor( + binding.longitudeView.setTextColor( R.color.mainTextColor.convertColor(context) ) - latitudeView.setTextColor( + binding.latitudeView.setTextColor( R.color.mainTextColor.convertColor(context) ) } } }) } + 1 -> selectLocationLauncher.launch( Intent(context, SelectLocationActivity::class.java) ) @@ -243,7 +223,7 @@ } imageAdapter = EditableImageAdapter(this, 3, 13f) - addImageRecyclerView.adapter = imageAdapter + binding.addImageRecyclerView.adapter = imageAdapter imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { selectPicture() @@ -281,7 +261,7 @@ } } - sceneEditView.addTextChangedListener(object : TextWatcher { + binding.sceneEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { } @@ -292,31 +272,31 @@ override fun afterTextChanged(s: Editable?) { val text = s.toString().trim() - inputLengthView.text = String.format("${text.length}/100") + binding.inputLengthView.text = String.format("${text.length}/100") if (text.length > 100) { - inputLengthView.setTextColor(R.color.redTextColor.convertColor(context)) + binding.inputLengthView.setTextColor(R.color.redTextColor.convertColor(context)) "现场情况字符不能超过100个字符".show(context) } else { - inputLengthView.setTextColor(R.color.subTextColor.convertColor(context)) + binding.inputLengthView.setTextColor(R.color.subTextColor.convertColor(context)) } } }) - addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() + binding.addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() - submitButton.setOnClickListener { - val deviceCode = deviceCodeView.text.toString().trim() + binding.submitButton.setOnClickListener { + val deviceCode = binding.deviceCodeView.text.toString().trim() if (deviceCode.isBlank()) { "请输入设备编号".show(context) return@setOnClickListener } - val ownerShip = ownerShipView.text.toString().trim() + val ownerShip = binding.ownerShipView.text.toString().trim() if (ownerShip.isBlank()) { "请输入设备所属项目".show(context) return@setOnClickListener } - val longitude = longitudeView.text.toString().trim() - val latitude = latitudeView.text.toString().trim() + val longitude = binding.longitudeView.text.toString().trim() + val latitude = binding.latitudeView.text.toString().trim() if (longitude.isBlank() || latitude.isBlank()) { "请先获取当前经纬度".show(context) return@setOnClickListener @@ -329,14 +309,14 @@ ) deviceViewModel.addDevice( deviceCode, - deviceNameView.text.toString(), + binding.deviceNameView.text.toString(), ownerShip, - collectIntervalView.text.toString(), + binding.collectIntervalView.text.toString(), longitude, latitude, imagePaths.reformat(), - sceneEditView.text.toString().trim(), - addDeviceTimeView.text.toString(), + binding.sceneEditView.text.toString().trim(), + binding.addDeviceTimeView.text.toString(), userData.id.toString(), userData.deptId ) @@ -345,16 +325,13 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(listOf("拍照", "相册")) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { when (position) { 0 -> { - PictureSelector.create(context) - .openCamera(SelectMimeType.ofImage()) + PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { if (result == null) { @@ -362,8 +339,7 @@ return } LoadingDialogHub.show( - this@AddDeviceActivity, - "图片上传中,请稍后..." + this@AddDeviceActivity, "图片上传中,请稍后..." ) selectedImages = result analyticalSelectResults(result[0]) @@ -374,14 +350,11 @@ } }) } + 1 -> { - PictureSelector.create(context) - .openGallery(SelectMimeType.ofImage()) - .isGif(false) - .isMaxSelectEnabledMask(true) - .setFilterMinFileSize(100) - .setMaxSelectNum(3) - .isDisplayCamera(false) + PictureSelector.create(context).openGallery(SelectMimeType.ofImage()) + .isGif(false).isMaxSelectEnabledMask(true).setFilterMinFileSize(100) + .setMaxSelectNum(3).isDisplayCamera(false) .setImageEngine(GlideLoadEngine.instance) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { @@ -390,8 +363,7 @@ return } LoadingDialogHub.show( - this@AddDeviceActivity, - "图片上传中,请稍后..." + this@AddDeviceActivity, "图片上传中,请稍后..." ) selectedImages = result // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 diff --git a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt index 3864f16..e4f19a4 100644 --- a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.content.Context +import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,19 +11,20 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityBigImageBinding import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager -import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : KotlinBaseActivity() { +class BigImageActivity : KotlinBaseActivity() { - override fun initLayoutView(): Int = R.layout.activity_big_image + override fun initViewBinding(): ActivityBigImageBinding { + return ActivityBigImageBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { PageNavigationManager.addActivity(this) @@ -30,16 +32,16 @@ ImmersionBar.with(this).statusBarDarkFont(false).init() } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) val urls = intent.getStringArrayListExtra(Constant.BIG_IMAGE_INTENT_DATA_KEY) if (urls == null || urls.size == 0) { return } - pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") - imagePagerView.adapter = BigImageAdapter(this, urls) - imagePagerView.currentItem = index - imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + binding.pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + binding.imagePagerView.adapter = BigImageAdapter(this, urls) + binding.imagePagerView.currentItem = index + binding.imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrollStateChanged(state: Int) { } @@ -53,7 +55,8 @@ } override fun onPageSelected(position: Int) { - pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + binding.pageNumberView.text = + String.format("(" + (position + 1) + "/" + urls.size + ")") } }) } @@ -63,7 +66,7 @@ } override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } + binding.leftBackView.setOnClickListener { this.finish() } } class BigImageAdapter(private var context: Context, imageList: ArrayList) : diff --git a/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt b/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt index 072953f..f036a78 100644 --- a/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.graphics.Color +import android.os.Bundle import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -10,6 +11,7 @@ import com.amap.api.services.geocoder.RegeocodeQuery import com.amap.api.services.geocoder.RegeocodeResult import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityDeviceDetailBinding import com.casic.smarttube.extensions.combineImagePath import com.casic.smarttube.extensions.toSignalImage import com.casic.smarttube.model.DeviceDetailModel @@ -25,51 +27,39 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState -import kotlinx.android.synthetic.main.activity_device_detail.densityView -import kotlinx.android.synthetic.main.activity_device_detail.descriptionView -import kotlinx.android.synthetic.main.activity_device_detail.deviceBatteryView -import kotlinx.android.synthetic.main.activity_device_detail.deviceCodeView -import kotlinx.android.synthetic.main.activity_device_detail.deviceNameView -import kotlinx.android.synthetic.main.activity_device_detail.deviceStateView -import kotlinx.android.synthetic.main.activity_device_detail.imageGridView -import kotlinx.android.synthetic.main.activity_device_detail.lastDataView -import kotlinx.android.synthetic.main.activity_device_detail.leftBackView -import kotlinx.android.synthetic.main.activity_device_detail.locationView -import kotlinx.android.synthetic.main.activity_device_detail.projectGroupView -import kotlinx.android.synthetic.main.activity_device_detail.rightOptionView -import kotlinx.android.synthetic.main.activity_device_detail.signalImageView -import kotlinx.android.synthetic.main.activity_device_detail.titleView -class DeviceDetailActivity : KotlinBaseActivity() { +class DeviceDetailActivity : KotlinBaseActivity() { private val kTag = "DeviceDetailActivity" private lateinit var deviceViewModel: DeviceViewModel private lateinit var deviceModel: DeviceDetailModel.DataModel private val geocoderSearch by lazy { GeocodeSearch(this) } - override fun initLayoutView(): Int = R.layout.activity_device_detail + override fun initViewBinding(): ActivityDeviceDetailBinding { + return ActivityDeviceDetailBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "设备详情" - leftBackView.setOnClickListener { finish() } + binding.titleView.text = "设备详情" + binding.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! - deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] deviceViewModel.obtainDeviceDetail(params[0], params[1]) deviceViewModel.deviceDetailModel.observe(this) { if (it.code == 200) { val device = it.data this.deviceModel = device - deviceCodeView.text = device.devcode - deviceNameView.text = device.deviceName - projectGroupView.text = String.format("项目${device.groupId}") + binding.deviceCodeView.text = device.devcode + binding.deviceNameView.text = device.deviceName + binding.projectGroupView.text = String.format("项目${device.groupId}") if (device.latGaode.isBlank() || device.lngGaode.isBlank()) { - locationView.text = "经纬度异常,无法查看具体位置" + binding.locationView.text = "经纬度异常,无法查看具体位置" } else { val queryParam = RegeocodeQuery( LatLonPoint(device.latGaode.toDouble(), device.lngGaode.toDouble()), @@ -81,7 +71,7 @@ GeocodeSearch.OnGeocodeSearchListener { override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { if (rCode == 1000) { - locationView.text = result?.regeocodeAddress?.formatAddress + binding.locationView.text = result?.regeocodeAddress?.formatAddress } } @@ -90,12 +80,12 @@ } }) } - descriptionView.text = device.descn + binding.descriptionView.text = device.descn if (device.photos.toString().isBlank()) { - imageGridView.visibility = View.GONE + binding.imageGridView.visibility = View.GONE } else { - imageGridView.visibility = View.VISIBLE + binding.imageGridView.visibility = View.VISIBLE //处理图片地址 val urls: ArrayList = ArrayList() val imageArray = device.photos.toString().split(",") @@ -104,10 +94,9 @@ urls.add(path.combineImagePath()) } } - val imageAdapter = ReadOnlyImageAdapter(this) - imageAdapter.setImageList(urls) - imageGridView.adapter = imageAdapter - imageGridView.setOnItemClickListener { _, _, position, _ -> + val imageAdapter = ReadOnlyImageAdapter(this, urls) + binding.imageGridView.adapter = imageAdapter + binding.imageGridView.setOnItemClickListener { _, _, position, _ -> if (urls[position].isEmpty()) { "图片加载失败,无法查看大图".show(this) } else { @@ -119,18 +108,18 @@ val value = device.stregnth.toDouble().toInt() val level = "$value%" val ppm = "${value * 500}ppm" - densityView.text = "$level(相当于$ppm)" + binding.densityView.text = "$level(相当于$ppm)" - lastDataView.text = device.uptime + binding.lastDataView.text = device.uptime if (device.onlineState == "0") { - deviceStateView.text = "离线" - deviceStateView.setTextColor(Color.RED) + binding.deviceStateView.text = "离线" + binding.deviceStateView.setTextColor(Color.RED) } else { - deviceStateView.text = "在线" - deviceStateView.setTextColor(Color.GREEN) + binding.deviceStateView.text = "在线" + binding.deviceStateView.setTextColor(Color.GREEN) } - signalImageView.setBackgroundResource(device.rsrp.toSignalImage()) - deviceBatteryView.text = if (device.cell.isNullOrBlank()) { + binding.signalImageView.setBackgroundResource(device.rsrp.toSignalImage()) + binding.deviceBatteryView.text = if (device.cell.isNullOrBlank()) { "0%" } else { device.cell + "%" @@ -149,7 +138,7 @@ } override fun initEvent() { - rightOptionView.setOnClickListener { + binding.rightOptionView.setOnClickListener { val lat = deviceModel.latGaode.toString() val lng = deviceModel.lngGaode.toString() if (lat.isBlank() || lng.isBlank()) { diff --git a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt index 0ae8862..ba52ab8 100644 --- a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.content.Context +import android.os.Bundle import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -8,6 +9,7 @@ import androidx.recyclerview.widget.RecyclerView import com.casic.smarttube.R import com.casic.smarttube.adapter.DeviceListAdapter +import com.casic.smarttube.databinding.ActivityGroupDeviceBinding import com.casic.smarttube.extensions.showEmptyPage import com.casic.smarttube.model.DeviceListModel import com.casic.smarttube.utils.LoadingDialogHub @@ -28,14 +30,8 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.qmuiteam.qmui.recyclerView.QMUIRVItemSwipeAction import com.qmuiteam.qmui.recyclerView.QMUISwipeAction -import kotlinx.android.synthetic.main.activity_group_device.groupDeviceLayout -import kotlinx.android.synthetic.main.activity_group_device.groupDeviceView -import kotlinx.android.synthetic.main.activity_group_device.leftBackView -import kotlinx.android.synthetic.main.activity_group_device.rightOptionView -import kotlinx.android.synthetic.main.activity_group_device.titleView -import kotlinx.android.synthetic.main.include_empty_view.emptyView -class GroupDeviceActivity : KotlinBaseActivity() { +class GroupDeviceActivity : KotlinBaseActivity() { private lateinit var groupId: String private lateinit var weakReferenceHandler: WeakReferenceHandler @@ -51,18 +47,19 @@ private var clickedPosition = 0 private var isDeleteAll = false - override fun initLayoutView(): Int = R.layout.activity_group_device + override fun initViewBinding(): ActivityGroupDeviceBinding { + return ActivityGroupDeviceBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - leftBackView.setOnClickListener { finish() } - rightOptionView.setOnClickListener { + binding.leftBackView.setOnClickListener { finish() } + binding.rightOptionView.setOnClickListener { //改为Popup val easyPopupWindow = EasyPopupWindow(this) easyPopupWindow.setPopupMenuItem( - LocaleConstant.DEVICE_OPERATE_IMAGES, - LocaleConstant.DEVICE_OPERATE_TITLES + LocaleConstant.DEVICE_OPERATE_IMAGES, LocaleConstant.DEVICE_OPERATE_TITLES ) easyPopupWindow.setOnPopupWindowClickListener(object : EasyPopupWindow.OnPopupWindowClickListener { @@ -77,13 +74,11 @@ pageIndex = 1 obtainDeviceListByPage() } + 1 -> { - AlertControlDialog.Builder() - .setContext(context) - .setTitle("提示") + AlertControlDialog.Builder().setContext(context).setTitle("提示") .setMessage("删除后将无法恢复,是否继续?") - .setNegativeButton("容我想想") - .setPositiveButton("已经想好") + .setNegativeButton("容我想想").setPositiveButton("已经想好") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onCancelClick() { @@ -103,13 +98,11 @@ } }).build().show() } + 2 -> { - MultiSelectDialog.Builder() - .setContext(this@GroupDeviceActivity) - .setTitle("选择设备") - .setDataSource(dataBeans) - .setNegativeButton("取消") - .setPositiveButton("选好了") + MultiSelectDialog.Builder().setContext(this@GroupDeviceActivity) + .setTitle("选择设备").setDataSource(dataBeans) + .setNegativeButton("取消").setPositiveButton("选好了") .setOnDialogButtonClickListener(object : MultiSelectDialog.OnDialogButtonClickListener { override fun onConfirmClick(selectedModels: MutableList) { @@ -126,21 +119,20 @@ override fun onCancelClick() { } - }) - .build().show() + }).build().show() } } } }) easyPopupWindow.setBackgroundDrawable(null) - val x: Int = rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(rightOptionView, x, 0) + val x: Int = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { groupId = intent.getStringExtra(Constant.INTENT_PARAM)!! - titleView.text = String.format(groupId + "项目设备列表") + binding.titleView.text = String.format(groupId + "项目设备列表") weakReferenceHandler = WeakReferenceHandler(callback) groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java] deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] @@ -157,13 +149,13 @@ } override fun initEvent() { - groupDeviceLayout.setOnRefreshListener { + binding.groupDeviceLayout.setOnRefreshListener { isRefresh = true //刷新之后页码重置 pageIndex = 1 obtainDeviceListByPage() } - groupDeviceLayout.setOnLoadMoreListener { + binding.groupDeviceLayout.setOnLoadMoreListener { isLoadMore = true pageIndex++ obtainDeviceListByPage() @@ -176,7 +168,7 @@ isRefresh -> { dataBeans.clear() dataBeans = dataRows!! - groupDeviceLayout.finishRefresh() + binding.groupDeviceLayout.finishRefresh() isRefresh = false } @@ -185,7 +177,7 @@ "到底了,别拉了".show(this) } dataBeans.addAll(dataRows!!) - groupDeviceLayout.finishLoadMore() + binding.groupDeviceLayout.finishLoadMore() isLoadMore = false } @@ -211,7 +203,7 @@ ) } if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { pageIndex = 1 obtainDeviceListByPage() } @@ -230,15 +222,15 @@ deviceAdapter.notifyDataSetChanged() } else { if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { pageIndex = 1 obtainDeviceListByPage() } } else { - emptyView!!.hide() + binding.emptyInclude.emptyView.hide() deviceAdapter = DeviceListAdapter(this, dataBeans) //绑定侧滑事件 - swipeAction.attachToRecyclerView(groupDeviceView) + swipeAction.attachToRecyclerView(binding.groupDeviceView) val linearLayoutManager = object : LinearLayoutManager(this) { override fun generateDefaultLayoutParams(): RecyclerView.LayoutParams { return RecyclerView.LayoutParams( @@ -247,8 +239,8 @@ ) } } - groupDeviceView.layoutManager = linearLayoutManager - groupDeviceView.adapter = deviceAdapter + binding.groupDeviceView.layoutManager = linearLayoutManager + binding.groupDeviceView.adapter = deviceAdapter deviceAdapter.setOnItemClickListener(object : DeviceListAdapter.OnItemClickListener { override fun onClicked(position: Int) { @@ -311,13 +303,9 @@ }) private fun deleteItem(adapterPosition: Int) { - AlertControlDialog.Builder() - .setContext(this) - .setTitle("提示") - .setMessage("删除后将无法恢复,是否继续?") - .setNegativeButton("容我想想") - .setPositiveButton("已经想好") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(this).setTitle("提示") + .setMessage("删除后将无法恢复,是否继续?").setNegativeButton("容我想想") + .setPositiveButton("已经想好").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onCancelClick() { diff --git a/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt b/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt index 71f438c..70e49f0 100644 --- a/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt @@ -1,9 +1,11 @@ package com.casic.smarttube.view +import android.os.Bundle import android.view.View import android.widget.AdapterView import androidx.lifecycle.ViewModelProvider import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityHistoryDataBinding import com.casic.smarttube.extensions.dateToMonthDay import com.casic.smarttube.extensions.getQuarterOfYear import com.casic.smarttube.utils.ChartViewHelper @@ -22,27 +24,26 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState -import kotlinx.android.synthetic.main.activity_history_data.dataLineChart -import kotlinx.android.synthetic.main.activity_history_data.leftBackView -import kotlinx.android.synthetic.main.activity_history_data.periodSpinner import java.util.Calendar -class HistoryDataActivity : KotlinBaseActivity() { +class HistoryDataActivity : KotlinBaseActivity() { private val kTag = "HistoryDataActivity" private lateinit var deviceViewModel: DeviceViewModel private lateinit var groupId: String private lateinit var devCode: String - override fun initLayoutView(): Int = R.layout.activity_history_data + override fun initViewBinding(): ActivityHistoryDataBinding { + return ActivityHistoryDataBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - leftBackView.setOnClickListener { finish() } + binding.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! groupId = params[0] devCode = params[1] @@ -61,8 +62,8 @@ override fun initEvent() { //默认选择近7天的数据 - periodSpinner.setSelection(3) - periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + binding.periodSpinner.setSelection(3) + binding.periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onItemSelected( parent: AdapterView<*>?, view: View?, position: Int, id: Long ) { @@ -76,6 +77,7 @@ groupId, devCode, "$year-01-01", time.timestampToCompleteDate() ) } + 1 -> { //本季度 val startDate = when (time.getQuarterOfYear()) { @@ -89,6 +91,7 @@ groupId, devCode, startDate, time.timestampToCompleteDate() ) } + 2 -> { //近30日 deviceViewModel.obtainDeviceHistoryData( @@ -98,6 +101,7 @@ time.timestampToCompleteDate() ) } + 3 -> { //近7日 deviceViewModel.obtainDeviceHistoryData( @@ -107,19 +111,18 @@ time.timestampToCompleteDate() ) } + 4 -> { //今日 deviceViewModel.obtainDeviceHistoryData( groupId, devCode, time.timestampToDate(), time.timestampToCompleteDate() ) } + 5 -> { - DateSelectDialog.Builder() - .setContext(this@HistoryDataActivity) - .setTitle("选择日期") - .setNegativeButton("取消") - .setPositiveButton("选好了") - .setOnDialogButtonClickListener(object : + DateSelectDialog.Builder().setContext(this@HistoryDataActivity) + .setTitle("选择日期").setNegativeButton("取消") + .setPositiveButton("选好了").setOnDialogButtonClickListener(object : DateSelectDialog.OnDialogButtonClickListener { override fun onConfirmClick(startDate: String, endDate: String) { deviceViewModel.obtainDeviceHistoryData( @@ -129,12 +132,10 @@ override fun onCancelClick() { //选择取消就默认加载近7天的数据 - periodSpinner.setSelection(3) + binding.periodSpinner.setSelection(3) } - }) - .setFragmentManager(supportFragmentManager) - .setCalendarType(Type.YEAR_MONTH_DAY) - .build().show() + }).setFragmentManager(supportFragmentManager) + .setCalendarType(Type.YEAR_MONTH_DAY).build().show() } } } @@ -159,7 +160,9 @@ Entry(i.toFloat(), rowsBean.stregnth!!.toFloat(), "浓度") ) } - ChartViewHelper.setLineChartData(dataLineChart, xAxisLabels, strengthEntries) + ChartViewHelper.setLineChartData( + binding.dataLineChart, xAxisLabels, strengthEntries + ) } } } diff --git a/app/build.gradle b/app/build.gradle index 81dccf6..defbef7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,12 +2,11 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' android { signingConfigs { release { - storeFile file('/Users/a203/Desktop/AndroidProjects/CasicSmartTube/app/CasicSmartTube.jks') + storeFile file('CasicSmartTube.jks') storePassword '123456789' keyAlias 'key0' keyPassword '123456789' @@ -21,8 +20,6 @@ targetSdkVersion 33 versionCode 2 versionName "1.0.1" - - ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -47,6 +44,10 @@ } } + viewBinding { + enabled true + } + applicationVariants.configureEach { variant -> variant.outputs.configureEach { outputFileName = "GT_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" @@ -61,7 +62,7 @@ dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.5' implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.6.1' diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cccda6d..fd9277c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,7 +81,7 @@ + android:value="a6907c8bb931727374aa5fd500cda107" /> (), Handler.Callback, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { private val kTag = "HomePageFragment" private val geocoderSearch by lazy { GeocodeSearch(requireContext()) } - private lateinit var homeView: View private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var easyPopupWindow: EasyPopupWindow private lateinit var aMap: AMap private lateinit var deviceViewModel: DeviceViewModel private lateinit var groupViewModel: ProjectGroupViewModel @@ -83,34 +89,34 @@ * */ private var mapZooms = ArrayList() - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View { - homeView = inflater.inflate(R.layout.fragment_home, container, false) + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } - weakReferenceHandler = WeakReferenceHandler(callback) - val easyPopupWindow = EasyPopupWindow(requireContext()) - easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) - homeView.rightOptionView.setOnClickListener { - easyPopupWindow.setOnPopupWindowClickListener(object : - EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - easyPopupWindow.setBackgroundDrawable(null) - val x: Int = homeView.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(homeView.rightOptionView, x, 0) + override fun setupTopBarLayout() { + + } + + override fun observeRequestState() { + groupViewModel.loadState.observe(this) { state -> + when (state) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") + else -> LoadingDialogHub.dismiss() + } } + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + weakReferenceHandler = WeakReferenceHandler(this) + + easyPopupWindow = EasyPopupWindow(requireContext()) + easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) //初始化vm - deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) - groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) - - observeRequestState() + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java] //默认数据 groupViewModel.obtainProGroupList() @@ -119,12 +125,8 @@ mapZooms.add(13f) initMap(savedInstanceState) - homeView.addDeviceButton.setOnClickListener { - requireContext().navigatePageTo() - } - //数据监听 - deviceViewModel.mapDeviceModel.observe(this, { + deviceViewModel.mapDeviceModel.observe(this) { if (it.code == 200) { if (allMarkerOptions.isNotEmpty()) { allMarkerOptions.clear() @@ -149,10 +151,8 @@ longitudeList.add(longitude) //将所有设备信息转化缓存为Marker点 allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(device.devcode) - .snippet(device.modelName) + MarkerOptions().position(LatLng(latitude, longitude)) + .title(device.devcode).snippet(device.modelName) ) } } @@ -160,8 +160,8 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 13f) } - }) - groupViewModel.groupModel.observe(this, { + } + groupViewModel.groupModel.observe(this) { if (it.code == 200) { val dataRows = it.data when { @@ -170,14 +170,15 @@ dataBeans = dataRows!! isRefresh = false } + else -> { dataBeans = dataRows!! } } weakReferenceHandler.sendEmptyMessage(2022090201) } - }) - groupViewModel.groupDeviceModel.observe(this, { + } + groupViewModel.groupDeviceModel.observe(this) { if (it.code == 200) { val latitudeList: MutableList = ArrayList() val longitudeList: MutableList = ArrayList() @@ -199,22 +200,33 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 16f) } - }) - return homeView + } } - private fun observeRequestState() { - groupViewModel.loadState.observe(this, { state -> - when (state) { - LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") - else -> LoadingDialogHub.dismiss() - } - }) + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + easyPopupWindow.setOnPopupWindowClickListener(object : + EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + easyPopupWindow.setBackgroundDrawable(null) + val x: Int = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + binding.addDeviceButton.setOnClickListener { + requireContext().navigatePageTo() + } } override fun onResume() { super.onResume() - homeView.mapView.onResume() + binding.mapView.onResume() //获取所有设备数据 deviceViewModel.obtainMapDeviceList() @@ -222,16 +234,16 @@ groupViewModel.obtainProGroupList() } - private val callback = Handler.Callback { - if (it.what == 2022090201) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022090201) { if (isRefresh) { groupListAdapter.notifyDataSetChanged() } else { groupListAdapter = GroupListAdapter(requireContext(), dataBeans) - homeView.homeRecyclerView!!.addItemDecoration( + binding.homeRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - homeView.homeRecyclerView!!.adapter = groupListAdapter + binding.homeRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : GroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { @@ -241,12 +253,12 @@ }) } } - true + return true } private fun initMap(savedInstanceState: Bundle?) { - homeView.mapView.onCreate(savedInstanceState) - aMap = homeView.mapView.map + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val uiSettings = aMap.uiSettings uiSettings.isCompassEnabled = true @@ -322,10 +334,7 @@ if (!isInRange) { clustersMarkers.add( GaoDeClusterMarkerView( - requireContext(), - it, - proj, - LocaleConstant.RADIUS_SIZE + requireContext(), it, proj, LocaleConstant.RADIUS_SIZE ) )//相距多少才聚合 } @@ -363,9 +372,7 @@ //绑定数据 val clickedLatLng = marker?.position!! for (device in deviceModels) { - if (clickedLatLng.latitude == device.latGaode!!.toDouble() - && clickedLatLng.longitude == device.lngGaode!!.toDouble() - ) { + if (clickedLatLng.latitude == device.latGaode!!.toDouble() && clickedLatLng.longitude == device.lngGaode!!.toDouble()) { deviceCodeView.text = String.format("设备编号: ${device.devcode}") deviceModelView.text = String.format("设备模型: ${device.modelName}") //获取设备最新浓度信息 @@ -395,8 +402,7 @@ val address = result?.regeocodeAddress?.formatAddress val temp = StringBuilder() if (address!!.length > 16) { - temp.append(address.substring(0, 14)) - .append("\r\n") + temp.append(address.substring(0, 14)).append("\r\n") .append(address.substring(16)) } else { temp.append(address) @@ -430,9 +436,7 @@ } } //查看聚合点,单独开页面导航过去 - BottomActionSheet.Builder() - .setContext(requireContext()) - .setActionItemTitle(multiDevice) + BottomActionSheet.Builder().setContext(requireContext()).setActionItemTitle(multiDevice) .setItemTextColor(Color.BLUE) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { @@ -455,12 +459,8 @@ override fun onInfoWindowClick(p0: Marker?) { if (p0 != null) { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -487,16 +487,16 @@ 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 onDestroy() { super.onDestroy() - homeView.mapView.onDestroy() + binding.mapView.onDestroy() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt index a4e964c..cc35197 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt @@ -4,11 +4,15 @@ import android.content.Intent import android.net.Uri import android.os.Build +import android.os.Bundle import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider import com.casic.smarttube.BuildConfig import com.casic.smarttube.R +import com.casic.smarttube.databinding.FragmentMineBinding import com.casic.smarttube.extensions.appendDownloadUrl import com.casic.smarttube.model.UserDetailModel import com.casic.smarttube.utils.AuthenticationHelper @@ -36,22 +40,10 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.ChangePasswordDialog -import kotlinx.android.synthetic.main.fragment_mine.aboutUsLayout -import kotlinx.android.synthetic.main.fragment_mine.cacheSizeView -import kotlinx.android.synthetic.main.fragment_mine.changePwdLayout -import kotlinx.android.synthetic.main.fragment_mine.clearCacheLayout -import kotlinx.android.synthetic.main.fragment_mine.loginOutButton -import kotlinx.android.synthetic.main.fragment_mine.updateLogLayout -import kotlinx.android.synthetic.main.fragment_mine.updateUserButton -import kotlinx.android.synthetic.main.fragment_mine.updateVersionLayout -import kotlinx.android.synthetic.main.fragment_mine.userDeptView -import kotlinx.android.synthetic.main.fragment_mine.userImageView -import kotlinx.android.synthetic.main.fragment_mine.userNameView -import kotlinx.android.synthetic.main.fragment_mine.userPhoneView import java.io.File import java.nio.charset.StandardCharsets -class MinePageFragment : KotlinBaseFragment() { +class MinePageFragment : KotlinBaseFragment() { private val kTag = "MinePageFragment" private lateinit var userData: UserDetailModel.Data @@ -60,13 +52,17 @@ private lateinit var versionViewModel: VersionViewModel private lateinit var progressDialog: ProgressDialog - override fun initLayoutView(): Int = R.layout.fragment_mine + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentMineBinding { + return FragmentMineBinding.inflate(inflater, container, false) + } override fun setupTopBarLayout() { } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java] @@ -98,8 +94,7 @@ versionViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show( - requireActivity(), - "检查版本中,请稍后" + requireActivity(), "检查版本中,请稍后" ) else -> LoadingDialogHub.dismiss() @@ -108,49 +103,45 @@ } override fun initEvent() { - userImageView.setOnClickListener { + binding.userImageView.setOnClickListener { "尽情期待~".show(requireContext()) } - updateUserButton.setOnClickListener { + binding.updateUserButton.setOnClickListener { LoadingDialogHub.show(requireActivity(), "同步中,请稍后...") userViewModel.obtainUserDetail() } - changePwdLayout.setOnClickListener { - ChangePasswordDialog.Builder() - .setContext(requireContext()) + binding.changePwdLayout.setOnClickListener { + ChangePasswordDialog.Builder().setContext(requireContext()) .setOnDialogButtonClickListener(object : ChangePasswordDialog.OnDialogButtonClickListener { override fun onConfirmClick(oldPwd: String, newPwd: String) { - val publicKey = - RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! val oldPassKey = RSAUtils.encryptDataByPublicKey( - oldPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + oldPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) val newPassKey = RSAUtils.encryptDataByPublicKey( - newPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + newPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) userViewModel.changePassword(oldPassKey, newPassKey) } }).build().show() } - aboutUsLayout.setOnClickListener { + binding.aboutUsLayout.setOnClickListener { requireContext().navigatePageTo() } - updateVersionLayout.setOnClickListener { + binding.updateVersionLayout.setOnClickListener { versionViewModel.updateVersion() } - updateLogLayout.setOnClickListener { + binding.updateLogLayout.setOnClickListener { "尽情期待~".show(requireContext()) } - clearCacheLayout.setOnClickListener { + binding.clearCacheLayout.setOnClickListener { //删除缓存之后在设置缓存大小 LoadingDialogHub.show(requireActivity(), "清理中,请稍后") File(requireContext().cacheDir.path).deleteFile() @@ -161,18 +152,14 @@ override fun onFinish() { LoadingDialogHub.dismiss() - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() } }.start() } - loginOutButton.setOnClickListener { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("退出登录") - .setMessage("确定要退出吗?") - .setNegativeButton("取消") - .setPositiveButton("确定") + binding.loginOutButton.setOnClickListener { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("退出登录") + .setMessage("确定要退出吗?").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -203,13 +190,9 @@ if (BuildConfig.VERSION_NAME == it.version) { "已是最新版本,无需更新".show(requireContext()) } else { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("提示") - .setMessage("有新版本,是否更新?") - .setNegativeButton("稍后再说") - .setPositiveButton("立即下载") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(requireContext()).setTitle("提示") + .setMessage("有新版本,是否更新?").setNegativeButton("稍后再说") + .setPositiveButton("立即下载").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { downloadApk(it.downloadUrl) @@ -244,7 +227,7 @@ updateUserInfo() } //缓存 - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() super.onResume() } @@ -258,9 +241,9 @@ // R.color.mainThemeColor.convertColor(requireContext()) // ) // userImageView.setImageDrawable(roundDrawable) - userNameView.text = userData.name - userPhoneView.text = String.format("电话:${userData.phone}") - userDeptView.text = String.format("部门:${userData.deptName}") + binding.userNameView.text = userData.name + binding.userPhoneView.text = String.format("电话:${userData.phone}") + binding.userDeptView.text = String.format("部门:${userData.deptName}") } private fun downloadApk(url: String?) { @@ -275,7 +258,8 @@ * */ val downloadPath = url!!.appendDownloadUrl() //开始下载 - downloadPath.downloadFile(requireContext().createDownloadFileDir().toString(), + downloadPath.downloadFile( + requireContext().createDownloadFileDir().toString(), object : OnDownloadListener { override fun onDownloadStart(totalBytes: Long) { progressDialog.max = totalBytes.toInt() diff --git a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt index b009850..c0afcc5 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt @@ -1,8 +1,11 @@ package com.casic.smarttube.fragment +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R import com.casic.smarttube.adapter.OverviewGroupListAdapter +import com.casic.smarttube.databinding.FragmentOverviewBinding import com.casic.smarttube.extensions.showEmptyPage import com.casic.smarttube.model.ProjectGroupModel import com.casic.smarttube.view.GroupDeviceActivity @@ -11,25 +14,25 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.widget.dialog.AlertInputDialog -import kotlinx.android.synthetic.main.fragment_overview.groupRecyclerView -import kotlinx.android.synthetic.main.fragment_overview.rightOptionView -import kotlinx.android.synthetic.main.fragment_overview.titleView -import kotlinx.android.synthetic.main.include_empty_view.emptyView -class OverviewFragment : KotlinBaseFragment() { +class OverviewFragment : KotlinBaseFragment() { private lateinit var groupViewModel: ProjectGroupViewModel private var dataBeans: MutableList = ArrayList() private lateinit var groupListAdapter: OverviewGroupListAdapter private var clickedPosition = 0 - override fun initLayoutView(): Int = R.layout.fragment_overview - - override fun setupTopBarLayout() { - titleView.text = "概览" + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentOverviewBinding { + return FragmentOverviewBinding.inflate(inflater, container, false) } - override fun initData() { + override fun setupTopBarLayout() { + binding.titleView.text = "概览" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) } @@ -43,7 +46,7 @@ } override fun initEvent() { - rightOptionView.setOnClickListener { + binding.rightOptionView.setOnClickListener { groupViewModel.obtainProGroupList() "刷新数据中,请稍后".show(requireContext()) } @@ -51,16 +54,16 @@ groupViewModel.groupModel.observe(this) { if (it.code == 200) { if (it.data.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { groupViewModel.obtainProGroupList() } } else { - emptyView!!.hide() + binding.emptyInclude.emptyView.hide() dataBeans.clear() dataBeans = it.data groupListAdapter = OverviewGroupListAdapter(requireContext(), it.data) - groupRecyclerView!!.adapter = groupListAdapter + binding.groupRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : OverviewGroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { diff --git a/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt b/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt index e424721..7f036b0 100644 --- a/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt +++ b/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt @@ -4,8 +4,8 @@ import android.graphics.Color import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.Poi -import com.pengxh.kt.lite.extensions.showBusRouteOnMap -import com.pengxh.kt.lite.extensions.showRouteOnMap +import com.casic.smarttube.extensions.showBusRouteOnMap +import com.casic.smarttube.extensions.showRouteOnMap import com.pengxh.kt.lite.widget.dialog.BottomActionSheet object RouteOnMap { diff --git a/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt b/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt index 65bba6f..598581a 100644 --- a/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt @@ -1,27 +1,29 @@ package com.casic.smarttube.view +import android.os.Bundle import com.casic.smarttube.BuildConfig import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityAboutUsBinding import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_about_us.* -import kotlinx.android.synthetic.main.include_base_title.* -class AboutUsActivity : KotlinBaseActivity() { +class AboutUsActivity : KotlinBaseActivity() { - override fun initLayoutView(): Int = R.layout.activity_about_us + override fun initViewBinding(): ActivityAboutUsBinding { + return ActivityAboutUsBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "关于我们" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "关于我们" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { - versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + override fun initOnCreate(savedInstanceState: Bundle?) { + binding.versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") } override fun observeRequestState() { diff --git a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt index 415f9dd..80b83bd 100644 --- a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.content.Intent import android.graphics.Color +import android.os.Bundle import android.os.CountDownTimer import android.os.Handler import android.text.Editable @@ -15,6 +16,7 @@ import com.amap.api.location.AMapLocation import com.casic.smarttube.R import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.smarttube.databinding.ActivityAddDeviceBinding import com.casic.smarttube.extensions.combineImagePath import com.casic.smarttube.extensions.compressImage import com.casic.smarttube.extensions.isNumber @@ -47,24 +49,9 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_add_device.addDeviceTimeView -import kotlinx.android.synthetic.main.activity_add_device.addImageRecyclerView -import kotlinx.android.synthetic.main.activity_add_device.collectIntervalView -import kotlinx.android.synthetic.main.activity_add_device.deviceCodeView -import kotlinx.android.synthetic.main.activity_add_device.deviceNameView -import kotlinx.android.synthetic.main.activity_add_device.inputLengthView -import kotlinx.android.synthetic.main.activity_add_device.latitudeView -import kotlinx.android.synthetic.main.activity_add_device.locationImageView -import kotlinx.android.synthetic.main.activity_add_device.longitudeView -import kotlinx.android.synthetic.main.activity_add_device.ownerShipView -import kotlinx.android.synthetic.main.activity_add_device.scannerView -import kotlinx.android.synthetic.main.activity_add_device.sceneEditView -import kotlinx.android.synthetic.main.activity_add_device.submitButton -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView import java.io.File -class AddDeviceActivity : KotlinBaseActivity() { +class AddDeviceActivity : KotlinBaseActivity() { private val kTag = "AddDeviceActivity" private lateinit var imageAdapter: EditableImageAdapter @@ -81,21 +68,23 @@ registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK) { val data = result.data!! - longitudeView.text = data.getStringExtra("longitude") - latitudeView.text = data.getStringExtra("latitude") + binding.longitudeView.text = data.getStringExtra("longitude") + binding.latitudeView.text = data.getStringExtra("latitude") } } - override fun initLayoutView(): Int = R.layout.activity_add_device + override fun initViewBinding(): ActivityAddDeviceBinding { + return ActivityAddDeviceBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "添加设备" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "添加设备" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { weakReferenceHandler = WeakReferenceHandler(callback) uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] @@ -119,17 +108,17 @@ override fun initEvent() { val manager = QrManager.getInstance().init(QrConfigCreator.create(this)) - scannerView.setOnClickListener { + binding.scannerView.setOnClickListener { manager.startScan(this) { if (it.content.isNumber()) { - deviceCodeView.setText(it.content) + binding.deviceCodeView.setText(it.content) } else { "设备编号错误,请检查标签".show(context) } } } - ownerShipView.setOnClickListener { + binding.ownerShipView.setOnClickListener { groupViewModel.obtainGroupList() } groupViewModel.groupListModel.observe(this) { @@ -147,19 +136,14 @@ groups.add("自定义") } if (groups.isNotEmpty()) { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(groups) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { if (groups[position] == "自定义") { - AlertInputDialog.Builder() - .setContext(context) - .setTitle("提示") + AlertInputDialog.Builder().setContext(context).setTitle("提示") .setHintMessage("请输入该设备所属项目名,如:项目203") - .setNegativeButton("取消") - .setPositiveButton("确定") + .setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertInputDialog.OnDialogButtonClickListener { override fun onCancelClick() { @@ -167,12 +151,11 @@ } override fun onConfirmClick(value: String) { - ownerShipView.text = value + binding.ownerShipView.text = value } - }) - .build().show() + }).build().show() } else { - ownerShipView.text = groups[position] + binding.ownerShipView.text = groups[position] } } }).build().show() @@ -180,27 +163,22 @@ } //默认频率1min - collectIntervalView.text = frequency[0] - collectIntervalView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + binding.collectIntervalView.text = frequency[0] + binding.collectIntervalView.setOnClickListener { + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(frequency) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { - collectIntervalView.text = frequency[position] + binding.collectIntervalView.text = frequency[position] } }).build().show() } - locationImageView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(context) - .setItemTextColor(Color.BLUE) + binding.locationImageView.setOnClickListener { + BottomActionSheet.Builder().setContext(context).setItemTextColor(Color.BLUE) .setActionItemTitle(arrayListOf("自动定位", "手动选点")) - .setOnActionSheetListener(object : - BottomActionSheet.OnActionSheetListener { + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { when (position) { 0 -> { @@ -210,30 +188,32 @@ override fun onAMapLocationGet(aMapLocation: AMapLocation?) { LoadingDialogHub.dismiss() if (aMapLocation == null) { - longitudeView.text = "定位失败" - latitudeView.text = "定位失败" + binding.longitudeView.text = "定位失败" + binding.latitudeView.text = "定位失败" - longitudeView.setTextColor( + binding.longitudeView.setTextColor( R.color.redTextColor.convertColor(context) ) - latitudeView.setTextColor( + binding.latitudeView.setTextColor( R.color.redTextColor.convertColor(context) ) } else { - longitudeView.text = + binding.longitudeView.text = aMapLocation.longitude.toString() - latitudeView.text = aMapLocation.latitude.toString() + binding.latitudeView.text = + aMapLocation.latitude.toString() - longitudeView.setTextColor( + binding.longitudeView.setTextColor( R.color.mainTextColor.convertColor(context) ) - latitudeView.setTextColor( + binding.latitudeView.setTextColor( R.color.mainTextColor.convertColor(context) ) } } }) } + 1 -> selectLocationLauncher.launch( Intent(context, SelectLocationActivity::class.java) ) @@ -243,7 +223,7 @@ } imageAdapter = EditableImageAdapter(this, 3, 13f) - addImageRecyclerView.adapter = imageAdapter + binding.addImageRecyclerView.adapter = imageAdapter imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { selectPicture() @@ -281,7 +261,7 @@ } } - sceneEditView.addTextChangedListener(object : TextWatcher { + binding.sceneEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { } @@ -292,31 +272,31 @@ override fun afterTextChanged(s: Editable?) { val text = s.toString().trim() - inputLengthView.text = String.format("${text.length}/100") + binding.inputLengthView.text = String.format("${text.length}/100") if (text.length > 100) { - inputLengthView.setTextColor(R.color.redTextColor.convertColor(context)) + binding.inputLengthView.setTextColor(R.color.redTextColor.convertColor(context)) "现场情况字符不能超过100个字符".show(context) } else { - inputLengthView.setTextColor(R.color.subTextColor.convertColor(context)) + binding.inputLengthView.setTextColor(R.color.subTextColor.convertColor(context)) } } }) - addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() + binding.addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() - submitButton.setOnClickListener { - val deviceCode = deviceCodeView.text.toString().trim() + binding.submitButton.setOnClickListener { + val deviceCode = binding.deviceCodeView.text.toString().trim() if (deviceCode.isBlank()) { "请输入设备编号".show(context) return@setOnClickListener } - val ownerShip = ownerShipView.text.toString().trim() + val ownerShip = binding.ownerShipView.text.toString().trim() if (ownerShip.isBlank()) { "请输入设备所属项目".show(context) return@setOnClickListener } - val longitude = longitudeView.text.toString().trim() - val latitude = latitudeView.text.toString().trim() + val longitude = binding.longitudeView.text.toString().trim() + val latitude = binding.latitudeView.text.toString().trim() if (longitude.isBlank() || latitude.isBlank()) { "请先获取当前经纬度".show(context) return@setOnClickListener @@ -329,14 +309,14 @@ ) deviceViewModel.addDevice( deviceCode, - deviceNameView.text.toString(), + binding.deviceNameView.text.toString(), ownerShip, - collectIntervalView.text.toString(), + binding.collectIntervalView.text.toString(), longitude, latitude, imagePaths.reformat(), - sceneEditView.text.toString().trim(), - addDeviceTimeView.text.toString(), + binding.sceneEditView.text.toString().trim(), + binding.addDeviceTimeView.text.toString(), userData.id.toString(), userData.deptId ) @@ -345,16 +325,13 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(listOf("拍照", "相册")) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { when (position) { 0 -> { - PictureSelector.create(context) - .openCamera(SelectMimeType.ofImage()) + PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { if (result == null) { @@ -362,8 +339,7 @@ return } LoadingDialogHub.show( - this@AddDeviceActivity, - "图片上传中,请稍后..." + this@AddDeviceActivity, "图片上传中,请稍后..." ) selectedImages = result analyticalSelectResults(result[0]) @@ -374,14 +350,11 @@ } }) } + 1 -> { - PictureSelector.create(context) - .openGallery(SelectMimeType.ofImage()) - .isGif(false) - .isMaxSelectEnabledMask(true) - .setFilterMinFileSize(100) - .setMaxSelectNum(3) - .isDisplayCamera(false) + PictureSelector.create(context).openGallery(SelectMimeType.ofImage()) + .isGif(false).isMaxSelectEnabledMask(true).setFilterMinFileSize(100) + .setMaxSelectNum(3).isDisplayCamera(false) .setImageEngine(GlideLoadEngine.instance) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { @@ -390,8 +363,7 @@ return } LoadingDialogHub.show( - this@AddDeviceActivity, - "图片上传中,请稍后..." + this@AddDeviceActivity, "图片上传中,请稍后..." ) selectedImages = result // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 diff --git a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt index 3864f16..e4f19a4 100644 --- a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.content.Context +import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,19 +11,20 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityBigImageBinding import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager -import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : KotlinBaseActivity() { +class BigImageActivity : KotlinBaseActivity() { - override fun initLayoutView(): Int = R.layout.activity_big_image + override fun initViewBinding(): ActivityBigImageBinding { + return ActivityBigImageBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { PageNavigationManager.addActivity(this) @@ -30,16 +32,16 @@ ImmersionBar.with(this).statusBarDarkFont(false).init() } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) val urls = intent.getStringArrayListExtra(Constant.BIG_IMAGE_INTENT_DATA_KEY) if (urls == null || urls.size == 0) { return } - pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") - imagePagerView.adapter = BigImageAdapter(this, urls) - imagePagerView.currentItem = index - imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + binding.pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + binding.imagePagerView.adapter = BigImageAdapter(this, urls) + binding.imagePagerView.currentItem = index + binding.imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrollStateChanged(state: Int) { } @@ -53,7 +55,8 @@ } override fun onPageSelected(position: Int) { - pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + binding.pageNumberView.text = + String.format("(" + (position + 1) + "/" + urls.size + ")") } }) } @@ -63,7 +66,7 @@ } override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } + binding.leftBackView.setOnClickListener { this.finish() } } class BigImageAdapter(private var context: Context, imageList: ArrayList) : diff --git a/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt b/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt index 072953f..f036a78 100644 --- a/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.graphics.Color +import android.os.Bundle import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -10,6 +11,7 @@ import com.amap.api.services.geocoder.RegeocodeQuery import com.amap.api.services.geocoder.RegeocodeResult import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityDeviceDetailBinding import com.casic.smarttube.extensions.combineImagePath import com.casic.smarttube.extensions.toSignalImage import com.casic.smarttube.model.DeviceDetailModel @@ -25,51 +27,39 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState -import kotlinx.android.synthetic.main.activity_device_detail.densityView -import kotlinx.android.synthetic.main.activity_device_detail.descriptionView -import kotlinx.android.synthetic.main.activity_device_detail.deviceBatteryView -import kotlinx.android.synthetic.main.activity_device_detail.deviceCodeView -import kotlinx.android.synthetic.main.activity_device_detail.deviceNameView -import kotlinx.android.synthetic.main.activity_device_detail.deviceStateView -import kotlinx.android.synthetic.main.activity_device_detail.imageGridView -import kotlinx.android.synthetic.main.activity_device_detail.lastDataView -import kotlinx.android.synthetic.main.activity_device_detail.leftBackView -import kotlinx.android.synthetic.main.activity_device_detail.locationView -import kotlinx.android.synthetic.main.activity_device_detail.projectGroupView -import kotlinx.android.synthetic.main.activity_device_detail.rightOptionView -import kotlinx.android.synthetic.main.activity_device_detail.signalImageView -import kotlinx.android.synthetic.main.activity_device_detail.titleView -class DeviceDetailActivity : KotlinBaseActivity() { +class DeviceDetailActivity : KotlinBaseActivity() { private val kTag = "DeviceDetailActivity" private lateinit var deviceViewModel: DeviceViewModel private lateinit var deviceModel: DeviceDetailModel.DataModel private val geocoderSearch by lazy { GeocodeSearch(this) } - override fun initLayoutView(): Int = R.layout.activity_device_detail + override fun initViewBinding(): ActivityDeviceDetailBinding { + return ActivityDeviceDetailBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "设备详情" - leftBackView.setOnClickListener { finish() } + binding.titleView.text = "设备详情" + binding.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! - deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] deviceViewModel.obtainDeviceDetail(params[0], params[1]) deviceViewModel.deviceDetailModel.observe(this) { if (it.code == 200) { val device = it.data this.deviceModel = device - deviceCodeView.text = device.devcode - deviceNameView.text = device.deviceName - projectGroupView.text = String.format("项目${device.groupId}") + binding.deviceCodeView.text = device.devcode + binding.deviceNameView.text = device.deviceName + binding.projectGroupView.text = String.format("项目${device.groupId}") if (device.latGaode.isBlank() || device.lngGaode.isBlank()) { - locationView.text = "经纬度异常,无法查看具体位置" + binding.locationView.text = "经纬度异常,无法查看具体位置" } else { val queryParam = RegeocodeQuery( LatLonPoint(device.latGaode.toDouble(), device.lngGaode.toDouble()), @@ -81,7 +71,7 @@ GeocodeSearch.OnGeocodeSearchListener { override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { if (rCode == 1000) { - locationView.text = result?.regeocodeAddress?.formatAddress + binding.locationView.text = result?.regeocodeAddress?.formatAddress } } @@ -90,12 +80,12 @@ } }) } - descriptionView.text = device.descn + binding.descriptionView.text = device.descn if (device.photos.toString().isBlank()) { - imageGridView.visibility = View.GONE + binding.imageGridView.visibility = View.GONE } else { - imageGridView.visibility = View.VISIBLE + binding.imageGridView.visibility = View.VISIBLE //处理图片地址 val urls: ArrayList = ArrayList() val imageArray = device.photos.toString().split(",") @@ -104,10 +94,9 @@ urls.add(path.combineImagePath()) } } - val imageAdapter = ReadOnlyImageAdapter(this) - imageAdapter.setImageList(urls) - imageGridView.adapter = imageAdapter - imageGridView.setOnItemClickListener { _, _, position, _ -> + val imageAdapter = ReadOnlyImageAdapter(this, urls) + binding.imageGridView.adapter = imageAdapter + binding.imageGridView.setOnItemClickListener { _, _, position, _ -> if (urls[position].isEmpty()) { "图片加载失败,无法查看大图".show(this) } else { @@ -119,18 +108,18 @@ val value = device.stregnth.toDouble().toInt() val level = "$value%" val ppm = "${value * 500}ppm" - densityView.text = "$level(相当于$ppm)" + binding.densityView.text = "$level(相当于$ppm)" - lastDataView.text = device.uptime + binding.lastDataView.text = device.uptime if (device.onlineState == "0") { - deviceStateView.text = "离线" - deviceStateView.setTextColor(Color.RED) + binding.deviceStateView.text = "离线" + binding.deviceStateView.setTextColor(Color.RED) } else { - deviceStateView.text = "在线" - deviceStateView.setTextColor(Color.GREEN) + binding.deviceStateView.text = "在线" + binding.deviceStateView.setTextColor(Color.GREEN) } - signalImageView.setBackgroundResource(device.rsrp.toSignalImage()) - deviceBatteryView.text = if (device.cell.isNullOrBlank()) { + binding.signalImageView.setBackgroundResource(device.rsrp.toSignalImage()) + binding.deviceBatteryView.text = if (device.cell.isNullOrBlank()) { "0%" } else { device.cell + "%" @@ -149,7 +138,7 @@ } override fun initEvent() { - rightOptionView.setOnClickListener { + binding.rightOptionView.setOnClickListener { val lat = deviceModel.latGaode.toString() val lng = deviceModel.lngGaode.toString() if (lat.isBlank() || lng.isBlank()) { diff --git a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt index 0ae8862..ba52ab8 100644 --- a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.content.Context +import android.os.Bundle import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -8,6 +9,7 @@ import androidx.recyclerview.widget.RecyclerView import com.casic.smarttube.R import com.casic.smarttube.adapter.DeviceListAdapter +import com.casic.smarttube.databinding.ActivityGroupDeviceBinding import com.casic.smarttube.extensions.showEmptyPage import com.casic.smarttube.model.DeviceListModel import com.casic.smarttube.utils.LoadingDialogHub @@ -28,14 +30,8 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.qmuiteam.qmui.recyclerView.QMUIRVItemSwipeAction import com.qmuiteam.qmui.recyclerView.QMUISwipeAction -import kotlinx.android.synthetic.main.activity_group_device.groupDeviceLayout -import kotlinx.android.synthetic.main.activity_group_device.groupDeviceView -import kotlinx.android.synthetic.main.activity_group_device.leftBackView -import kotlinx.android.synthetic.main.activity_group_device.rightOptionView -import kotlinx.android.synthetic.main.activity_group_device.titleView -import kotlinx.android.synthetic.main.include_empty_view.emptyView -class GroupDeviceActivity : KotlinBaseActivity() { +class GroupDeviceActivity : KotlinBaseActivity() { private lateinit var groupId: String private lateinit var weakReferenceHandler: WeakReferenceHandler @@ -51,18 +47,19 @@ private var clickedPosition = 0 private var isDeleteAll = false - override fun initLayoutView(): Int = R.layout.activity_group_device + override fun initViewBinding(): ActivityGroupDeviceBinding { + return ActivityGroupDeviceBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - leftBackView.setOnClickListener { finish() } - rightOptionView.setOnClickListener { + binding.leftBackView.setOnClickListener { finish() } + binding.rightOptionView.setOnClickListener { //改为Popup val easyPopupWindow = EasyPopupWindow(this) easyPopupWindow.setPopupMenuItem( - LocaleConstant.DEVICE_OPERATE_IMAGES, - LocaleConstant.DEVICE_OPERATE_TITLES + LocaleConstant.DEVICE_OPERATE_IMAGES, LocaleConstant.DEVICE_OPERATE_TITLES ) easyPopupWindow.setOnPopupWindowClickListener(object : EasyPopupWindow.OnPopupWindowClickListener { @@ -77,13 +74,11 @@ pageIndex = 1 obtainDeviceListByPage() } + 1 -> { - AlertControlDialog.Builder() - .setContext(context) - .setTitle("提示") + AlertControlDialog.Builder().setContext(context).setTitle("提示") .setMessage("删除后将无法恢复,是否继续?") - .setNegativeButton("容我想想") - .setPositiveButton("已经想好") + .setNegativeButton("容我想想").setPositiveButton("已经想好") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onCancelClick() { @@ -103,13 +98,11 @@ } }).build().show() } + 2 -> { - MultiSelectDialog.Builder() - .setContext(this@GroupDeviceActivity) - .setTitle("选择设备") - .setDataSource(dataBeans) - .setNegativeButton("取消") - .setPositiveButton("选好了") + MultiSelectDialog.Builder().setContext(this@GroupDeviceActivity) + .setTitle("选择设备").setDataSource(dataBeans) + .setNegativeButton("取消").setPositiveButton("选好了") .setOnDialogButtonClickListener(object : MultiSelectDialog.OnDialogButtonClickListener { override fun onConfirmClick(selectedModels: MutableList) { @@ -126,21 +119,20 @@ override fun onCancelClick() { } - }) - .build().show() + }).build().show() } } } }) easyPopupWindow.setBackgroundDrawable(null) - val x: Int = rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(rightOptionView, x, 0) + val x: Int = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { groupId = intent.getStringExtra(Constant.INTENT_PARAM)!! - titleView.text = String.format(groupId + "项目设备列表") + binding.titleView.text = String.format(groupId + "项目设备列表") weakReferenceHandler = WeakReferenceHandler(callback) groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java] deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] @@ -157,13 +149,13 @@ } override fun initEvent() { - groupDeviceLayout.setOnRefreshListener { + binding.groupDeviceLayout.setOnRefreshListener { isRefresh = true //刷新之后页码重置 pageIndex = 1 obtainDeviceListByPage() } - groupDeviceLayout.setOnLoadMoreListener { + binding.groupDeviceLayout.setOnLoadMoreListener { isLoadMore = true pageIndex++ obtainDeviceListByPage() @@ -176,7 +168,7 @@ isRefresh -> { dataBeans.clear() dataBeans = dataRows!! - groupDeviceLayout.finishRefresh() + binding.groupDeviceLayout.finishRefresh() isRefresh = false } @@ -185,7 +177,7 @@ "到底了,别拉了".show(this) } dataBeans.addAll(dataRows!!) - groupDeviceLayout.finishLoadMore() + binding.groupDeviceLayout.finishLoadMore() isLoadMore = false } @@ -211,7 +203,7 @@ ) } if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { pageIndex = 1 obtainDeviceListByPage() } @@ -230,15 +222,15 @@ deviceAdapter.notifyDataSetChanged() } else { if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { pageIndex = 1 obtainDeviceListByPage() } } else { - emptyView!!.hide() + binding.emptyInclude.emptyView.hide() deviceAdapter = DeviceListAdapter(this, dataBeans) //绑定侧滑事件 - swipeAction.attachToRecyclerView(groupDeviceView) + swipeAction.attachToRecyclerView(binding.groupDeviceView) val linearLayoutManager = object : LinearLayoutManager(this) { override fun generateDefaultLayoutParams(): RecyclerView.LayoutParams { return RecyclerView.LayoutParams( @@ -247,8 +239,8 @@ ) } } - groupDeviceView.layoutManager = linearLayoutManager - groupDeviceView.adapter = deviceAdapter + binding.groupDeviceView.layoutManager = linearLayoutManager + binding.groupDeviceView.adapter = deviceAdapter deviceAdapter.setOnItemClickListener(object : DeviceListAdapter.OnItemClickListener { override fun onClicked(position: Int) { @@ -311,13 +303,9 @@ }) private fun deleteItem(adapterPosition: Int) { - AlertControlDialog.Builder() - .setContext(this) - .setTitle("提示") - .setMessage("删除后将无法恢复,是否继续?") - .setNegativeButton("容我想想") - .setPositiveButton("已经想好") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(this).setTitle("提示") + .setMessage("删除后将无法恢复,是否继续?").setNegativeButton("容我想想") + .setPositiveButton("已经想好").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onCancelClick() { diff --git a/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt b/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt index 71f438c..70e49f0 100644 --- a/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt @@ -1,9 +1,11 @@ package com.casic.smarttube.view +import android.os.Bundle import android.view.View import android.widget.AdapterView import androidx.lifecycle.ViewModelProvider import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityHistoryDataBinding import com.casic.smarttube.extensions.dateToMonthDay import com.casic.smarttube.extensions.getQuarterOfYear import com.casic.smarttube.utils.ChartViewHelper @@ -22,27 +24,26 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState -import kotlinx.android.synthetic.main.activity_history_data.dataLineChart -import kotlinx.android.synthetic.main.activity_history_data.leftBackView -import kotlinx.android.synthetic.main.activity_history_data.periodSpinner import java.util.Calendar -class HistoryDataActivity : KotlinBaseActivity() { +class HistoryDataActivity : KotlinBaseActivity() { private val kTag = "HistoryDataActivity" private lateinit var deviceViewModel: DeviceViewModel private lateinit var groupId: String private lateinit var devCode: String - override fun initLayoutView(): Int = R.layout.activity_history_data + override fun initViewBinding(): ActivityHistoryDataBinding { + return ActivityHistoryDataBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - leftBackView.setOnClickListener { finish() } + binding.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! groupId = params[0] devCode = params[1] @@ -61,8 +62,8 @@ override fun initEvent() { //默认选择近7天的数据 - periodSpinner.setSelection(3) - periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + binding.periodSpinner.setSelection(3) + binding.periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onItemSelected( parent: AdapterView<*>?, view: View?, position: Int, id: Long ) { @@ -76,6 +77,7 @@ groupId, devCode, "$year-01-01", time.timestampToCompleteDate() ) } + 1 -> { //本季度 val startDate = when (time.getQuarterOfYear()) { @@ -89,6 +91,7 @@ groupId, devCode, startDate, time.timestampToCompleteDate() ) } + 2 -> { //近30日 deviceViewModel.obtainDeviceHistoryData( @@ -98,6 +101,7 @@ time.timestampToCompleteDate() ) } + 3 -> { //近7日 deviceViewModel.obtainDeviceHistoryData( @@ -107,19 +111,18 @@ time.timestampToCompleteDate() ) } + 4 -> { //今日 deviceViewModel.obtainDeviceHistoryData( groupId, devCode, time.timestampToDate(), time.timestampToCompleteDate() ) } + 5 -> { - DateSelectDialog.Builder() - .setContext(this@HistoryDataActivity) - .setTitle("选择日期") - .setNegativeButton("取消") - .setPositiveButton("选好了") - .setOnDialogButtonClickListener(object : + DateSelectDialog.Builder().setContext(this@HistoryDataActivity) + .setTitle("选择日期").setNegativeButton("取消") + .setPositiveButton("选好了").setOnDialogButtonClickListener(object : DateSelectDialog.OnDialogButtonClickListener { override fun onConfirmClick(startDate: String, endDate: String) { deviceViewModel.obtainDeviceHistoryData( @@ -129,12 +132,10 @@ override fun onCancelClick() { //选择取消就默认加载近7天的数据 - periodSpinner.setSelection(3) + binding.periodSpinner.setSelection(3) } - }) - .setFragmentManager(supportFragmentManager) - .setCalendarType(Type.YEAR_MONTH_DAY) - .build().show() + }).setFragmentManager(supportFragmentManager) + .setCalendarType(Type.YEAR_MONTH_DAY).build().show() } } } @@ -159,7 +160,9 @@ Entry(i.toFloat(), rowsBean.stregnth!!.toFloat(), "浓度") ) } - ChartViewHelper.setLineChartData(dataLineChart, xAxisLabels, strengthEntries) + ChartViewHelper.setLineChartData( + binding.dataLineChart, xAxisLabels, strengthEntries + ) } } } diff --git a/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt b/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt index ebca433..f947b2c 100644 --- a/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt @@ -1,7 +1,8 @@ package com.casic.smarttube.view +import android.os.Bundle import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityLoginBinding import com.casic.smarttube.utils.AuthenticationHelper import com.casic.smarttube.utils.LoadingDialogHub import com.casic.smarttube.utils.LocaleConstant @@ -14,26 +15,29 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues -import kotlinx.android.synthetic.main.activity_login.loginButton -import kotlinx.android.synthetic.main.activity_login.userNameView -import kotlinx.android.synthetic.main.activity_login.userPasswordView -class LoginActivity : KotlinBaseActivity() { +class LoginActivity : KotlinBaseActivity() { private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginViewModel: LoginViewModel private lateinit var userViewModel: UserViewModel - override fun initLayoutView(): Int = R.layout.activity_login + override fun initViewBinding(): ActivityLoginBinding { + return ActivityLoginBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(true).init() } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { // 设置默认账号密码 - userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) - userPasswordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + binding.userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + binding.userPasswordView.setText( + SaveKeyValues.getValue( + LocaleConstant.PASSWORD, "" + ) as String + ) authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] @@ -50,9 +54,9 @@ } override fun initEvent() { - loginButton.setOnClickListener { - val account = userNameView.text.toString().trim() - val userPassword = userPasswordView.text.toString().trim() + binding.loginButton.setOnClickListener { + val account = binding.userNameView.text.toString().trim() + val userPassword = binding.userPasswordView.text.toString().trim() if (account.isBlank()) { "用户名不能为空".show(this) return@setOnClickListener @@ -74,8 +78,8 @@ AuthenticationHelper.savePublicKey(keyString) val publicKey = RSAUtils.keyStrToPublicKey(keyString) - val account = userNameView.text.toString() - val userPassword = userPasswordView.text.toString() + val account = binding.userNameView.text.toString() + val userPassword = binding.userPasswordView.text.toString() val dataByPublicKey = RSAUtils.encryptDataByPublicKey(userPassword.toByteArray(), publicKey!!) //登录并获取Token,POST请求 diff --git a/app/build.gradle b/app/build.gradle index 81dccf6..defbef7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,12 +2,11 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' android { signingConfigs { release { - storeFile file('/Users/a203/Desktop/AndroidProjects/CasicSmartTube/app/CasicSmartTube.jks') + storeFile file('CasicSmartTube.jks') storePassword '123456789' keyAlias 'key0' keyPassword '123456789' @@ -21,8 +20,6 @@ targetSdkVersion 33 versionCode 2 versionName "1.0.1" - - ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -47,6 +44,10 @@ } } + viewBinding { + enabled true + } + applicationVariants.configureEach { variant -> variant.outputs.configureEach { outputFileName = "GT_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" @@ -61,7 +62,7 @@ dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.5' implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.6.1' diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cccda6d..fd9277c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,7 +81,7 @@ + android:value="a6907c8bb931727374aa5fd500cda107" /> (), Handler.Callback, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { private val kTag = "HomePageFragment" private val geocoderSearch by lazy { GeocodeSearch(requireContext()) } - private lateinit var homeView: View private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var easyPopupWindow: EasyPopupWindow private lateinit var aMap: AMap private lateinit var deviceViewModel: DeviceViewModel private lateinit var groupViewModel: ProjectGroupViewModel @@ -83,34 +89,34 @@ * */ private var mapZooms = ArrayList() - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View { - homeView = inflater.inflate(R.layout.fragment_home, container, false) + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } - weakReferenceHandler = WeakReferenceHandler(callback) - val easyPopupWindow = EasyPopupWindow(requireContext()) - easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) - homeView.rightOptionView.setOnClickListener { - easyPopupWindow.setOnPopupWindowClickListener(object : - EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - easyPopupWindow.setBackgroundDrawable(null) - val x: Int = homeView.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(homeView.rightOptionView, x, 0) + override fun setupTopBarLayout() { + + } + + override fun observeRequestState() { + groupViewModel.loadState.observe(this) { state -> + when (state) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") + else -> LoadingDialogHub.dismiss() + } } + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + weakReferenceHandler = WeakReferenceHandler(this) + + easyPopupWindow = EasyPopupWindow(requireContext()) + easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) //初始化vm - deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) - groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) - - observeRequestState() + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java] //默认数据 groupViewModel.obtainProGroupList() @@ -119,12 +125,8 @@ mapZooms.add(13f) initMap(savedInstanceState) - homeView.addDeviceButton.setOnClickListener { - requireContext().navigatePageTo() - } - //数据监听 - deviceViewModel.mapDeviceModel.observe(this, { + deviceViewModel.mapDeviceModel.observe(this) { if (it.code == 200) { if (allMarkerOptions.isNotEmpty()) { allMarkerOptions.clear() @@ -149,10 +151,8 @@ longitudeList.add(longitude) //将所有设备信息转化缓存为Marker点 allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(device.devcode) - .snippet(device.modelName) + MarkerOptions().position(LatLng(latitude, longitude)) + .title(device.devcode).snippet(device.modelName) ) } } @@ -160,8 +160,8 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 13f) } - }) - groupViewModel.groupModel.observe(this, { + } + groupViewModel.groupModel.observe(this) { if (it.code == 200) { val dataRows = it.data when { @@ -170,14 +170,15 @@ dataBeans = dataRows!! isRefresh = false } + else -> { dataBeans = dataRows!! } } weakReferenceHandler.sendEmptyMessage(2022090201) } - }) - groupViewModel.groupDeviceModel.observe(this, { + } + groupViewModel.groupDeviceModel.observe(this) { if (it.code == 200) { val latitudeList: MutableList = ArrayList() val longitudeList: MutableList = ArrayList() @@ -199,22 +200,33 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 16f) } - }) - return homeView + } } - private fun observeRequestState() { - groupViewModel.loadState.observe(this, { state -> - when (state) { - LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") - else -> LoadingDialogHub.dismiss() - } - }) + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + easyPopupWindow.setOnPopupWindowClickListener(object : + EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + easyPopupWindow.setBackgroundDrawable(null) + val x: Int = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + binding.addDeviceButton.setOnClickListener { + requireContext().navigatePageTo() + } } override fun onResume() { super.onResume() - homeView.mapView.onResume() + binding.mapView.onResume() //获取所有设备数据 deviceViewModel.obtainMapDeviceList() @@ -222,16 +234,16 @@ groupViewModel.obtainProGroupList() } - private val callback = Handler.Callback { - if (it.what == 2022090201) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022090201) { if (isRefresh) { groupListAdapter.notifyDataSetChanged() } else { groupListAdapter = GroupListAdapter(requireContext(), dataBeans) - homeView.homeRecyclerView!!.addItemDecoration( + binding.homeRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - homeView.homeRecyclerView!!.adapter = groupListAdapter + binding.homeRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : GroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { @@ -241,12 +253,12 @@ }) } } - true + return true } private fun initMap(savedInstanceState: Bundle?) { - homeView.mapView.onCreate(savedInstanceState) - aMap = homeView.mapView.map + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val uiSettings = aMap.uiSettings uiSettings.isCompassEnabled = true @@ -322,10 +334,7 @@ if (!isInRange) { clustersMarkers.add( GaoDeClusterMarkerView( - requireContext(), - it, - proj, - LocaleConstant.RADIUS_SIZE + requireContext(), it, proj, LocaleConstant.RADIUS_SIZE ) )//相距多少才聚合 } @@ -363,9 +372,7 @@ //绑定数据 val clickedLatLng = marker?.position!! for (device in deviceModels) { - if (clickedLatLng.latitude == device.latGaode!!.toDouble() - && clickedLatLng.longitude == device.lngGaode!!.toDouble() - ) { + if (clickedLatLng.latitude == device.latGaode!!.toDouble() && clickedLatLng.longitude == device.lngGaode!!.toDouble()) { deviceCodeView.text = String.format("设备编号: ${device.devcode}") deviceModelView.text = String.format("设备模型: ${device.modelName}") //获取设备最新浓度信息 @@ -395,8 +402,7 @@ val address = result?.regeocodeAddress?.formatAddress val temp = StringBuilder() if (address!!.length > 16) { - temp.append(address.substring(0, 14)) - .append("\r\n") + temp.append(address.substring(0, 14)).append("\r\n") .append(address.substring(16)) } else { temp.append(address) @@ -430,9 +436,7 @@ } } //查看聚合点,单独开页面导航过去 - BottomActionSheet.Builder() - .setContext(requireContext()) - .setActionItemTitle(multiDevice) + BottomActionSheet.Builder().setContext(requireContext()).setActionItemTitle(multiDevice) .setItemTextColor(Color.BLUE) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { @@ -455,12 +459,8 @@ override fun onInfoWindowClick(p0: Marker?) { if (p0 != null) { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -487,16 +487,16 @@ 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 onDestroy() { super.onDestroy() - homeView.mapView.onDestroy() + binding.mapView.onDestroy() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt index a4e964c..cc35197 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt @@ -4,11 +4,15 @@ import android.content.Intent import android.net.Uri import android.os.Build +import android.os.Bundle import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider import com.casic.smarttube.BuildConfig import com.casic.smarttube.R +import com.casic.smarttube.databinding.FragmentMineBinding import com.casic.smarttube.extensions.appendDownloadUrl import com.casic.smarttube.model.UserDetailModel import com.casic.smarttube.utils.AuthenticationHelper @@ -36,22 +40,10 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.ChangePasswordDialog -import kotlinx.android.synthetic.main.fragment_mine.aboutUsLayout -import kotlinx.android.synthetic.main.fragment_mine.cacheSizeView -import kotlinx.android.synthetic.main.fragment_mine.changePwdLayout -import kotlinx.android.synthetic.main.fragment_mine.clearCacheLayout -import kotlinx.android.synthetic.main.fragment_mine.loginOutButton -import kotlinx.android.synthetic.main.fragment_mine.updateLogLayout -import kotlinx.android.synthetic.main.fragment_mine.updateUserButton -import kotlinx.android.synthetic.main.fragment_mine.updateVersionLayout -import kotlinx.android.synthetic.main.fragment_mine.userDeptView -import kotlinx.android.synthetic.main.fragment_mine.userImageView -import kotlinx.android.synthetic.main.fragment_mine.userNameView -import kotlinx.android.synthetic.main.fragment_mine.userPhoneView import java.io.File import java.nio.charset.StandardCharsets -class MinePageFragment : KotlinBaseFragment() { +class MinePageFragment : KotlinBaseFragment() { private val kTag = "MinePageFragment" private lateinit var userData: UserDetailModel.Data @@ -60,13 +52,17 @@ private lateinit var versionViewModel: VersionViewModel private lateinit var progressDialog: ProgressDialog - override fun initLayoutView(): Int = R.layout.fragment_mine + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentMineBinding { + return FragmentMineBinding.inflate(inflater, container, false) + } override fun setupTopBarLayout() { } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java] @@ -98,8 +94,7 @@ versionViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show( - requireActivity(), - "检查版本中,请稍后" + requireActivity(), "检查版本中,请稍后" ) else -> LoadingDialogHub.dismiss() @@ -108,49 +103,45 @@ } override fun initEvent() { - userImageView.setOnClickListener { + binding.userImageView.setOnClickListener { "尽情期待~".show(requireContext()) } - updateUserButton.setOnClickListener { + binding.updateUserButton.setOnClickListener { LoadingDialogHub.show(requireActivity(), "同步中,请稍后...") userViewModel.obtainUserDetail() } - changePwdLayout.setOnClickListener { - ChangePasswordDialog.Builder() - .setContext(requireContext()) + binding.changePwdLayout.setOnClickListener { + ChangePasswordDialog.Builder().setContext(requireContext()) .setOnDialogButtonClickListener(object : ChangePasswordDialog.OnDialogButtonClickListener { override fun onConfirmClick(oldPwd: String, newPwd: String) { - val publicKey = - RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! val oldPassKey = RSAUtils.encryptDataByPublicKey( - oldPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + oldPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) val newPassKey = RSAUtils.encryptDataByPublicKey( - newPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + newPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) userViewModel.changePassword(oldPassKey, newPassKey) } }).build().show() } - aboutUsLayout.setOnClickListener { + binding.aboutUsLayout.setOnClickListener { requireContext().navigatePageTo() } - updateVersionLayout.setOnClickListener { + binding.updateVersionLayout.setOnClickListener { versionViewModel.updateVersion() } - updateLogLayout.setOnClickListener { + binding.updateLogLayout.setOnClickListener { "尽情期待~".show(requireContext()) } - clearCacheLayout.setOnClickListener { + binding.clearCacheLayout.setOnClickListener { //删除缓存之后在设置缓存大小 LoadingDialogHub.show(requireActivity(), "清理中,请稍后") File(requireContext().cacheDir.path).deleteFile() @@ -161,18 +152,14 @@ override fun onFinish() { LoadingDialogHub.dismiss() - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() } }.start() } - loginOutButton.setOnClickListener { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("退出登录") - .setMessage("确定要退出吗?") - .setNegativeButton("取消") - .setPositiveButton("确定") + binding.loginOutButton.setOnClickListener { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("退出登录") + .setMessage("确定要退出吗?").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -203,13 +190,9 @@ if (BuildConfig.VERSION_NAME == it.version) { "已是最新版本,无需更新".show(requireContext()) } else { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("提示") - .setMessage("有新版本,是否更新?") - .setNegativeButton("稍后再说") - .setPositiveButton("立即下载") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(requireContext()).setTitle("提示") + .setMessage("有新版本,是否更新?").setNegativeButton("稍后再说") + .setPositiveButton("立即下载").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { downloadApk(it.downloadUrl) @@ -244,7 +227,7 @@ updateUserInfo() } //缓存 - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() super.onResume() } @@ -258,9 +241,9 @@ // R.color.mainThemeColor.convertColor(requireContext()) // ) // userImageView.setImageDrawable(roundDrawable) - userNameView.text = userData.name - userPhoneView.text = String.format("电话:${userData.phone}") - userDeptView.text = String.format("部门:${userData.deptName}") + binding.userNameView.text = userData.name + binding.userPhoneView.text = String.format("电话:${userData.phone}") + binding.userDeptView.text = String.format("部门:${userData.deptName}") } private fun downloadApk(url: String?) { @@ -275,7 +258,8 @@ * */ val downloadPath = url!!.appendDownloadUrl() //开始下载 - downloadPath.downloadFile(requireContext().createDownloadFileDir().toString(), + downloadPath.downloadFile( + requireContext().createDownloadFileDir().toString(), object : OnDownloadListener { override fun onDownloadStart(totalBytes: Long) { progressDialog.max = totalBytes.toInt() diff --git a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt index b009850..c0afcc5 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt @@ -1,8 +1,11 @@ package com.casic.smarttube.fragment +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R import com.casic.smarttube.adapter.OverviewGroupListAdapter +import com.casic.smarttube.databinding.FragmentOverviewBinding import com.casic.smarttube.extensions.showEmptyPage import com.casic.smarttube.model.ProjectGroupModel import com.casic.smarttube.view.GroupDeviceActivity @@ -11,25 +14,25 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.widget.dialog.AlertInputDialog -import kotlinx.android.synthetic.main.fragment_overview.groupRecyclerView -import kotlinx.android.synthetic.main.fragment_overview.rightOptionView -import kotlinx.android.synthetic.main.fragment_overview.titleView -import kotlinx.android.synthetic.main.include_empty_view.emptyView -class OverviewFragment : KotlinBaseFragment() { +class OverviewFragment : KotlinBaseFragment() { private lateinit var groupViewModel: ProjectGroupViewModel private var dataBeans: MutableList = ArrayList() private lateinit var groupListAdapter: OverviewGroupListAdapter private var clickedPosition = 0 - override fun initLayoutView(): Int = R.layout.fragment_overview - - override fun setupTopBarLayout() { - titleView.text = "概览" + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentOverviewBinding { + return FragmentOverviewBinding.inflate(inflater, container, false) } - override fun initData() { + override fun setupTopBarLayout() { + binding.titleView.text = "概览" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) } @@ -43,7 +46,7 @@ } override fun initEvent() { - rightOptionView.setOnClickListener { + binding.rightOptionView.setOnClickListener { groupViewModel.obtainProGroupList() "刷新数据中,请稍后".show(requireContext()) } @@ -51,16 +54,16 @@ groupViewModel.groupModel.observe(this) { if (it.code == 200) { if (it.data.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { groupViewModel.obtainProGroupList() } } else { - emptyView!!.hide() + binding.emptyInclude.emptyView.hide() dataBeans.clear() dataBeans = it.data groupListAdapter = OverviewGroupListAdapter(requireContext(), it.data) - groupRecyclerView!!.adapter = groupListAdapter + binding.groupRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : OverviewGroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { diff --git a/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt b/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt index e424721..7f036b0 100644 --- a/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt +++ b/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt @@ -4,8 +4,8 @@ import android.graphics.Color import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.Poi -import com.pengxh.kt.lite.extensions.showBusRouteOnMap -import com.pengxh.kt.lite.extensions.showRouteOnMap +import com.casic.smarttube.extensions.showBusRouteOnMap +import com.casic.smarttube.extensions.showRouteOnMap import com.pengxh.kt.lite.widget.dialog.BottomActionSheet object RouteOnMap { diff --git a/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt b/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt index 65bba6f..598581a 100644 --- a/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt @@ -1,27 +1,29 @@ package com.casic.smarttube.view +import android.os.Bundle import com.casic.smarttube.BuildConfig import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityAboutUsBinding import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_about_us.* -import kotlinx.android.synthetic.main.include_base_title.* -class AboutUsActivity : KotlinBaseActivity() { +class AboutUsActivity : KotlinBaseActivity() { - override fun initLayoutView(): Int = R.layout.activity_about_us + override fun initViewBinding(): ActivityAboutUsBinding { + return ActivityAboutUsBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "关于我们" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "关于我们" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { - versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + override fun initOnCreate(savedInstanceState: Bundle?) { + binding.versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") } override fun observeRequestState() { diff --git a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt index 415f9dd..80b83bd 100644 --- a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.content.Intent import android.graphics.Color +import android.os.Bundle import android.os.CountDownTimer import android.os.Handler import android.text.Editable @@ -15,6 +16,7 @@ import com.amap.api.location.AMapLocation import com.casic.smarttube.R import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.smarttube.databinding.ActivityAddDeviceBinding import com.casic.smarttube.extensions.combineImagePath import com.casic.smarttube.extensions.compressImage import com.casic.smarttube.extensions.isNumber @@ -47,24 +49,9 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_add_device.addDeviceTimeView -import kotlinx.android.synthetic.main.activity_add_device.addImageRecyclerView -import kotlinx.android.synthetic.main.activity_add_device.collectIntervalView -import kotlinx.android.synthetic.main.activity_add_device.deviceCodeView -import kotlinx.android.synthetic.main.activity_add_device.deviceNameView -import kotlinx.android.synthetic.main.activity_add_device.inputLengthView -import kotlinx.android.synthetic.main.activity_add_device.latitudeView -import kotlinx.android.synthetic.main.activity_add_device.locationImageView -import kotlinx.android.synthetic.main.activity_add_device.longitudeView -import kotlinx.android.synthetic.main.activity_add_device.ownerShipView -import kotlinx.android.synthetic.main.activity_add_device.scannerView -import kotlinx.android.synthetic.main.activity_add_device.sceneEditView -import kotlinx.android.synthetic.main.activity_add_device.submitButton -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView import java.io.File -class AddDeviceActivity : KotlinBaseActivity() { +class AddDeviceActivity : KotlinBaseActivity() { private val kTag = "AddDeviceActivity" private lateinit var imageAdapter: EditableImageAdapter @@ -81,21 +68,23 @@ registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK) { val data = result.data!! - longitudeView.text = data.getStringExtra("longitude") - latitudeView.text = data.getStringExtra("latitude") + binding.longitudeView.text = data.getStringExtra("longitude") + binding.latitudeView.text = data.getStringExtra("latitude") } } - override fun initLayoutView(): Int = R.layout.activity_add_device + override fun initViewBinding(): ActivityAddDeviceBinding { + return ActivityAddDeviceBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "添加设备" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "添加设备" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { weakReferenceHandler = WeakReferenceHandler(callback) uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] @@ -119,17 +108,17 @@ override fun initEvent() { val manager = QrManager.getInstance().init(QrConfigCreator.create(this)) - scannerView.setOnClickListener { + binding.scannerView.setOnClickListener { manager.startScan(this) { if (it.content.isNumber()) { - deviceCodeView.setText(it.content) + binding.deviceCodeView.setText(it.content) } else { "设备编号错误,请检查标签".show(context) } } } - ownerShipView.setOnClickListener { + binding.ownerShipView.setOnClickListener { groupViewModel.obtainGroupList() } groupViewModel.groupListModel.observe(this) { @@ -147,19 +136,14 @@ groups.add("自定义") } if (groups.isNotEmpty()) { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(groups) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { if (groups[position] == "自定义") { - AlertInputDialog.Builder() - .setContext(context) - .setTitle("提示") + AlertInputDialog.Builder().setContext(context).setTitle("提示") .setHintMessage("请输入该设备所属项目名,如:项目203") - .setNegativeButton("取消") - .setPositiveButton("确定") + .setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertInputDialog.OnDialogButtonClickListener { override fun onCancelClick() { @@ -167,12 +151,11 @@ } override fun onConfirmClick(value: String) { - ownerShipView.text = value + binding.ownerShipView.text = value } - }) - .build().show() + }).build().show() } else { - ownerShipView.text = groups[position] + binding.ownerShipView.text = groups[position] } } }).build().show() @@ -180,27 +163,22 @@ } //默认频率1min - collectIntervalView.text = frequency[0] - collectIntervalView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + binding.collectIntervalView.text = frequency[0] + binding.collectIntervalView.setOnClickListener { + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(frequency) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { - collectIntervalView.text = frequency[position] + binding.collectIntervalView.text = frequency[position] } }).build().show() } - locationImageView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(context) - .setItemTextColor(Color.BLUE) + binding.locationImageView.setOnClickListener { + BottomActionSheet.Builder().setContext(context).setItemTextColor(Color.BLUE) .setActionItemTitle(arrayListOf("自动定位", "手动选点")) - .setOnActionSheetListener(object : - BottomActionSheet.OnActionSheetListener { + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { when (position) { 0 -> { @@ -210,30 +188,32 @@ override fun onAMapLocationGet(aMapLocation: AMapLocation?) { LoadingDialogHub.dismiss() if (aMapLocation == null) { - longitudeView.text = "定位失败" - latitudeView.text = "定位失败" + binding.longitudeView.text = "定位失败" + binding.latitudeView.text = "定位失败" - longitudeView.setTextColor( + binding.longitudeView.setTextColor( R.color.redTextColor.convertColor(context) ) - latitudeView.setTextColor( + binding.latitudeView.setTextColor( R.color.redTextColor.convertColor(context) ) } else { - longitudeView.text = + binding.longitudeView.text = aMapLocation.longitude.toString() - latitudeView.text = aMapLocation.latitude.toString() + binding.latitudeView.text = + aMapLocation.latitude.toString() - longitudeView.setTextColor( + binding.longitudeView.setTextColor( R.color.mainTextColor.convertColor(context) ) - latitudeView.setTextColor( + binding.latitudeView.setTextColor( R.color.mainTextColor.convertColor(context) ) } } }) } + 1 -> selectLocationLauncher.launch( Intent(context, SelectLocationActivity::class.java) ) @@ -243,7 +223,7 @@ } imageAdapter = EditableImageAdapter(this, 3, 13f) - addImageRecyclerView.adapter = imageAdapter + binding.addImageRecyclerView.adapter = imageAdapter imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { selectPicture() @@ -281,7 +261,7 @@ } } - sceneEditView.addTextChangedListener(object : TextWatcher { + binding.sceneEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { } @@ -292,31 +272,31 @@ override fun afterTextChanged(s: Editable?) { val text = s.toString().trim() - inputLengthView.text = String.format("${text.length}/100") + binding.inputLengthView.text = String.format("${text.length}/100") if (text.length > 100) { - inputLengthView.setTextColor(R.color.redTextColor.convertColor(context)) + binding.inputLengthView.setTextColor(R.color.redTextColor.convertColor(context)) "现场情况字符不能超过100个字符".show(context) } else { - inputLengthView.setTextColor(R.color.subTextColor.convertColor(context)) + binding.inputLengthView.setTextColor(R.color.subTextColor.convertColor(context)) } } }) - addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() + binding.addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() - submitButton.setOnClickListener { - val deviceCode = deviceCodeView.text.toString().trim() + binding.submitButton.setOnClickListener { + val deviceCode = binding.deviceCodeView.text.toString().trim() if (deviceCode.isBlank()) { "请输入设备编号".show(context) return@setOnClickListener } - val ownerShip = ownerShipView.text.toString().trim() + val ownerShip = binding.ownerShipView.text.toString().trim() if (ownerShip.isBlank()) { "请输入设备所属项目".show(context) return@setOnClickListener } - val longitude = longitudeView.text.toString().trim() - val latitude = latitudeView.text.toString().trim() + val longitude = binding.longitudeView.text.toString().trim() + val latitude = binding.latitudeView.text.toString().trim() if (longitude.isBlank() || latitude.isBlank()) { "请先获取当前经纬度".show(context) return@setOnClickListener @@ -329,14 +309,14 @@ ) deviceViewModel.addDevice( deviceCode, - deviceNameView.text.toString(), + binding.deviceNameView.text.toString(), ownerShip, - collectIntervalView.text.toString(), + binding.collectIntervalView.text.toString(), longitude, latitude, imagePaths.reformat(), - sceneEditView.text.toString().trim(), - addDeviceTimeView.text.toString(), + binding.sceneEditView.text.toString().trim(), + binding.addDeviceTimeView.text.toString(), userData.id.toString(), userData.deptId ) @@ -345,16 +325,13 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(listOf("拍照", "相册")) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { when (position) { 0 -> { - PictureSelector.create(context) - .openCamera(SelectMimeType.ofImage()) + PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { if (result == null) { @@ -362,8 +339,7 @@ return } LoadingDialogHub.show( - this@AddDeviceActivity, - "图片上传中,请稍后..." + this@AddDeviceActivity, "图片上传中,请稍后..." ) selectedImages = result analyticalSelectResults(result[0]) @@ -374,14 +350,11 @@ } }) } + 1 -> { - PictureSelector.create(context) - .openGallery(SelectMimeType.ofImage()) - .isGif(false) - .isMaxSelectEnabledMask(true) - .setFilterMinFileSize(100) - .setMaxSelectNum(3) - .isDisplayCamera(false) + PictureSelector.create(context).openGallery(SelectMimeType.ofImage()) + .isGif(false).isMaxSelectEnabledMask(true).setFilterMinFileSize(100) + .setMaxSelectNum(3).isDisplayCamera(false) .setImageEngine(GlideLoadEngine.instance) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { @@ -390,8 +363,7 @@ return } LoadingDialogHub.show( - this@AddDeviceActivity, - "图片上传中,请稍后..." + this@AddDeviceActivity, "图片上传中,请稍后..." ) selectedImages = result // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 diff --git a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt index 3864f16..e4f19a4 100644 --- a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.content.Context +import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,19 +11,20 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityBigImageBinding import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager -import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : KotlinBaseActivity() { +class BigImageActivity : KotlinBaseActivity() { - override fun initLayoutView(): Int = R.layout.activity_big_image + override fun initViewBinding(): ActivityBigImageBinding { + return ActivityBigImageBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { PageNavigationManager.addActivity(this) @@ -30,16 +32,16 @@ ImmersionBar.with(this).statusBarDarkFont(false).init() } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) val urls = intent.getStringArrayListExtra(Constant.BIG_IMAGE_INTENT_DATA_KEY) if (urls == null || urls.size == 0) { return } - pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") - imagePagerView.adapter = BigImageAdapter(this, urls) - imagePagerView.currentItem = index - imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + binding.pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + binding.imagePagerView.adapter = BigImageAdapter(this, urls) + binding.imagePagerView.currentItem = index + binding.imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrollStateChanged(state: Int) { } @@ -53,7 +55,8 @@ } override fun onPageSelected(position: Int) { - pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + binding.pageNumberView.text = + String.format("(" + (position + 1) + "/" + urls.size + ")") } }) } @@ -63,7 +66,7 @@ } override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } + binding.leftBackView.setOnClickListener { this.finish() } } class BigImageAdapter(private var context: Context, imageList: ArrayList) : diff --git a/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt b/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt index 072953f..f036a78 100644 --- a/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.graphics.Color +import android.os.Bundle import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -10,6 +11,7 @@ import com.amap.api.services.geocoder.RegeocodeQuery import com.amap.api.services.geocoder.RegeocodeResult import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityDeviceDetailBinding import com.casic.smarttube.extensions.combineImagePath import com.casic.smarttube.extensions.toSignalImage import com.casic.smarttube.model.DeviceDetailModel @@ -25,51 +27,39 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState -import kotlinx.android.synthetic.main.activity_device_detail.densityView -import kotlinx.android.synthetic.main.activity_device_detail.descriptionView -import kotlinx.android.synthetic.main.activity_device_detail.deviceBatteryView -import kotlinx.android.synthetic.main.activity_device_detail.deviceCodeView -import kotlinx.android.synthetic.main.activity_device_detail.deviceNameView -import kotlinx.android.synthetic.main.activity_device_detail.deviceStateView -import kotlinx.android.synthetic.main.activity_device_detail.imageGridView -import kotlinx.android.synthetic.main.activity_device_detail.lastDataView -import kotlinx.android.synthetic.main.activity_device_detail.leftBackView -import kotlinx.android.synthetic.main.activity_device_detail.locationView -import kotlinx.android.synthetic.main.activity_device_detail.projectGroupView -import kotlinx.android.synthetic.main.activity_device_detail.rightOptionView -import kotlinx.android.synthetic.main.activity_device_detail.signalImageView -import kotlinx.android.synthetic.main.activity_device_detail.titleView -class DeviceDetailActivity : KotlinBaseActivity() { +class DeviceDetailActivity : KotlinBaseActivity() { private val kTag = "DeviceDetailActivity" private lateinit var deviceViewModel: DeviceViewModel private lateinit var deviceModel: DeviceDetailModel.DataModel private val geocoderSearch by lazy { GeocodeSearch(this) } - override fun initLayoutView(): Int = R.layout.activity_device_detail + override fun initViewBinding(): ActivityDeviceDetailBinding { + return ActivityDeviceDetailBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "设备详情" - leftBackView.setOnClickListener { finish() } + binding.titleView.text = "设备详情" + binding.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! - deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] deviceViewModel.obtainDeviceDetail(params[0], params[1]) deviceViewModel.deviceDetailModel.observe(this) { if (it.code == 200) { val device = it.data this.deviceModel = device - deviceCodeView.text = device.devcode - deviceNameView.text = device.deviceName - projectGroupView.text = String.format("项目${device.groupId}") + binding.deviceCodeView.text = device.devcode + binding.deviceNameView.text = device.deviceName + binding.projectGroupView.text = String.format("项目${device.groupId}") if (device.latGaode.isBlank() || device.lngGaode.isBlank()) { - locationView.text = "经纬度异常,无法查看具体位置" + binding.locationView.text = "经纬度异常,无法查看具体位置" } else { val queryParam = RegeocodeQuery( LatLonPoint(device.latGaode.toDouble(), device.lngGaode.toDouble()), @@ -81,7 +71,7 @@ GeocodeSearch.OnGeocodeSearchListener { override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { if (rCode == 1000) { - locationView.text = result?.regeocodeAddress?.formatAddress + binding.locationView.text = result?.regeocodeAddress?.formatAddress } } @@ -90,12 +80,12 @@ } }) } - descriptionView.text = device.descn + binding.descriptionView.text = device.descn if (device.photos.toString().isBlank()) { - imageGridView.visibility = View.GONE + binding.imageGridView.visibility = View.GONE } else { - imageGridView.visibility = View.VISIBLE + binding.imageGridView.visibility = View.VISIBLE //处理图片地址 val urls: ArrayList = ArrayList() val imageArray = device.photos.toString().split(",") @@ -104,10 +94,9 @@ urls.add(path.combineImagePath()) } } - val imageAdapter = ReadOnlyImageAdapter(this) - imageAdapter.setImageList(urls) - imageGridView.adapter = imageAdapter - imageGridView.setOnItemClickListener { _, _, position, _ -> + val imageAdapter = ReadOnlyImageAdapter(this, urls) + binding.imageGridView.adapter = imageAdapter + binding.imageGridView.setOnItemClickListener { _, _, position, _ -> if (urls[position].isEmpty()) { "图片加载失败,无法查看大图".show(this) } else { @@ -119,18 +108,18 @@ val value = device.stregnth.toDouble().toInt() val level = "$value%" val ppm = "${value * 500}ppm" - densityView.text = "$level(相当于$ppm)" + binding.densityView.text = "$level(相当于$ppm)" - lastDataView.text = device.uptime + binding.lastDataView.text = device.uptime if (device.onlineState == "0") { - deviceStateView.text = "离线" - deviceStateView.setTextColor(Color.RED) + binding.deviceStateView.text = "离线" + binding.deviceStateView.setTextColor(Color.RED) } else { - deviceStateView.text = "在线" - deviceStateView.setTextColor(Color.GREEN) + binding.deviceStateView.text = "在线" + binding.deviceStateView.setTextColor(Color.GREEN) } - signalImageView.setBackgroundResource(device.rsrp.toSignalImage()) - deviceBatteryView.text = if (device.cell.isNullOrBlank()) { + binding.signalImageView.setBackgroundResource(device.rsrp.toSignalImage()) + binding.deviceBatteryView.text = if (device.cell.isNullOrBlank()) { "0%" } else { device.cell + "%" @@ -149,7 +138,7 @@ } override fun initEvent() { - rightOptionView.setOnClickListener { + binding.rightOptionView.setOnClickListener { val lat = deviceModel.latGaode.toString() val lng = deviceModel.lngGaode.toString() if (lat.isBlank() || lng.isBlank()) { diff --git a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt index 0ae8862..ba52ab8 100644 --- a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.content.Context +import android.os.Bundle import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -8,6 +9,7 @@ import androidx.recyclerview.widget.RecyclerView import com.casic.smarttube.R import com.casic.smarttube.adapter.DeviceListAdapter +import com.casic.smarttube.databinding.ActivityGroupDeviceBinding import com.casic.smarttube.extensions.showEmptyPage import com.casic.smarttube.model.DeviceListModel import com.casic.smarttube.utils.LoadingDialogHub @@ -28,14 +30,8 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.qmuiteam.qmui.recyclerView.QMUIRVItemSwipeAction import com.qmuiteam.qmui.recyclerView.QMUISwipeAction -import kotlinx.android.synthetic.main.activity_group_device.groupDeviceLayout -import kotlinx.android.synthetic.main.activity_group_device.groupDeviceView -import kotlinx.android.synthetic.main.activity_group_device.leftBackView -import kotlinx.android.synthetic.main.activity_group_device.rightOptionView -import kotlinx.android.synthetic.main.activity_group_device.titleView -import kotlinx.android.synthetic.main.include_empty_view.emptyView -class GroupDeviceActivity : KotlinBaseActivity() { +class GroupDeviceActivity : KotlinBaseActivity() { private lateinit var groupId: String private lateinit var weakReferenceHandler: WeakReferenceHandler @@ -51,18 +47,19 @@ private var clickedPosition = 0 private var isDeleteAll = false - override fun initLayoutView(): Int = R.layout.activity_group_device + override fun initViewBinding(): ActivityGroupDeviceBinding { + return ActivityGroupDeviceBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - leftBackView.setOnClickListener { finish() } - rightOptionView.setOnClickListener { + binding.leftBackView.setOnClickListener { finish() } + binding.rightOptionView.setOnClickListener { //改为Popup val easyPopupWindow = EasyPopupWindow(this) easyPopupWindow.setPopupMenuItem( - LocaleConstant.DEVICE_OPERATE_IMAGES, - LocaleConstant.DEVICE_OPERATE_TITLES + LocaleConstant.DEVICE_OPERATE_IMAGES, LocaleConstant.DEVICE_OPERATE_TITLES ) easyPopupWindow.setOnPopupWindowClickListener(object : EasyPopupWindow.OnPopupWindowClickListener { @@ -77,13 +74,11 @@ pageIndex = 1 obtainDeviceListByPage() } + 1 -> { - AlertControlDialog.Builder() - .setContext(context) - .setTitle("提示") + AlertControlDialog.Builder().setContext(context).setTitle("提示") .setMessage("删除后将无法恢复,是否继续?") - .setNegativeButton("容我想想") - .setPositiveButton("已经想好") + .setNegativeButton("容我想想").setPositiveButton("已经想好") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onCancelClick() { @@ -103,13 +98,11 @@ } }).build().show() } + 2 -> { - MultiSelectDialog.Builder() - .setContext(this@GroupDeviceActivity) - .setTitle("选择设备") - .setDataSource(dataBeans) - .setNegativeButton("取消") - .setPositiveButton("选好了") + MultiSelectDialog.Builder().setContext(this@GroupDeviceActivity) + .setTitle("选择设备").setDataSource(dataBeans) + .setNegativeButton("取消").setPositiveButton("选好了") .setOnDialogButtonClickListener(object : MultiSelectDialog.OnDialogButtonClickListener { override fun onConfirmClick(selectedModels: MutableList) { @@ -126,21 +119,20 @@ override fun onCancelClick() { } - }) - .build().show() + }).build().show() } } } }) easyPopupWindow.setBackgroundDrawable(null) - val x: Int = rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(rightOptionView, x, 0) + val x: Int = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { groupId = intent.getStringExtra(Constant.INTENT_PARAM)!! - titleView.text = String.format(groupId + "项目设备列表") + binding.titleView.text = String.format(groupId + "项目设备列表") weakReferenceHandler = WeakReferenceHandler(callback) groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java] deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] @@ -157,13 +149,13 @@ } override fun initEvent() { - groupDeviceLayout.setOnRefreshListener { + binding.groupDeviceLayout.setOnRefreshListener { isRefresh = true //刷新之后页码重置 pageIndex = 1 obtainDeviceListByPage() } - groupDeviceLayout.setOnLoadMoreListener { + binding.groupDeviceLayout.setOnLoadMoreListener { isLoadMore = true pageIndex++ obtainDeviceListByPage() @@ -176,7 +168,7 @@ isRefresh -> { dataBeans.clear() dataBeans = dataRows!! - groupDeviceLayout.finishRefresh() + binding.groupDeviceLayout.finishRefresh() isRefresh = false } @@ -185,7 +177,7 @@ "到底了,别拉了".show(this) } dataBeans.addAll(dataRows!!) - groupDeviceLayout.finishLoadMore() + binding.groupDeviceLayout.finishLoadMore() isLoadMore = false } @@ -211,7 +203,7 @@ ) } if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { pageIndex = 1 obtainDeviceListByPage() } @@ -230,15 +222,15 @@ deviceAdapter.notifyDataSetChanged() } else { if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { pageIndex = 1 obtainDeviceListByPage() } } else { - emptyView!!.hide() + binding.emptyInclude.emptyView.hide() deviceAdapter = DeviceListAdapter(this, dataBeans) //绑定侧滑事件 - swipeAction.attachToRecyclerView(groupDeviceView) + swipeAction.attachToRecyclerView(binding.groupDeviceView) val linearLayoutManager = object : LinearLayoutManager(this) { override fun generateDefaultLayoutParams(): RecyclerView.LayoutParams { return RecyclerView.LayoutParams( @@ -247,8 +239,8 @@ ) } } - groupDeviceView.layoutManager = linearLayoutManager - groupDeviceView.adapter = deviceAdapter + binding.groupDeviceView.layoutManager = linearLayoutManager + binding.groupDeviceView.adapter = deviceAdapter deviceAdapter.setOnItemClickListener(object : DeviceListAdapter.OnItemClickListener { override fun onClicked(position: Int) { @@ -311,13 +303,9 @@ }) private fun deleteItem(adapterPosition: Int) { - AlertControlDialog.Builder() - .setContext(this) - .setTitle("提示") - .setMessage("删除后将无法恢复,是否继续?") - .setNegativeButton("容我想想") - .setPositiveButton("已经想好") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(this).setTitle("提示") + .setMessage("删除后将无法恢复,是否继续?").setNegativeButton("容我想想") + .setPositiveButton("已经想好").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onCancelClick() { diff --git a/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt b/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt index 71f438c..70e49f0 100644 --- a/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt @@ -1,9 +1,11 @@ package com.casic.smarttube.view +import android.os.Bundle import android.view.View import android.widget.AdapterView import androidx.lifecycle.ViewModelProvider import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityHistoryDataBinding import com.casic.smarttube.extensions.dateToMonthDay import com.casic.smarttube.extensions.getQuarterOfYear import com.casic.smarttube.utils.ChartViewHelper @@ -22,27 +24,26 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState -import kotlinx.android.synthetic.main.activity_history_data.dataLineChart -import kotlinx.android.synthetic.main.activity_history_data.leftBackView -import kotlinx.android.synthetic.main.activity_history_data.periodSpinner import java.util.Calendar -class HistoryDataActivity : KotlinBaseActivity() { +class HistoryDataActivity : KotlinBaseActivity() { private val kTag = "HistoryDataActivity" private lateinit var deviceViewModel: DeviceViewModel private lateinit var groupId: String private lateinit var devCode: String - override fun initLayoutView(): Int = R.layout.activity_history_data + override fun initViewBinding(): ActivityHistoryDataBinding { + return ActivityHistoryDataBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - leftBackView.setOnClickListener { finish() } + binding.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! groupId = params[0] devCode = params[1] @@ -61,8 +62,8 @@ override fun initEvent() { //默认选择近7天的数据 - periodSpinner.setSelection(3) - periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + binding.periodSpinner.setSelection(3) + binding.periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onItemSelected( parent: AdapterView<*>?, view: View?, position: Int, id: Long ) { @@ -76,6 +77,7 @@ groupId, devCode, "$year-01-01", time.timestampToCompleteDate() ) } + 1 -> { //本季度 val startDate = when (time.getQuarterOfYear()) { @@ -89,6 +91,7 @@ groupId, devCode, startDate, time.timestampToCompleteDate() ) } + 2 -> { //近30日 deviceViewModel.obtainDeviceHistoryData( @@ -98,6 +101,7 @@ time.timestampToCompleteDate() ) } + 3 -> { //近7日 deviceViewModel.obtainDeviceHistoryData( @@ -107,19 +111,18 @@ time.timestampToCompleteDate() ) } + 4 -> { //今日 deviceViewModel.obtainDeviceHistoryData( groupId, devCode, time.timestampToDate(), time.timestampToCompleteDate() ) } + 5 -> { - DateSelectDialog.Builder() - .setContext(this@HistoryDataActivity) - .setTitle("选择日期") - .setNegativeButton("取消") - .setPositiveButton("选好了") - .setOnDialogButtonClickListener(object : + DateSelectDialog.Builder().setContext(this@HistoryDataActivity) + .setTitle("选择日期").setNegativeButton("取消") + .setPositiveButton("选好了").setOnDialogButtonClickListener(object : DateSelectDialog.OnDialogButtonClickListener { override fun onConfirmClick(startDate: String, endDate: String) { deviceViewModel.obtainDeviceHistoryData( @@ -129,12 +132,10 @@ override fun onCancelClick() { //选择取消就默认加载近7天的数据 - periodSpinner.setSelection(3) + binding.periodSpinner.setSelection(3) } - }) - .setFragmentManager(supportFragmentManager) - .setCalendarType(Type.YEAR_MONTH_DAY) - .build().show() + }).setFragmentManager(supportFragmentManager) + .setCalendarType(Type.YEAR_MONTH_DAY).build().show() } } } @@ -159,7 +160,9 @@ Entry(i.toFloat(), rowsBean.stregnth!!.toFloat(), "浓度") ) } - ChartViewHelper.setLineChartData(dataLineChart, xAxisLabels, strengthEntries) + ChartViewHelper.setLineChartData( + binding.dataLineChart, xAxisLabels, strengthEntries + ) } } } diff --git a/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt b/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt index ebca433..f947b2c 100644 --- a/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt @@ -1,7 +1,8 @@ package com.casic.smarttube.view +import android.os.Bundle import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityLoginBinding import com.casic.smarttube.utils.AuthenticationHelper import com.casic.smarttube.utils.LoadingDialogHub import com.casic.smarttube.utils.LocaleConstant @@ -14,26 +15,29 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues -import kotlinx.android.synthetic.main.activity_login.loginButton -import kotlinx.android.synthetic.main.activity_login.userNameView -import kotlinx.android.synthetic.main.activity_login.userPasswordView -class LoginActivity : KotlinBaseActivity() { +class LoginActivity : KotlinBaseActivity() { private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginViewModel: LoginViewModel private lateinit var userViewModel: UserViewModel - override fun initLayoutView(): Int = R.layout.activity_login + override fun initViewBinding(): ActivityLoginBinding { + return ActivityLoginBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(true).init() } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { // 设置默认账号密码 - userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) - userPasswordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + binding.userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + binding.userPasswordView.setText( + SaveKeyValues.getValue( + LocaleConstant.PASSWORD, "" + ) as String + ) authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] @@ -50,9 +54,9 @@ } override fun initEvent() { - loginButton.setOnClickListener { - val account = userNameView.text.toString().trim() - val userPassword = userPasswordView.text.toString().trim() + binding.loginButton.setOnClickListener { + val account = binding.userNameView.text.toString().trim() + val userPassword = binding.userPasswordView.text.toString().trim() if (account.isBlank()) { "用户名不能为空".show(this) return@setOnClickListener @@ -74,8 +78,8 @@ AuthenticationHelper.savePublicKey(keyString) val publicKey = RSAUtils.keyStrToPublicKey(keyString) - val account = userNameView.text.toString() - val userPassword = userPasswordView.text.toString() + val account = binding.userNameView.text.toString() + val userPassword = binding.userPasswordView.text.toString() val dataByPublicKey = RSAUtils.encryptDataByPublicKey(userPassword.toByteArray(), publicKey!!) //登录并获取Token,POST请求 diff --git a/app/src/main/java/com/casic/smarttube/view/MainActivity.kt b/app/src/main/java/com/casic/smarttube/view/MainActivity.kt index 4461757..575e1ee 100644 --- a/app/src/main/java/com/casic/smarttube/view/MainActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/MainActivity.kt @@ -1,5 +1,6 @@ package com.casic.smarttube.view +import android.os.Bundle import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment @@ -7,6 +8,7 @@ import androidx.fragment.app.FragmentPagerAdapter import androidx.viewpager.widget.ViewPager import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityMainBinding import com.casic.smarttube.fragment.HomePageFragment import com.casic.smarttube.fragment.MinePageFragment import com.casic.smarttube.fragment.OverviewFragment @@ -15,9 +17,8 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_main.* -class MainActivity : KotlinBaseActivity() { +class MainActivity : KotlinBaseActivity() { private var menuItem: MenuItem? = null private var fragmentList: MutableList = ArrayList() @@ -29,32 +30,36 @@ fragmentList.add(MinePageFragment()) } - override fun initLayoutView(): Int = R.layout.activity_main + override fun initViewBinding(): ActivityMainBinding { + return ActivityMainBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { //保留icon原图颜色 - bottomNavigation.itemIconTintList = null - bottomNavigation.setOnItemSelectedListener { menuItem -> + binding.bottomNavigation.itemIconTintList = null + binding.bottomNavigation.setOnItemSelectedListener { menuItem -> when (menuItem.itemId) { R.id.nav_home -> { - mainViewPager.currentItem = 0 + binding.mainViewPager.currentItem = 0 } + R.id.nav_overview -> { - mainViewPager.currentItem = 1 + binding.mainViewPager.currentItem = 1 } + R.id.nav_mine -> { - mainViewPager.currentItem = 2 + binding.mainViewPager.currentItem = 2 } } false } - mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) - mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 + binding.mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + binding.mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun observeRequestState() { @@ -62,7 +67,7 @@ } override fun initEvent() { - mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + binding.mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrollStateChanged(state: Int) { } @@ -77,9 +82,9 @@ if (menuItem != null) { menuItem!!.isChecked = false } else { - bottomNavigation.menu.getItem(0).isChecked = false + binding.bottomNavigation.menu.getItem(0).isChecked = false } - menuItem = bottomNavigation.menu.getItem(position) + menuItem = binding.bottomNavigation.menu.getItem(position) menuItem!!.isChecked = true } }) diff --git a/app/build.gradle b/app/build.gradle index 81dccf6..defbef7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,12 +2,11 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' android { signingConfigs { release { - storeFile file('/Users/a203/Desktop/AndroidProjects/CasicSmartTube/app/CasicSmartTube.jks') + storeFile file('CasicSmartTube.jks') storePassword '123456789' keyAlias 'key0' keyPassword '123456789' @@ -21,8 +20,6 @@ targetSdkVersion 33 versionCode 2 versionName "1.0.1" - - ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -47,6 +44,10 @@ } } + viewBinding { + enabled true + } + applicationVariants.configureEach { variant -> variant.outputs.configureEach { outputFileName = "GT_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" @@ -61,7 +62,7 @@ dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.5' implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.6.1' diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cccda6d..fd9277c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,7 +81,7 @@ + android:value="a6907c8bb931727374aa5fd500cda107" /> (), Handler.Callback, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { private val kTag = "HomePageFragment" private val geocoderSearch by lazy { GeocodeSearch(requireContext()) } - private lateinit var homeView: View private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var easyPopupWindow: EasyPopupWindow private lateinit var aMap: AMap private lateinit var deviceViewModel: DeviceViewModel private lateinit var groupViewModel: ProjectGroupViewModel @@ -83,34 +89,34 @@ * */ private var mapZooms = ArrayList() - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View { - homeView = inflater.inflate(R.layout.fragment_home, container, false) + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } - weakReferenceHandler = WeakReferenceHandler(callback) - val easyPopupWindow = EasyPopupWindow(requireContext()) - easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) - homeView.rightOptionView.setOnClickListener { - easyPopupWindow.setOnPopupWindowClickListener(object : - EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - easyPopupWindow.setBackgroundDrawable(null) - val x: Int = homeView.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(homeView.rightOptionView, x, 0) + override fun setupTopBarLayout() { + + } + + override fun observeRequestState() { + groupViewModel.loadState.observe(this) { state -> + when (state) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") + else -> LoadingDialogHub.dismiss() + } } + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + weakReferenceHandler = WeakReferenceHandler(this) + + easyPopupWindow = EasyPopupWindow(requireContext()) + easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) //初始化vm - deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) - groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) - - observeRequestState() + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java] //默认数据 groupViewModel.obtainProGroupList() @@ -119,12 +125,8 @@ mapZooms.add(13f) initMap(savedInstanceState) - homeView.addDeviceButton.setOnClickListener { - requireContext().navigatePageTo() - } - //数据监听 - deviceViewModel.mapDeviceModel.observe(this, { + deviceViewModel.mapDeviceModel.observe(this) { if (it.code == 200) { if (allMarkerOptions.isNotEmpty()) { allMarkerOptions.clear() @@ -149,10 +151,8 @@ longitudeList.add(longitude) //将所有设备信息转化缓存为Marker点 allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(device.devcode) - .snippet(device.modelName) + MarkerOptions().position(LatLng(latitude, longitude)) + .title(device.devcode).snippet(device.modelName) ) } } @@ -160,8 +160,8 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 13f) } - }) - groupViewModel.groupModel.observe(this, { + } + groupViewModel.groupModel.observe(this) { if (it.code == 200) { val dataRows = it.data when { @@ -170,14 +170,15 @@ dataBeans = dataRows!! isRefresh = false } + else -> { dataBeans = dataRows!! } } weakReferenceHandler.sendEmptyMessage(2022090201) } - }) - groupViewModel.groupDeviceModel.observe(this, { + } + groupViewModel.groupDeviceModel.observe(this) { if (it.code == 200) { val latitudeList: MutableList = ArrayList() val longitudeList: MutableList = ArrayList() @@ -199,22 +200,33 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 16f) } - }) - return homeView + } } - private fun observeRequestState() { - groupViewModel.loadState.observe(this, { state -> - when (state) { - LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") - else -> LoadingDialogHub.dismiss() - } - }) + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + easyPopupWindow.setOnPopupWindowClickListener(object : + EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + easyPopupWindow.setBackgroundDrawable(null) + val x: Int = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + binding.addDeviceButton.setOnClickListener { + requireContext().navigatePageTo() + } } override fun onResume() { super.onResume() - homeView.mapView.onResume() + binding.mapView.onResume() //获取所有设备数据 deviceViewModel.obtainMapDeviceList() @@ -222,16 +234,16 @@ groupViewModel.obtainProGroupList() } - private val callback = Handler.Callback { - if (it.what == 2022090201) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022090201) { if (isRefresh) { groupListAdapter.notifyDataSetChanged() } else { groupListAdapter = GroupListAdapter(requireContext(), dataBeans) - homeView.homeRecyclerView!!.addItemDecoration( + binding.homeRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - homeView.homeRecyclerView!!.adapter = groupListAdapter + binding.homeRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : GroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { @@ -241,12 +253,12 @@ }) } } - true + return true } private fun initMap(savedInstanceState: Bundle?) { - homeView.mapView.onCreate(savedInstanceState) - aMap = homeView.mapView.map + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val uiSettings = aMap.uiSettings uiSettings.isCompassEnabled = true @@ -322,10 +334,7 @@ if (!isInRange) { clustersMarkers.add( GaoDeClusterMarkerView( - requireContext(), - it, - proj, - LocaleConstant.RADIUS_SIZE + requireContext(), it, proj, LocaleConstant.RADIUS_SIZE ) )//相距多少才聚合 } @@ -363,9 +372,7 @@ //绑定数据 val clickedLatLng = marker?.position!! for (device in deviceModels) { - if (clickedLatLng.latitude == device.latGaode!!.toDouble() - && clickedLatLng.longitude == device.lngGaode!!.toDouble() - ) { + if (clickedLatLng.latitude == device.latGaode!!.toDouble() && clickedLatLng.longitude == device.lngGaode!!.toDouble()) { deviceCodeView.text = String.format("设备编号: ${device.devcode}") deviceModelView.text = String.format("设备模型: ${device.modelName}") //获取设备最新浓度信息 @@ -395,8 +402,7 @@ val address = result?.regeocodeAddress?.formatAddress val temp = StringBuilder() if (address!!.length > 16) { - temp.append(address.substring(0, 14)) - .append("\r\n") + temp.append(address.substring(0, 14)).append("\r\n") .append(address.substring(16)) } else { temp.append(address) @@ -430,9 +436,7 @@ } } //查看聚合点,单独开页面导航过去 - BottomActionSheet.Builder() - .setContext(requireContext()) - .setActionItemTitle(multiDevice) + BottomActionSheet.Builder().setContext(requireContext()).setActionItemTitle(multiDevice) .setItemTextColor(Color.BLUE) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { @@ -455,12 +459,8 @@ override fun onInfoWindowClick(p0: Marker?) { if (p0 != null) { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -487,16 +487,16 @@ 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 onDestroy() { super.onDestroy() - homeView.mapView.onDestroy() + binding.mapView.onDestroy() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt index a4e964c..cc35197 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt @@ -4,11 +4,15 @@ import android.content.Intent import android.net.Uri import android.os.Build +import android.os.Bundle import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider import com.casic.smarttube.BuildConfig import com.casic.smarttube.R +import com.casic.smarttube.databinding.FragmentMineBinding import com.casic.smarttube.extensions.appendDownloadUrl import com.casic.smarttube.model.UserDetailModel import com.casic.smarttube.utils.AuthenticationHelper @@ -36,22 +40,10 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.ChangePasswordDialog -import kotlinx.android.synthetic.main.fragment_mine.aboutUsLayout -import kotlinx.android.synthetic.main.fragment_mine.cacheSizeView -import kotlinx.android.synthetic.main.fragment_mine.changePwdLayout -import kotlinx.android.synthetic.main.fragment_mine.clearCacheLayout -import kotlinx.android.synthetic.main.fragment_mine.loginOutButton -import kotlinx.android.synthetic.main.fragment_mine.updateLogLayout -import kotlinx.android.synthetic.main.fragment_mine.updateUserButton -import kotlinx.android.synthetic.main.fragment_mine.updateVersionLayout -import kotlinx.android.synthetic.main.fragment_mine.userDeptView -import kotlinx.android.synthetic.main.fragment_mine.userImageView -import kotlinx.android.synthetic.main.fragment_mine.userNameView -import kotlinx.android.synthetic.main.fragment_mine.userPhoneView import java.io.File import java.nio.charset.StandardCharsets -class MinePageFragment : KotlinBaseFragment() { +class MinePageFragment : KotlinBaseFragment() { private val kTag = "MinePageFragment" private lateinit var userData: UserDetailModel.Data @@ -60,13 +52,17 @@ private lateinit var versionViewModel: VersionViewModel private lateinit var progressDialog: ProgressDialog - override fun initLayoutView(): Int = R.layout.fragment_mine + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentMineBinding { + return FragmentMineBinding.inflate(inflater, container, false) + } override fun setupTopBarLayout() { } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java] @@ -98,8 +94,7 @@ versionViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show( - requireActivity(), - "检查版本中,请稍后" + requireActivity(), "检查版本中,请稍后" ) else -> LoadingDialogHub.dismiss() @@ -108,49 +103,45 @@ } override fun initEvent() { - userImageView.setOnClickListener { + binding.userImageView.setOnClickListener { "尽情期待~".show(requireContext()) } - updateUserButton.setOnClickListener { + binding.updateUserButton.setOnClickListener { LoadingDialogHub.show(requireActivity(), "同步中,请稍后...") userViewModel.obtainUserDetail() } - changePwdLayout.setOnClickListener { - ChangePasswordDialog.Builder() - .setContext(requireContext()) + binding.changePwdLayout.setOnClickListener { + ChangePasswordDialog.Builder().setContext(requireContext()) .setOnDialogButtonClickListener(object : ChangePasswordDialog.OnDialogButtonClickListener { override fun onConfirmClick(oldPwd: String, newPwd: String) { - val publicKey = - RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! val oldPassKey = RSAUtils.encryptDataByPublicKey( - oldPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + oldPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) val newPassKey = RSAUtils.encryptDataByPublicKey( - newPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + newPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) userViewModel.changePassword(oldPassKey, newPassKey) } }).build().show() } - aboutUsLayout.setOnClickListener { + binding.aboutUsLayout.setOnClickListener { requireContext().navigatePageTo() } - updateVersionLayout.setOnClickListener { + binding.updateVersionLayout.setOnClickListener { versionViewModel.updateVersion() } - updateLogLayout.setOnClickListener { + binding.updateLogLayout.setOnClickListener { "尽情期待~".show(requireContext()) } - clearCacheLayout.setOnClickListener { + binding.clearCacheLayout.setOnClickListener { //删除缓存之后在设置缓存大小 LoadingDialogHub.show(requireActivity(), "清理中,请稍后") File(requireContext().cacheDir.path).deleteFile() @@ -161,18 +152,14 @@ override fun onFinish() { LoadingDialogHub.dismiss() - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() } }.start() } - loginOutButton.setOnClickListener { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("退出登录") - .setMessage("确定要退出吗?") - .setNegativeButton("取消") - .setPositiveButton("确定") + binding.loginOutButton.setOnClickListener { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("退出登录") + .setMessage("确定要退出吗?").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -203,13 +190,9 @@ if (BuildConfig.VERSION_NAME == it.version) { "已是最新版本,无需更新".show(requireContext()) } else { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("提示") - .setMessage("有新版本,是否更新?") - .setNegativeButton("稍后再说") - .setPositiveButton("立即下载") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(requireContext()).setTitle("提示") + .setMessage("有新版本,是否更新?").setNegativeButton("稍后再说") + .setPositiveButton("立即下载").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { downloadApk(it.downloadUrl) @@ -244,7 +227,7 @@ updateUserInfo() } //缓存 - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() super.onResume() } @@ -258,9 +241,9 @@ // R.color.mainThemeColor.convertColor(requireContext()) // ) // userImageView.setImageDrawable(roundDrawable) - userNameView.text = userData.name - userPhoneView.text = String.format("电话:${userData.phone}") - userDeptView.text = String.format("部门:${userData.deptName}") + binding.userNameView.text = userData.name + binding.userPhoneView.text = String.format("电话:${userData.phone}") + binding.userDeptView.text = String.format("部门:${userData.deptName}") } private fun downloadApk(url: String?) { @@ -275,7 +258,8 @@ * */ val downloadPath = url!!.appendDownloadUrl() //开始下载 - downloadPath.downloadFile(requireContext().createDownloadFileDir().toString(), + downloadPath.downloadFile( + requireContext().createDownloadFileDir().toString(), object : OnDownloadListener { override fun onDownloadStart(totalBytes: Long) { progressDialog.max = totalBytes.toInt() diff --git a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt index b009850..c0afcc5 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt @@ -1,8 +1,11 @@ package com.casic.smarttube.fragment +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R import com.casic.smarttube.adapter.OverviewGroupListAdapter +import com.casic.smarttube.databinding.FragmentOverviewBinding import com.casic.smarttube.extensions.showEmptyPage import com.casic.smarttube.model.ProjectGroupModel import com.casic.smarttube.view.GroupDeviceActivity @@ -11,25 +14,25 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.widget.dialog.AlertInputDialog -import kotlinx.android.synthetic.main.fragment_overview.groupRecyclerView -import kotlinx.android.synthetic.main.fragment_overview.rightOptionView -import kotlinx.android.synthetic.main.fragment_overview.titleView -import kotlinx.android.synthetic.main.include_empty_view.emptyView -class OverviewFragment : KotlinBaseFragment() { +class OverviewFragment : KotlinBaseFragment() { private lateinit var groupViewModel: ProjectGroupViewModel private var dataBeans: MutableList = ArrayList() private lateinit var groupListAdapter: OverviewGroupListAdapter private var clickedPosition = 0 - override fun initLayoutView(): Int = R.layout.fragment_overview - - override fun setupTopBarLayout() { - titleView.text = "概览" + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentOverviewBinding { + return FragmentOverviewBinding.inflate(inflater, container, false) } - override fun initData() { + override fun setupTopBarLayout() { + binding.titleView.text = "概览" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) } @@ -43,7 +46,7 @@ } override fun initEvent() { - rightOptionView.setOnClickListener { + binding.rightOptionView.setOnClickListener { groupViewModel.obtainProGroupList() "刷新数据中,请稍后".show(requireContext()) } @@ -51,16 +54,16 @@ groupViewModel.groupModel.observe(this) { if (it.code == 200) { if (it.data.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { groupViewModel.obtainProGroupList() } } else { - emptyView!!.hide() + binding.emptyInclude.emptyView.hide() dataBeans.clear() dataBeans = it.data groupListAdapter = OverviewGroupListAdapter(requireContext(), it.data) - groupRecyclerView!!.adapter = groupListAdapter + binding.groupRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : OverviewGroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { diff --git a/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt b/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt index e424721..7f036b0 100644 --- a/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt +++ b/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt @@ -4,8 +4,8 @@ import android.graphics.Color import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.Poi -import com.pengxh.kt.lite.extensions.showBusRouteOnMap -import com.pengxh.kt.lite.extensions.showRouteOnMap +import com.casic.smarttube.extensions.showBusRouteOnMap +import com.casic.smarttube.extensions.showRouteOnMap import com.pengxh.kt.lite.widget.dialog.BottomActionSheet object RouteOnMap { diff --git a/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt b/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt index 65bba6f..598581a 100644 --- a/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt @@ -1,27 +1,29 @@ package com.casic.smarttube.view +import android.os.Bundle import com.casic.smarttube.BuildConfig import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityAboutUsBinding import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_about_us.* -import kotlinx.android.synthetic.main.include_base_title.* -class AboutUsActivity : KotlinBaseActivity() { +class AboutUsActivity : KotlinBaseActivity() { - override fun initLayoutView(): Int = R.layout.activity_about_us + override fun initViewBinding(): ActivityAboutUsBinding { + return ActivityAboutUsBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "关于我们" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "关于我们" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { - versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + override fun initOnCreate(savedInstanceState: Bundle?) { + binding.versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") } override fun observeRequestState() { diff --git a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt index 415f9dd..80b83bd 100644 --- a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.content.Intent import android.graphics.Color +import android.os.Bundle import android.os.CountDownTimer import android.os.Handler import android.text.Editable @@ -15,6 +16,7 @@ import com.amap.api.location.AMapLocation import com.casic.smarttube.R import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.smarttube.databinding.ActivityAddDeviceBinding import com.casic.smarttube.extensions.combineImagePath import com.casic.smarttube.extensions.compressImage import com.casic.smarttube.extensions.isNumber @@ -47,24 +49,9 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_add_device.addDeviceTimeView -import kotlinx.android.synthetic.main.activity_add_device.addImageRecyclerView -import kotlinx.android.synthetic.main.activity_add_device.collectIntervalView -import kotlinx.android.synthetic.main.activity_add_device.deviceCodeView -import kotlinx.android.synthetic.main.activity_add_device.deviceNameView -import kotlinx.android.synthetic.main.activity_add_device.inputLengthView -import kotlinx.android.synthetic.main.activity_add_device.latitudeView -import kotlinx.android.synthetic.main.activity_add_device.locationImageView -import kotlinx.android.synthetic.main.activity_add_device.longitudeView -import kotlinx.android.synthetic.main.activity_add_device.ownerShipView -import kotlinx.android.synthetic.main.activity_add_device.scannerView -import kotlinx.android.synthetic.main.activity_add_device.sceneEditView -import kotlinx.android.synthetic.main.activity_add_device.submitButton -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView import java.io.File -class AddDeviceActivity : KotlinBaseActivity() { +class AddDeviceActivity : KotlinBaseActivity() { private val kTag = "AddDeviceActivity" private lateinit var imageAdapter: EditableImageAdapter @@ -81,21 +68,23 @@ registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK) { val data = result.data!! - longitudeView.text = data.getStringExtra("longitude") - latitudeView.text = data.getStringExtra("latitude") + binding.longitudeView.text = data.getStringExtra("longitude") + binding.latitudeView.text = data.getStringExtra("latitude") } } - override fun initLayoutView(): Int = R.layout.activity_add_device + override fun initViewBinding(): ActivityAddDeviceBinding { + return ActivityAddDeviceBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "添加设备" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "添加设备" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { weakReferenceHandler = WeakReferenceHandler(callback) uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] @@ -119,17 +108,17 @@ override fun initEvent() { val manager = QrManager.getInstance().init(QrConfigCreator.create(this)) - scannerView.setOnClickListener { + binding.scannerView.setOnClickListener { manager.startScan(this) { if (it.content.isNumber()) { - deviceCodeView.setText(it.content) + binding.deviceCodeView.setText(it.content) } else { "设备编号错误,请检查标签".show(context) } } } - ownerShipView.setOnClickListener { + binding.ownerShipView.setOnClickListener { groupViewModel.obtainGroupList() } groupViewModel.groupListModel.observe(this) { @@ -147,19 +136,14 @@ groups.add("自定义") } if (groups.isNotEmpty()) { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(groups) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { if (groups[position] == "自定义") { - AlertInputDialog.Builder() - .setContext(context) - .setTitle("提示") + AlertInputDialog.Builder().setContext(context).setTitle("提示") .setHintMessage("请输入该设备所属项目名,如:项目203") - .setNegativeButton("取消") - .setPositiveButton("确定") + .setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertInputDialog.OnDialogButtonClickListener { override fun onCancelClick() { @@ -167,12 +151,11 @@ } override fun onConfirmClick(value: String) { - ownerShipView.text = value + binding.ownerShipView.text = value } - }) - .build().show() + }).build().show() } else { - ownerShipView.text = groups[position] + binding.ownerShipView.text = groups[position] } } }).build().show() @@ -180,27 +163,22 @@ } //默认频率1min - collectIntervalView.text = frequency[0] - collectIntervalView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + binding.collectIntervalView.text = frequency[0] + binding.collectIntervalView.setOnClickListener { + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(frequency) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { - collectIntervalView.text = frequency[position] + binding.collectIntervalView.text = frequency[position] } }).build().show() } - locationImageView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(context) - .setItemTextColor(Color.BLUE) + binding.locationImageView.setOnClickListener { + BottomActionSheet.Builder().setContext(context).setItemTextColor(Color.BLUE) .setActionItemTitle(arrayListOf("自动定位", "手动选点")) - .setOnActionSheetListener(object : - BottomActionSheet.OnActionSheetListener { + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { when (position) { 0 -> { @@ -210,30 +188,32 @@ override fun onAMapLocationGet(aMapLocation: AMapLocation?) { LoadingDialogHub.dismiss() if (aMapLocation == null) { - longitudeView.text = "定位失败" - latitudeView.text = "定位失败" + binding.longitudeView.text = "定位失败" + binding.latitudeView.text = "定位失败" - longitudeView.setTextColor( + binding.longitudeView.setTextColor( R.color.redTextColor.convertColor(context) ) - latitudeView.setTextColor( + binding.latitudeView.setTextColor( R.color.redTextColor.convertColor(context) ) } else { - longitudeView.text = + binding.longitudeView.text = aMapLocation.longitude.toString() - latitudeView.text = aMapLocation.latitude.toString() + binding.latitudeView.text = + aMapLocation.latitude.toString() - longitudeView.setTextColor( + binding.longitudeView.setTextColor( R.color.mainTextColor.convertColor(context) ) - latitudeView.setTextColor( + binding.latitudeView.setTextColor( R.color.mainTextColor.convertColor(context) ) } } }) } + 1 -> selectLocationLauncher.launch( Intent(context, SelectLocationActivity::class.java) ) @@ -243,7 +223,7 @@ } imageAdapter = EditableImageAdapter(this, 3, 13f) - addImageRecyclerView.adapter = imageAdapter + binding.addImageRecyclerView.adapter = imageAdapter imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { selectPicture() @@ -281,7 +261,7 @@ } } - sceneEditView.addTextChangedListener(object : TextWatcher { + binding.sceneEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { } @@ -292,31 +272,31 @@ override fun afterTextChanged(s: Editable?) { val text = s.toString().trim() - inputLengthView.text = String.format("${text.length}/100") + binding.inputLengthView.text = String.format("${text.length}/100") if (text.length > 100) { - inputLengthView.setTextColor(R.color.redTextColor.convertColor(context)) + binding.inputLengthView.setTextColor(R.color.redTextColor.convertColor(context)) "现场情况字符不能超过100个字符".show(context) } else { - inputLengthView.setTextColor(R.color.subTextColor.convertColor(context)) + binding.inputLengthView.setTextColor(R.color.subTextColor.convertColor(context)) } } }) - addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() + binding.addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() - submitButton.setOnClickListener { - val deviceCode = deviceCodeView.text.toString().trim() + binding.submitButton.setOnClickListener { + val deviceCode = binding.deviceCodeView.text.toString().trim() if (deviceCode.isBlank()) { "请输入设备编号".show(context) return@setOnClickListener } - val ownerShip = ownerShipView.text.toString().trim() + val ownerShip = binding.ownerShipView.text.toString().trim() if (ownerShip.isBlank()) { "请输入设备所属项目".show(context) return@setOnClickListener } - val longitude = longitudeView.text.toString().trim() - val latitude = latitudeView.text.toString().trim() + val longitude = binding.longitudeView.text.toString().trim() + val latitude = binding.latitudeView.text.toString().trim() if (longitude.isBlank() || latitude.isBlank()) { "请先获取当前经纬度".show(context) return@setOnClickListener @@ -329,14 +309,14 @@ ) deviceViewModel.addDevice( deviceCode, - deviceNameView.text.toString(), + binding.deviceNameView.text.toString(), ownerShip, - collectIntervalView.text.toString(), + binding.collectIntervalView.text.toString(), longitude, latitude, imagePaths.reformat(), - sceneEditView.text.toString().trim(), - addDeviceTimeView.text.toString(), + binding.sceneEditView.text.toString().trim(), + binding.addDeviceTimeView.text.toString(), userData.id.toString(), userData.deptId ) @@ -345,16 +325,13 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(listOf("拍照", "相册")) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { when (position) { 0 -> { - PictureSelector.create(context) - .openCamera(SelectMimeType.ofImage()) + PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { if (result == null) { @@ -362,8 +339,7 @@ return } LoadingDialogHub.show( - this@AddDeviceActivity, - "图片上传中,请稍后..." + this@AddDeviceActivity, "图片上传中,请稍后..." ) selectedImages = result analyticalSelectResults(result[0]) @@ -374,14 +350,11 @@ } }) } + 1 -> { - PictureSelector.create(context) - .openGallery(SelectMimeType.ofImage()) - .isGif(false) - .isMaxSelectEnabledMask(true) - .setFilterMinFileSize(100) - .setMaxSelectNum(3) - .isDisplayCamera(false) + PictureSelector.create(context).openGallery(SelectMimeType.ofImage()) + .isGif(false).isMaxSelectEnabledMask(true).setFilterMinFileSize(100) + .setMaxSelectNum(3).isDisplayCamera(false) .setImageEngine(GlideLoadEngine.instance) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { @@ -390,8 +363,7 @@ return } LoadingDialogHub.show( - this@AddDeviceActivity, - "图片上传中,请稍后..." + this@AddDeviceActivity, "图片上传中,请稍后..." ) selectedImages = result // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 diff --git a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt index 3864f16..e4f19a4 100644 --- a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.content.Context +import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,19 +11,20 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityBigImageBinding import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager -import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : KotlinBaseActivity() { +class BigImageActivity : KotlinBaseActivity() { - override fun initLayoutView(): Int = R.layout.activity_big_image + override fun initViewBinding(): ActivityBigImageBinding { + return ActivityBigImageBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { PageNavigationManager.addActivity(this) @@ -30,16 +32,16 @@ ImmersionBar.with(this).statusBarDarkFont(false).init() } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) val urls = intent.getStringArrayListExtra(Constant.BIG_IMAGE_INTENT_DATA_KEY) if (urls == null || urls.size == 0) { return } - pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") - imagePagerView.adapter = BigImageAdapter(this, urls) - imagePagerView.currentItem = index - imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + binding.pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + binding.imagePagerView.adapter = BigImageAdapter(this, urls) + binding.imagePagerView.currentItem = index + binding.imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrollStateChanged(state: Int) { } @@ -53,7 +55,8 @@ } override fun onPageSelected(position: Int) { - pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + binding.pageNumberView.text = + String.format("(" + (position + 1) + "/" + urls.size + ")") } }) } @@ -63,7 +66,7 @@ } override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } + binding.leftBackView.setOnClickListener { this.finish() } } class BigImageAdapter(private var context: Context, imageList: ArrayList) : diff --git a/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt b/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt index 072953f..f036a78 100644 --- a/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.graphics.Color +import android.os.Bundle import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -10,6 +11,7 @@ import com.amap.api.services.geocoder.RegeocodeQuery import com.amap.api.services.geocoder.RegeocodeResult import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityDeviceDetailBinding import com.casic.smarttube.extensions.combineImagePath import com.casic.smarttube.extensions.toSignalImage import com.casic.smarttube.model.DeviceDetailModel @@ -25,51 +27,39 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState -import kotlinx.android.synthetic.main.activity_device_detail.densityView -import kotlinx.android.synthetic.main.activity_device_detail.descriptionView -import kotlinx.android.synthetic.main.activity_device_detail.deviceBatteryView -import kotlinx.android.synthetic.main.activity_device_detail.deviceCodeView -import kotlinx.android.synthetic.main.activity_device_detail.deviceNameView -import kotlinx.android.synthetic.main.activity_device_detail.deviceStateView -import kotlinx.android.synthetic.main.activity_device_detail.imageGridView -import kotlinx.android.synthetic.main.activity_device_detail.lastDataView -import kotlinx.android.synthetic.main.activity_device_detail.leftBackView -import kotlinx.android.synthetic.main.activity_device_detail.locationView -import kotlinx.android.synthetic.main.activity_device_detail.projectGroupView -import kotlinx.android.synthetic.main.activity_device_detail.rightOptionView -import kotlinx.android.synthetic.main.activity_device_detail.signalImageView -import kotlinx.android.synthetic.main.activity_device_detail.titleView -class DeviceDetailActivity : KotlinBaseActivity() { +class DeviceDetailActivity : KotlinBaseActivity() { private val kTag = "DeviceDetailActivity" private lateinit var deviceViewModel: DeviceViewModel private lateinit var deviceModel: DeviceDetailModel.DataModel private val geocoderSearch by lazy { GeocodeSearch(this) } - override fun initLayoutView(): Int = R.layout.activity_device_detail + override fun initViewBinding(): ActivityDeviceDetailBinding { + return ActivityDeviceDetailBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "设备详情" - leftBackView.setOnClickListener { finish() } + binding.titleView.text = "设备详情" + binding.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! - deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] deviceViewModel.obtainDeviceDetail(params[0], params[1]) deviceViewModel.deviceDetailModel.observe(this) { if (it.code == 200) { val device = it.data this.deviceModel = device - deviceCodeView.text = device.devcode - deviceNameView.text = device.deviceName - projectGroupView.text = String.format("项目${device.groupId}") + binding.deviceCodeView.text = device.devcode + binding.deviceNameView.text = device.deviceName + binding.projectGroupView.text = String.format("项目${device.groupId}") if (device.latGaode.isBlank() || device.lngGaode.isBlank()) { - locationView.text = "经纬度异常,无法查看具体位置" + binding.locationView.text = "经纬度异常,无法查看具体位置" } else { val queryParam = RegeocodeQuery( LatLonPoint(device.latGaode.toDouble(), device.lngGaode.toDouble()), @@ -81,7 +71,7 @@ GeocodeSearch.OnGeocodeSearchListener { override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { if (rCode == 1000) { - locationView.text = result?.regeocodeAddress?.formatAddress + binding.locationView.text = result?.regeocodeAddress?.formatAddress } } @@ -90,12 +80,12 @@ } }) } - descriptionView.text = device.descn + binding.descriptionView.text = device.descn if (device.photos.toString().isBlank()) { - imageGridView.visibility = View.GONE + binding.imageGridView.visibility = View.GONE } else { - imageGridView.visibility = View.VISIBLE + binding.imageGridView.visibility = View.VISIBLE //处理图片地址 val urls: ArrayList = ArrayList() val imageArray = device.photos.toString().split(",") @@ -104,10 +94,9 @@ urls.add(path.combineImagePath()) } } - val imageAdapter = ReadOnlyImageAdapter(this) - imageAdapter.setImageList(urls) - imageGridView.adapter = imageAdapter - imageGridView.setOnItemClickListener { _, _, position, _ -> + val imageAdapter = ReadOnlyImageAdapter(this, urls) + binding.imageGridView.adapter = imageAdapter + binding.imageGridView.setOnItemClickListener { _, _, position, _ -> if (urls[position].isEmpty()) { "图片加载失败,无法查看大图".show(this) } else { @@ -119,18 +108,18 @@ val value = device.stregnth.toDouble().toInt() val level = "$value%" val ppm = "${value * 500}ppm" - densityView.text = "$level(相当于$ppm)" + binding.densityView.text = "$level(相当于$ppm)" - lastDataView.text = device.uptime + binding.lastDataView.text = device.uptime if (device.onlineState == "0") { - deviceStateView.text = "离线" - deviceStateView.setTextColor(Color.RED) + binding.deviceStateView.text = "离线" + binding.deviceStateView.setTextColor(Color.RED) } else { - deviceStateView.text = "在线" - deviceStateView.setTextColor(Color.GREEN) + binding.deviceStateView.text = "在线" + binding.deviceStateView.setTextColor(Color.GREEN) } - signalImageView.setBackgroundResource(device.rsrp.toSignalImage()) - deviceBatteryView.text = if (device.cell.isNullOrBlank()) { + binding.signalImageView.setBackgroundResource(device.rsrp.toSignalImage()) + binding.deviceBatteryView.text = if (device.cell.isNullOrBlank()) { "0%" } else { device.cell + "%" @@ -149,7 +138,7 @@ } override fun initEvent() { - rightOptionView.setOnClickListener { + binding.rightOptionView.setOnClickListener { val lat = deviceModel.latGaode.toString() val lng = deviceModel.lngGaode.toString() if (lat.isBlank() || lng.isBlank()) { diff --git a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt index 0ae8862..ba52ab8 100644 --- a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.content.Context +import android.os.Bundle import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -8,6 +9,7 @@ import androidx.recyclerview.widget.RecyclerView import com.casic.smarttube.R import com.casic.smarttube.adapter.DeviceListAdapter +import com.casic.smarttube.databinding.ActivityGroupDeviceBinding import com.casic.smarttube.extensions.showEmptyPage import com.casic.smarttube.model.DeviceListModel import com.casic.smarttube.utils.LoadingDialogHub @@ -28,14 +30,8 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.qmuiteam.qmui.recyclerView.QMUIRVItemSwipeAction import com.qmuiteam.qmui.recyclerView.QMUISwipeAction -import kotlinx.android.synthetic.main.activity_group_device.groupDeviceLayout -import kotlinx.android.synthetic.main.activity_group_device.groupDeviceView -import kotlinx.android.synthetic.main.activity_group_device.leftBackView -import kotlinx.android.synthetic.main.activity_group_device.rightOptionView -import kotlinx.android.synthetic.main.activity_group_device.titleView -import kotlinx.android.synthetic.main.include_empty_view.emptyView -class GroupDeviceActivity : KotlinBaseActivity() { +class GroupDeviceActivity : KotlinBaseActivity() { private lateinit var groupId: String private lateinit var weakReferenceHandler: WeakReferenceHandler @@ -51,18 +47,19 @@ private var clickedPosition = 0 private var isDeleteAll = false - override fun initLayoutView(): Int = R.layout.activity_group_device + override fun initViewBinding(): ActivityGroupDeviceBinding { + return ActivityGroupDeviceBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - leftBackView.setOnClickListener { finish() } - rightOptionView.setOnClickListener { + binding.leftBackView.setOnClickListener { finish() } + binding.rightOptionView.setOnClickListener { //改为Popup val easyPopupWindow = EasyPopupWindow(this) easyPopupWindow.setPopupMenuItem( - LocaleConstant.DEVICE_OPERATE_IMAGES, - LocaleConstant.DEVICE_OPERATE_TITLES + LocaleConstant.DEVICE_OPERATE_IMAGES, LocaleConstant.DEVICE_OPERATE_TITLES ) easyPopupWindow.setOnPopupWindowClickListener(object : EasyPopupWindow.OnPopupWindowClickListener { @@ -77,13 +74,11 @@ pageIndex = 1 obtainDeviceListByPage() } + 1 -> { - AlertControlDialog.Builder() - .setContext(context) - .setTitle("提示") + AlertControlDialog.Builder().setContext(context).setTitle("提示") .setMessage("删除后将无法恢复,是否继续?") - .setNegativeButton("容我想想") - .setPositiveButton("已经想好") + .setNegativeButton("容我想想").setPositiveButton("已经想好") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onCancelClick() { @@ -103,13 +98,11 @@ } }).build().show() } + 2 -> { - MultiSelectDialog.Builder() - .setContext(this@GroupDeviceActivity) - .setTitle("选择设备") - .setDataSource(dataBeans) - .setNegativeButton("取消") - .setPositiveButton("选好了") + MultiSelectDialog.Builder().setContext(this@GroupDeviceActivity) + .setTitle("选择设备").setDataSource(dataBeans) + .setNegativeButton("取消").setPositiveButton("选好了") .setOnDialogButtonClickListener(object : MultiSelectDialog.OnDialogButtonClickListener { override fun onConfirmClick(selectedModels: MutableList) { @@ -126,21 +119,20 @@ override fun onCancelClick() { } - }) - .build().show() + }).build().show() } } } }) easyPopupWindow.setBackgroundDrawable(null) - val x: Int = rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(rightOptionView, x, 0) + val x: Int = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { groupId = intent.getStringExtra(Constant.INTENT_PARAM)!! - titleView.text = String.format(groupId + "项目设备列表") + binding.titleView.text = String.format(groupId + "项目设备列表") weakReferenceHandler = WeakReferenceHandler(callback) groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java] deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] @@ -157,13 +149,13 @@ } override fun initEvent() { - groupDeviceLayout.setOnRefreshListener { + binding.groupDeviceLayout.setOnRefreshListener { isRefresh = true //刷新之后页码重置 pageIndex = 1 obtainDeviceListByPage() } - groupDeviceLayout.setOnLoadMoreListener { + binding.groupDeviceLayout.setOnLoadMoreListener { isLoadMore = true pageIndex++ obtainDeviceListByPage() @@ -176,7 +168,7 @@ isRefresh -> { dataBeans.clear() dataBeans = dataRows!! - groupDeviceLayout.finishRefresh() + binding.groupDeviceLayout.finishRefresh() isRefresh = false } @@ -185,7 +177,7 @@ "到底了,别拉了".show(this) } dataBeans.addAll(dataRows!!) - groupDeviceLayout.finishLoadMore() + binding.groupDeviceLayout.finishLoadMore() isLoadMore = false } @@ -211,7 +203,7 @@ ) } if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { pageIndex = 1 obtainDeviceListByPage() } @@ -230,15 +222,15 @@ deviceAdapter.notifyDataSetChanged() } else { if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { pageIndex = 1 obtainDeviceListByPage() } } else { - emptyView!!.hide() + binding.emptyInclude.emptyView.hide() deviceAdapter = DeviceListAdapter(this, dataBeans) //绑定侧滑事件 - swipeAction.attachToRecyclerView(groupDeviceView) + swipeAction.attachToRecyclerView(binding.groupDeviceView) val linearLayoutManager = object : LinearLayoutManager(this) { override fun generateDefaultLayoutParams(): RecyclerView.LayoutParams { return RecyclerView.LayoutParams( @@ -247,8 +239,8 @@ ) } } - groupDeviceView.layoutManager = linearLayoutManager - groupDeviceView.adapter = deviceAdapter + binding.groupDeviceView.layoutManager = linearLayoutManager + binding.groupDeviceView.adapter = deviceAdapter deviceAdapter.setOnItemClickListener(object : DeviceListAdapter.OnItemClickListener { override fun onClicked(position: Int) { @@ -311,13 +303,9 @@ }) private fun deleteItem(adapterPosition: Int) { - AlertControlDialog.Builder() - .setContext(this) - .setTitle("提示") - .setMessage("删除后将无法恢复,是否继续?") - .setNegativeButton("容我想想") - .setPositiveButton("已经想好") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(this).setTitle("提示") + .setMessage("删除后将无法恢复,是否继续?").setNegativeButton("容我想想") + .setPositiveButton("已经想好").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onCancelClick() { diff --git a/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt b/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt index 71f438c..70e49f0 100644 --- a/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt @@ -1,9 +1,11 @@ package com.casic.smarttube.view +import android.os.Bundle import android.view.View import android.widget.AdapterView import androidx.lifecycle.ViewModelProvider import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityHistoryDataBinding import com.casic.smarttube.extensions.dateToMonthDay import com.casic.smarttube.extensions.getQuarterOfYear import com.casic.smarttube.utils.ChartViewHelper @@ -22,27 +24,26 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState -import kotlinx.android.synthetic.main.activity_history_data.dataLineChart -import kotlinx.android.synthetic.main.activity_history_data.leftBackView -import kotlinx.android.synthetic.main.activity_history_data.periodSpinner import java.util.Calendar -class HistoryDataActivity : KotlinBaseActivity() { +class HistoryDataActivity : KotlinBaseActivity() { private val kTag = "HistoryDataActivity" private lateinit var deviceViewModel: DeviceViewModel private lateinit var groupId: String private lateinit var devCode: String - override fun initLayoutView(): Int = R.layout.activity_history_data + override fun initViewBinding(): ActivityHistoryDataBinding { + return ActivityHistoryDataBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - leftBackView.setOnClickListener { finish() } + binding.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! groupId = params[0] devCode = params[1] @@ -61,8 +62,8 @@ override fun initEvent() { //默认选择近7天的数据 - periodSpinner.setSelection(3) - periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + binding.periodSpinner.setSelection(3) + binding.periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onItemSelected( parent: AdapterView<*>?, view: View?, position: Int, id: Long ) { @@ -76,6 +77,7 @@ groupId, devCode, "$year-01-01", time.timestampToCompleteDate() ) } + 1 -> { //本季度 val startDate = when (time.getQuarterOfYear()) { @@ -89,6 +91,7 @@ groupId, devCode, startDate, time.timestampToCompleteDate() ) } + 2 -> { //近30日 deviceViewModel.obtainDeviceHistoryData( @@ -98,6 +101,7 @@ time.timestampToCompleteDate() ) } + 3 -> { //近7日 deviceViewModel.obtainDeviceHistoryData( @@ -107,19 +111,18 @@ time.timestampToCompleteDate() ) } + 4 -> { //今日 deviceViewModel.obtainDeviceHistoryData( groupId, devCode, time.timestampToDate(), time.timestampToCompleteDate() ) } + 5 -> { - DateSelectDialog.Builder() - .setContext(this@HistoryDataActivity) - .setTitle("选择日期") - .setNegativeButton("取消") - .setPositiveButton("选好了") - .setOnDialogButtonClickListener(object : + DateSelectDialog.Builder().setContext(this@HistoryDataActivity) + .setTitle("选择日期").setNegativeButton("取消") + .setPositiveButton("选好了").setOnDialogButtonClickListener(object : DateSelectDialog.OnDialogButtonClickListener { override fun onConfirmClick(startDate: String, endDate: String) { deviceViewModel.obtainDeviceHistoryData( @@ -129,12 +132,10 @@ override fun onCancelClick() { //选择取消就默认加载近7天的数据 - periodSpinner.setSelection(3) + binding.periodSpinner.setSelection(3) } - }) - .setFragmentManager(supportFragmentManager) - .setCalendarType(Type.YEAR_MONTH_DAY) - .build().show() + }).setFragmentManager(supportFragmentManager) + .setCalendarType(Type.YEAR_MONTH_DAY).build().show() } } } @@ -159,7 +160,9 @@ Entry(i.toFloat(), rowsBean.stregnth!!.toFloat(), "浓度") ) } - ChartViewHelper.setLineChartData(dataLineChart, xAxisLabels, strengthEntries) + ChartViewHelper.setLineChartData( + binding.dataLineChart, xAxisLabels, strengthEntries + ) } } } diff --git a/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt b/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt index ebca433..f947b2c 100644 --- a/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt @@ -1,7 +1,8 @@ package com.casic.smarttube.view +import android.os.Bundle import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityLoginBinding import com.casic.smarttube.utils.AuthenticationHelper import com.casic.smarttube.utils.LoadingDialogHub import com.casic.smarttube.utils.LocaleConstant @@ -14,26 +15,29 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues -import kotlinx.android.synthetic.main.activity_login.loginButton -import kotlinx.android.synthetic.main.activity_login.userNameView -import kotlinx.android.synthetic.main.activity_login.userPasswordView -class LoginActivity : KotlinBaseActivity() { +class LoginActivity : KotlinBaseActivity() { private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginViewModel: LoginViewModel private lateinit var userViewModel: UserViewModel - override fun initLayoutView(): Int = R.layout.activity_login + override fun initViewBinding(): ActivityLoginBinding { + return ActivityLoginBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(true).init() } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { // 设置默认账号密码 - userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) - userPasswordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + binding.userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + binding.userPasswordView.setText( + SaveKeyValues.getValue( + LocaleConstant.PASSWORD, "" + ) as String + ) authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] @@ -50,9 +54,9 @@ } override fun initEvent() { - loginButton.setOnClickListener { - val account = userNameView.text.toString().trim() - val userPassword = userPasswordView.text.toString().trim() + binding.loginButton.setOnClickListener { + val account = binding.userNameView.text.toString().trim() + val userPassword = binding.userPasswordView.text.toString().trim() if (account.isBlank()) { "用户名不能为空".show(this) return@setOnClickListener @@ -74,8 +78,8 @@ AuthenticationHelper.savePublicKey(keyString) val publicKey = RSAUtils.keyStrToPublicKey(keyString) - val account = userNameView.text.toString() - val userPassword = userPasswordView.text.toString() + val account = binding.userNameView.text.toString() + val userPassword = binding.userPasswordView.text.toString() val dataByPublicKey = RSAUtils.encryptDataByPublicKey(userPassword.toByteArray(), publicKey!!) //登录并获取Token,POST请求 diff --git a/app/src/main/java/com/casic/smarttube/view/MainActivity.kt b/app/src/main/java/com/casic/smarttube/view/MainActivity.kt index 4461757..575e1ee 100644 --- a/app/src/main/java/com/casic/smarttube/view/MainActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/MainActivity.kt @@ -1,5 +1,6 @@ package com.casic.smarttube.view +import android.os.Bundle import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment @@ -7,6 +8,7 @@ import androidx.fragment.app.FragmentPagerAdapter import androidx.viewpager.widget.ViewPager import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityMainBinding import com.casic.smarttube.fragment.HomePageFragment import com.casic.smarttube.fragment.MinePageFragment import com.casic.smarttube.fragment.OverviewFragment @@ -15,9 +17,8 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_main.* -class MainActivity : KotlinBaseActivity() { +class MainActivity : KotlinBaseActivity() { private var menuItem: MenuItem? = null private var fragmentList: MutableList = ArrayList() @@ -29,32 +30,36 @@ fragmentList.add(MinePageFragment()) } - override fun initLayoutView(): Int = R.layout.activity_main + override fun initViewBinding(): ActivityMainBinding { + return ActivityMainBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { //保留icon原图颜色 - bottomNavigation.itemIconTintList = null - bottomNavigation.setOnItemSelectedListener { menuItem -> + binding.bottomNavigation.itemIconTintList = null + binding.bottomNavigation.setOnItemSelectedListener { menuItem -> when (menuItem.itemId) { R.id.nav_home -> { - mainViewPager.currentItem = 0 + binding.mainViewPager.currentItem = 0 } + R.id.nav_overview -> { - mainViewPager.currentItem = 1 + binding.mainViewPager.currentItem = 1 } + R.id.nav_mine -> { - mainViewPager.currentItem = 2 + binding.mainViewPager.currentItem = 2 } } false } - mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) - mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 + binding.mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + binding.mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun observeRequestState() { @@ -62,7 +67,7 @@ } override fun initEvent() { - mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + binding.mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrollStateChanged(state: Int) { } @@ -77,9 +82,9 @@ if (menuItem != null) { menuItem!!.isChecked = false } else { - bottomNavigation.menu.getItem(0).isChecked = false + binding.bottomNavigation.menu.getItem(0).isChecked = false } - menuItem = bottomNavigation.menu.getItem(position) + menuItem = binding.bottomNavigation.menu.getItem(position) menuItem!!.isChecked = true } }) diff --git a/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt b/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt index f00e0ca..908aade 100644 --- a/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt @@ -15,6 +15,7 @@ import com.amap.api.services.geocoder.RegeocodeQuery import com.amap.api.services.geocoder.RegeocodeResult import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityMapDeviceBriefBinding import com.casic.smarttube.utils.LoadingDialogHub import com.casic.smarttube.utils.RouteOnMap import com.casic.smarttube.vm.DeviceViewModel @@ -24,16 +25,8 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState -import kotlinx.android.synthetic.main.activity_map_device_brief.deviceCodeView -import kotlinx.android.synthetic.main.activity_map_device_brief.deviceModelView -import kotlinx.android.synthetic.main.activity_map_device_brief.deviceValueView -import kotlinx.android.synthetic.main.activity_map_device_brief.locationView -import kotlinx.android.synthetic.main.activity_map_device_brief.mapView -import kotlinx.android.synthetic.main.activity_map_device_brief.updateTimeView -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -class MapDeviceBriefActivity : KotlinBaseActivity() { +class MapDeviceBriefActivity : KotlinBaseActivity() { private val kTag = "MapDeviceBriefActivity" private lateinit var deviceViewModel: DeviceViewModel @@ -42,17 +35,19 @@ private val geocoderSearch by lazy { GeocodeSearch(this) } - override fun initLayoutView(): Int = R.layout.activity_map_device_brief + override fun initViewBinding(): ActivityMapDeviceBriefBinding { + return ActivityMapDeviceBriefBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "设备最新数据地图展示" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "设备最新数据地图展示" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { - aMap = mapView.map + override fun initOnCreate(savedInstanceState: Bundle?) { + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val uiSettings = aMap.uiSettings uiSettings.isCompassEnabled = true @@ -80,22 +75,22 @@ if (it.code == 200) { val device = it.data - deviceCodeView.text = String.format("设备编号: ${device.devcode}") - deviceModelView.text = String.format("设备模型: ${params[2]}") + binding.deviceCodeView.text = String.format("设备编号: ${device.devcode}") + binding.deviceModelView.text = String.format("设备模型: ${params[2]}") //获取设备最新浓度信息 deviceViewModel.obtainTubeLastData(device.groupId, device.devcode) deviceViewModel.lastDataModel.observe(this) { v -> if (v.code == 200) { - deviceValueView.text = String.format("最新浓度: ${v.data.strength}") - updateTimeView.text = String.format("更新时间: ${v.data.uptime}") + binding.deviceValueView.text = String.format("最新浓度: ${v.data.strength}") + binding.updateTimeView.text = String.format("更新时间: ${v.data.uptime}") } else { - deviceValueView.text = String.format("最新浓度: 未知") - updateTimeView.text = String.format("更新时间: 未知") + binding.deviceValueView.text = String.format("最新浓度: 未知") + binding.updateTimeView.text = String.format("更新时间: 未知") } } if (device.latGaode.isBlank() || device.lngGaode.isBlank()) { - locationView.text = "经纬度异常,无法查看具体位置" + binding.locationView.text = "经纬度异常,无法查看具体位置" } else { val queryParam = RegeocodeQuery( LatLonPoint(device.latGaode.toDouble(), device.lngGaode.toDouble()), @@ -108,7 +103,7 @@ GeocodeSearch.OnGeocodeSearchListener { override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { if (rCode == 1000) { - locationView.text = + binding.locationView.text = String.format("详细位置: ${result?.regeocodeAddress?.formatAddress}") } } @@ -123,8 +118,7 @@ aMap.animateCamera(newCameraPosition, 1500, object : AMap.CancelableCallback { override fun onFinish() { //添加Marker - val markerOptions = MarkerOptions() - .position(latLng) + val markerOptions = MarkerOptions().position(latLng) .icon(BitmapDescriptorFactory.fromResource(R.mipmap.well_location)) .draggable(false) aMap.addMarker(markerOptions) @@ -148,26 +142,26 @@ /**地图相关*********/ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - mapView.onCreate(savedInstanceState) + binding.mapView.onCreate(savedInstanceState) } override fun onResume() { super.onResume() - mapView.onResume() + binding.mapView.onResume() } override fun onPause() { super.onPause() - mapView.onPause() + binding.mapView.onPause() } override fun onDestroy() { - mapView.onDestroy() + binding.mapView.onDestroy() super.onDestroy() } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - mapView.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) } } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 81dccf6..defbef7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,12 +2,11 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' android { signingConfigs { release { - storeFile file('/Users/a203/Desktop/AndroidProjects/CasicSmartTube/app/CasicSmartTube.jks') + storeFile file('CasicSmartTube.jks') storePassword '123456789' keyAlias 'key0' keyPassword '123456789' @@ -21,8 +20,6 @@ targetSdkVersion 33 versionCode 2 versionName "1.0.1" - - ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -47,6 +44,10 @@ } } + viewBinding { + enabled true + } + applicationVariants.configureEach { variant -> variant.outputs.configureEach { outputFileName = "GT_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" @@ -61,7 +62,7 @@ dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.5' implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.6.1' diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cccda6d..fd9277c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,7 +81,7 @@ + android:value="a6907c8bb931727374aa5fd500cda107" /> (), Handler.Callback, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { private val kTag = "HomePageFragment" private val geocoderSearch by lazy { GeocodeSearch(requireContext()) } - private lateinit var homeView: View private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var easyPopupWindow: EasyPopupWindow private lateinit var aMap: AMap private lateinit var deviceViewModel: DeviceViewModel private lateinit var groupViewModel: ProjectGroupViewModel @@ -83,34 +89,34 @@ * */ private var mapZooms = ArrayList() - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View { - homeView = inflater.inflate(R.layout.fragment_home, container, false) + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } - weakReferenceHandler = WeakReferenceHandler(callback) - val easyPopupWindow = EasyPopupWindow(requireContext()) - easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) - homeView.rightOptionView.setOnClickListener { - easyPopupWindow.setOnPopupWindowClickListener(object : - EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - easyPopupWindow.setBackgroundDrawable(null) - val x: Int = homeView.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(homeView.rightOptionView, x, 0) + override fun setupTopBarLayout() { + + } + + override fun observeRequestState() { + groupViewModel.loadState.observe(this) { state -> + when (state) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") + else -> LoadingDialogHub.dismiss() + } } + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + weakReferenceHandler = WeakReferenceHandler(this) + + easyPopupWindow = EasyPopupWindow(requireContext()) + easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) //初始化vm - deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) - groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) - - observeRequestState() + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java] //默认数据 groupViewModel.obtainProGroupList() @@ -119,12 +125,8 @@ mapZooms.add(13f) initMap(savedInstanceState) - homeView.addDeviceButton.setOnClickListener { - requireContext().navigatePageTo() - } - //数据监听 - deviceViewModel.mapDeviceModel.observe(this, { + deviceViewModel.mapDeviceModel.observe(this) { if (it.code == 200) { if (allMarkerOptions.isNotEmpty()) { allMarkerOptions.clear() @@ -149,10 +151,8 @@ longitudeList.add(longitude) //将所有设备信息转化缓存为Marker点 allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(device.devcode) - .snippet(device.modelName) + MarkerOptions().position(LatLng(latitude, longitude)) + .title(device.devcode).snippet(device.modelName) ) } } @@ -160,8 +160,8 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 13f) } - }) - groupViewModel.groupModel.observe(this, { + } + groupViewModel.groupModel.observe(this) { if (it.code == 200) { val dataRows = it.data when { @@ -170,14 +170,15 @@ dataBeans = dataRows!! isRefresh = false } + else -> { dataBeans = dataRows!! } } weakReferenceHandler.sendEmptyMessage(2022090201) } - }) - groupViewModel.groupDeviceModel.observe(this, { + } + groupViewModel.groupDeviceModel.observe(this) { if (it.code == 200) { val latitudeList: MutableList = ArrayList() val longitudeList: MutableList = ArrayList() @@ -199,22 +200,33 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 16f) } - }) - return homeView + } } - private fun observeRequestState() { - groupViewModel.loadState.observe(this, { state -> - when (state) { - LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") - else -> LoadingDialogHub.dismiss() - } - }) + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + easyPopupWindow.setOnPopupWindowClickListener(object : + EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + easyPopupWindow.setBackgroundDrawable(null) + val x: Int = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + binding.addDeviceButton.setOnClickListener { + requireContext().navigatePageTo() + } } override fun onResume() { super.onResume() - homeView.mapView.onResume() + binding.mapView.onResume() //获取所有设备数据 deviceViewModel.obtainMapDeviceList() @@ -222,16 +234,16 @@ groupViewModel.obtainProGroupList() } - private val callback = Handler.Callback { - if (it.what == 2022090201) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022090201) { if (isRefresh) { groupListAdapter.notifyDataSetChanged() } else { groupListAdapter = GroupListAdapter(requireContext(), dataBeans) - homeView.homeRecyclerView!!.addItemDecoration( + binding.homeRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - homeView.homeRecyclerView!!.adapter = groupListAdapter + binding.homeRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : GroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { @@ -241,12 +253,12 @@ }) } } - true + return true } private fun initMap(savedInstanceState: Bundle?) { - homeView.mapView.onCreate(savedInstanceState) - aMap = homeView.mapView.map + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val uiSettings = aMap.uiSettings uiSettings.isCompassEnabled = true @@ -322,10 +334,7 @@ if (!isInRange) { clustersMarkers.add( GaoDeClusterMarkerView( - requireContext(), - it, - proj, - LocaleConstant.RADIUS_SIZE + requireContext(), it, proj, LocaleConstant.RADIUS_SIZE ) )//相距多少才聚合 } @@ -363,9 +372,7 @@ //绑定数据 val clickedLatLng = marker?.position!! for (device in deviceModels) { - if (clickedLatLng.latitude == device.latGaode!!.toDouble() - && clickedLatLng.longitude == device.lngGaode!!.toDouble() - ) { + if (clickedLatLng.latitude == device.latGaode!!.toDouble() && clickedLatLng.longitude == device.lngGaode!!.toDouble()) { deviceCodeView.text = String.format("设备编号: ${device.devcode}") deviceModelView.text = String.format("设备模型: ${device.modelName}") //获取设备最新浓度信息 @@ -395,8 +402,7 @@ val address = result?.regeocodeAddress?.formatAddress val temp = StringBuilder() if (address!!.length > 16) { - temp.append(address.substring(0, 14)) - .append("\r\n") + temp.append(address.substring(0, 14)).append("\r\n") .append(address.substring(16)) } else { temp.append(address) @@ -430,9 +436,7 @@ } } //查看聚合点,单独开页面导航过去 - BottomActionSheet.Builder() - .setContext(requireContext()) - .setActionItemTitle(multiDevice) + BottomActionSheet.Builder().setContext(requireContext()).setActionItemTitle(multiDevice) .setItemTextColor(Color.BLUE) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { @@ -455,12 +459,8 @@ override fun onInfoWindowClick(p0: Marker?) { if (p0 != null) { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -487,16 +487,16 @@ 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 onDestroy() { super.onDestroy() - homeView.mapView.onDestroy() + binding.mapView.onDestroy() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt index a4e964c..cc35197 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt @@ -4,11 +4,15 @@ import android.content.Intent import android.net.Uri import android.os.Build +import android.os.Bundle import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider import com.casic.smarttube.BuildConfig import com.casic.smarttube.R +import com.casic.smarttube.databinding.FragmentMineBinding import com.casic.smarttube.extensions.appendDownloadUrl import com.casic.smarttube.model.UserDetailModel import com.casic.smarttube.utils.AuthenticationHelper @@ -36,22 +40,10 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.ChangePasswordDialog -import kotlinx.android.synthetic.main.fragment_mine.aboutUsLayout -import kotlinx.android.synthetic.main.fragment_mine.cacheSizeView -import kotlinx.android.synthetic.main.fragment_mine.changePwdLayout -import kotlinx.android.synthetic.main.fragment_mine.clearCacheLayout -import kotlinx.android.synthetic.main.fragment_mine.loginOutButton -import kotlinx.android.synthetic.main.fragment_mine.updateLogLayout -import kotlinx.android.synthetic.main.fragment_mine.updateUserButton -import kotlinx.android.synthetic.main.fragment_mine.updateVersionLayout -import kotlinx.android.synthetic.main.fragment_mine.userDeptView -import kotlinx.android.synthetic.main.fragment_mine.userImageView -import kotlinx.android.synthetic.main.fragment_mine.userNameView -import kotlinx.android.synthetic.main.fragment_mine.userPhoneView import java.io.File import java.nio.charset.StandardCharsets -class MinePageFragment : KotlinBaseFragment() { +class MinePageFragment : KotlinBaseFragment() { private val kTag = "MinePageFragment" private lateinit var userData: UserDetailModel.Data @@ -60,13 +52,17 @@ private lateinit var versionViewModel: VersionViewModel private lateinit var progressDialog: ProgressDialog - override fun initLayoutView(): Int = R.layout.fragment_mine + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentMineBinding { + return FragmentMineBinding.inflate(inflater, container, false) + } override fun setupTopBarLayout() { } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java] @@ -98,8 +94,7 @@ versionViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show( - requireActivity(), - "检查版本中,请稍后" + requireActivity(), "检查版本中,请稍后" ) else -> LoadingDialogHub.dismiss() @@ -108,49 +103,45 @@ } override fun initEvent() { - userImageView.setOnClickListener { + binding.userImageView.setOnClickListener { "尽情期待~".show(requireContext()) } - updateUserButton.setOnClickListener { + binding.updateUserButton.setOnClickListener { LoadingDialogHub.show(requireActivity(), "同步中,请稍后...") userViewModel.obtainUserDetail() } - changePwdLayout.setOnClickListener { - ChangePasswordDialog.Builder() - .setContext(requireContext()) + binding.changePwdLayout.setOnClickListener { + ChangePasswordDialog.Builder().setContext(requireContext()) .setOnDialogButtonClickListener(object : ChangePasswordDialog.OnDialogButtonClickListener { override fun onConfirmClick(oldPwd: String, newPwd: String) { - val publicKey = - RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! val oldPassKey = RSAUtils.encryptDataByPublicKey( - oldPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + oldPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) val newPassKey = RSAUtils.encryptDataByPublicKey( - newPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + newPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) userViewModel.changePassword(oldPassKey, newPassKey) } }).build().show() } - aboutUsLayout.setOnClickListener { + binding.aboutUsLayout.setOnClickListener { requireContext().navigatePageTo() } - updateVersionLayout.setOnClickListener { + binding.updateVersionLayout.setOnClickListener { versionViewModel.updateVersion() } - updateLogLayout.setOnClickListener { + binding.updateLogLayout.setOnClickListener { "尽情期待~".show(requireContext()) } - clearCacheLayout.setOnClickListener { + binding.clearCacheLayout.setOnClickListener { //删除缓存之后在设置缓存大小 LoadingDialogHub.show(requireActivity(), "清理中,请稍后") File(requireContext().cacheDir.path).deleteFile() @@ -161,18 +152,14 @@ override fun onFinish() { LoadingDialogHub.dismiss() - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() } }.start() } - loginOutButton.setOnClickListener { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("退出登录") - .setMessage("确定要退出吗?") - .setNegativeButton("取消") - .setPositiveButton("确定") + binding.loginOutButton.setOnClickListener { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("退出登录") + .setMessage("确定要退出吗?").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -203,13 +190,9 @@ if (BuildConfig.VERSION_NAME == it.version) { "已是最新版本,无需更新".show(requireContext()) } else { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("提示") - .setMessage("有新版本,是否更新?") - .setNegativeButton("稍后再说") - .setPositiveButton("立即下载") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(requireContext()).setTitle("提示") + .setMessage("有新版本,是否更新?").setNegativeButton("稍后再说") + .setPositiveButton("立即下载").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { downloadApk(it.downloadUrl) @@ -244,7 +227,7 @@ updateUserInfo() } //缓存 - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() super.onResume() } @@ -258,9 +241,9 @@ // R.color.mainThemeColor.convertColor(requireContext()) // ) // userImageView.setImageDrawable(roundDrawable) - userNameView.text = userData.name - userPhoneView.text = String.format("电话:${userData.phone}") - userDeptView.text = String.format("部门:${userData.deptName}") + binding.userNameView.text = userData.name + binding.userPhoneView.text = String.format("电话:${userData.phone}") + binding.userDeptView.text = String.format("部门:${userData.deptName}") } private fun downloadApk(url: String?) { @@ -275,7 +258,8 @@ * */ val downloadPath = url!!.appendDownloadUrl() //开始下载 - downloadPath.downloadFile(requireContext().createDownloadFileDir().toString(), + downloadPath.downloadFile( + requireContext().createDownloadFileDir().toString(), object : OnDownloadListener { override fun onDownloadStart(totalBytes: Long) { progressDialog.max = totalBytes.toInt() diff --git a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt index b009850..c0afcc5 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt @@ -1,8 +1,11 @@ package com.casic.smarttube.fragment +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R import com.casic.smarttube.adapter.OverviewGroupListAdapter +import com.casic.smarttube.databinding.FragmentOverviewBinding import com.casic.smarttube.extensions.showEmptyPage import com.casic.smarttube.model.ProjectGroupModel import com.casic.smarttube.view.GroupDeviceActivity @@ -11,25 +14,25 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.widget.dialog.AlertInputDialog -import kotlinx.android.synthetic.main.fragment_overview.groupRecyclerView -import kotlinx.android.synthetic.main.fragment_overview.rightOptionView -import kotlinx.android.synthetic.main.fragment_overview.titleView -import kotlinx.android.synthetic.main.include_empty_view.emptyView -class OverviewFragment : KotlinBaseFragment() { +class OverviewFragment : KotlinBaseFragment() { private lateinit var groupViewModel: ProjectGroupViewModel private var dataBeans: MutableList = ArrayList() private lateinit var groupListAdapter: OverviewGroupListAdapter private var clickedPosition = 0 - override fun initLayoutView(): Int = R.layout.fragment_overview - - override fun setupTopBarLayout() { - titleView.text = "概览" + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentOverviewBinding { + return FragmentOverviewBinding.inflate(inflater, container, false) } - override fun initData() { + override fun setupTopBarLayout() { + binding.titleView.text = "概览" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) } @@ -43,7 +46,7 @@ } override fun initEvent() { - rightOptionView.setOnClickListener { + binding.rightOptionView.setOnClickListener { groupViewModel.obtainProGroupList() "刷新数据中,请稍后".show(requireContext()) } @@ -51,16 +54,16 @@ groupViewModel.groupModel.observe(this) { if (it.code == 200) { if (it.data.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { groupViewModel.obtainProGroupList() } } else { - emptyView!!.hide() + binding.emptyInclude.emptyView.hide() dataBeans.clear() dataBeans = it.data groupListAdapter = OverviewGroupListAdapter(requireContext(), it.data) - groupRecyclerView!!.adapter = groupListAdapter + binding.groupRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : OverviewGroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { diff --git a/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt b/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt index e424721..7f036b0 100644 --- a/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt +++ b/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt @@ -4,8 +4,8 @@ import android.graphics.Color import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.Poi -import com.pengxh.kt.lite.extensions.showBusRouteOnMap -import com.pengxh.kt.lite.extensions.showRouteOnMap +import com.casic.smarttube.extensions.showBusRouteOnMap +import com.casic.smarttube.extensions.showRouteOnMap import com.pengxh.kt.lite.widget.dialog.BottomActionSheet object RouteOnMap { diff --git a/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt b/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt index 65bba6f..598581a 100644 --- a/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt @@ -1,27 +1,29 @@ package com.casic.smarttube.view +import android.os.Bundle import com.casic.smarttube.BuildConfig import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityAboutUsBinding import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_about_us.* -import kotlinx.android.synthetic.main.include_base_title.* -class AboutUsActivity : KotlinBaseActivity() { +class AboutUsActivity : KotlinBaseActivity() { - override fun initLayoutView(): Int = R.layout.activity_about_us + override fun initViewBinding(): ActivityAboutUsBinding { + return ActivityAboutUsBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "关于我们" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "关于我们" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { - versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + override fun initOnCreate(savedInstanceState: Bundle?) { + binding.versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") } override fun observeRequestState() { diff --git a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt index 415f9dd..80b83bd 100644 --- a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.content.Intent import android.graphics.Color +import android.os.Bundle import android.os.CountDownTimer import android.os.Handler import android.text.Editable @@ -15,6 +16,7 @@ import com.amap.api.location.AMapLocation import com.casic.smarttube.R import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.smarttube.databinding.ActivityAddDeviceBinding import com.casic.smarttube.extensions.combineImagePath import com.casic.smarttube.extensions.compressImage import com.casic.smarttube.extensions.isNumber @@ -47,24 +49,9 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_add_device.addDeviceTimeView -import kotlinx.android.synthetic.main.activity_add_device.addImageRecyclerView -import kotlinx.android.synthetic.main.activity_add_device.collectIntervalView -import kotlinx.android.synthetic.main.activity_add_device.deviceCodeView -import kotlinx.android.synthetic.main.activity_add_device.deviceNameView -import kotlinx.android.synthetic.main.activity_add_device.inputLengthView -import kotlinx.android.synthetic.main.activity_add_device.latitudeView -import kotlinx.android.synthetic.main.activity_add_device.locationImageView -import kotlinx.android.synthetic.main.activity_add_device.longitudeView -import kotlinx.android.synthetic.main.activity_add_device.ownerShipView -import kotlinx.android.synthetic.main.activity_add_device.scannerView -import kotlinx.android.synthetic.main.activity_add_device.sceneEditView -import kotlinx.android.synthetic.main.activity_add_device.submitButton -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView import java.io.File -class AddDeviceActivity : KotlinBaseActivity() { +class AddDeviceActivity : KotlinBaseActivity() { private val kTag = "AddDeviceActivity" private lateinit var imageAdapter: EditableImageAdapter @@ -81,21 +68,23 @@ registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK) { val data = result.data!! - longitudeView.text = data.getStringExtra("longitude") - latitudeView.text = data.getStringExtra("latitude") + binding.longitudeView.text = data.getStringExtra("longitude") + binding.latitudeView.text = data.getStringExtra("latitude") } } - override fun initLayoutView(): Int = R.layout.activity_add_device + override fun initViewBinding(): ActivityAddDeviceBinding { + return ActivityAddDeviceBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "添加设备" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "添加设备" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { weakReferenceHandler = WeakReferenceHandler(callback) uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] @@ -119,17 +108,17 @@ override fun initEvent() { val manager = QrManager.getInstance().init(QrConfigCreator.create(this)) - scannerView.setOnClickListener { + binding.scannerView.setOnClickListener { manager.startScan(this) { if (it.content.isNumber()) { - deviceCodeView.setText(it.content) + binding.deviceCodeView.setText(it.content) } else { "设备编号错误,请检查标签".show(context) } } } - ownerShipView.setOnClickListener { + binding.ownerShipView.setOnClickListener { groupViewModel.obtainGroupList() } groupViewModel.groupListModel.observe(this) { @@ -147,19 +136,14 @@ groups.add("自定义") } if (groups.isNotEmpty()) { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(groups) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { if (groups[position] == "自定义") { - AlertInputDialog.Builder() - .setContext(context) - .setTitle("提示") + AlertInputDialog.Builder().setContext(context).setTitle("提示") .setHintMessage("请输入该设备所属项目名,如:项目203") - .setNegativeButton("取消") - .setPositiveButton("确定") + .setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertInputDialog.OnDialogButtonClickListener { override fun onCancelClick() { @@ -167,12 +151,11 @@ } override fun onConfirmClick(value: String) { - ownerShipView.text = value + binding.ownerShipView.text = value } - }) - .build().show() + }).build().show() } else { - ownerShipView.text = groups[position] + binding.ownerShipView.text = groups[position] } } }).build().show() @@ -180,27 +163,22 @@ } //默认频率1min - collectIntervalView.text = frequency[0] - collectIntervalView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + binding.collectIntervalView.text = frequency[0] + binding.collectIntervalView.setOnClickListener { + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(frequency) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { - collectIntervalView.text = frequency[position] + binding.collectIntervalView.text = frequency[position] } }).build().show() } - locationImageView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(context) - .setItemTextColor(Color.BLUE) + binding.locationImageView.setOnClickListener { + BottomActionSheet.Builder().setContext(context).setItemTextColor(Color.BLUE) .setActionItemTitle(arrayListOf("自动定位", "手动选点")) - .setOnActionSheetListener(object : - BottomActionSheet.OnActionSheetListener { + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { when (position) { 0 -> { @@ -210,30 +188,32 @@ override fun onAMapLocationGet(aMapLocation: AMapLocation?) { LoadingDialogHub.dismiss() if (aMapLocation == null) { - longitudeView.text = "定位失败" - latitudeView.text = "定位失败" + binding.longitudeView.text = "定位失败" + binding.latitudeView.text = "定位失败" - longitudeView.setTextColor( + binding.longitudeView.setTextColor( R.color.redTextColor.convertColor(context) ) - latitudeView.setTextColor( + binding.latitudeView.setTextColor( R.color.redTextColor.convertColor(context) ) } else { - longitudeView.text = + binding.longitudeView.text = aMapLocation.longitude.toString() - latitudeView.text = aMapLocation.latitude.toString() + binding.latitudeView.text = + aMapLocation.latitude.toString() - longitudeView.setTextColor( + binding.longitudeView.setTextColor( R.color.mainTextColor.convertColor(context) ) - latitudeView.setTextColor( + binding.latitudeView.setTextColor( R.color.mainTextColor.convertColor(context) ) } } }) } + 1 -> selectLocationLauncher.launch( Intent(context, SelectLocationActivity::class.java) ) @@ -243,7 +223,7 @@ } imageAdapter = EditableImageAdapter(this, 3, 13f) - addImageRecyclerView.adapter = imageAdapter + binding.addImageRecyclerView.adapter = imageAdapter imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { selectPicture() @@ -281,7 +261,7 @@ } } - sceneEditView.addTextChangedListener(object : TextWatcher { + binding.sceneEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { } @@ -292,31 +272,31 @@ override fun afterTextChanged(s: Editable?) { val text = s.toString().trim() - inputLengthView.text = String.format("${text.length}/100") + binding.inputLengthView.text = String.format("${text.length}/100") if (text.length > 100) { - inputLengthView.setTextColor(R.color.redTextColor.convertColor(context)) + binding.inputLengthView.setTextColor(R.color.redTextColor.convertColor(context)) "现场情况字符不能超过100个字符".show(context) } else { - inputLengthView.setTextColor(R.color.subTextColor.convertColor(context)) + binding.inputLengthView.setTextColor(R.color.subTextColor.convertColor(context)) } } }) - addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() + binding.addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() - submitButton.setOnClickListener { - val deviceCode = deviceCodeView.text.toString().trim() + binding.submitButton.setOnClickListener { + val deviceCode = binding.deviceCodeView.text.toString().trim() if (deviceCode.isBlank()) { "请输入设备编号".show(context) return@setOnClickListener } - val ownerShip = ownerShipView.text.toString().trim() + val ownerShip = binding.ownerShipView.text.toString().trim() if (ownerShip.isBlank()) { "请输入设备所属项目".show(context) return@setOnClickListener } - val longitude = longitudeView.text.toString().trim() - val latitude = latitudeView.text.toString().trim() + val longitude = binding.longitudeView.text.toString().trim() + val latitude = binding.latitudeView.text.toString().trim() if (longitude.isBlank() || latitude.isBlank()) { "请先获取当前经纬度".show(context) return@setOnClickListener @@ -329,14 +309,14 @@ ) deviceViewModel.addDevice( deviceCode, - deviceNameView.text.toString(), + binding.deviceNameView.text.toString(), ownerShip, - collectIntervalView.text.toString(), + binding.collectIntervalView.text.toString(), longitude, latitude, imagePaths.reformat(), - sceneEditView.text.toString().trim(), - addDeviceTimeView.text.toString(), + binding.sceneEditView.text.toString().trim(), + binding.addDeviceTimeView.text.toString(), userData.id.toString(), userData.deptId ) @@ -345,16 +325,13 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(listOf("拍照", "相册")) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { when (position) { 0 -> { - PictureSelector.create(context) - .openCamera(SelectMimeType.ofImage()) + PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { if (result == null) { @@ -362,8 +339,7 @@ return } LoadingDialogHub.show( - this@AddDeviceActivity, - "图片上传中,请稍后..." + this@AddDeviceActivity, "图片上传中,请稍后..." ) selectedImages = result analyticalSelectResults(result[0]) @@ -374,14 +350,11 @@ } }) } + 1 -> { - PictureSelector.create(context) - .openGallery(SelectMimeType.ofImage()) - .isGif(false) - .isMaxSelectEnabledMask(true) - .setFilterMinFileSize(100) - .setMaxSelectNum(3) - .isDisplayCamera(false) + PictureSelector.create(context).openGallery(SelectMimeType.ofImage()) + .isGif(false).isMaxSelectEnabledMask(true).setFilterMinFileSize(100) + .setMaxSelectNum(3).isDisplayCamera(false) .setImageEngine(GlideLoadEngine.instance) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { @@ -390,8 +363,7 @@ return } LoadingDialogHub.show( - this@AddDeviceActivity, - "图片上传中,请稍后..." + this@AddDeviceActivity, "图片上传中,请稍后..." ) selectedImages = result // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 diff --git a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt index 3864f16..e4f19a4 100644 --- a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.content.Context +import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,19 +11,20 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityBigImageBinding import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager -import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : KotlinBaseActivity() { +class BigImageActivity : KotlinBaseActivity() { - override fun initLayoutView(): Int = R.layout.activity_big_image + override fun initViewBinding(): ActivityBigImageBinding { + return ActivityBigImageBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { PageNavigationManager.addActivity(this) @@ -30,16 +32,16 @@ ImmersionBar.with(this).statusBarDarkFont(false).init() } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) val urls = intent.getStringArrayListExtra(Constant.BIG_IMAGE_INTENT_DATA_KEY) if (urls == null || urls.size == 0) { return } - pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") - imagePagerView.adapter = BigImageAdapter(this, urls) - imagePagerView.currentItem = index - imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + binding.pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + binding.imagePagerView.adapter = BigImageAdapter(this, urls) + binding.imagePagerView.currentItem = index + binding.imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrollStateChanged(state: Int) { } @@ -53,7 +55,8 @@ } override fun onPageSelected(position: Int) { - pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + binding.pageNumberView.text = + String.format("(" + (position + 1) + "/" + urls.size + ")") } }) } @@ -63,7 +66,7 @@ } override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } + binding.leftBackView.setOnClickListener { this.finish() } } class BigImageAdapter(private var context: Context, imageList: ArrayList) : diff --git a/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt b/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt index 072953f..f036a78 100644 --- a/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.graphics.Color +import android.os.Bundle import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -10,6 +11,7 @@ import com.amap.api.services.geocoder.RegeocodeQuery import com.amap.api.services.geocoder.RegeocodeResult import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityDeviceDetailBinding import com.casic.smarttube.extensions.combineImagePath import com.casic.smarttube.extensions.toSignalImage import com.casic.smarttube.model.DeviceDetailModel @@ -25,51 +27,39 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState -import kotlinx.android.synthetic.main.activity_device_detail.densityView -import kotlinx.android.synthetic.main.activity_device_detail.descriptionView -import kotlinx.android.synthetic.main.activity_device_detail.deviceBatteryView -import kotlinx.android.synthetic.main.activity_device_detail.deviceCodeView -import kotlinx.android.synthetic.main.activity_device_detail.deviceNameView -import kotlinx.android.synthetic.main.activity_device_detail.deviceStateView -import kotlinx.android.synthetic.main.activity_device_detail.imageGridView -import kotlinx.android.synthetic.main.activity_device_detail.lastDataView -import kotlinx.android.synthetic.main.activity_device_detail.leftBackView -import kotlinx.android.synthetic.main.activity_device_detail.locationView -import kotlinx.android.synthetic.main.activity_device_detail.projectGroupView -import kotlinx.android.synthetic.main.activity_device_detail.rightOptionView -import kotlinx.android.synthetic.main.activity_device_detail.signalImageView -import kotlinx.android.synthetic.main.activity_device_detail.titleView -class DeviceDetailActivity : KotlinBaseActivity() { +class DeviceDetailActivity : KotlinBaseActivity() { private val kTag = "DeviceDetailActivity" private lateinit var deviceViewModel: DeviceViewModel private lateinit var deviceModel: DeviceDetailModel.DataModel private val geocoderSearch by lazy { GeocodeSearch(this) } - override fun initLayoutView(): Int = R.layout.activity_device_detail + override fun initViewBinding(): ActivityDeviceDetailBinding { + return ActivityDeviceDetailBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "设备详情" - leftBackView.setOnClickListener { finish() } + binding.titleView.text = "设备详情" + binding.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! - deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] deviceViewModel.obtainDeviceDetail(params[0], params[1]) deviceViewModel.deviceDetailModel.observe(this) { if (it.code == 200) { val device = it.data this.deviceModel = device - deviceCodeView.text = device.devcode - deviceNameView.text = device.deviceName - projectGroupView.text = String.format("项目${device.groupId}") + binding.deviceCodeView.text = device.devcode + binding.deviceNameView.text = device.deviceName + binding.projectGroupView.text = String.format("项目${device.groupId}") if (device.latGaode.isBlank() || device.lngGaode.isBlank()) { - locationView.text = "经纬度异常,无法查看具体位置" + binding.locationView.text = "经纬度异常,无法查看具体位置" } else { val queryParam = RegeocodeQuery( LatLonPoint(device.latGaode.toDouble(), device.lngGaode.toDouble()), @@ -81,7 +71,7 @@ GeocodeSearch.OnGeocodeSearchListener { override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { if (rCode == 1000) { - locationView.text = result?.regeocodeAddress?.formatAddress + binding.locationView.text = result?.regeocodeAddress?.formatAddress } } @@ -90,12 +80,12 @@ } }) } - descriptionView.text = device.descn + binding.descriptionView.text = device.descn if (device.photos.toString().isBlank()) { - imageGridView.visibility = View.GONE + binding.imageGridView.visibility = View.GONE } else { - imageGridView.visibility = View.VISIBLE + binding.imageGridView.visibility = View.VISIBLE //处理图片地址 val urls: ArrayList = ArrayList() val imageArray = device.photos.toString().split(",") @@ -104,10 +94,9 @@ urls.add(path.combineImagePath()) } } - val imageAdapter = ReadOnlyImageAdapter(this) - imageAdapter.setImageList(urls) - imageGridView.adapter = imageAdapter - imageGridView.setOnItemClickListener { _, _, position, _ -> + val imageAdapter = ReadOnlyImageAdapter(this, urls) + binding.imageGridView.adapter = imageAdapter + binding.imageGridView.setOnItemClickListener { _, _, position, _ -> if (urls[position].isEmpty()) { "图片加载失败,无法查看大图".show(this) } else { @@ -119,18 +108,18 @@ val value = device.stregnth.toDouble().toInt() val level = "$value%" val ppm = "${value * 500}ppm" - densityView.text = "$level(相当于$ppm)" + binding.densityView.text = "$level(相当于$ppm)" - lastDataView.text = device.uptime + binding.lastDataView.text = device.uptime if (device.onlineState == "0") { - deviceStateView.text = "离线" - deviceStateView.setTextColor(Color.RED) + binding.deviceStateView.text = "离线" + binding.deviceStateView.setTextColor(Color.RED) } else { - deviceStateView.text = "在线" - deviceStateView.setTextColor(Color.GREEN) + binding.deviceStateView.text = "在线" + binding.deviceStateView.setTextColor(Color.GREEN) } - signalImageView.setBackgroundResource(device.rsrp.toSignalImage()) - deviceBatteryView.text = if (device.cell.isNullOrBlank()) { + binding.signalImageView.setBackgroundResource(device.rsrp.toSignalImage()) + binding.deviceBatteryView.text = if (device.cell.isNullOrBlank()) { "0%" } else { device.cell + "%" @@ -149,7 +138,7 @@ } override fun initEvent() { - rightOptionView.setOnClickListener { + binding.rightOptionView.setOnClickListener { val lat = deviceModel.latGaode.toString() val lng = deviceModel.lngGaode.toString() if (lat.isBlank() || lng.isBlank()) { diff --git a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt index 0ae8862..ba52ab8 100644 --- a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.content.Context +import android.os.Bundle import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -8,6 +9,7 @@ import androidx.recyclerview.widget.RecyclerView import com.casic.smarttube.R import com.casic.smarttube.adapter.DeviceListAdapter +import com.casic.smarttube.databinding.ActivityGroupDeviceBinding import com.casic.smarttube.extensions.showEmptyPage import com.casic.smarttube.model.DeviceListModel import com.casic.smarttube.utils.LoadingDialogHub @@ -28,14 +30,8 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.qmuiteam.qmui.recyclerView.QMUIRVItemSwipeAction import com.qmuiteam.qmui.recyclerView.QMUISwipeAction -import kotlinx.android.synthetic.main.activity_group_device.groupDeviceLayout -import kotlinx.android.synthetic.main.activity_group_device.groupDeviceView -import kotlinx.android.synthetic.main.activity_group_device.leftBackView -import kotlinx.android.synthetic.main.activity_group_device.rightOptionView -import kotlinx.android.synthetic.main.activity_group_device.titleView -import kotlinx.android.synthetic.main.include_empty_view.emptyView -class GroupDeviceActivity : KotlinBaseActivity() { +class GroupDeviceActivity : KotlinBaseActivity() { private lateinit var groupId: String private lateinit var weakReferenceHandler: WeakReferenceHandler @@ -51,18 +47,19 @@ private var clickedPosition = 0 private var isDeleteAll = false - override fun initLayoutView(): Int = R.layout.activity_group_device + override fun initViewBinding(): ActivityGroupDeviceBinding { + return ActivityGroupDeviceBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - leftBackView.setOnClickListener { finish() } - rightOptionView.setOnClickListener { + binding.leftBackView.setOnClickListener { finish() } + binding.rightOptionView.setOnClickListener { //改为Popup val easyPopupWindow = EasyPopupWindow(this) easyPopupWindow.setPopupMenuItem( - LocaleConstant.DEVICE_OPERATE_IMAGES, - LocaleConstant.DEVICE_OPERATE_TITLES + LocaleConstant.DEVICE_OPERATE_IMAGES, LocaleConstant.DEVICE_OPERATE_TITLES ) easyPopupWindow.setOnPopupWindowClickListener(object : EasyPopupWindow.OnPopupWindowClickListener { @@ -77,13 +74,11 @@ pageIndex = 1 obtainDeviceListByPage() } + 1 -> { - AlertControlDialog.Builder() - .setContext(context) - .setTitle("提示") + AlertControlDialog.Builder().setContext(context).setTitle("提示") .setMessage("删除后将无法恢复,是否继续?") - .setNegativeButton("容我想想") - .setPositiveButton("已经想好") + .setNegativeButton("容我想想").setPositiveButton("已经想好") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onCancelClick() { @@ -103,13 +98,11 @@ } }).build().show() } + 2 -> { - MultiSelectDialog.Builder() - .setContext(this@GroupDeviceActivity) - .setTitle("选择设备") - .setDataSource(dataBeans) - .setNegativeButton("取消") - .setPositiveButton("选好了") + MultiSelectDialog.Builder().setContext(this@GroupDeviceActivity) + .setTitle("选择设备").setDataSource(dataBeans) + .setNegativeButton("取消").setPositiveButton("选好了") .setOnDialogButtonClickListener(object : MultiSelectDialog.OnDialogButtonClickListener { override fun onConfirmClick(selectedModels: MutableList) { @@ -126,21 +119,20 @@ override fun onCancelClick() { } - }) - .build().show() + }).build().show() } } } }) easyPopupWindow.setBackgroundDrawable(null) - val x: Int = rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(rightOptionView, x, 0) + val x: Int = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { groupId = intent.getStringExtra(Constant.INTENT_PARAM)!! - titleView.text = String.format(groupId + "项目设备列表") + binding.titleView.text = String.format(groupId + "项目设备列表") weakReferenceHandler = WeakReferenceHandler(callback) groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java] deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] @@ -157,13 +149,13 @@ } override fun initEvent() { - groupDeviceLayout.setOnRefreshListener { + binding.groupDeviceLayout.setOnRefreshListener { isRefresh = true //刷新之后页码重置 pageIndex = 1 obtainDeviceListByPage() } - groupDeviceLayout.setOnLoadMoreListener { + binding.groupDeviceLayout.setOnLoadMoreListener { isLoadMore = true pageIndex++ obtainDeviceListByPage() @@ -176,7 +168,7 @@ isRefresh -> { dataBeans.clear() dataBeans = dataRows!! - groupDeviceLayout.finishRefresh() + binding.groupDeviceLayout.finishRefresh() isRefresh = false } @@ -185,7 +177,7 @@ "到底了,别拉了".show(this) } dataBeans.addAll(dataRows!!) - groupDeviceLayout.finishLoadMore() + binding.groupDeviceLayout.finishLoadMore() isLoadMore = false } @@ -211,7 +203,7 @@ ) } if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { pageIndex = 1 obtainDeviceListByPage() } @@ -230,15 +222,15 @@ deviceAdapter.notifyDataSetChanged() } else { if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { pageIndex = 1 obtainDeviceListByPage() } } else { - emptyView!!.hide() + binding.emptyInclude.emptyView.hide() deviceAdapter = DeviceListAdapter(this, dataBeans) //绑定侧滑事件 - swipeAction.attachToRecyclerView(groupDeviceView) + swipeAction.attachToRecyclerView(binding.groupDeviceView) val linearLayoutManager = object : LinearLayoutManager(this) { override fun generateDefaultLayoutParams(): RecyclerView.LayoutParams { return RecyclerView.LayoutParams( @@ -247,8 +239,8 @@ ) } } - groupDeviceView.layoutManager = linearLayoutManager - groupDeviceView.adapter = deviceAdapter + binding.groupDeviceView.layoutManager = linearLayoutManager + binding.groupDeviceView.adapter = deviceAdapter deviceAdapter.setOnItemClickListener(object : DeviceListAdapter.OnItemClickListener { override fun onClicked(position: Int) { @@ -311,13 +303,9 @@ }) private fun deleteItem(adapterPosition: Int) { - AlertControlDialog.Builder() - .setContext(this) - .setTitle("提示") - .setMessage("删除后将无法恢复,是否继续?") - .setNegativeButton("容我想想") - .setPositiveButton("已经想好") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(this).setTitle("提示") + .setMessage("删除后将无法恢复,是否继续?").setNegativeButton("容我想想") + .setPositiveButton("已经想好").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onCancelClick() { diff --git a/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt b/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt index 71f438c..70e49f0 100644 --- a/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt @@ -1,9 +1,11 @@ package com.casic.smarttube.view +import android.os.Bundle import android.view.View import android.widget.AdapterView import androidx.lifecycle.ViewModelProvider import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityHistoryDataBinding import com.casic.smarttube.extensions.dateToMonthDay import com.casic.smarttube.extensions.getQuarterOfYear import com.casic.smarttube.utils.ChartViewHelper @@ -22,27 +24,26 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState -import kotlinx.android.synthetic.main.activity_history_data.dataLineChart -import kotlinx.android.synthetic.main.activity_history_data.leftBackView -import kotlinx.android.synthetic.main.activity_history_data.periodSpinner import java.util.Calendar -class HistoryDataActivity : KotlinBaseActivity() { +class HistoryDataActivity : KotlinBaseActivity() { private val kTag = "HistoryDataActivity" private lateinit var deviceViewModel: DeviceViewModel private lateinit var groupId: String private lateinit var devCode: String - override fun initLayoutView(): Int = R.layout.activity_history_data + override fun initViewBinding(): ActivityHistoryDataBinding { + return ActivityHistoryDataBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - leftBackView.setOnClickListener { finish() } + binding.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! groupId = params[0] devCode = params[1] @@ -61,8 +62,8 @@ override fun initEvent() { //默认选择近7天的数据 - periodSpinner.setSelection(3) - periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + binding.periodSpinner.setSelection(3) + binding.periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onItemSelected( parent: AdapterView<*>?, view: View?, position: Int, id: Long ) { @@ -76,6 +77,7 @@ groupId, devCode, "$year-01-01", time.timestampToCompleteDate() ) } + 1 -> { //本季度 val startDate = when (time.getQuarterOfYear()) { @@ -89,6 +91,7 @@ groupId, devCode, startDate, time.timestampToCompleteDate() ) } + 2 -> { //近30日 deviceViewModel.obtainDeviceHistoryData( @@ -98,6 +101,7 @@ time.timestampToCompleteDate() ) } + 3 -> { //近7日 deviceViewModel.obtainDeviceHistoryData( @@ -107,19 +111,18 @@ time.timestampToCompleteDate() ) } + 4 -> { //今日 deviceViewModel.obtainDeviceHistoryData( groupId, devCode, time.timestampToDate(), time.timestampToCompleteDate() ) } + 5 -> { - DateSelectDialog.Builder() - .setContext(this@HistoryDataActivity) - .setTitle("选择日期") - .setNegativeButton("取消") - .setPositiveButton("选好了") - .setOnDialogButtonClickListener(object : + DateSelectDialog.Builder().setContext(this@HistoryDataActivity) + .setTitle("选择日期").setNegativeButton("取消") + .setPositiveButton("选好了").setOnDialogButtonClickListener(object : DateSelectDialog.OnDialogButtonClickListener { override fun onConfirmClick(startDate: String, endDate: String) { deviceViewModel.obtainDeviceHistoryData( @@ -129,12 +132,10 @@ override fun onCancelClick() { //选择取消就默认加载近7天的数据 - periodSpinner.setSelection(3) + binding.periodSpinner.setSelection(3) } - }) - .setFragmentManager(supportFragmentManager) - .setCalendarType(Type.YEAR_MONTH_DAY) - .build().show() + }).setFragmentManager(supportFragmentManager) + .setCalendarType(Type.YEAR_MONTH_DAY).build().show() } } } @@ -159,7 +160,9 @@ Entry(i.toFloat(), rowsBean.stregnth!!.toFloat(), "浓度") ) } - ChartViewHelper.setLineChartData(dataLineChart, xAxisLabels, strengthEntries) + ChartViewHelper.setLineChartData( + binding.dataLineChart, xAxisLabels, strengthEntries + ) } } } diff --git a/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt b/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt index ebca433..f947b2c 100644 --- a/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt @@ -1,7 +1,8 @@ package com.casic.smarttube.view +import android.os.Bundle import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityLoginBinding import com.casic.smarttube.utils.AuthenticationHelper import com.casic.smarttube.utils.LoadingDialogHub import com.casic.smarttube.utils.LocaleConstant @@ -14,26 +15,29 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues -import kotlinx.android.synthetic.main.activity_login.loginButton -import kotlinx.android.synthetic.main.activity_login.userNameView -import kotlinx.android.synthetic.main.activity_login.userPasswordView -class LoginActivity : KotlinBaseActivity() { +class LoginActivity : KotlinBaseActivity() { private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginViewModel: LoginViewModel private lateinit var userViewModel: UserViewModel - override fun initLayoutView(): Int = R.layout.activity_login + override fun initViewBinding(): ActivityLoginBinding { + return ActivityLoginBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(true).init() } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { // 设置默认账号密码 - userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) - userPasswordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + binding.userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + binding.userPasswordView.setText( + SaveKeyValues.getValue( + LocaleConstant.PASSWORD, "" + ) as String + ) authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] @@ -50,9 +54,9 @@ } override fun initEvent() { - loginButton.setOnClickListener { - val account = userNameView.text.toString().trim() - val userPassword = userPasswordView.text.toString().trim() + binding.loginButton.setOnClickListener { + val account = binding.userNameView.text.toString().trim() + val userPassword = binding.userPasswordView.text.toString().trim() if (account.isBlank()) { "用户名不能为空".show(this) return@setOnClickListener @@ -74,8 +78,8 @@ AuthenticationHelper.savePublicKey(keyString) val publicKey = RSAUtils.keyStrToPublicKey(keyString) - val account = userNameView.text.toString() - val userPassword = userPasswordView.text.toString() + val account = binding.userNameView.text.toString() + val userPassword = binding.userPasswordView.text.toString() val dataByPublicKey = RSAUtils.encryptDataByPublicKey(userPassword.toByteArray(), publicKey!!) //登录并获取Token,POST请求 diff --git a/app/src/main/java/com/casic/smarttube/view/MainActivity.kt b/app/src/main/java/com/casic/smarttube/view/MainActivity.kt index 4461757..575e1ee 100644 --- a/app/src/main/java/com/casic/smarttube/view/MainActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/MainActivity.kt @@ -1,5 +1,6 @@ package com.casic.smarttube.view +import android.os.Bundle import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment @@ -7,6 +8,7 @@ import androidx.fragment.app.FragmentPagerAdapter import androidx.viewpager.widget.ViewPager import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityMainBinding import com.casic.smarttube.fragment.HomePageFragment import com.casic.smarttube.fragment.MinePageFragment import com.casic.smarttube.fragment.OverviewFragment @@ -15,9 +17,8 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_main.* -class MainActivity : KotlinBaseActivity() { +class MainActivity : KotlinBaseActivity() { private var menuItem: MenuItem? = null private var fragmentList: MutableList = ArrayList() @@ -29,32 +30,36 @@ fragmentList.add(MinePageFragment()) } - override fun initLayoutView(): Int = R.layout.activity_main + override fun initViewBinding(): ActivityMainBinding { + return ActivityMainBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { //保留icon原图颜色 - bottomNavigation.itemIconTintList = null - bottomNavigation.setOnItemSelectedListener { menuItem -> + binding.bottomNavigation.itemIconTintList = null + binding.bottomNavigation.setOnItemSelectedListener { menuItem -> when (menuItem.itemId) { R.id.nav_home -> { - mainViewPager.currentItem = 0 + binding.mainViewPager.currentItem = 0 } + R.id.nav_overview -> { - mainViewPager.currentItem = 1 + binding.mainViewPager.currentItem = 1 } + R.id.nav_mine -> { - mainViewPager.currentItem = 2 + binding.mainViewPager.currentItem = 2 } } false } - mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) - mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 + binding.mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + binding.mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun observeRequestState() { @@ -62,7 +67,7 @@ } override fun initEvent() { - mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + binding.mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrollStateChanged(state: Int) { } @@ -77,9 +82,9 @@ if (menuItem != null) { menuItem!!.isChecked = false } else { - bottomNavigation.menu.getItem(0).isChecked = false + binding.bottomNavigation.menu.getItem(0).isChecked = false } - menuItem = bottomNavigation.menu.getItem(position) + menuItem = binding.bottomNavigation.menu.getItem(position) menuItem!!.isChecked = true } }) diff --git a/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt b/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt index f00e0ca..908aade 100644 --- a/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt @@ -15,6 +15,7 @@ import com.amap.api.services.geocoder.RegeocodeQuery import com.amap.api.services.geocoder.RegeocodeResult import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityMapDeviceBriefBinding import com.casic.smarttube.utils.LoadingDialogHub import com.casic.smarttube.utils.RouteOnMap import com.casic.smarttube.vm.DeviceViewModel @@ -24,16 +25,8 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState -import kotlinx.android.synthetic.main.activity_map_device_brief.deviceCodeView -import kotlinx.android.synthetic.main.activity_map_device_brief.deviceModelView -import kotlinx.android.synthetic.main.activity_map_device_brief.deviceValueView -import kotlinx.android.synthetic.main.activity_map_device_brief.locationView -import kotlinx.android.synthetic.main.activity_map_device_brief.mapView -import kotlinx.android.synthetic.main.activity_map_device_brief.updateTimeView -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -class MapDeviceBriefActivity : KotlinBaseActivity() { +class MapDeviceBriefActivity : KotlinBaseActivity() { private val kTag = "MapDeviceBriefActivity" private lateinit var deviceViewModel: DeviceViewModel @@ -42,17 +35,19 @@ private val geocoderSearch by lazy { GeocodeSearch(this) } - override fun initLayoutView(): Int = R.layout.activity_map_device_brief + override fun initViewBinding(): ActivityMapDeviceBriefBinding { + return ActivityMapDeviceBriefBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "设备最新数据地图展示" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "设备最新数据地图展示" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { - aMap = mapView.map + override fun initOnCreate(savedInstanceState: Bundle?) { + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val uiSettings = aMap.uiSettings uiSettings.isCompassEnabled = true @@ -80,22 +75,22 @@ if (it.code == 200) { val device = it.data - deviceCodeView.text = String.format("设备编号: ${device.devcode}") - deviceModelView.text = String.format("设备模型: ${params[2]}") + binding.deviceCodeView.text = String.format("设备编号: ${device.devcode}") + binding.deviceModelView.text = String.format("设备模型: ${params[2]}") //获取设备最新浓度信息 deviceViewModel.obtainTubeLastData(device.groupId, device.devcode) deviceViewModel.lastDataModel.observe(this) { v -> if (v.code == 200) { - deviceValueView.text = String.format("最新浓度: ${v.data.strength}") - updateTimeView.text = String.format("更新时间: ${v.data.uptime}") + binding.deviceValueView.text = String.format("最新浓度: ${v.data.strength}") + binding.updateTimeView.text = String.format("更新时间: ${v.data.uptime}") } else { - deviceValueView.text = String.format("最新浓度: 未知") - updateTimeView.text = String.format("更新时间: 未知") + binding.deviceValueView.text = String.format("最新浓度: 未知") + binding.updateTimeView.text = String.format("更新时间: 未知") } } if (device.latGaode.isBlank() || device.lngGaode.isBlank()) { - locationView.text = "经纬度异常,无法查看具体位置" + binding.locationView.text = "经纬度异常,无法查看具体位置" } else { val queryParam = RegeocodeQuery( LatLonPoint(device.latGaode.toDouble(), device.lngGaode.toDouble()), @@ -108,7 +103,7 @@ GeocodeSearch.OnGeocodeSearchListener { override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { if (rCode == 1000) { - locationView.text = + binding.locationView.text = String.format("详细位置: ${result?.regeocodeAddress?.formatAddress}") } } @@ -123,8 +118,7 @@ aMap.animateCamera(newCameraPosition, 1500, object : AMap.CancelableCallback { override fun onFinish() { //添加Marker - val markerOptions = MarkerOptions() - .position(latLng) + val markerOptions = MarkerOptions().position(latLng) .icon(BitmapDescriptorFactory.fromResource(R.mipmap.well_location)) .draggable(false) aMap.addMarker(markerOptions) @@ -148,26 +142,26 @@ /**地图相关*********/ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - mapView.onCreate(savedInstanceState) + binding.mapView.onCreate(savedInstanceState) } override fun onResume() { super.onResume() - mapView.onResume() + binding.mapView.onResume() } override fun onPause() { super.onPause() - mapView.onPause() + binding.mapView.onPause() } override fun onDestroy() { - mapView.onDestroy() + binding.mapView.onDestroy() super.onDestroy() } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - mapView.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/view/PermissionActivity.kt b/app/src/main/java/com/casic/smarttube/view/PermissionActivity.kt index e872ef4..fc20978 100644 --- a/app/src/main/java/com/casic/smarttube/view/PermissionActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/PermissionActivity.kt @@ -13,7 +13,6 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。 if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) { startSplashScreenActivity() } else { diff --git a/app/build.gradle b/app/build.gradle index 81dccf6..defbef7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,12 +2,11 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' android { signingConfigs { release { - storeFile file('/Users/a203/Desktop/AndroidProjects/CasicSmartTube/app/CasicSmartTube.jks') + storeFile file('CasicSmartTube.jks') storePassword '123456789' keyAlias 'key0' keyPassword '123456789' @@ -21,8 +20,6 @@ targetSdkVersion 33 versionCode 2 versionName "1.0.1" - - ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -47,6 +44,10 @@ } } + viewBinding { + enabled true + } + applicationVariants.configureEach { variant -> variant.outputs.configureEach { outputFileName = "GT_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" @@ -61,7 +62,7 @@ dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.5' implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.6.1' diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cccda6d..fd9277c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,7 +81,7 @@ + android:value="a6907c8bb931727374aa5fd500cda107" /> (), Handler.Callback, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { private val kTag = "HomePageFragment" private val geocoderSearch by lazy { GeocodeSearch(requireContext()) } - private lateinit var homeView: View private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var easyPopupWindow: EasyPopupWindow private lateinit var aMap: AMap private lateinit var deviceViewModel: DeviceViewModel private lateinit var groupViewModel: ProjectGroupViewModel @@ -83,34 +89,34 @@ * */ private var mapZooms = ArrayList() - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View { - homeView = inflater.inflate(R.layout.fragment_home, container, false) + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } - weakReferenceHandler = WeakReferenceHandler(callback) - val easyPopupWindow = EasyPopupWindow(requireContext()) - easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) - homeView.rightOptionView.setOnClickListener { - easyPopupWindow.setOnPopupWindowClickListener(object : - EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - easyPopupWindow.setBackgroundDrawable(null) - val x: Int = homeView.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(homeView.rightOptionView, x, 0) + override fun setupTopBarLayout() { + + } + + override fun observeRequestState() { + groupViewModel.loadState.observe(this) { state -> + when (state) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") + else -> LoadingDialogHub.dismiss() + } } + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + weakReferenceHandler = WeakReferenceHandler(this) + + easyPopupWindow = EasyPopupWindow(requireContext()) + easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) //初始化vm - deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) - groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) - - observeRequestState() + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java] //默认数据 groupViewModel.obtainProGroupList() @@ -119,12 +125,8 @@ mapZooms.add(13f) initMap(savedInstanceState) - homeView.addDeviceButton.setOnClickListener { - requireContext().navigatePageTo() - } - //数据监听 - deviceViewModel.mapDeviceModel.observe(this, { + deviceViewModel.mapDeviceModel.observe(this) { if (it.code == 200) { if (allMarkerOptions.isNotEmpty()) { allMarkerOptions.clear() @@ -149,10 +151,8 @@ longitudeList.add(longitude) //将所有设备信息转化缓存为Marker点 allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(device.devcode) - .snippet(device.modelName) + MarkerOptions().position(LatLng(latitude, longitude)) + .title(device.devcode).snippet(device.modelName) ) } } @@ -160,8 +160,8 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 13f) } - }) - groupViewModel.groupModel.observe(this, { + } + groupViewModel.groupModel.observe(this) { if (it.code == 200) { val dataRows = it.data when { @@ -170,14 +170,15 @@ dataBeans = dataRows!! isRefresh = false } + else -> { dataBeans = dataRows!! } } weakReferenceHandler.sendEmptyMessage(2022090201) } - }) - groupViewModel.groupDeviceModel.observe(this, { + } + groupViewModel.groupDeviceModel.observe(this) { if (it.code == 200) { val latitudeList: MutableList = ArrayList() val longitudeList: MutableList = ArrayList() @@ -199,22 +200,33 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 16f) } - }) - return homeView + } } - private fun observeRequestState() { - groupViewModel.loadState.observe(this, { state -> - when (state) { - LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") - else -> LoadingDialogHub.dismiss() - } - }) + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + easyPopupWindow.setOnPopupWindowClickListener(object : + EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + easyPopupWindow.setBackgroundDrawable(null) + val x: Int = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + binding.addDeviceButton.setOnClickListener { + requireContext().navigatePageTo() + } } override fun onResume() { super.onResume() - homeView.mapView.onResume() + binding.mapView.onResume() //获取所有设备数据 deviceViewModel.obtainMapDeviceList() @@ -222,16 +234,16 @@ groupViewModel.obtainProGroupList() } - private val callback = Handler.Callback { - if (it.what == 2022090201) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022090201) { if (isRefresh) { groupListAdapter.notifyDataSetChanged() } else { groupListAdapter = GroupListAdapter(requireContext(), dataBeans) - homeView.homeRecyclerView!!.addItemDecoration( + binding.homeRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - homeView.homeRecyclerView!!.adapter = groupListAdapter + binding.homeRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : GroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { @@ -241,12 +253,12 @@ }) } } - true + return true } private fun initMap(savedInstanceState: Bundle?) { - homeView.mapView.onCreate(savedInstanceState) - aMap = homeView.mapView.map + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val uiSettings = aMap.uiSettings uiSettings.isCompassEnabled = true @@ -322,10 +334,7 @@ if (!isInRange) { clustersMarkers.add( GaoDeClusterMarkerView( - requireContext(), - it, - proj, - LocaleConstant.RADIUS_SIZE + requireContext(), it, proj, LocaleConstant.RADIUS_SIZE ) )//相距多少才聚合 } @@ -363,9 +372,7 @@ //绑定数据 val clickedLatLng = marker?.position!! for (device in deviceModels) { - if (clickedLatLng.latitude == device.latGaode!!.toDouble() - && clickedLatLng.longitude == device.lngGaode!!.toDouble() - ) { + if (clickedLatLng.latitude == device.latGaode!!.toDouble() && clickedLatLng.longitude == device.lngGaode!!.toDouble()) { deviceCodeView.text = String.format("设备编号: ${device.devcode}") deviceModelView.text = String.format("设备模型: ${device.modelName}") //获取设备最新浓度信息 @@ -395,8 +402,7 @@ val address = result?.regeocodeAddress?.formatAddress val temp = StringBuilder() if (address!!.length > 16) { - temp.append(address.substring(0, 14)) - .append("\r\n") + temp.append(address.substring(0, 14)).append("\r\n") .append(address.substring(16)) } else { temp.append(address) @@ -430,9 +436,7 @@ } } //查看聚合点,单独开页面导航过去 - BottomActionSheet.Builder() - .setContext(requireContext()) - .setActionItemTitle(multiDevice) + BottomActionSheet.Builder().setContext(requireContext()).setActionItemTitle(multiDevice) .setItemTextColor(Color.BLUE) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { @@ -455,12 +459,8 @@ override fun onInfoWindowClick(p0: Marker?) { if (p0 != null) { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -487,16 +487,16 @@ 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 onDestroy() { super.onDestroy() - homeView.mapView.onDestroy() + binding.mapView.onDestroy() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt index a4e964c..cc35197 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt @@ -4,11 +4,15 @@ import android.content.Intent import android.net.Uri import android.os.Build +import android.os.Bundle import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider import com.casic.smarttube.BuildConfig import com.casic.smarttube.R +import com.casic.smarttube.databinding.FragmentMineBinding import com.casic.smarttube.extensions.appendDownloadUrl import com.casic.smarttube.model.UserDetailModel import com.casic.smarttube.utils.AuthenticationHelper @@ -36,22 +40,10 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.ChangePasswordDialog -import kotlinx.android.synthetic.main.fragment_mine.aboutUsLayout -import kotlinx.android.synthetic.main.fragment_mine.cacheSizeView -import kotlinx.android.synthetic.main.fragment_mine.changePwdLayout -import kotlinx.android.synthetic.main.fragment_mine.clearCacheLayout -import kotlinx.android.synthetic.main.fragment_mine.loginOutButton -import kotlinx.android.synthetic.main.fragment_mine.updateLogLayout -import kotlinx.android.synthetic.main.fragment_mine.updateUserButton -import kotlinx.android.synthetic.main.fragment_mine.updateVersionLayout -import kotlinx.android.synthetic.main.fragment_mine.userDeptView -import kotlinx.android.synthetic.main.fragment_mine.userImageView -import kotlinx.android.synthetic.main.fragment_mine.userNameView -import kotlinx.android.synthetic.main.fragment_mine.userPhoneView import java.io.File import java.nio.charset.StandardCharsets -class MinePageFragment : KotlinBaseFragment() { +class MinePageFragment : KotlinBaseFragment() { private val kTag = "MinePageFragment" private lateinit var userData: UserDetailModel.Data @@ -60,13 +52,17 @@ private lateinit var versionViewModel: VersionViewModel private lateinit var progressDialog: ProgressDialog - override fun initLayoutView(): Int = R.layout.fragment_mine + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentMineBinding { + return FragmentMineBinding.inflate(inflater, container, false) + } override fun setupTopBarLayout() { } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java] @@ -98,8 +94,7 @@ versionViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show( - requireActivity(), - "检查版本中,请稍后" + requireActivity(), "检查版本中,请稍后" ) else -> LoadingDialogHub.dismiss() @@ -108,49 +103,45 @@ } override fun initEvent() { - userImageView.setOnClickListener { + binding.userImageView.setOnClickListener { "尽情期待~".show(requireContext()) } - updateUserButton.setOnClickListener { + binding.updateUserButton.setOnClickListener { LoadingDialogHub.show(requireActivity(), "同步中,请稍后...") userViewModel.obtainUserDetail() } - changePwdLayout.setOnClickListener { - ChangePasswordDialog.Builder() - .setContext(requireContext()) + binding.changePwdLayout.setOnClickListener { + ChangePasswordDialog.Builder().setContext(requireContext()) .setOnDialogButtonClickListener(object : ChangePasswordDialog.OnDialogButtonClickListener { override fun onConfirmClick(oldPwd: String, newPwd: String) { - val publicKey = - RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! val oldPassKey = RSAUtils.encryptDataByPublicKey( - oldPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + oldPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) val newPassKey = RSAUtils.encryptDataByPublicKey( - newPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + newPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) userViewModel.changePassword(oldPassKey, newPassKey) } }).build().show() } - aboutUsLayout.setOnClickListener { + binding.aboutUsLayout.setOnClickListener { requireContext().navigatePageTo() } - updateVersionLayout.setOnClickListener { + binding.updateVersionLayout.setOnClickListener { versionViewModel.updateVersion() } - updateLogLayout.setOnClickListener { + binding.updateLogLayout.setOnClickListener { "尽情期待~".show(requireContext()) } - clearCacheLayout.setOnClickListener { + binding.clearCacheLayout.setOnClickListener { //删除缓存之后在设置缓存大小 LoadingDialogHub.show(requireActivity(), "清理中,请稍后") File(requireContext().cacheDir.path).deleteFile() @@ -161,18 +152,14 @@ override fun onFinish() { LoadingDialogHub.dismiss() - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() } }.start() } - loginOutButton.setOnClickListener { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("退出登录") - .setMessage("确定要退出吗?") - .setNegativeButton("取消") - .setPositiveButton("确定") + binding.loginOutButton.setOnClickListener { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("退出登录") + .setMessage("确定要退出吗?").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -203,13 +190,9 @@ if (BuildConfig.VERSION_NAME == it.version) { "已是最新版本,无需更新".show(requireContext()) } else { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("提示") - .setMessage("有新版本,是否更新?") - .setNegativeButton("稍后再说") - .setPositiveButton("立即下载") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(requireContext()).setTitle("提示") + .setMessage("有新版本,是否更新?").setNegativeButton("稍后再说") + .setPositiveButton("立即下载").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { downloadApk(it.downloadUrl) @@ -244,7 +227,7 @@ updateUserInfo() } //缓存 - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() super.onResume() } @@ -258,9 +241,9 @@ // R.color.mainThemeColor.convertColor(requireContext()) // ) // userImageView.setImageDrawable(roundDrawable) - userNameView.text = userData.name - userPhoneView.text = String.format("电话:${userData.phone}") - userDeptView.text = String.format("部门:${userData.deptName}") + binding.userNameView.text = userData.name + binding.userPhoneView.text = String.format("电话:${userData.phone}") + binding.userDeptView.text = String.format("部门:${userData.deptName}") } private fun downloadApk(url: String?) { @@ -275,7 +258,8 @@ * */ val downloadPath = url!!.appendDownloadUrl() //开始下载 - downloadPath.downloadFile(requireContext().createDownloadFileDir().toString(), + downloadPath.downloadFile( + requireContext().createDownloadFileDir().toString(), object : OnDownloadListener { override fun onDownloadStart(totalBytes: Long) { progressDialog.max = totalBytes.toInt() diff --git a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt index b009850..c0afcc5 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt @@ -1,8 +1,11 @@ package com.casic.smarttube.fragment +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R import com.casic.smarttube.adapter.OverviewGroupListAdapter +import com.casic.smarttube.databinding.FragmentOverviewBinding import com.casic.smarttube.extensions.showEmptyPage import com.casic.smarttube.model.ProjectGroupModel import com.casic.smarttube.view.GroupDeviceActivity @@ -11,25 +14,25 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.widget.dialog.AlertInputDialog -import kotlinx.android.synthetic.main.fragment_overview.groupRecyclerView -import kotlinx.android.synthetic.main.fragment_overview.rightOptionView -import kotlinx.android.synthetic.main.fragment_overview.titleView -import kotlinx.android.synthetic.main.include_empty_view.emptyView -class OverviewFragment : KotlinBaseFragment() { +class OverviewFragment : KotlinBaseFragment() { private lateinit var groupViewModel: ProjectGroupViewModel private var dataBeans: MutableList = ArrayList() private lateinit var groupListAdapter: OverviewGroupListAdapter private var clickedPosition = 0 - override fun initLayoutView(): Int = R.layout.fragment_overview - - override fun setupTopBarLayout() { - titleView.text = "概览" + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentOverviewBinding { + return FragmentOverviewBinding.inflate(inflater, container, false) } - override fun initData() { + override fun setupTopBarLayout() { + binding.titleView.text = "概览" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) } @@ -43,7 +46,7 @@ } override fun initEvent() { - rightOptionView.setOnClickListener { + binding.rightOptionView.setOnClickListener { groupViewModel.obtainProGroupList() "刷新数据中,请稍后".show(requireContext()) } @@ -51,16 +54,16 @@ groupViewModel.groupModel.observe(this) { if (it.code == 200) { if (it.data.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { groupViewModel.obtainProGroupList() } } else { - emptyView!!.hide() + binding.emptyInclude.emptyView.hide() dataBeans.clear() dataBeans = it.data groupListAdapter = OverviewGroupListAdapter(requireContext(), it.data) - groupRecyclerView!!.adapter = groupListAdapter + binding.groupRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : OverviewGroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { diff --git a/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt b/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt index e424721..7f036b0 100644 --- a/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt +++ b/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt @@ -4,8 +4,8 @@ import android.graphics.Color import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.Poi -import com.pengxh.kt.lite.extensions.showBusRouteOnMap -import com.pengxh.kt.lite.extensions.showRouteOnMap +import com.casic.smarttube.extensions.showBusRouteOnMap +import com.casic.smarttube.extensions.showRouteOnMap import com.pengxh.kt.lite.widget.dialog.BottomActionSheet object RouteOnMap { diff --git a/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt b/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt index 65bba6f..598581a 100644 --- a/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt @@ -1,27 +1,29 @@ package com.casic.smarttube.view +import android.os.Bundle import com.casic.smarttube.BuildConfig import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityAboutUsBinding import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_about_us.* -import kotlinx.android.synthetic.main.include_base_title.* -class AboutUsActivity : KotlinBaseActivity() { +class AboutUsActivity : KotlinBaseActivity() { - override fun initLayoutView(): Int = R.layout.activity_about_us + override fun initViewBinding(): ActivityAboutUsBinding { + return ActivityAboutUsBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "关于我们" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "关于我们" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { - versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + override fun initOnCreate(savedInstanceState: Bundle?) { + binding.versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") } override fun observeRequestState() { diff --git a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt index 415f9dd..80b83bd 100644 --- a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.content.Intent import android.graphics.Color +import android.os.Bundle import android.os.CountDownTimer import android.os.Handler import android.text.Editable @@ -15,6 +16,7 @@ import com.amap.api.location.AMapLocation import com.casic.smarttube.R import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.smarttube.databinding.ActivityAddDeviceBinding import com.casic.smarttube.extensions.combineImagePath import com.casic.smarttube.extensions.compressImage import com.casic.smarttube.extensions.isNumber @@ -47,24 +49,9 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_add_device.addDeviceTimeView -import kotlinx.android.synthetic.main.activity_add_device.addImageRecyclerView -import kotlinx.android.synthetic.main.activity_add_device.collectIntervalView -import kotlinx.android.synthetic.main.activity_add_device.deviceCodeView -import kotlinx.android.synthetic.main.activity_add_device.deviceNameView -import kotlinx.android.synthetic.main.activity_add_device.inputLengthView -import kotlinx.android.synthetic.main.activity_add_device.latitudeView -import kotlinx.android.synthetic.main.activity_add_device.locationImageView -import kotlinx.android.synthetic.main.activity_add_device.longitudeView -import kotlinx.android.synthetic.main.activity_add_device.ownerShipView -import kotlinx.android.synthetic.main.activity_add_device.scannerView -import kotlinx.android.synthetic.main.activity_add_device.sceneEditView -import kotlinx.android.synthetic.main.activity_add_device.submitButton -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView import java.io.File -class AddDeviceActivity : KotlinBaseActivity() { +class AddDeviceActivity : KotlinBaseActivity() { private val kTag = "AddDeviceActivity" private lateinit var imageAdapter: EditableImageAdapter @@ -81,21 +68,23 @@ registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK) { val data = result.data!! - longitudeView.text = data.getStringExtra("longitude") - latitudeView.text = data.getStringExtra("latitude") + binding.longitudeView.text = data.getStringExtra("longitude") + binding.latitudeView.text = data.getStringExtra("latitude") } } - override fun initLayoutView(): Int = R.layout.activity_add_device + override fun initViewBinding(): ActivityAddDeviceBinding { + return ActivityAddDeviceBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "添加设备" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "添加设备" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { weakReferenceHandler = WeakReferenceHandler(callback) uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] @@ -119,17 +108,17 @@ override fun initEvent() { val manager = QrManager.getInstance().init(QrConfigCreator.create(this)) - scannerView.setOnClickListener { + binding.scannerView.setOnClickListener { manager.startScan(this) { if (it.content.isNumber()) { - deviceCodeView.setText(it.content) + binding.deviceCodeView.setText(it.content) } else { "设备编号错误,请检查标签".show(context) } } } - ownerShipView.setOnClickListener { + binding.ownerShipView.setOnClickListener { groupViewModel.obtainGroupList() } groupViewModel.groupListModel.observe(this) { @@ -147,19 +136,14 @@ groups.add("自定义") } if (groups.isNotEmpty()) { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(groups) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { if (groups[position] == "自定义") { - AlertInputDialog.Builder() - .setContext(context) - .setTitle("提示") + AlertInputDialog.Builder().setContext(context).setTitle("提示") .setHintMessage("请输入该设备所属项目名,如:项目203") - .setNegativeButton("取消") - .setPositiveButton("确定") + .setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertInputDialog.OnDialogButtonClickListener { override fun onCancelClick() { @@ -167,12 +151,11 @@ } override fun onConfirmClick(value: String) { - ownerShipView.text = value + binding.ownerShipView.text = value } - }) - .build().show() + }).build().show() } else { - ownerShipView.text = groups[position] + binding.ownerShipView.text = groups[position] } } }).build().show() @@ -180,27 +163,22 @@ } //默认频率1min - collectIntervalView.text = frequency[0] - collectIntervalView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + binding.collectIntervalView.text = frequency[0] + binding.collectIntervalView.setOnClickListener { + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(frequency) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { - collectIntervalView.text = frequency[position] + binding.collectIntervalView.text = frequency[position] } }).build().show() } - locationImageView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(context) - .setItemTextColor(Color.BLUE) + binding.locationImageView.setOnClickListener { + BottomActionSheet.Builder().setContext(context).setItemTextColor(Color.BLUE) .setActionItemTitle(arrayListOf("自动定位", "手动选点")) - .setOnActionSheetListener(object : - BottomActionSheet.OnActionSheetListener { + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { when (position) { 0 -> { @@ -210,30 +188,32 @@ override fun onAMapLocationGet(aMapLocation: AMapLocation?) { LoadingDialogHub.dismiss() if (aMapLocation == null) { - longitudeView.text = "定位失败" - latitudeView.text = "定位失败" + binding.longitudeView.text = "定位失败" + binding.latitudeView.text = "定位失败" - longitudeView.setTextColor( + binding.longitudeView.setTextColor( R.color.redTextColor.convertColor(context) ) - latitudeView.setTextColor( + binding.latitudeView.setTextColor( R.color.redTextColor.convertColor(context) ) } else { - longitudeView.text = + binding.longitudeView.text = aMapLocation.longitude.toString() - latitudeView.text = aMapLocation.latitude.toString() + binding.latitudeView.text = + aMapLocation.latitude.toString() - longitudeView.setTextColor( + binding.longitudeView.setTextColor( R.color.mainTextColor.convertColor(context) ) - latitudeView.setTextColor( + binding.latitudeView.setTextColor( R.color.mainTextColor.convertColor(context) ) } } }) } + 1 -> selectLocationLauncher.launch( Intent(context, SelectLocationActivity::class.java) ) @@ -243,7 +223,7 @@ } imageAdapter = EditableImageAdapter(this, 3, 13f) - addImageRecyclerView.adapter = imageAdapter + binding.addImageRecyclerView.adapter = imageAdapter imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { selectPicture() @@ -281,7 +261,7 @@ } } - sceneEditView.addTextChangedListener(object : TextWatcher { + binding.sceneEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { } @@ -292,31 +272,31 @@ override fun afterTextChanged(s: Editable?) { val text = s.toString().trim() - inputLengthView.text = String.format("${text.length}/100") + binding.inputLengthView.text = String.format("${text.length}/100") if (text.length > 100) { - inputLengthView.setTextColor(R.color.redTextColor.convertColor(context)) + binding.inputLengthView.setTextColor(R.color.redTextColor.convertColor(context)) "现场情况字符不能超过100个字符".show(context) } else { - inputLengthView.setTextColor(R.color.subTextColor.convertColor(context)) + binding.inputLengthView.setTextColor(R.color.subTextColor.convertColor(context)) } } }) - addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() + binding.addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() - submitButton.setOnClickListener { - val deviceCode = deviceCodeView.text.toString().trim() + binding.submitButton.setOnClickListener { + val deviceCode = binding.deviceCodeView.text.toString().trim() if (deviceCode.isBlank()) { "请输入设备编号".show(context) return@setOnClickListener } - val ownerShip = ownerShipView.text.toString().trim() + val ownerShip = binding.ownerShipView.text.toString().trim() if (ownerShip.isBlank()) { "请输入设备所属项目".show(context) return@setOnClickListener } - val longitude = longitudeView.text.toString().trim() - val latitude = latitudeView.text.toString().trim() + val longitude = binding.longitudeView.text.toString().trim() + val latitude = binding.latitudeView.text.toString().trim() if (longitude.isBlank() || latitude.isBlank()) { "请先获取当前经纬度".show(context) return@setOnClickListener @@ -329,14 +309,14 @@ ) deviceViewModel.addDevice( deviceCode, - deviceNameView.text.toString(), + binding.deviceNameView.text.toString(), ownerShip, - collectIntervalView.text.toString(), + binding.collectIntervalView.text.toString(), longitude, latitude, imagePaths.reformat(), - sceneEditView.text.toString().trim(), - addDeviceTimeView.text.toString(), + binding.sceneEditView.text.toString().trim(), + binding.addDeviceTimeView.text.toString(), userData.id.toString(), userData.deptId ) @@ -345,16 +325,13 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(listOf("拍照", "相册")) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { when (position) { 0 -> { - PictureSelector.create(context) - .openCamera(SelectMimeType.ofImage()) + PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { if (result == null) { @@ -362,8 +339,7 @@ return } LoadingDialogHub.show( - this@AddDeviceActivity, - "图片上传中,请稍后..." + this@AddDeviceActivity, "图片上传中,请稍后..." ) selectedImages = result analyticalSelectResults(result[0]) @@ -374,14 +350,11 @@ } }) } + 1 -> { - PictureSelector.create(context) - .openGallery(SelectMimeType.ofImage()) - .isGif(false) - .isMaxSelectEnabledMask(true) - .setFilterMinFileSize(100) - .setMaxSelectNum(3) - .isDisplayCamera(false) + PictureSelector.create(context).openGallery(SelectMimeType.ofImage()) + .isGif(false).isMaxSelectEnabledMask(true).setFilterMinFileSize(100) + .setMaxSelectNum(3).isDisplayCamera(false) .setImageEngine(GlideLoadEngine.instance) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { @@ -390,8 +363,7 @@ return } LoadingDialogHub.show( - this@AddDeviceActivity, - "图片上传中,请稍后..." + this@AddDeviceActivity, "图片上传中,请稍后..." ) selectedImages = result // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 diff --git a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt index 3864f16..e4f19a4 100644 --- a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.content.Context +import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,19 +11,20 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityBigImageBinding import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager -import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : KotlinBaseActivity() { +class BigImageActivity : KotlinBaseActivity() { - override fun initLayoutView(): Int = R.layout.activity_big_image + override fun initViewBinding(): ActivityBigImageBinding { + return ActivityBigImageBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { PageNavigationManager.addActivity(this) @@ -30,16 +32,16 @@ ImmersionBar.with(this).statusBarDarkFont(false).init() } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) val urls = intent.getStringArrayListExtra(Constant.BIG_IMAGE_INTENT_DATA_KEY) if (urls == null || urls.size == 0) { return } - pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") - imagePagerView.adapter = BigImageAdapter(this, urls) - imagePagerView.currentItem = index - imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + binding.pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + binding.imagePagerView.adapter = BigImageAdapter(this, urls) + binding.imagePagerView.currentItem = index + binding.imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrollStateChanged(state: Int) { } @@ -53,7 +55,8 @@ } override fun onPageSelected(position: Int) { - pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + binding.pageNumberView.text = + String.format("(" + (position + 1) + "/" + urls.size + ")") } }) } @@ -63,7 +66,7 @@ } override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } + binding.leftBackView.setOnClickListener { this.finish() } } class BigImageAdapter(private var context: Context, imageList: ArrayList) : diff --git a/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt b/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt index 072953f..f036a78 100644 --- a/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.graphics.Color +import android.os.Bundle import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -10,6 +11,7 @@ import com.amap.api.services.geocoder.RegeocodeQuery import com.amap.api.services.geocoder.RegeocodeResult import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityDeviceDetailBinding import com.casic.smarttube.extensions.combineImagePath import com.casic.smarttube.extensions.toSignalImage import com.casic.smarttube.model.DeviceDetailModel @@ -25,51 +27,39 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState -import kotlinx.android.synthetic.main.activity_device_detail.densityView -import kotlinx.android.synthetic.main.activity_device_detail.descriptionView -import kotlinx.android.synthetic.main.activity_device_detail.deviceBatteryView -import kotlinx.android.synthetic.main.activity_device_detail.deviceCodeView -import kotlinx.android.synthetic.main.activity_device_detail.deviceNameView -import kotlinx.android.synthetic.main.activity_device_detail.deviceStateView -import kotlinx.android.synthetic.main.activity_device_detail.imageGridView -import kotlinx.android.synthetic.main.activity_device_detail.lastDataView -import kotlinx.android.synthetic.main.activity_device_detail.leftBackView -import kotlinx.android.synthetic.main.activity_device_detail.locationView -import kotlinx.android.synthetic.main.activity_device_detail.projectGroupView -import kotlinx.android.synthetic.main.activity_device_detail.rightOptionView -import kotlinx.android.synthetic.main.activity_device_detail.signalImageView -import kotlinx.android.synthetic.main.activity_device_detail.titleView -class DeviceDetailActivity : KotlinBaseActivity() { +class DeviceDetailActivity : KotlinBaseActivity() { private val kTag = "DeviceDetailActivity" private lateinit var deviceViewModel: DeviceViewModel private lateinit var deviceModel: DeviceDetailModel.DataModel private val geocoderSearch by lazy { GeocodeSearch(this) } - override fun initLayoutView(): Int = R.layout.activity_device_detail + override fun initViewBinding(): ActivityDeviceDetailBinding { + return ActivityDeviceDetailBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "设备详情" - leftBackView.setOnClickListener { finish() } + binding.titleView.text = "设备详情" + binding.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! - deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] deviceViewModel.obtainDeviceDetail(params[0], params[1]) deviceViewModel.deviceDetailModel.observe(this) { if (it.code == 200) { val device = it.data this.deviceModel = device - deviceCodeView.text = device.devcode - deviceNameView.text = device.deviceName - projectGroupView.text = String.format("项目${device.groupId}") + binding.deviceCodeView.text = device.devcode + binding.deviceNameView.text = device.deviceName + binding.projectGroupView.text = String.format("项目${device.groupId}") if (device.latGaode.isBlank() || device.lngGaode.isBlank()) { - locationView.text = "经纬度异常,无法查看具体位置" + binding.locationView.text = "经纬度异常,无法查看具体位置" } else { val queryParam = RegeocodeQuery( LatLonPoint(device.latGaode.toDouble(), device.lngGaode.toDouble()), @@ -81,7 +71,7 @@ GeocodeSearch.OnGeocodeSearchListener { override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { if (rCode == 1000) { - locationView.text = result?.regeocodeAddress?.formatAddress + binding.locationView.text = result?.regeocodeAddress?.formatAddress } } @@ -90,12 +80,12 @@ } }) } - descriptionView.text = device.descn + binding.descriptionView.text = device.descn if (device.photos.toString().isBlank()) { - imageGridView.visibility = View.GONE + binding.imageGridView.visibility = View.GONE } else { - imageGridView.visibility = View.VISIBLE + binding.imageGridView.visibility = View.VISIBLE //处理图片地址 val urls: ArrayList = ArrayList() val imageArray = device.photos.toString().split(",") @@ -104,10 +94,9 @@ urls.add(path.combineImagePath()) } } - val imageAdapter = ReadOnlyImageAdapter(this) - imageAdapter.setImageList(urls) - imageGridView.adapter = imageAdapter - imageGridView.setOnItemClickListener { _, _, position, _ -> + val imageAdapter = ReadOnlyImageAdapter(this, urls) + binding.imageGridView.adapter = imageAdapter + binding.imageGridView.setOnItemClickListener { _, _, position, _ -> if (urls[position].isEmpty()) { "图片加载失败,无法查看大图".show(this) } else { @@ -119,18 +108,18 @@ val value = device.stregnth.toDouble().toInt() val level = "$value%" val ppm = "${value * 500}ppm" - densityView.text = "$level(相当于$ppm)" + binding.densityView.text = "$level(相当于$ppm)" - lastDataView.text = device.uptime + binding.lastDataView.text = device.uptime if (device.onlineState == "0") { - deviceStateView.text = "离线" - deviceStateView.setTextColor(Color.RED) + binding.deviceStateView.text = "离线" + binding.deviceStateView.setTextColor(Color.RED) } else { - deviceStateView.text = "在线" - deviceStateView.setTextColor(Color.GREEN) + binding.deviceStateView.text = "在线" + binding.deviceStateView.setTextColor(Color.GREEN) } - signalImageView.setBackgroundResource(device.rsrp.toSignalImage()) - deviceBatteryView.text = if (device.cell.isNullOrBlank()) { + binding.signalImageView.setBackgroundResource(device.rsrp.toSignalImage()) + binding.deviceBatteryView.text = if (device.cell.isNullOrBlank()) { "0%" } else { device.cell + "%" @@ -149,7 +138,7 @@ } override fun initEvent() { - rightOptionView.setOnClickListener { + binding.rightOptionView.setOnClickListener { val lat = deviceModel.latGaode.toString() val lng = deviceModel.lngGaode.toString() if (lat.isBlank() || lng.isBlank()) { diff --git a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt index 0ae8862..ba52ab8 100644 --- a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.content.Context +import android.os.Bundle import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -8,6 +9,7 @@ import androidx.recyclerview.widget.RecyclerView import com.casic.smarttube.R import com.casic.smarttube.adapter.DeviceListAdapter +import com.casic.smarttube.databinding.ActivityGroupDeviceBinding import com.casic.smarttube.extensions.showEmptyPage import com.casic.smarttube.model.DeviceListModel import com.casic.smarttube.utils.LoadingDialogHub @@ -28,14 +30,8 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.qmuiteam.qmui.recyclerView.QMUIRVItemSwipeAction import com.qmuiteam.qmui.recyclerView.QMUISwipeAction -import kotlinx.android.synthetic.main.activity_group_device.groupDeviceLayout -import kotlinx.android.synthetic.main.activity_group_device.groupDeviceView -import kotlinx.android.synthetic.main.activity_group_device.leftBackView -import kotlinx.android.synthetic.main.activity_group_device.rightOptionView -import kotlinx.android.synthetic.main.activity_group_device.titleView -import kotlinx.android.synthetic.main.include_empty_view.emptyView -class GroupDeviceActivity : KotlinBaseActivity() { +class GroupDeviceActivity : KotlinBaseActivity() { private lateinit var groupId: String private lateinit var weakReferenceHandler: WeakReferenceHandler @@ -51,18 +47,19 @@ private var clickedPosition = 0 private var isDeleteAll = false - override fun initLayoutView(): Int = R.layout.activity_group_device + override fun initViewBinding(): ActivityGroupDeviceBinding { + return ActivityGroupDeviceBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - leftBackView.setOnClickListener { finish() } - rightOptionView.setOnClickListener { + binding.leftBackView.setOnClickListener { finish() } + binding.rightOptionView.setOnClickListener { //改为Popup val easyPopupWindow = EasyPopupWindow(this) easyPopupWindow.setPopupMenuItem( - LocaleConstant.DEVICE_OPERATE_IMAGES, - LocaleConstant.DEVICE_OPERATE_TITLES + LocaleConstant.DEVICE_OPERATE_IMAGES, LocaleConstant.DEVICE_OPERATE_TITLES ) easyPopupWindow.setOnPopupWindowClickListener(object : EasyPopupWindow.OnPopupWindowClickListener { @@ -77,13 +74,11 @@ pageIndex = 1 obtainDeviceListByPage() } + 1 -> { - AlertControlDialog.Builder() - .setContext(context) - .setTitle("提示") + AlertControlDialog.Builder().setContext(context).setTitle("提示") .setMessage("删除后将无法恢复,是否继续?") - .setNegativeButton("容我想想") - .setPositiveButton("已经想好") + .setNegativeButton("容我想想").setPositiveButton("已经想好") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onCancelClick() { @@ -103,13 +98,11 @@ } }).build().show() } + 2 -> { - MultiSelectDialog.Builder() - .setContext(this@GroupDeviceActivity) - .setTitle("选择设备") - .setDataSource(dataBeans) - .setNegativeButton("取消") - .setPositiveButton("选好了") + MultiSelectDialog.Builder().setContext(this@GroupDeviceActivity) + .setTitle("选择设备").setDataSource(dataBeans) + .setNegativeButton("取消").setPositiveButton("选好了") .setOnDialogButtonClickListener(object : MultiSelectDialog.OnDialogButtonClickListener { override fun onConfirmClick(selectedModels: MutableList) { @@ -126,21 +119,20 @@ override fun onCancelClick() { } - }) - .build().show() + }).build().show() } } } }) easyPopupWindow.setBackgroundDrawable(null) - val x: Int = rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(rightOptionView, x, 0) + val x: Int = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { groupId = intent.getStringExtra(Constant.INTENT_PARAM)!! - titleView.text = String.format(groupId + "项目设备列表") + binding.titleView.text = String.format(groupId + "项目设备列表") weakReferenceHandler = WeakReferenceHandler(callback) groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java] deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] @@ -157,13 +149,13 @@ } override fun initEvent() { - groupDeviceLayout.setOnRefreshListener { + binding.groupDeviceLayout.setOnRefreshListener { isRefresh = true //刷新之后页码重置 pageIndex = 1 obtainDeviceListByPage() } - groupDeviceLayout.setOnLoadMoreListener { + binding.groupDeviceLayout.setOnLoadMoreListener { isLoadMore = true pageIndex++ obtainDeviceListByPage() @@ -176,7 +168,7 @@ isRefresh -> { dataBeans.clear() dataBeans = dataRows!! - groupDeviceLayout.finishRefresh() + binding.groupDeviceLayout.finishRefresh() isRefresh = false } @@ -185,7 +177,7 @@ "到底了,别拉了".show(this) } dataBeans.addAll(dataRows!!) - groupDeviceLayout.finishLoadMore() + binding.groupDeviceLayout.finishLoadMore() isLoadMore = false } @@ -211,7 +203,7 @@ ) } if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { pageIndex = 1 obtainDeviceListByPage() } @@ -230,15 +222,15 @@ deviceAdapter.notifyDataSetChanged() } else { if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { pageIndex = 1 obtainDeviceListByPage() } } else { - emptyView!!.hide() + binding.emptyInclude.emptyView.hide() deviceAdapter = DeviceListAdapter(this, dataBeans) //绑定侧滑事件 - swipeAction.attachToRecyclerView(groupDeviceView) + swipeAction.attachToRecyclerView(binding.groupDeviceView) val linearLayoutManager = object : LinearLayoutManager(this) { override fun generateDefaultLayoutParams(): RecyclerView.LayoutParams { return RecyclerView.LayoutParams( @@ -247,8 +239,8 @@ ) } } - groupDeviceView.layoutManager = linearLayoutManager - groupDeviceView.adapter = deviceAdapter + binding.groupDeviceView.layoutManager = linearLayoutManager + binding.groupDeviceView.adapter = deviceAdapter deviceAdapter.setOnItemClickListener(object : DeviceListAdapter.OnItemClickListener { override fun onClicked(position: Int) { @@ -311,13 +303,9 @@ }) private fun deleteItem(adapterPosition: Int) { - AlertControlDialog.Builder() - .setContext(this) - .setTitle("提示") - .setMessage("删除后将无法恢复,是否继续?") - .setNegativeButton("容我想想") - .setPositiveButton("已经想好") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(this).setTitle("提示") + .setMessage("删除后将无法恢复,是否继续?").setNegativeButton("容我想想") + .setPositiveButton("已经想好").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onCancelClick() { diff --git a/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt b/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt index 71f438c..70e49f0 100644 --- a/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt @@ -1,9 +1,11 @@ package com.casic.smarttube.view +import android.os.Bundle import android.view.View import android.widget.AdapterView import androidx.lifecycle.ViewModelProvider import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityHistoryDataBinding import com.casic.smarttube.extensions.dateToMonthDay import com.casic.smarttube.extensions.getQuarterOfYear import com.casic.smarttube.utils.ChartViewHelper @@ -22,27 +24,26 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState -import kotlinx.android.synthetic.main.activity_history_data.dataLineChart -import kotlinx.android.synthetic.main.activity_history_data.leftBackView -import kotlinx.android.synthetic.main.activity_history_data.periodSpinner import java.util.Calendar -class HistoryDataActivity : KotlinBaseActivity() { +class HistoryDataActivity : KotlinBaseActivity() { private val kTag = "HistoryDataActivity" private lateinit var deviceViewModel: DeviceViewModel private lateinit var groupId: String private lateinit var devCode: String - override fun initLayoutView(): Int = R.layout.activity_history_data + override fun initViewBinding(): ActivityHistoryDataBinding { + return ActivityHistoryDataBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - leftBackView.setOnClickListener { finish() } + binding.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! groupId = params[0] devCode = params[1] @@ -61,8 +62,8 @@ override fun initEvent() { //默认选择近7天的数据 - periodSpinner.setSelection(3) - periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + binding.periodSpinner.setSelection(3) + binding.periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onItemSelected( parent: AdapterView<*>?, view: View?, position: Int, id: Long ) { @@ -76,6 +77,7 @@ groupId, devCode, "$year-01-01", time.timestampToCompleteDate() ) } + 1 -> { //本季度 val startDate = when (time.getQuarterOfYear()) { @@ -89,6 +91,7 @@ groupId, devCode, startDate, time.timestampToCompleteDate() ) } + 2 -> { //近30日 deviceViewModel.obtainDeviceHistoryData( @@ -98,6 +101,7 @@ time.timestampToCompleteDate() ) } + 3 -> { //近7日 deviceViewModel.obtainDeviceHistoryData( @@ -107,19 +111,18 @@ time.timestampToCompleteDate() ) } + 4 -> { //今日 deviceViewModel.obtainDeviceHistoryData( groupId, devCode, time.timestampToDate(), time.timestampToCompleteDate() ) } + 5 -> { - DateSelectDialog.Builder() - .setContext(this@HistoryDataActivity) - .setTitle("选择日期") - .setNegativeButton("取消") - .setPositiveButton("选好了") - .setOnDialogButtonClickListener(object : + DateSelectDialog.Builder().setContext(this@HistoryDataActivity) + .setTitle("选择日期").setNegativeButton("取消") + .setPositiveButton("选好了").setOnDialogButtonClickListener(object : DateSelectDialog.OnDialogButtonClickListener { override fun onConfirmClick(startDate: String, endDate: String) { deviceViewModel.obtainDeviceHistoryData( @@ -129,12 +132,10 @@ override fun onCancelClick() { //选择取消就默认加载近7天的数据 - periodSpinner.setSelection(3) + binding.periodSpinner.setSelection(3) } - }) - .setFragmentManager(supportFragmentManager) - .setCalendarType(Type.YEAR_MONTH_DAY) - .build().show() + }).setFragmentManager(supportFragmentManager) + .setCalendarType(Type.YEAR_MONTH_DAY).build().show() } } } @@ -159,7 +160,9 @@ Entry(i.toFloat(), rowsBean.stregnth!!.toFloat(), "浓度") ) } - ChartViewHelper.setLineChartData(dataLineChart, xAxisLabels, strengthEntries) + ChartViewHelper.setLineChartData( + binding.dataLineChart, xAxisLabels, strengthEntries + ) } } } diff --git a/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt b/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt index ebca433..f947b2c 100644 --- a/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt @@ -1,7 +1,8 @@ package com.casic.smarttube.view +import android.os.Bundle import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityLoginBinding import com.casic.smarttube.utils.AuthenticationHelper import com.casic.smarttube.utils.LoadingDialogHub import com.casic.smarttube.utils.LocaleConstant @@ -14,26 +15,29 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues -import kotlinx.android.synthetic.main.activity_login.loginButton -import kotlinx.android.synthetic.main.activity_login.userNameView -import kotlinx.android.synthetic.main.activity_login.userPasswordView -class LoginActivity : KotlinBaseActivity() { +class LoginActivity : KotlinBaseActivity() { private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginViewModel: LoginViewModel private lateinit var userViewModel: UserViewModel - override fun initLayoutView(): Int = R.layout.activity_login + override fun initViewBinding(): ActivityLoginBinding { + return ActivityLoginBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(true).init() } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { // 设置默认账号密码 - userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) - userPasswordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + binding.userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + binding.userPasswordView.setText( + SaveKeyValues.getValue( + LocaleConstant.PASSWORD, "" + ) as String + ) authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] @@ -50,9 +54,9 @@ } override fun initEvent() { - loginButton.setOnClickListener { - val account = userNameView.text.toString().trim() - val userPassword = userPasswordView.text.toString().trim() + binding.loginButton.setOnClickListener { + val account = binding.userNameView.text.toString().trim() + val userPassword = binding.userPasswordView.text.toString().trim() if (account.isBlank()) { "用户名不能为空".show(this) return@setOnClickListener @@ -74,8 +78,8 @@ AuthenticationHelper.savePublicKey(keyString) val publicKey = RSAUtils.keyStrToPublicKey(keyString) - val account = userNameView.text.toString() - val userPassword = userPasswordView.text.toString() + val account = binding.userNameView.text.toString() + val userPassword = binding.userPasswordView.text.toString() val dataByPublicKey = RSAUtils.encryptDataByPublicKey(userPassword.toByteArray(), publicKey!!) //登录并获取Token,POST请求 diff --git a/app/src/main/java/com/casic/smarttube/view/MainActivity.kt b/app/src/main/java/com/casic/smarttube/view/MainActivity.kt index 4461757..575e1ee 100644 --- a/app/src/main/java/com/casic/smarttube/view/MainActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/MainActivity.kt @@ -1,5 +1,6 @@ package com.casic.smarttube.view +import android.os.Bundle import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment @@ -7,6 +8,7 @@ import androidx.fragment.app.FragmentPagerAdapter import androidx.viewpager.widget.ViewPager import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityMainBinding import com.casic.smarttube.fragment.HomePageFragment import com.casic.smarttube.fragment.MinePageFragment import com.casic.smarttube.fragment.OverviewFragment @@ -15,9 +17,8 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_main.* -class MainActivity : KotlinBaseActivity() { +class MainActivity : KotlinBaseActivity() { private var menuItem: MenuItem? = null private var fragmentList: MutableList = ArrayList() @@ -29,32 +30,36 @@ fragmentList.add(MinePageFragment()) } - override fun initLayoutView(): Int = R.layout.activity_main + override fun initViewBinding(): ActivityMainBinding { + return ActivityMainBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { //保留icon原图颜色 - bottomNavigation.itemIconTintList = null - bottomNavigation.setOnItemSelectedListener { menuItem -> + binding.bottomNavigation.itemIconTintList = null + binding.bottomNavigation.setOnItemSelectedListener { menuItem -> when (menuItem.itemId) { R.id.nav_home -> { - mainViewPager.currentItem = 0 + binding.mainViewPager.currentItem = 0 } + R.id.nav_overview -> { - mainViewPager.currentItem = 1 + binding.mainViewPager.currentItem = 1 } + R.id.nav_mine -> { - mainViewPager.currentItem = 2 + binding.mainViewPager.currentItem = 2 } } false } - mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) - mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 + binding.mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + binding.mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun observeRequestState() { @@ -62,7 +67,7 @@ } override fun initEvent() { - mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + binding.mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrollStateChanged(state: Int) { } @@ -77,9 +82,9 @@ if (menuItem != null) { menuItem!!.isChecked = false } else { - bottomNavigation.menu.getItem(0).isChecked = false + binding.bottomNavigation.menu.getItem(0).isChecked = false } - menuItem = bottomNavigation.menu.getItem(position) + menuItem = binding.bottomNavigation.menu.getItem(position) menuItem!!.isChecked = true } }) diff --git a/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt b/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt index f00e0ca..908aade 100644 --- a/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt @@ -15,6 +15,7 @@ import com.amap.api.services.geocoder.RegeocodeQuery import com.amap.api.services.geocoder.RegeocodeResult import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityMapDeviceBriefBinding import com.casic.smarttube.utils.LoadingDialogHub import com.casic.smarttube.utils.RouteOnMap import com.casic.smarttube.vm.DeviceViewModel @@ -24,16 +25,8 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState -import kotlinx.android.synthetic.main.activity_map_device_brief.deviceCodeView -import kotlinx.android.synthetic.main.activity_map_device_brief.deviceModelView -import kotlinx.android.synthetic.main.activity_map_device_brief.deviceValueView -import kotlinx.android.synthetic.main.activity_map_device_brief.locationView -import kotlinx.android.synthetic.main.activity_map_device_brief.mapView -import kotlinx.android.synthetic.main.activity_map_device_brief.updateTimeView -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -class MapDeviceBriefActivity : KotlinBaseActivity() { +class MapDeviceBriefActivity : KotlinBaseActivity() { private val kTag = "MapDeviceBriefActivity" private lateinit var deviceViewModel: DeviceViewModel @@ -42,17 +35,19 @@ private val geocoderSearch by lazy { GeocodeSearch(this) } - override fun initLayoutView(): Int = R.layout.activity_map_device_brief + override fun initViewBinding(): ActivityMapDeviceBriefBinding { + return ActivityMapDeviceBriefBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "设备最新数据地图展示" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "设备最新数据地图展示" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { - aMap = mapView.map + override fun initOnCreate(savedInstanceState: Bundle?) { + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val uiSettings = aMap.uiSettings uiSettings.isCompassEnabled = true @@ -80,22 +75,22 @@ if (it.code == 200) { val device = it.data - deviceCodeView.text = String.format("设备编号: ${device.devcode}") - deviceModelView.text = String.format("设备模型: ${params[2]}") + binding.deviceCodeView.text = String.format("设备编号: ${device.devcode}") + binding.deviceModelView.text = String.format("设备模型: ${params[2]}") //获取设备最新浓度信息 deviceViewModel.obtainTubeLastData(device.groupId, device.devcode) deviceViewModel.lastDataModel.observe(this) { v -> if (v.code == 200) { - deviceValueView.text = String.format("最新浓度: ${v.data.strength}") - updateTimeView.text = String.format("更新时间: ${v.data.uptime}") + binding.deviceValueView.text = String.format("最新浓度: ${v.data.strength}") + binding.updateTimeView.text = String.format("更新时间: ${v.data.uptime}") } else { - deviceValueView.text = String.format("最新浓度: 未知") - updateTimeView.text = String.format("更新时间: 未知") + binding.deviceValueView.text = String.format("最新浓度: 未知") + binding.updateTimeView.text = String.format("更新时间: 未知") } } if (device.latGaode.isBlank() || device.lngGaode.isBlank()) { - locationView.text = "经纬度异常,无法查看具体位置" + binding.locationView.text = "经纬度异常,无法查看具体位置" } else { val queryParam = RegeocodeQuery( LatLonPoint(device.latGaode.toDouble(), device.lngGaode.toDouble()), @@ -108,7 +103,7 @@ GeocodeSearch.OnGeocodeSearchListener { override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { if (rCode == 1000) { - locationView.text = + binding.locationView.text = String.format("详细位置: ${result?.regeocodeAddress?.formatAddress}") } } @@ -123,8 +118,7 @@ aMap.animateCamera(newCameraPosition, 1500, object : AMap.CancelableCallback { override fun onFinish() { //添加Marker - val markerOptions = MarkerOptions() - .position(latLng) + val markerOptions = MarkerOptions().position(latLng) .icon(BitmapDescriptorFactory.fromResource(R.mipmap.well_location)) .draggable(false) aMap.addMarker(markerOptions) @@ -148,26 +142,26 @@ /**地图相关*********/ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - mapView.onCreate(savedInstanceState) + binding.mapView.onCreate(savedInstanceState) } override fun onResume() { super.onResume() - mapView.onResume() + binding.mapView.onResume() } override fun onPause() { super.onPause() - mapView.onPause() + binding.mapView.onPause() } override fun onDestroy() { - mapView.onDestroy() + binding.mapView.onDestroy() super.onDestroy() } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - mapView.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/view/PermissionActivity.kt b/app/src/main/java/com/casic/smarttube/view/PermissionActivity.kt index e872ef4..fc20978 100644 --- a/app/src/main/java/com/casic/smarttube/view/PermissionActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/PermissionActivity.kt @@ -13,7 +13,6 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。 if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) { startSplashScreenActivity() } else { diff --git a/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt b/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt index c639105..bb0b0ed 100644 --- a/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt @@ -13,33 +13,35 @@ import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.MyLocationStyle import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivitySelectLocationBinding import com.casic.smarttube.utils.CenterMarkerView import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_select_location.* -class SelectLocationActivity : KotlinBaseActivity(), AMap.OnMyLocationChangeListener, - OnMapLoadedListener, OnCameraChangeListener { +class SelectLocationActivity : KotlinBaseActivity(), + AMap.OnMyLocationChangeListener, OnMapLoadedListener, OnCameraChangeListener { private val kTag = "SelectLocationActivity" private lateinit var latLng: LatLng private lateinit var aMap: AMap private lateinit var centerMarkerView: CenterMarkerView - override fun initLayoutView(): Int = R.layout.activity_select_location + override fun initViewBinding(): ActivitySelectLocationBinding { + return ActivitySelectLocationBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "手动选点" - leftBackView.setOnClickListener { finish() } + binding.titleView.text = "手动选点" + binding.leftBackView.setOnClickListener { finish() } } - override fun initData() { - aMap = mapView.map + override fun initOnCreate(savedInstanceState: Bundle?) { + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val locationStyle = MyLocationStyle() //定位一次,且将视角移动到地图中心点 @@ -76,7 +78,7 @@ aMap.setOnMapLoadedListener(this) aMap.setOnCameraChangeListener(this) - rightOperateView.setOnClickListener { + binding.rightOperateView.setOnClickListener { val intent = Intent() intent.putExtra("longitude", latLng.longitude.toString()) intent.putExtra("latitude", latLng.latitude.toString()) @@ -110,27 +112,27 @@ /**地图相关*********/ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - mapView.onCreate(savedInstanceState) + binding.mapView.onCreate(savedInstanceState) } override fun onResume() { super.onResume() - mapView.onResume() + binding.mapView.onResume() } override fun onPause() { super.onPause() - mapView.onPause() + binding.mapView.onPause() } override fun onDestroy() { centerMarkerView.destroy() - mapView.onDestroy() + binding.mapView.onDestroy() super.onDestroy() } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - mapView.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) } } \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 81dccf6..defbef7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,12 +2,11 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' android { signingConfigs { release { - storeFile file('/Users/a203/Desktop/AndroidProjects/CasicSmartTube/app/CasicSmartTube.jks') + storeFile file('CasicSmartTube.jks') storePassword '123456789' keyAlias 'key0' keyPassword '123456789' @@ -21,8 +20,6 @@ targetSdkVersion 33 versionCode 2 versionName "1.0.1" - - ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -47,6 +44,10 @@ } } + viewBinding { + enabled true + } + applicationVariants.configureEach { variant -> variant.outputs.configureEach { outputFileName = "GT_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" @@ -61,7 +62,7 @@ dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.5' implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.6.1' diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cccda6d..fd9277c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,7 +81,7 @@ + android:value="a6907c8bb931727374aa5fd500cda107" /> (), Handler.Callback, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { private val kTag = "HomePageFragment" private val geocoderSearch by lazy { GeocodeSearch(requireContext()) } - private lateinit var homeView: View private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var easyPopupWindow: EasyPopupWindow private lateinit var aMap: AMap private lateinit var deviceViewModel: DeviceViewModel private lateinit var groupViewModel: ProjectGroupViewModel @@ -83,34 +89,34 @@ * */ private var mapZooms = ArrayList() - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View { - homeView = inflater.inflate(R.layout.fragment_home, container, false) + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } - weakReferenceHandler = WeakReferenceHandler(callback) - val easyPopupWindow = EasyPopupWindow(requireContext()) - easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) - homeView.rightOptionView.setOnClickListener { - easyPopupWindow.setOnPopupWindowClickListener(object : - EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - easyPopupWindow.setBackgroundDrawable(null) - val x: Int = homeView.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(homeView.rightOptionView, x, 0) + override fun setupTopBarLayout() { + + } + + override fun observeRequestState() { + groupViewModel.loadState.observe(this) { state -> + when (state) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") + else -> LoadingDialogHub.dismiss() + } } + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + weakReferenceHandler = WeakReferenceHandler(this) + + easyPopupWindow = EasyPopupWindow(requireContext()) + easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) //初始化vm - deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) - groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) - - observeRequestState() + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java] //默认数据 groupViewModel.obtainProGroupList() @@ -119,12 +125,8 @@ mapZooms.add(13f) initMap(savedInstanceState) - homeView.addDeviceButton.setOnClickListener { - requireContext().navigatePageTo() - } - //数据监听 - deviceViewModel.mapDeviceModel.observe(this, { + deviceViewModel.mapDeviceModel.observe(this) { if (it.code == 200) { if (allMarkerOptions.isNotEmpty()) { allMarkerOptions.clear() @@ -149,10 +151,8 @@ longitudeList.add(longitude) //将所有设备信息转化缓存为Marker点 allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(device.devcode) - .snippet(device.modelName) + MarkerOptions().position(LatLng(latitude, longitude)) + .title(device.devcode).snippet(device.modelName) ) } } @@ -160,8 +160,8 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 13f) } - }) - groupViewModel.groupModel.observe(this, { + } + groupViewModel.groupModel.observe(this) { if (it.code == 200) { val dataRows = it.data when { @@ -170,14 +170,15 @@ dataBeans = dataRows!! isRefresh = false } + else -> { dataBeans = dataRows!! } } weakReferenceHandler.sendEmptyMessage(2022090201) } - }) - groupViewModel.groupDeviceModel.observe(this, { + } + groupViewModel.groupDeviceModel.observe(this) { if (it.code == 200) { val latitudeList: MutableList = ArrayList() val longitudeList: MutableList = ArrayList() @@ -199,22 +200,33 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 16f) } - }) - return homeView + } } - private fun observeRequestState() { - groupViewModel.loadState.observe(this, { state -> - when (state) { - LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") - else -> LoadingDialogHub.dismiss() - } - }) + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + easyPopupWindow.setOnPopupWindowClickListener(object : + EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + easyPopupWindow.setBackgroundDrawable(null) + val x: Int = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + binding.addDeviceButton.setOnClickListener { + requireContext().navigatePageTo() + } } override fun onResume() { super.onResume() - homeView.mapView.onResume() + binding.mapView.onResume() //获取所有设备数据 deviceViewModel.obtainMapDeviceList() @@ -222,16 +234,16 @@ groupViewModel.obtainProGroupList() } - private val callback = Handler.Callback { - if (it.what == 2022090201) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022090201) { if (isRefresh) { groupListAdapter.notifyDataSetChanged() } else { groupListAdapter = GroupListAdapter(requireContext(), dataBeans) - homeView.homeRecyclerView!!.addItemDecoration( + binding.homeRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - homeView.homeRecyclerView!!.adapter = groupListAdapter + binding.homeRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : GroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { @@ -241,12 +253,12 @@ }) } } - true + return true } private fun initMap(savedInstanceState: Bundle?) { - homeView.mapView.onCreate(savedInstanceState) - aMap = homeView.mapView.map + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val uiSettings = aMap.uiSettings uiSettings.isCompassEnabled = true @@ -322,10 +334,7 @@ if (!isInRange) { clustersMarkers.add( GaoDeClusterMarkerView( - requireContext(), - it, - proj, - LocaleConstant.RADIUS_SIZE + requireContext(), it, proj, LocaleConstant.RADIUS_SIZE ) )//相距多少才聚合 } @@ -363,9 +372,7 @@ //绑定数据 val clickedLatLng = marker?.position!! for (device in deviceModels) { - if (clickedLatLng.latitude == device.latGaode!!.toDouble() - && clickedLatLng.longitude == device.lngGaode!!.toDouble() - ) { + if (clickedLatLng.latitude == device.latGaode!!.toDouble() && clickedLatLng.longitude == device.lngGaode!!.toDouble()) { deviceCodeView.text = String.format("设备编号: ${device.devcode}") deviceModelView.text = String.format("设备模型: ${device.modelName}") //获取设备最新浓度信息 @@ -395,8 +402,7 @@ val address = result?.regeocodeAddress?.formatAddress val temp = StringBuilder() if (address!!.length > 16) { - temp.append(address.substring(0, 14)) - .append("\r\n") + temp.append(address.substring(0, 14)).append("\r\n") .append(address.substring(16)) } else { temp.append(address) @@ -430,9 +436,7 @@ } } //查看聚合点,单独开页面导航过去 - BottomActionSheet.Builder() - .setContext(requireContext()) - .setActionItemTitle(multiDevice) + BottomActionSheet.Builder().setContext(requireContext()).setActionItemTitle(multiDevice) .setItemTextColor(Color.BLUE) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { @@ -455,12 +459,8 @@ override fun onInfoWindowClick(p0: Marker?) { if (p0 != null) { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -487,16 +487,16 @@ 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 onDestroy() { super.onDestroy() - homeView.mapView.onDestroy() + binding.mapView.onDestroy() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt index a4e964c..cc35197 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt @@ -4,11 +4,15 @@ import android.content.Intent import android.net.Uri import android.os.Build +import android.os.Bundle import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider import com.casic.smarttube.BuildConfig import com.casic.smarttube.R +import com.casic.smarttube.databinding.FragmentMineBinding import com.casic.smarttube.extensions.appendDownloadUrl import com.casic.smarttube.model.UserDetailModel import com.casic.smarttube.utils.AuthenticationHelper @@ -36,22 +40,10 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.ChangePasswordDialog -import kotlinx.android.synthetic.main.fragment_mine.aboutUsLayout -import kotlinx.android.synthetic.main.fragment_mine.cacheSizeView -import kotlinx.android.synthetic.main.fragment_mine.changePwdLayout -import kotlinx.android.synthetic.main.fragment_mine.clearCacheLayout -import kotlinx.android.synthetic.main.fragment_mine.loginOutButton -import kotlinx.android.synthetic.main.fragment_mine.updateLogLayout -import kotlinx.android.synthetic.main.fragment_mine.updateUserButton -import kotlinx.android.synthetic.main.fragment_mine.updateVersionLayout -import kotlinx.android.synthetic.main.fragment_mine.userDeptView -import kotlinx.android.synthetic.main.fragment_mine.userImageView -import kotlinx.android.synthetic.main.fragment_mine.userNameView -import kotlinx.android.synthetic.main.fragment_mine.userPhoneView import java.io.File import java.nio.charset.StandardCharsets -class MinePageFragment : KotlinBaseFragment() { +class MinePageFragment : KotlinBaseFragment() { private val kTag = "MinePageFragment" private lateinit var userData: UserDetailModel.Data @@ -60,13 +52,17 @@ private lateinit var versionViewModel: VersionViewModel private lateinit var progressDialog: ProgressDialog - override fun initLayoutView(): Int = R.layout.fragment_mine + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentMineBinding { + return FragmentMineBinding.inflate(inflater, container, false) + } override fun setupTopBarLayout() { } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java] @@ -98,8 +94,7 @@ versionViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show( - requireActivity(), - "检查版本中,请稍后" + requireActivity(), "检查版本中,请稍后" ) else -> LoadingDialogHub.dismiss() @@ -108,49 +103,45 @@ } override fun initEvent() { - userImageView.setOnClickListener { + binding.userImageView.setOnClickListener { "尽情期待~".show(requireContext()) } - updateUserButton.setOnClickListener { + binding.updateUserButton.setOnClickListener { LoadingDialogHub.show(requireActivity(), "同步中,请稍后...") userViewModel.obtainUserDetail() } - changePwdLayout.setOnClickListener { - ChangePasswordDialog.Builder() - .setContext(requireContext()) + binding.changePwdLayout.setOnClickListener { + ChangePasswordDialog.Builder().setContext(requireContext()) .setOnDialogButtonClickListener(object : ChangePasswordDialog.OnDialogButtonClickListener { override fun onConfirmClick(oldPwd: String, newPwd: String) { - val publicKey = - RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! val oldPassKey = RSAUtils.encryptDataByPublicKey( - oldPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + oldPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) val newPassKey = RSAUtils.encryptDataByPublicKey( - newPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + newPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) userViewModel.changePassword(oldPassKey, newPassKey) } }).build().show() } - aboutUsLayout.setOnClickListener { + binding.aboutUsLayout.setOnClickListener { requireContext().navigatePageTo() } - updateVersionLayout.setOnClickListener { + binding.updateVersionLayout.setOnClickListener { versionViewModel.updateVersion() } - updateLogLayout.setOnClickListener { + binding.updateLogLayout.setOnClickListener { "尽情期待~".show(requireContext()) } - clearCacheLayout.setOnClickListener { + binding.clearCacheLayout.setOnClickListener { //删除缓存之后在设置缓存大小 LoadingDialogHub.show(requireActivity(), "清理中,请稍后") File(requireContext().cacheDir.path).deleteFile() @@ -161,18 +152,14 @@ override fun onFinish() { LoadingDialogHub.dismiss() - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() } }.start() } - loginOutButton.setOnClickListener { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("退出登录") - .setMessage("确定要退出吗?") - .setNegativeButton("取消") - .setPositiveButton("确定") + binding.loginOutButton.setOnClickListener { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("退出登录") + .setMessage("确定要退出吗?").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -203,13 +190,9 @@ if (BuildConfig.VERSION_NAME == it.version) { "已是最新版本,无需更新".show(requireContext()) } else { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("提示") - .setMessage("有新版本,是否更新?") - .setNegativeButton("稍后再说") - .setPositiveButton("立即下载") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(requireContext()).setTitle("提示") + .setMessage("有新版本,是否更新?").setNegativeButton("稍后再说") + .setPositiveButton("立即下载").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { downloadApk(it.downloadUrl) @@ -244,7 +227,7 @@ updateUserInfo() } //缓存 - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() super.onResume() } @@ -258,9 +241,9 @@ // R.color.mainThemeColor.convertColor(requireContext()) // ) // userImageView.setImageDrawable(roundDrawable) - userNameView.text = userData.name - userPhoneView.text = String.format("电话:${userData.phone}") - userDeptView.text = String.format("部门:${userData.deptName}") + binding.userNameView.text = userData.name + binding.userPhoneView.text = String.format("电话:${userData.phone}") + binding.userDeptView.text = String.format("部门:${userData.deptName}") } private fun downloadApk(url: String?) { @@ -275,7 +258,8 @@ * */ val downloadPath = url!!.appendDownloadUrl() //开始下载 - downloadPath.downloadFile(requireContext().createDownloadFileDir().toString(), + downloadPath.downloadFile( + requireContext().createDownloadFileDir().toString(), object : OnDownloadListener { override fun onDownloadStart(totalBytes: Long) { progressDialog.max = totalBytes.toInt() diff --git a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt index b009850..c0afcc5 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt @@ -1,8 +1,11 @@ package com.casic.smarttube.fragment +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R import com.casic.smarttube.adapter.OverviewGroupListAdapter +import com.casic.smarttube.databinding.FragmentOverviewBinding import com.casic.smarttube.extensions.showEmptyPage import com.casic.smarttube.model.ProjectGroupModel import com.casic.smarttube.view.GroupDeviceActivity @@ -11,25 +14,25 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.widget.dialog.AlertInputDialog -import kotlinx.android.synthetic.main.fragment_overview.groupRecyclerView -import kotlinx.android.synthetic.main.fragment_overview.rightOptionView -import kotlinx.android.synthetic.main.fragment_overview.titleView -import kotlinx.android.synthetic.main.include_empty_view.emptyView -class OverviewFragment : KotlinBaseFragment() { +class OverviewFragment : KotlinBaseFragment() { private lateinit var groupViewModel: ProjectGroupViewModel private var dataBeans: MutableList = ArrayList() private lateinit var groupListAdapter: OverviewGroupListAdapter private var clickedPosition = 0 - override fun initLayoutView(): Int = R.layout.fragment_overview - - override fun setupTopBarLayout() { - titleView.text = "概览" + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentOverviewBinding { + return FragmentOverviewBinding.inflate(inflater, container, false) } - override fun initData() { + override fun setupTopBarLayout() { + binding.titleView.text = "概览" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) } @@ -43,7 +46,7 @@ } override fun initEvent() { - rightOptionView.setOnClickListener { + binding.rightOptionView.setOnClickListener { groupViewModel.obtainProGroupList() "刷新数据中,请稍后".show(requireContext()) } @@ -51,16 +54,16 @@ groupViewModel.groupModel.observe(this) { if (it.code == 200) { if (it.data.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { groupViewModel.obtainProGroupList() } } else { - emptyView!!.hide() + binding.emptyInclude.emptyView.hide() dataBeans.clear() dataBeans = it.data groupListAdapter = OverviewGroupListAdapter(requireContext(), it.data) - groupRecyclerView!!.adapter = groupListAdapter + binding.groupRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : OverviewGroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { diff --git a/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt b/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt index e424721..7f036b0 100644 --- a/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt +++ b/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt @@ -4,8 +4,8 @@ import android.graphics.Color import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.Poi -import com.pengxh.kt.lite.extensions.showBusRouteOnMap -import com.pengxh.kt.lite.extensions.showRouteOnMap +import com.casic.smarttube.extensions.showBusRouteOnMap +import com.casic.smarttube.extensions.showRouteOnMap import com.pengxh.kt.lite.widget.dialog.BottomActionSheet object RouteOnMap { diff --git a/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt b/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt index 65bba6f..598581a 100644 --- a/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt @@ -1,27 +1,29 @@ package com.casic.smarttube.view +import android.os.Bundle import com.casic.smarttube.BuildConfig import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityAboutUsBinding import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_about_us.* -import kotlinx.android.synthetic.main.include_base_title.* -class AboutUsActivity : KotlinBaseActivity() { +class AboutUsActivity : KotlinBaseActivity() { - override fun initLayoutView(): Int = R.layout.activity_about_us + override fun initViewBinding(): ActivityAboutUsBinding { + return ActivityAboutUsBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "关于我们" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "关于我们" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { - versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + override fun initOnCreate(savedInstanceState: Bundle?) { + binding.versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") } override fun observeRequestState() { diff --git a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt index 415f9dd..80b83bd 100644 --- a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.content.Intent import android.graphics.Color +import android.os.Bundle import android.os.CountDownTimer import android.os.Handler import android.text.Editable @@ -15,6 +16,7 @@ import com.amap.api.location.AMapLocation import com.casic.smarttube.R import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.smarttube.databinding.ActivityAddDeviceBinding import com.casic.smarttube.extensions.combineImagePath import com.casic.smarttube.extensions.compressImage import com.casic.smarttube.extensions.isNumber @@ -47,24 +49,9 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_add_device.addDeviceTimeView -import kotlinx.android.synthetic.main.activity_add_device.addImageRecyclerView -import kotlinx.android.synthetic.main.activity_add_device.collectIntervalView -import kotlinx.android.synthetic.main.activity_add_device.deviceCodeView -import kotlinx.android.synthetic.main.activity_add_device.deviceNameView -import kotlinx.android.synthetic.main.activity_add_device.inputLengthView -import kotlinx.android.synthetic.main.activity_add_device.latitudeView -import kotlinx.android.synthetic.main.activity_add_device.locationImageView -import kotlinx.android.synthetic.main.activity_add_device.longitudeView -import kotlinx.android.synthetic.main.activity_add_device.ownerShipView -import kotlinx.android.synthetic.main.activity_add_device.scannerView -import kotlinx.android.synthetic.main.activity_add_device.sceneEditView -import kotlinx.android.synthetic.main.activity_add_device.submitButton -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView import java.io.File -class AddDeviceActivity : KotlinBaseActivity() { +class AddDeviceActivity : KotlinBaseActivity() { private val kTag = "AddDeviceActivity" private lateinit var imageAdapter: EditableImageAdapter @@ -81,21 +68,23 @@ registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK) { val data = result.data!! - longitudeView.text = data.getStringExtra("longitude") - latitudeView.text = data.getStringExtra("latitude") + binding.longitudeView.text = data.getStringExtra("longitude") + binding.latitudeView.text = data.getStringExtra("latitude") } } - override fun initLayoutView(): Int = R.layout.activity_add_device + override fun initViewBinding(): ActivityAddDeviceBinding { + return ActivityAddDeviceBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "添加设备" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "添加设备" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { weakReferenceHandler = WeakReferenceHandler(callback) uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] @@ -119,17 +108,17 @@ override fun initEvent() { val manager = QrManager.getInstance().init(QrConfigCreator.create(this)) - scannerView.setOnClickListener { + binding.scannerView.setOnClickListener { manager.startScan(this) { if (it.content.isNumber()) { - deviceCodeView.setText(it.content) + binding.deviceCodeView.setText(it.content) } else { "设备编号错误,请检查标签".show(context) } } } - ownerShipView.setOnClickListener { + binding.ownerShipView.setOnClickListener { groupViewModel.obtainGroupList() } groupViewModel.groupListModel.observe(this) { @@ -147,19 +136,14 @@ groups.add("自定义") } if (groups.isNotEmpty()) { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(groups) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { if (groups[position] == "自定义") { - AlertInputDialog.Builder() - .setContext(context) - .setTitle("提示") + AlertInputDialog.Builder().setContext(context).setTitle("提示") .setHintMessage("请输入该设备所属项目名,如:项目203") - .setNegativeButton("取消") - .setPositiveButton("确定") + .setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertInputDialog.OnDialogButtonClickListener { override fun onCancelClick() { @@ -167,12 +151,11 @@ } override fun onConfirmClick(value: String) { - ownerShipView.text = value + binding.ownerShipView.text = value } - }) - .build().show() + }).build().show() } else { - ownerShipView.text = groups[position] + binding.ownerShipView.text = groups[position] } } }).build().show() @@ -180,27 +163,22 @@ } //默认频率1min - collectIntervalView.text = frequency[0] - collectIntervalView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + binding.collectIntervalView.text = frequency[0] + binding.collectIntervalView.setOnClickListener { + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(frequency) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { - collectIntervalView.text = frequency[position] + binding.collectIntervalView.text = frequency[position] } }).build().show() } - locationImageView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(context) - .setItemTextColor(Color.BLUE) + binding.locationImageView.setOnClickListener { + BottomActionSheet.Builder().setContext(context).setItemTextColor(Color.BLUE) .setActionItemTitle(arrayListOf("自动定位", "手动选点")) - .setOnActionSheetListener(object : - BottomActionSheet.OnActionSheetListener { + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { when (position) { 0 -> { @@ -210,30 +188,32 @@ override fun onAMapLocationGet(aMapLocation: AMapLocation?) { LoadingDialogHub.dismiss() if (aMapLocation == null) { - longitudeView.text = "定位失败" - latitudeView.text = "定位失败" + binding.longitudeView.text = "定位失败" + binding.latitudeView.text = "定位失败" - longitudeView.setTextColor( + binding.longitudeView.setTextColor( R.color.redTextColor.convertColor(context) ) - latitudeView.setTextColor( + binding.latitudeView.setTextColor( R.color.redTextColor.convertColor(context) ) } else { - longitudeView.text = + binding.longitudeView.text = aMapLocation.longitude.toString() - latitudeView.text = aMapLocation.latitude.toString() + binding.latitudeView.text = + aMapLocation.latitude.toString() - longitudeView.setTextColor( + binding.longitudeView.setTextColor( R.color.mainTextColor.convertColor(context) ) - latitudeView.setTextColor( + binding.latitudeView.setTextColor( R.color.mainTextColor.convertColor(context) ) } } }) } + 1 -> selectLocationLauncher.launch( Intent(context, SelectLocationActivity::class.java) ) @@ -243,7 +223,7 @@ } imageAdapter = EditableImageAdapter(this, 3, 13f) - addImageRecyclerView.adapter = imageAdapter + binding.addImageRecyclerView.adapter = imageAdapter imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { selectPicture() @@ -281,7 +261,7 @@ } } - sceneEditView.addTextChangedListener(object : TextWatcher { + binding.sceneEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { } @@ -292,31 +272,31 @@ override fun afterTextChanged(s: Editable?) { val text = s.toString().trim() - inputLengthView.text = String.format("${text.length}/100") + binding.inputLengthView.text = String.format("${text.length}/100") if (text.length > 100) { - inputLengthView.setTextColor(R.color.redTextColor.convertColor(context)) + binding.inputLengthView.setTextColor(R.color.redTextColor.convertColor(context)) "现场情况字符不能超过100个字符".show(context) } else { - inputLengthView.setTextColor(R.color.subTextColor.convertColor(context)) + binding.inputLengthView.setTextColor(R.color.subTextColor.convertColor(context)) } } }) - addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() + binding.addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() - submitButton.setOnClickListener { - val deviceCode = deviceCodeView.text.toString().trim() + binding.submitButton.setOnClickListener { + val deviceCode = binding.deviceCodeView.text.toString().trim() if (deviceCode.isBlank()) { "请输入设备编号".show(context) return@setOnClickListener } - val ownerShip = ownerShipView.text.toString().trim() + val ownerShip = binding.ownerShipView.text.toString().trim() if (ownerShip.isBlank()) { "请输入设备所属项目".show(context) return@setOnClickListener } - val longitude = longitudeView.text.toString().trim() - val latitude = latitudeView.text.toString().trim() + val longitude = binding.longitudeView.text.toString().trim() + val latitude = binding.latitudeView.text.toString().trim() if (longitude.isBlank() || latitude.isBlank()) { "请先获取当前经纬度".show(context) return@setOnClickListener @@ -329,14 +309,14 @@ ) deviceViewModel.addDevice( deviceCode, - deviceNameView.text.toString(), + binding.deviceNameView.text.toString(), ownerShip, - collectIntervalView.text.toString(), + binding.collectIntervalView.text.toString(), longitude, latitude, imagePaths.reformat(), - sceneEditView.text.toString().trim(), - addDeviceTimeView.text.toString(), + binding.sceneEditView.text.toString().trim(), + binding.addDeviceTimeView.text.toString(), userData.id.toString(), userData.deptId ) @@ -345,16 +325,13 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(listOf("拍照", "相册")) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { when (position) { 0 -> { - PictureSelector.create(context) - .openCamera(SelectMimeType.ofImage()) + PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { if (result == null) { @@ -362,8 +339,7 @@ return } LoadingDialogHub.show( - this@AddDeviceActivity, - "图片上传中,请稍后..." + this@AddDeviceActivity, "图片上传中,请稍后..." ) selectedImages = result analyticalSelectResults(result[0]) @@ -374,14 +350,11 @@ } }) } + 1 -> { - PictureSelector.create(context) - .openGallery(SelectMimeType.ofImage()) - .isGif(false) - .isMaxSelectEnabledMask(true) - .setFilterMinFileSize(100) - .setMaxSelectNum(3) - .isDisplayCamera(false) + PictureSelector.create(context).openGallery(SelectMimeType.ofImage()) + .isGif(false).isMaxSelectEnabledMask(true).setFilterMinFileSize(100) + .setMaxSelectNum(3).isDisplayCamera(false) .setImageEngine(GlideLoadEngine.instance) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { @@ -390,8 +363,7 @@ return } LoadingDialogHub.show( - this@AddDeviceActivity, - "图片上传中,请稍后..." + this@AddDeviceActivity, "图片上传中,请稍后..." ) selectedImages = result // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 diff --git a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt index 3864f16..e4f19a4 100644 --- a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.content.Context +import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,19 +11,20 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityBigImageBinding import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager -import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : KotlinBaseActivity() { +class BigImageActivity : KotlinBaseActivity() { - override fun initLayoutView(): Int = R.layout.activity_big_image + override fun initViewBinding(): ActivityBigImageBinding { + return ActivityBigImageBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { PageNavigationManager.addActivity(this) @@ -30,16 +32,16 @@ ImmersionBar.with(this).statusBarDarkFont(false).init() } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) val urls = intent.getStringArrayListExtra(Constant.BIG_IMAGE_INTENT_DATA_KEY) if (urls == null || urls.size == 0) { return } - pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") - imagePagerView.adapter = BigImageAdapter(this, urls) - imagePagerView.currentItem = index - imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + binding.pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + binding.imagePagerView.adapter = BigImageAdapter(this, urls) + binding.imagePagerView.currentItem = index + binding.imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrollStateChanged(state: Int) { } @@ -53,7 +55,8 @@ } override fun onPageSelected(position: Int) { - pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + binding.pageNumberView.text = + String.format("(" + (position + 1) + "/" + urls.size + ")") } }) } @@ -63,7 +66,7 @@ } override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } + binding.leftBackView.setOnClickListener { this.finish() } } class BigImageAdapter(private var context: Context, imageList: ArrayList) : diff --git a/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt b/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt index 072953f..f036a78 100644 --- a/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.graphics.Color +import android.os.Bundle import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -10,6 +11,7 @@ import com.amap.api.services.geocoder.RegeocodeQuery import com.amap.api.services.geocoder.RegeocodeResult import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityDeviceDetailBinding import com.casic.smarttube.extensions.combineImagePath import com.casic.smarttube.extensions.toSignalImage import com.casic.smarttube.model.DeviceDetailModel @@ -25,51 +27,39 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState -import kotlinx.android.synthetic.main.activity_device_detail.densityView -import kotlinx.android.synthetic.main.activity_device_detail.descriptionView -import kotlinx.android.synthetic.main.activity_device_detail.deviceBatteryView -import kotlinx.android.synthetic.main.activity_device_detail.deviceCodeView -import kotlinx.android.synthetic.main.activity_device_detail.deviceNameView -import kotlinx.android.synthetic.main.activity_device_detail.deviceStateView -import kotlinx.android.synthetic.main.activity_device_detail.imageGridView -import kotlinx.android.synthetic.main.activity_device_detail.lastDataView -import kotlinx.android.synthetic.main.activity_device_detail.leftBackView -import kotlinx.android.synthetic.main.activity_device_detail.locationView -import kotlinx.android.synthetic.main.activity_device_detail.projectGroupView -import kotlinx.android.synthetic.main.activity_device_detail.rightOptionView -import kotlinx.android.synthetic.main.activity_device_detail.signalImageView -import kotlinx.android.synthetic.main.activity_device_detail.titleView -class DeviceDetailActivity : KotlinBaseActivity() { +class DeviceDetailActivity : KotlinBaseActivity() { private val kTag = "DeviceDetailActivity" private lateinit var deviceViewModel: DeviceViewModel private lateinit var deviceModel: DeviceDetailModel.DataModel private val geocoderSearch by lazy { GeocodeSearch(this) } - override fun initLayoutView(): Int = R.layout.activity_device_detail + override fun initViewBinding(): ActivityDeviceDetailBinding { + return ActivityDeviceDetailBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "设备详情" - leftBackView.setOnClickListener { finish() } + binding.titleView.text = "设备详情" + binding.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! - deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] deviceViewModel.obtainDeviceDetail(params[0], params[1]) deviceViewModel.deviceDetailModel.observe(this) { if (it.code == 200) { val device = it.data this.deviceModel = device - deviceCodeView.text = device.devcode - deviceNameView.text = device.deviceName - projectGroupView.text = String.format("项目${device.groupId}") + binding.deviceCodeView.text = device.devcode + binding.deviceNameView.text = device.deviceName + binding.projectGroupView.text = String.format("项目${device.groupId}") if (device.latGaode.isBlank() || device.lngGaode.isBlank()) { - locationView.text = "经纬度异常,无法查看具体位置" + binding.locationView.text = "经纬度异常,无法查看具体位置" } else { val queryParam = RegeocodeQuery( LatLonPoint(device.latGaode.toDouble(), device.lngGaode.toDouble()), @@ -81,7 +71,7 @@ GeocodeSearch.OnGeocodeSearchListener { override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { if (rCode == 1000) { - locationView.text = result?.regeocodeAddress?.formatAddress + binding.locationView.text = result?.regeocodeAddress?.formatAddress } } @@ -90,12 +80,12 @@ } }) } - descriptionView.text = device.descn + binding.descriptionView.text = device.descn if (device.photos.toString().isBlank()) { - imageGridView.visibility = View.GONE + binding.imageGridView.visibility = View.GONE } else { - imageGridView.visibility = View.VISIBLE + binding.imageGridView.visibility = View.VISIBLE //处理图片地址 val urls: ArrayList = ArrayList() val imageArray = device.photos.toString().split(",") @@ -104,10 +94,9 @@ urls.add(path.combineImagePath()) } } - val imageAdapter = ReadOnlyImageAdapter(this) - imageAdapter.setImageList(urls) - imageGridView.adapter = imageAdapter - imageGridView.setOnItemClickListener { _, _, position, _ -> + val imageAdapter = ReadOnlyImageAdapter(this, urls) + binding.imageGridView.adapter = imageAdapter + binding.imageGridView.setOnItemClickListener { _, _, position, _ -> if (urls[position].isEmpty()) { "图片加载失败,无法查看大图".show(this) } else { @@ -119,18 +108,18 @@ val value = device.stregnth.toDouble().toInt() val level = "$value%" val ppm = "${value * 500}ppm" - densityView.text = "$level(相当于$ppm)" + binding.densityView.text = "$level(相当于$ppm)" - lastDataView.text = device.uptime + binding.lastDataView.text = device.uptime if (device.onlineState == "0") { - deviceStateView.text = "离线" - deviceStateView.setTextColor(Color.RED) + binding.deviceStateView.text = "离线" + binding.deviceStateView.setTextColor(Color.RED) } else { - deviceStateView.text = "在线" - deviceStateView.setTextColor(Color.GREEN) + binding.deviceStateView.text = "在线" + binding.deviceStateView.setTextColor(Color.GREEN) } - signalImageView.setBackgroundResource(device.rsrp.toSignalImage()) - deviceBatteryView.text = if (device.cell.isNullOrBlank()) { + binding.signalImageView.setBackgroundResource(device.rsrp.toSignalImage()) + binding.deviceBatteryView.text = if (device.cell.isNullOrBlank()) { "0%" } else { device.cell + "%" @@ -149,7 +138,7 @@ } override fun initEvent() { - rightOptionView.setOnClickListener { + binding.rightOptionView.setOnClickListener { val lat = deviceModel.latGaode.toString() val lng = deviceModel.lngGaode.toString() if (lat.isBlank() || lng.isBlank()) { diff --git a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt index 0ae8862..ba52ab8 100644 --- a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.content.Context +import android.os.Bundle import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -8,6 +9,7 @@ import androidx.recyclerview.widget.RecyclerView import com.casic.smarttube.R import com.casic.smarttube.adapter.DeviceListAdapter +import com.casic.smarttube.databinding.ActivityGroupDeviceBinding import com.casic.smarttube.extensions.showEmptyPage import com.casic.smarttube.model.DeviceListModel import com.casic.smarttube.utils.LoadingDialogHub @@ -28,14 +30,8 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.qmuiteam.qmui.recyclerView.QMUIRVItemSwipeAction import com.qmuiteam.qmui.recyclerView.QMUISwipeAction -import kotlinx.android.synthetic.main.activity_group_device.groupDeviceLayout -import kotlinx.android.synthetic.main.activity_group_device.groupDeviceView -import kotlinx.android.synthetic.main.activity_group_device.leftBackView -import kotlinx.android.synthetic.main.activity_group_device.rightOptionView -import kotlinx.android.synthetic.main.activity_group_device.titleView -import kotlinx.android.synthetic.main.include_empty_view.emptyView -class GroupDeviceActivity : KotlinBaseActivity() { +class GroupDeviceActivity : KotlinBaseActivity() { private lateinit var groupId: String private lateinit var weakReferenceHandler: WeakReferenceHandler @@ -51,18 +47,19 @@ private var clickedPosition = 0 private var isDeleteAll = false - override fun initLayoutView(): Int = R.layout.activity_group_device + override fun initViewBinding(): ActivityGroupDeviceBinding { + return ActivityGroupDeviceBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - leftBackView.setOnClickListener { finish() } - rightOptionView.setOnClickListener { + binding.leftBackView.setOnClickListener { finish() } + binding.rightOptionView.setOnClickListener { //改为Popup val easyPopupWindow = EasyPopupWindow(this) easyPopupWindow.setPopupMenuItem( - LocaleConstant.DEVICE_OPERATE_IMAGES, - LocaleConstant.DEVICE_OPERATE_TITLES + LocaleConstant.DEVICE_OPERATE_IMAGES, LocaleConstant.DEVICE_OPERATE_TITLES ) easyPopupWindow.setOnPopupWindowClickListener(object : EasyPopupWindow.OnPopupWindowClickListener { @@ -77,13 +74,11 @@ pageIndex = 1 obtainDeviceListByPage() } + 1 -> { - AlertControlDialog.Builder() - .setContext(context) - .setTitle("提示") + AlertControlDialog.Builder().setContext(context).setTitle("提示") .setMessage("删除后将无法恢复,是否继续?") - .setNegativeButton("容我想想") - .setPositiveButton("已经想好") + .setNegativeButton("容我想想").setPositiveButton("已经想好") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onCancelClick() { @@ -103,13 +98,11 @@ } }).build().show() } + 2 -> { - MultiSelectDialog.Builder() - .setContext(this@GroupDeviceActivity) - .setTitle("选择设备") - .setDataSource(dataBeans) - .setNegativeButton("取消") - .setPositiveButton("选好了") + MultiSelectDialog.Builder().setContext(this@GroupDeviceActivity) + .setTitle("选择设备").setDataSource(dataBeans) + .setNegativeButton("取消").setPositiveButton("选好了") .setOnDialogButtonClickListener(object : MultiSelectDialog.OnDialogButtonClickListener { override fun onConfirmClick(selectedModels: MutableList) { @@ -126,21 +119,20 @@ override fun onCancelClick() { } - }) - .build().show() + }).build().show() } } } }) easyPopupWindow.setBackgroundDrawable(null) - val x: Int = rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(rightOptionView, x, 0) + val x: Int = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { groupId = intent.getStringExtra(Constant.INTENT_PARAM)!! - titleView.text = String.format(groupId + "项目设备列表") + binding.titleView.text = String.format(groupId + "项目设备列表") weakReferenceHandler = WeakReferenceHandler(callback) groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java] deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] @@ -157,13 +149,13 @@ } override fun initEvent() { - groupDeviceLayout.setOnRefreshListener { + binding.groupDeviceLayout.setOnRefreshListener { isRefresh = true //刷新之后页码重置 pageIndex = 1 obtainDeviceListByPage() } - groupDeviceLayout.setOnLoadMoreListener { + binding.groupDeviceLayout.setOnLoadMoreListener { isLoadMore = true pageIndex++ obtainDeviceListByPage() @@ -176,7 +168,7 @@ isRefresh -> { dataBeans.clear() dataBeans = dataRows!! - groupDeviceLayout.finishRefresh() + binding.groupDeviceLayout.finishRefresh() isRefresh = false } @@ -185,7 +177,7 @@ "到底了,别拉了".show(this) } dataBeans.addAll(dataRows!!) - groupDeviceLayout.finishLoadMore() + binding.groupDeviceLayout.finishLoadMore() isLoadMore = false } @@ -211,7 +203,7 @@ ) } if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { pageIndex = 1 obtainDeviceListByPage() } @@ -230,15 +222,15 @@ deviceAdapter.notifyDataSetChanged() } else { if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { pageIndex = 1 obtainDeviceListByPage() } } else { - emptyView!!.hide() + binding.emptyInclude.emptyView.hide() deviceAdapter = DeviceListAdapter(this, dataBeans) //绑定侧滑事件 - swipeAction.attachToRecyclerView(groupDeviceView) + swipeAction.attachToRecyclerView(binding.groupDeviceView) val linearLayoutManager = object : LinearLayoutManager(this) { override fun generateDefaultLayoutParams(): RecyclerView.LayoutParams { return RecyclerView.LayoutParams( @@ -247,8 +239,8 @@ ) } } - groupDeviceView.layoutManager = linearLayoutManager - groupDeviceView.adapter = deviceAdapter + binding.groupDeviceView.layoutManager = linearLayoutManager + binding.groupDeviceView.adapter = deviceAdapter deviceAdapter.setOnItemClickListener(object : DeviceListAdapter.OnItemClickListener { override fun onClicked(position: Int) { @@ -311,13 +303,9 @@ }) private fun deleteItem(adapterPosition: Int) { - AlertControlDialog.Builder() - .setContext(this) - .setTitle("提示") - .setMessage("删除后将无法恢复,是否继续?") - .setNegativeButton("容我想想") - .setPositiveButton("已经想好") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(this).setTitle("提示") + .setMessage("删除后将无法恢复,是否继续?").setNegativeButton("容我想想") + .setPositiveButton("已经想好").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onCancelClick() { diff --git a/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt b/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt index 71f438c..70e49f0 100644 --- a/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt @@ -1,9 +1,11 @@ package com.casic.smarttube.view +import android.os.Bundle import android.view.View import android.widget.AdapterView import androidx.lifecycle.ViewModelProvider import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityHistoryDataBinding import com.casic.smarttube.extensions.dateToMonthDay import com.casic.smarttube.extensions.getQuarterOfYear import com.casic.smarttube.utils.ChartViewHelper @@ -22,27 +24,26 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState -import kotlinx.android.synthetic.main.activity_history_data.dataLineChart -import kotlinx.android.synthetic.main.activity_history_data.leftBackView -import kotlinx.android.synthetic.main.activity_history_data.periodSpinner import java.util.Calendar -class HistoryDataActivity : KotlinBaseActivity() { +class HistoryDataActivity : KotlinBaseActivity() { private val kTag = "HistoryDataActivity" private lateinit var deviceViewModel: DeviceViewModel private lateinit var groupId: String private lateinit var devCode: String - override fun initLayoutView(): Int = R.layout.activity_history_data + override fun initViewBinding(): ActivityHistoryDataBinding { + return ActivityHistoryDataBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - leftBackView.setOnClickListener { finish() } + binding.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! groupId = params[0] devCode = params[1] @@ -61,8 +62,8 @@ override fun initEvent() { //默认选择近7天的数据 - periodSpinner.setSelection(3) - periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + binding.periodSpinner.setSelection(3) + binding.periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onItemSelected( parent: AdapterView<*>?, view: View?, position: Int, id: Long ) { @@ -76,6 +77,7 @@ groupId, devCode, "$year-01-01", time.timestampToCompleteDate() ) } + 1 -> { //本季度 val startDate = when (time.getQuarterOfYear()) { @@ -89,6 +91,7 @@ groupId, devCode, startDate, time.timestampToCompleteDate() ) } + 2 -> { //近30日 deviceViewModel.obtainDeviceHistoryData( @@ -98,6 +101,7 @@ time.timestampToCompleteDate() ) } + 3 -> { //近7日 deviceViewModel.obtainDeviceHistoryData( @@ -107,19 +111,18 @@ time.timestampToCompleteDate() ) } + 4 -> { //今日 deviceViewModel.obtainDeviceHistoryData( groupId, devCode, time.timestampToDate(), time.timestampToCompleteDate() ) } + 5 -> { - DateSelectDialog.Builder() - .setContext(this@HistoryDataActivity) - .setTitle("选择日期") - .setNegativeButton("取消") - .setPositiveButton("选好了") - .setOnDialogButtonClickListener(object : + DateSelectDialog.Builder().setContext(this@HistoryDataActivity) + .setTitle("选择日期").setNegativeButton("取消") + .setPositiveButton("选好了").setOnDialogButtonClickListener(object : DateSelectDialog.OnDialogButtonClickListener { override fun onConfirmClick(startDate: String, endDate: String) { deviceViewModel.obtainDeviceHistoryData( @@ -129,12 +132,10 @@ override fun onCancelClick() { //选择取消就默认加载近7天的数据 - periodSpinner.setSelection(3) + binding.periodSpinner.setSelection(3) } - }) - .setFragmentManager(supportFragmentManager) - .setCalendarType(Type.YEAR_MONTH_DAY) - .build().show() + }).setFragmentManager(supportFragmentManager) + .setCalendarType(Type.YEAR_MONTH_DAY).build().show() } } } @@ -159,7 +160,9 @@ Entry(i.toFloat(), rowsBean.stregnth!!.toFloat(), "浓度") ) } - ChartViewHelper.setLineChartData(dataLineChart, xAxisLabels, strengthEntries) + ChartViewHelper.setLineChartData( + binding.dataLineChart, xAxisLabels, strengthEntries + ) } } } diff --git a/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt b/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt index ebca433..f947b2c 100644 --- a/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt @@ -1,7 +1,8 @@ package com.casic.smarttube.view +import android.os.Bundle import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityLoginBinding import com.casic.smarttube.utils.AuthenticationHelper import com.casic.smarttube.utils.LoadingDialogHub import com.casic.smarttube.utils.LocaleConstant @@ -14,26 +15,29 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues -import kotlinx.android.synthetic.main.activity_login.loginButton -import kotlinx.android.synthetic.main.activity_login.userNameView -import kotlinx.android.synthetic.main.activity_login.userPasswordView -class LoginActivity : KotlinBaseActivity() { +class LoginActivity : KotlinBaseActivity() { private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginViewModel: LoginViewModel private lateinit var userViewModel: UserViewModel - override fun initLayoutView(): Int = R.layout.activity_login + override fun initViewBinding(): ActivityLoginBinding { + return ActivityLoginBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(true).init() } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { // 设置默认账号密码 - userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) - userPasswordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + binding.userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + binding.userPasswordView.setText( + SaveKeyValues.getValue( + LocaleConstant.PASSWORD, "" + ) as String + ) authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] @@ -50,9 +54,9 @@ } override fun initEvent() { - loginButton.setOnClickListener { - val account = userNameView.text.toString().trim() - val userPassword = userPasswordView.text.toString().trim() + binding.loginButton.setOnClickListener { + val account = binding.userNameView.text.toString().trim() + val userPassword = binding.userPasswordView.text.toString().trim() if (account.isBlank()) { "用户名不能为空".show(this) return@setOnClickListener @@ -74,8 +78,8 @@ AuthenticationHelper.savePublicKey(keyString) val publicKey = RSAUtils.keyStrToPublicKey(keyString) - val account = userNameView.text.toString() - val userPassword = userPasswordView.text.toString() + val account = binding.userNameView.text.toString() + val userPassword = binding.userPasswordView.text.toString() val dataByPublicKey = RSAUtils.encryptDataByPublicKey(userPassword.toByteArray(), publicKey!!) //登录并获取Token,POST请求 diff --git a/app/src/main/java/com/casic/smarttube/view/MainActivity.kt b/app/src/main/java/com/casic/smarttube/view/MainActivity.kt index 4461757..575e1ee 100644 --- a/app/src/main/java/com/casic/smarttube/view/MainActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/MainActivity.kt @@ -1,5 +1,6 @@ package com.casic.smarttube.view +import android.os.Bundle import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment @@ -7,6 +8,7 @@ import androidx.fragment.app.FragmentPagerAdapter import androidx.viewpager.widget.ViewPager import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityMainBinding import com.casic.smarttube.fragment.HomePageFragment import com.casic.smarttube.fragment.MinePageFragment import com.casic.smarttube.fragment.OverviewFragment @@ -15,9 +17,8 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_main.* -class MainActivity : KotlinBaseActivity() { +class MainActivity : KotlinBaseActivity() { private var menuItem: MenuItem? = null private var fragmentList: MutableList = ArrayList() @@ -29,32 +30,36 @@ fragmentList.add(MinePageFragment()) } - override fun initLayoutView(): Int = R.layout.activity_main + override fun initViewBinding(): ActivityMainBinding { + return ActivityMainBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { //保留icon原图颜色 - bottomNavigation.itemIconTintList = null - bottomNavigation.setOnItemSelectedListener { menuItem -> + binding.bottomNavigation.itemIconTintList = null + binding.bottomNavigation.setOnItemSelectedListener { menuItem -> when (menuItem.itemId) { R.id.nav_home -> { - mainViewPager.currentItem = 0 + binding.mainViewPager.currentItem = 0 } + R.id.nav_overview -> { - mainViewPager.currentItem = 1 + binding.mainViewPager.currentItem = 1 } + R.id.nav_mine -> { - mainViewPager.currentItem = 2 + binding.mainViewPager.currentItem = 2 } } false } - mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) - mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 + binding.mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + binding.mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun observeRequestState() { @@ -62,7 +67,7 @@ } override fun initEvent() { - mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + binding.mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrollStateChanged(state: Int) { } @@ -77,9 +82,9 @@ if (menuItem != null) { menuItem!!.isChecked = false } else { - bottomNavigation.menu.getItem(0).isChecked = false + binding.bottomNavigation.menu.getItem(0).isChecked = false } - menuItem = bottomNavigation.menu.getItem(position) + menuItem = binding.bottomNavigation.menu.getItem(position) menuItem!!.isChecked = true } }) diff --git a/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt b/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt index f00e0ca..908aade 100644 --- a/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt @@ -15,6 +15,7 @@ import com.amap.api.services.geocoder.RegeocodeQuery import com.amap.api.services.geocoder.RegeocodeResult import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityMapDeviceBriefBinding import com.casic.smarttube.utils.LoadingDialogHub import com.casic.smarttube.utils.RouteOnMap import com.casic.smarttube.vm.DeviceViewModel @@ -24,16 +25,8 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState -import kotlinx.android.synthetic.main.activity_map_device_brief.deviceCodeView -import kotlinx.android.synthetic.main.activity_map_device_brief.deviceModelView -import kotlinx.android.synthetic.main.activity_map_device_brief.deviceValueView -import kotlinx.android.synthetic.main.activity_map_device_brief.locationView -import kotlinx.android.synthetic.main.activity_map_device_brief.mapView -import kotlinx.android.synthetic.main.activity_map_device_brief.updateTimeView -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -class MapDeviceBriefActivity : KotlinBaseActivity() { +class MapDeviceBriefActivity : KotlinBaseActivity() { private val kTag = "MapDeviceBriefActivity" private lateinit var deviceViewModel: DeviceViewModel @@ -42,17 +35,19 @@ private val geocoderSearch by lazy { GeocodeSearch(this) } - override fun initLayoutView(): Int = R.layout.activity_map_device_brief + override fun initViewBinding(): ActivityMapDeviceBriefBinding { + return ActivityMapDeviceBriefBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "设备最新数据地图展示" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "设备最新数据地图展示" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { - aMap = mapView.map + override fun initOnCreate(savedInstanceState: Bundle?) { + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val uiSettings = aMap.uiSettings uiSettings.isCompassEnabled = true @@ -80,22 +75,22 @@ if (it.code == 200) { val device = it.data - deviceCodeView.text = String.format("设备编号: ${device.devcode}") - deviceModelView.text = String.format("设备模型: ${params[2]}") + binding.deviceCodeView.text = String.format("设备编号: ${device.devcode}") + binding.deviceModelView.text = String.format("设备模型: ${params[2]}") //获取设备最新浓度信息 deviceViewModel.obtainTubeLastData(device.groupId, device.devcode) deviceViewModel.lastDataModel.observe(this) { v -> if (v.code == 200) { - deviceValueView.text = String.format("最新浓度: ${v.data.strength}") - updateTimeView.text = String.format("更新时间: ${v.data.uptime}") + binding.deviceValueView.text = String.format("最新浓度: ${v.data.strength}") + binding.updateTimeView.text = String.format("更新时间: ${v.data.uptime}") } else { - deviceValueView.text = String.format("最新浓度: 未知") - updateTimeView.text = String.format("更新时间: 未知") + binding.deviceValueView.text = String.format("最新浓度: 未知") + binding.updateTimeView.text = String.format("更新时间: 未知") } } if (device.latGaode.isBlank() || device.lngGaode.isBlank()) { - locationView.text = "经纬度异常,无法查看具体位置" + binding.locationView.text = "经纬度异常,无法查看具体位置" } else { val queryParam = RegeocodeQuery( LatLonPoint(device.latGaode.toDouble(), device.lngGaode.toDouble()), @@ -108,7 +103,7 @@ GeocodeSearch.OnGeocodeSearchListener { override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { if (rCode == 1000) { - locationView.text = + binding.locationView.text = String.format("详细位置: ${result?.regeocodeAddress?.formatAddress}") } } @@ -123,8 +118,7 @@ aMap.animateCamera(newCameraPosition, 1500, object : AMap.CancelableCallback { override fun onFinish() { //添加Marker - val markerOptions = MarkerOptions() - .position(latLng) + val markerOptions = MarkerOptions().position(latLng) .icon(BitmapDescriptorFactory.fromResource(R.mipmap.well_location)) .draggable(false) aMap.addMarker(markerOptions) @@ -148,26 +142,26 @@ /**地图相关*********/ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - mapView.onCreate(savedInstanceState) + binding.mapView.onCreate(savedInstanceState) } override fun onResume() { super.onResume() - mapView.onResume() + binding.mapView.onResume() } override fun onPause() { super.onPause() - mapView.onPause() + binding.mapView.onPause() } override fun onDestroy() { - mapView.onDestroy() + binding.mapView.onDestroy() super.onDestroy() } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - mapView.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/view/PermissionActivity.kt b/app/src/main/java/com/casic/smarttube/view/PermissionActivity.kt index e872ef4..fc20978 100644 --- a/app/src/main/java/com/casic/smarttube/view/PermissionActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/PermissionActivity.kt @@ -13,7 +13,6 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。 if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) { startSplashScreenActivity() } else { diff --git a/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt b/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt index c639105..bb0b0ed 100644 --- a/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt @@ -13,33 +13,35 @@ import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.MyLocationStyle import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivitySelectLocationBinding import com.casic.smarttube.utils.CenterMarkerView import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_select_location.* -class SelectLocationActivity : KotlinBaseActivity(), AMap.OnMyLocationChangeListener, - OnMapLoadedListener, OnCameraChangeListener { +class SelectLocationActivity : KotlinBaseActivity(), + AMap.OnMyLocationChangeListener, OnMapLoadedListener, OnCameraChangeListener { private val kTag = "SelectLocationActivity" private lateinit var latLng: LatLng private lateinit var aMap: AMap private lateinit var centerMarkerView: CenterMarkerView - override fun initLayoutView(): Int = R.layout.activity_select_location + override fun initViewBinding(): ActivitySelectLocationBinding { + return ActivitySelectLocationBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "手动选点" - leftBackView.setOnClickListener { finish() } + binding.titleView.text = "手动选点" + binding.leftBackView.setOnClickListener { finish() } } - override fun initData() { - aMap = mapView.map + override fun initOnCreate(savedInstanceState: Bundle?) { + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val locationStyle = MyLocationStyle() //定位一次,且将视角移动到地图中心点 @@ -76,7 +78,7 @@ aMap.setOnMapLoadedListener(this) aMap.setOnCameraChangeListener(this) - rightOperateView.setOnClickListener { + binding.rightOperateView.setOnClickListener { val intent = Intent() intent.putExtra("longitude", latLng.longitude.toString()) intent.putExtra("latitude", latLng.latitude.toString()) @@ -110,27 +112,27 @@ /**地图相关*********/ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - mapView.onCreate(savedInstanceState) + binding.mapView.onCreate(savedInstanceState) } override fun onResume() { super.onResume() - mapView.onResume() + binding.mapView.onResume() } override fun onPause() { super.onPause() - mapView.onPause() + binding.mapView.onPause() } override fun onDestroy() { centerMarkerView.destroy() - mapView.onDestroy() + binding.mapView.onDestroy() super.onDestroy() } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - mapView.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/smarttube/view/SplashScreenActivity.kt index dafbe4d..baf5222 100644 --- a/app/src/main/java/com/casic/smarttube/view/SplashScreenActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/SplashScreenActivity.kt @@ -1,16 +1,17 @@ package com.casic.smarttube.view import android.annotation.SuppressLint +import android.os.Bundle import android.os.CountDownTimer import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivitySplashBinding import com.casic.smarttube.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo @SuppressLint("CustomSplashScreen") -class SplashScreenActivity : KotlinBaseActivity() { +class SplashScreenActivity : KotlinBaseActivity() { private lateinit var userDetailViewModel: UserViewModel private val countDownTimer = object : CountDownTimer(1000, 500) { @@ -34,13 +35,15 @@ } } - override fun initLayoutView(): Int = R.layout.activity_splash + override fun initViewBinding(): ActivitySplashBinding { + return ActivitySplashBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { userDetailViewModel = ViewModelProvider(this).get(UserViewModel::class.java) } diff --git a/app/build.gradle b/app/build.gradle index 81dccf6..defbef7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,12 +2,11 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' android { signingConfigs { release { - storeFile file('/Users/a203/Desktop/AndroidProjects/CasicSmartTube/app/CasicSmartTube.jks') + storeFile file('CasicSmartTube.jks') storePassword '123456789' keyAlias 'key0' keyPassword '123456789' @@ -21,8 +20,6 @@ targetSdkVersion 33 versionCode 2 versionName "1.0.1" - - ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -47,6 +44,10 @@ } } + viewBinding { + enabled true + } + applicationVariants.configureEach { variant -> variant.outputs.configureEach { outputFileName = "GT_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" @@ -61,7 +62,7 @@ dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.5' implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.6.1' diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cccda6d..fd9277c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,7 +81,7 @@ + android:value="a6907c8bb931727374aa5fd500cda107" /> (), Handler.Callback, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { private val kTag = "HomePageFragment" private val geocoderSearch by lazy { GeocodeSearch(requireContext()) } - private lateinit var homeView: View private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var easyPopupWindow: EasyPopupWindow private lateinit var aMap: AMap private lateinit var deviceViewModel: DeviceViewModel private lateinit var groupViewModel: ProjectGroupViewModel @@ -83,34 +89,34 @@ * */ private var mapZooms = ArrayList() - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View { - homeView = inflater.inflate(R.layout.fragment_home, container, false) + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } - weakReferenceHandler = WeakReferenceHandler(callback) - val easyPopupWindow = EasyPopupWindow(requireContext()) - easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) - homeView.rightOptionView.setOnClickListener { - easyPopupWindow.setOnPopupWindowClickListener(object : - EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - easyPopupWindow.setBackgroundDrawable(null) - val x: Int = homeView.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(homeView.rightOptionView, x, 0) + override fun setupTopBarLayout() { + + } + + override fun observeRequestState() { + groupViewModel.loadState.observe(this) { state -> + when (state) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") + else -> LoadingDialogHub.dismiss() + } } + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + weakReferenceHandler = WeakReferenceHandler(this) + + easyPopupWindow = EasyPopupWindow(requireContext()) + easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) //初始化vm - deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) - groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) - - observeRequestState() + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java] //默认数据 groupViewModel.obtainProGroupList() @@ -119,12 +125,8 @@ mapZooms.add(13f) initMap(savedInstanceState) - homeView.addDeviceButton.setOnClickListener { - requireContext().navigatePageTo() - } - //数据监听 - deviceViewModel.mapDeviceModel.observe(this, { + deviceViewModel.mapDeviceModel.observe(this) { if (it.code == 200) { if (allMarkerOptions.isNotEmpty()) { allMarkerOptions.clear() @@ -149,10 +151,8 @@ longitudeList.add(longitude) //将所有设备信息转化缓存为Marker点 allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(device.devcode) - .snippet(device.modelName) + MarkerOptions().position(LatLng(latitude, longitude)) + .title(device.devcode).snippet(device.modelName) ) } } @@ -160,8 +160,8 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 13f) } - }) - groupViewModel.groupModel.observe(this, { + } + groupViewModel.groupModel.observe(this) { if (it.code == 200) { val dataRows = it.data when { @@ -170,14 +170,15 @@ dataBeans = dataRows!! isRefresh = false } + else -> { dataBeans = dataRows!! } } weakReferenceHandler.sendEmptyMessage(2022090201) } - }) - groupViewModel.groupDeviceModel.observe(this, { + } + groupViewModel.groupDeviceModel.observe(this) { if (it.code == 200) { val latitudeList: MutableList = ArrayList() val longitudeList: MutableList = ArrayList() @@ -199,22 +200,33 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 16f) } - }) - return homeView + } } - private fun observeRequestState() { - groupViewModel.loadState.observe(this, { state -> - when (state) { - LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") - else -> LoadingDialogHub.dismiss() - } - }) + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + easyPopupWindow.setOnPopupWindowClickListener(object : + EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + easyPopupWindow.setBackgroundDrawable(null) + val x: Int = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + binding.addDeviceButton.setOnClickListener { + requireContext().navigatePageTo() + } } override fun onResume() { super.onResume() - homeView.mapView.onResume() + binding.mapView.onResume() //获取所有设备数据 deviceViewModel.obtainMapDeviceList() @@ -222,16 +234,16 @@ groupViewModel.obtainProGroupList() } - private val callback = Handler.Callback { - if (it.what == 2022090201) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022090201) { if (isRefresh) { groupListAdapter.notifyDataSetChanged() } else { groupListAdapter = GroupListAdapter(requireContext(), dataBeans) - homeView.homeRecyclerView!!.addItemDecoration( + binding.homeRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - homeView.homeRecyclerView!!.adapter = groupListAdapter + binding.homeRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : GroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { @@ -241,12 +253,12 @@ }) } } - true + return true } private fun initMap(savedInstanceState: Bundle?) { - homeView.mapView.onCreate(savedInstanceState) - aMap = homeView.mapView.map + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val uiSettings = aMap.uiSettings uiSettings.isCompassEnabled = true @@ -322,10 +334,7 @@ if (!isInRange) { clustersMarkers.add( GaoDeClusterMarkerView( - requireContext(), - it, - proj, - LocaleConstant.RADIUS_SIZE + requireContext(), it, proj, LocaleConstant.RADIUS_SIZE ) )//相距多少才聚合 } @@ -363,9 +372,7 @@ //绑定数据 val clickedLatLng = marker?.position!! for (device in deviceModels) { - if (clickedLatLng.latitude == device.latGaode!!.toDouble() - && clickedLatLng.longitude == device.lngGaode!!.toDouble() - ) { + if (clickedLatLng.latitude == device.latGaode!!.toDouble() && clickedLatLng.longitude == device.lngGaode!!.toDouble()) { deviceCodeView.text = String.format("设备编号: ${device.devcode}") deviceModelView.text = String.format("设备模型: ${device.modelName}") //获取设备最新浓度信息 @@ -395,8 +402,7 @@ val address = result?.regeocodeAddress?.formatAddress val temp = StringBuilder() if (address!!.length > 16) { - temp.append(address.substring(0, 14)) - .append("\r\n") + temp.append(address.substring(0, 14)).append("\r\n") .append(address.substring(16)) } else { temp.append(address) @@ -430,9 +436,7 @@ } } //查看聚合点,单独开页面导航过去 - BottomActionSheet.Builder() - .setContext(requireContext()) - .setActionItemTitle(multiDevice) + BottomActionSheet.Builder().setContext(requireContext()).setActionItemTitle(multiDevice) .setItemTextColor(Color.BLUE) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { @@ -455,12 +459,8 @@ override fun onInfoWindowClick(p0: Marker?) { if (p0 != null) { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -487,16 +487,16 @@ 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 onDestroy() { super.onDestroy() - homeView.mapView.onDestroy() + binding.mapView.onDestroy() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt index a4e964c..cc35197 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt @@ -4,11 +4,15 @@ import android.content.Intent import android.net.Uri import android.os.Build +import android.os.Bundle import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider import com.casic.smarttube.BuildConfig import com.casic.smarttube.R +import com.casic.smarttube.databinding.FragmentMineBinding import com.casic.smarttube.extensions.appendDownloadUrl import com.casic.smarttube.model.UserDetailModel import com.casic.smarttube.utils.AuthenticationHelper @@ -36,22 +40,10 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.ChangePasswordDialog -import kotlinx.android.synthetic.main.fragment_mine.aboutUsLayout -import kotlinx.android.synthetic.main.fragment_mine.cacheSizeView -import kotlinx.android.synthetic.main.fragment_mine.changePwdLayout -import kotlinx.android.synthetic.main.fragment_mine.clearCacheLayout -import kotlinx.android.synthetic.main.fragment_mine.loginOutButton -import kotlinx.android.synthetic.main.fragment_mine.updateLogLayout -import kotlinx.android.synthetic.main.fragment_mine.updateUserButton -import kotlinx.android.synthetic.main.fragment_mine.updateVersionLayout -import kotlinx.android.synthetic.main.fragment_mine.userDeptView -import kotlinx.android.synthetic.main.fragment_mine.userImageView -import kotlinx.android.synthetic.main.fragment_mine.userNameView -import kotlinx.android.synthetic.main.fragment_mine.userPhoneView import java.io.File import java.nio.charset.StandardCharsets -class MinePageFragment : KotlinBaseFragment() { +class MinePageFragment : KotlinBaseFragment() { private val kTag = "MinePageFragment" private lateinit var userData: UserDetailModel.Data @@ -60,13 +52,17 @@ private lateinit var versionViewModel: VersionViewModel private lateinit var progressDialog: ProgressDialog - override fun initLayoutView(): Int = R.layout.fragment_mine + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentMineBinding { + return FragmentMineBinding.inflate(inflater, container, false) + } override fun setupTopBarLayout() { } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java] @@ -98,8 +94,7 @@ versionViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show( - requireActivity(), - "检查版本中,请稍后" + requireActivity(), "检查版本中,请稍后" ) else -> LoadingDialogHub.dismiss() @@ -108,49 +103,45 @@ } override fun initEvent() { - userImageView.setOnClickListener { + binding.userImageView.setOnClickListener { "尽情期待~".show(requireContext()) } - updateUserButton.setOnClickListener { + binding.updateUserButton.setOnClickListener { LoadingDialogHub.show(requireActivity(), "同步中,请稍后...") userViewModel.obtainUserDetail() } - changePwdLayout.setOnClickListener { - ChangePasswordDialog.Builder() - .setContext(requireContext()) + binding.changePwdLayout.setOnClickListener { + ChangePasswordDialog.Builder().setContext(requireContext()) .setOnDialogButtonClickListener(object : ChangePasswordDialog.OnDialogButtonClickListener { override fun onConfirmClick(oldPwd: String, newPwd: String) { - val publicKey = - RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! val oldPassKey = RSAUtils.encryptDataByPublicKey( - oldPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + oldPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) val newPassKey = RSAUtils.encryptDataByPublicKey( - newPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + newPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) userViewModel.changePassword(oldPassKey, newPassKey) } }).build().show() } - aboutUsLayout.setOnClickListener { + binding.aboutUsLayout.setOnClickListener { requireContext().navigatePageTo() } - updateVersionLayout.setOnClickListener { + binding.updateVersionLayout.setOnClickListener { versionViewModel.updateVersion() } - updateLogLayout.setOnClickListener { + binding.updateLogLayout.setOnClickListener { "尽情期待~".show(requireContext()) } - clearCacheLayout.setOnClickListener { + binding.clearCacheLayout.setOnClickListener { //删除缓存之后在设置缓存大小 LoadingDialogHub.show(requireActivity(), "清理中,请稍后") File(requireContext().cacheDir.path).deleteFile() @@ -161,18 +152,14 @@ override fun onFinish() { LoadingDialogHub.dismiss() - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() } }.start() } - loginOutButton.setOnClickListener { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("退出登录") - .setMessage("确定要退出吗?") - .setNegativeButton("取消") - .setPositiveButton("确定") + binding.loginOutButton.setOnClickListener { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("退出登录") + .setMessage("确定要退出吗?").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -203,13 +190,9 @@ if (BuildConfig.VERSION_NAME == it.version) { "已是最新版本,无需更新".show(requireContext()) } else { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("提示") - .setMessage("有新版本,是否更新?") - .setNegativeButton("稍后再说") - .setPositiveButton("立即下载") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(requireContext()).setTitle("提示") + .setMessage("有新版本,是否更新?").setNegativeButton("稍后再说") + .setPositiveButton("立即下载").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { downloadApk(it.downloadUrl) @@ -244,7 +227,7 @@ updateUserInfo() } //缓存 - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() super.onResume() } @@ -258,9 +241,9 @@ // R.color.mainThemeColor.convertColor(requireContext()) // ) // userImageView.setImageDrawable(roundDrawable) - userNameView.text = userData.name - userPhoneView.text = String.format("电话:${userData.phone}") - userDeptView.text = String.format("部门:${userData.deptName}") + binding.userNameView.text = userData.name + binding.userPhoneView.text = String.format("电话:${userData.phone}") + binding.userDeptView.text = String.format("部门:${userData.deptName}") } private fun downloadApk(url: String?) { @@ -275,7 +258,8 @@ * */ val downloadPath = url!!.appendDownloadUrl() //开始下载 - downloadPath.downloadFile(requireContext().createDownloadFileDir().toString(), + downloadPath.downloadFile( + requireContext().createDownloadFileDir().toString(), object : OnDownloadListener { override fun onDownloadStart(totalBytes: Long) { progressDialog.max = totalBytes.toInt() diff --git a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt index b009850..c0afcc5 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt @@ -1,8 +1,11 @@ package com.casic.smarttube.fragment +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R import com.casic.smarttube.adapter.OverviewGroupListAdapter +import com.casic.smarttube.databinding.FragmentOverviewBinding import com.casic.smarttube.extensions.showEmptyPage import com.casic.smarttube.model.ProjectGroupModel import com.casic.smarttube.view.GroupDeviceActivity @@ -11,25 +14,25 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.widget.dialog.AlertInputDialog -import kotlinx.android.synthetic.main.fragment_overview.groupRecyclerView -import kotlinx.android.synthetic.main.fragment_overview.rightOptionView -import kotlinx.android.synthetic.main.fragment_overview.titleView -import kotlinx.android.synthetic.main.include_empty_view.emptyView -class OverviewFragment : KotlinBaseFragment() { +class OverviewFragment : KotlinBaseFragment() { private lateinit var groupViewModel: ProjectGroupViewModel private var dataBeans: MutableList = ArrayList() private lateinit var groupListAdapter: OverviewGroupListAdapter private var clickedPosition = 0 - override fun initLayoutView(): Int = R.layout.fragment_overview - - override fun setupTopBarLayout() { - titleView.text = "概览" + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentOverviewBinding { + return FragmentOverviewBinding.inflate(inflater, container, false) } - override fun initData() { + override fun setupTopBarLayout() { + binding.titleView.text = "概览" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) } @@ -43,7 +46,7 @@ } override fun initEvent() { - rightOptionView.setOnClickListener { + binding.rightOptionView.setOnClickListener { groupViewModel.obtainProGroupList() "刷新数据中,请稍后".show(requireContext()) } @@ -51,16 +54,16 @@ groupViewModel.groupModel.observe(this) { if (it.code == 200) { if (it.data.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { groupViewModel.obtainProGroupList() } } else { - emptyView!!.hide() + binding.emptyInclude.emptyView.hide() dataBeans.clear() dataBeans = it.data groupListAdapter = OverviewGroupListAdapter(requireContext(), it.data) - groupRecyclerView!!.adapter = groupListAdapter + binding.groupRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : OverviewGroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { diff --git a/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt b/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt index e424721..7f036b0 100644 --- a/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt +++ b/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt @@ -4,8 +4,8 @@ import android.graphics.Color import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.Poi -import com.pengxh.kt.lite.extensions.showBusRouteOnMap -import com.pengxh.kt.lite.extensions.showRouteOnMap +import com.casic.smarttube.extensions.showBusRouteOnMap +import com.casic.smarttube.extensions.showRouteOnMap import com.pengxh.kt.lite.widget.dialog.BottomActionSheet object RouteOnMap { diff --git a/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt b/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt index 65bba6f..598581a 100644 --- a/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt @@ -1,27 +1,29 @@ package com.casic.smarttube.view +import android.os.Bundle import com.casic.smarttube.BuildConfig import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityAboutUsBinding import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_about_us.* -import kotlinx.android.synthetic.main.include_base_title.* -class AboutUsActivity : KotlinBaseActivity() { +class AboutUsActivity : KotlinBaseActivity() { - override fun initLayoutView(): Int = R.layout.activity_about_us + override fun initViewBinding(): ActivityAboutUsBinding { + return ActivityAboutUsBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "关于我们" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "关于我们" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { - versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + override fun initOnCreate(savedInstanceState: Bundle?) { + binding.versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") } override fun observeRequestState() { diff --git a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt index 415f9dd..80b83bd 100644 --- a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.content.Intent import android.graphics.Color +import android.os.Bundle import android.os.CountDownTimer import android.os.Handler import android.text.Editable @@ -15,6 +16,7 @@ import com.amap.api.location.AMapLocation import com.casic.smarttube.R import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.smarttube.databinding.ActivityAddDeviceBinding import com.casic.smarttube.extensions.combineImagePath import com.casic.smarttube.extensions.compressImage import com.casic.smarttube.extensions.isNumber @@ -47,24 +49,9 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_add_device.addDeviceTimeView -import kotlinx.android.synthetic.main.activity_add_device.addImageRecyclerView -import kotlinx.android.synthetic.main.activity_add_device.collectIntervalView -import kotlinx.android.synthetic.main.activity_add_device.deviceCodeView -import kotlinx.android.synthetic.main.activity_add_device.deviceNameView -import kotlinx.android.synthetic.main.activity_add_device.inputLengthView -import kotlinx.android.synthetic.main.activity_add_device.latitudeView -import kotlinx.android.synthetic.main.activity_add_device.locationImageView -import kotlinx.android.synthetic.main.activity_add_device.longitudeView -import kotlinx.android.synthetic.main.activity_add_device.ownerShipView -import kotlinx.android.synthetic.main.activity_add_device.scannerView -import kotlinx.android.synthetic.main.activity_add_device.sceneEditView -import kotlinx.android.synthetic.main.activity_add_device.submitButton -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView import java.io.File -class AddDeviceActivity : KotlinBaseActivity() { +class AddDeviceActivity : KotlinBaseActivity() { private val kTag = "AddDeviceActivity" private lateinit var imageAdapter: EditableImageAdapter @@ -81,21 +68,23 @@ registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK) { val data = result.data!! - longitudeView.text = data.getStringExtra("longitude") - latitudeView.text = data.getStringExtra("latitude") + binding.longitudeView.text = data.getStringExtra("longitude") + binding.latitudeView.text = data.getStringExtra("latitude") } } - override fun initLayoutView(): Int = R.layout.activity_add_device + override fun initViewBinding(): ActivityAddDeviceBinding { + return ActivityAddDeviceBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "添加设备" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "添加设备" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { weakReferenceHandler = WeakReferenceHandler(callback) uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] @@ -119,17 +108,17 @@ override fun initEvent() { val manager = QrManager.getInstance().init(QrConfigCreator.create(this)) - scannerView.setOnClickListener { + binding.scannerView.setOnClickListener { manager.startScan(this) { if (it.content.isNumber()) { - deviceCodeView.setText(it.content) + binding.deviceCodeView.setText(it.content) } else { "设备编号错误,请检查标签".show(context) } } } - ownerShipView.setOnClickListener { + binding.ownerShipView.setOnClickListener { groupViewModel.obtainGroupList() } groupViewModel.groupListModel.observe(this) { @@ -147,19 +136,14 @@ groups.add("自定义") } if (groups.isNotEmpty()) { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(groups) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { if (groups[position] == "自定义") { - AlertInputDialog.Builder() - .setContext(context) - .setTitle("提示") + AlertInputDialog.Builder().setContext(context).setTitle("提示") .setHintMessage("请输入该设备所属项目名,如:项目203") - .setNegativeButton("取消") - .setPositiveButton("确定") + .setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertInputDialog.OnDialogButtonClickListener { override fun onCancelClick() { @@ -167,12 +151,11 @@ } override fun onConfirmClick(value: String) { - ownerShipView.text = value + binding.ownerShipView.text = value } - }) - .build().show() + }).build().show() } else { - ownerShipView.text = groups[position] + binding.ownerShipView.text = groups[position] } } }).build().show() @@ -180,27 +163,22 @@ } //默认频率1min - collectIntervalView.text = frequency[0] - collectIntervalView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + binding.collectIntervalView.text = frequency[0] + binding.collectIntervalView.setOnClickListener { + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(frequency) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { - collectIntervalView.text = frequency[position] + binding.collectIntervalView.text = frequency[position] } }).build().show() } - locationImageView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(context) - .setItemTextColor(Color.BLUE) + binding.locationImageView.setOnClickListener { + BottomActionSheet.Builder().setContext(context).setItemTextColor(Color.BLUE) .setActionItemTitle(arrayListOf("自动定位", "手动选点")) - .setOnActionSheetListener(object : - BottomActionSheet.OnActionSheetListener { + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { when (position) { 0 -> { @@ -210,30 +188,32 @@ override fun onAMapLocationGet(aMapLocation: AMapLocation?) { LoadingDialogHub.dismiss() if (aMapLocation == null) { - longitudeView.text = "定位失败" - latitudeView.text = "定位失败" + binding.longitudeView.text = "定位失败" + binding.latitudeView.text = "定位失败" - longitudeView.setTextColor( + binding.longitudeView.setTextColor( R.color.redTextColor.convertColor(context) ) - latitudeView.setTextColor( + binding.latitudeView.setTextColor( R.color.redTextColor.convertColor(context) ) } else { - longitudeView.text = + binding.longitudeView.text = aMapLocation.longitude.toString() - latitudeView.text = aMapLocation.latitude.toString() + binding.latitudeView.text = + aMapLocation.latitude.toString() - longitudeView.setTextColor( + binding.longitudeView.setTextColor( R.color.mainTextColor.convertColor(context) ) - latitudeView.setTextColor( + binding.latitudeView.setTextColor( R.color.mainTextColor.convertColor(context) ) } } }) } + 1 -> selectLocationLauncher.launch( Intent(context, SelectLocationActivity::class.java) ) @@ -243,7 +223,7 @@ } imageAdapter = EditableImageAdapter(this, 3, 13f) - addImageRecyclerView.adapter = imageAdapter + binding.addImageRecyclerView.adapter = imageAdapter imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { selectPicture() @@ -281,7 +261,7 @@ } } - sceneEditView.addTextChangedListener(object : TextWatcher { + binding.sceneEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { } @@ -292,31 +272,31 @@ override fun afterTextChanged(s: Editable?) { val text = s.toString().trim() - inputLengthView.text = String.format("${text.length}/100") + binding.inputLengthView.text = String.format("${text.length}/100") if (text.length > 100) { - inputLengthView.setTextColor(R.color.redTextColor.convertColor(context)) + binding.inputLengthView.setTextColor(R.color.redTextColor.convertColor(context)) "现场情况字符不能超过100个字符".show(context) } else { - inputLengthView.setTextColor(R.color.subTextColor.convertColor(context)) + binding.inputLengthView.setTextColor(R.color.subTextColor.convertColor(context)) } } }) - addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() + binding.addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() - submitButton.setOnClickListener { - val deviceCode = deviceCodeView.text.toString().trim() + binding.submitButton.setOnClickListener { + val deviceCode = binding.deviceCodeView.text.toString().trim() if (deviceCode.isBlank()) { "请输入设备编号".show(context) return@setOnClickListener } - val ownerShip = ownerShipView.text.toString().trim() + val ownerShip = binding.ownerShipView.text.toString().trim() if (ownerShip.isBlank()) { "请输入设备所属项目".show(context) return@setOnClickListener } - val longitude = longitudeView.text.toString().trim() - val latitude = latitudeView.text.toString().trim() + val longitude = binding.longitudeView.text.toString().trim() + val latitude = binding.latitudeView.text.toString().trim() if (longitude.isBlank() || latitude.isBlank()) { "请先获取当前经纬度".show(context) return@setOnClickListener @@ -329,14 +309,14 @@ ) deviceViewModel.addDevice( deviceCode, - deviceNameView.text.toString(), + binding.deviceNameView.text.toString(), ownerShip, - collectIntervalView.text.toString(), + binding.collectIntervalView.text.toString(), longitude, latitude, imagePaths.reformat(), - sceneEditView.text.toString().trim(), - addDeviceTimeView.text.toString(), + binding.sceneEditView.text.toString().trim(), + binding.addDeviceTimeView.text.toString(), userData.id.toString(), userData.deptId ) @@ -345,16 +325,13 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(listOf("拍照", "相册")) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { when (position) { 0 -> { - PictureSelector.create(context) - .openCamera(SelectMimeType.ofImage()) + PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { if (result == null) { @@ -362,8 +339,7 @@ return } LoadingDialogHub.show( - this@AddDeviceActivity, - "图片上传中,请稍后..." + this@AddDeviceActivity, "图片上传中,请稍后..." ) selectedImages = result analyticalSelectResults(result[0]) @@ -374,14 +350,11 @@ } }) } + 1 -> { - PictureSelector.create(context) - .openGallery(SelectMimeType.ofImage()) - .isGif(false) - .isMaxSelectEnabledMask(true) - .setFilterMinFileSize(100) - .setMaxSelectNum(3) - .isDisplayCamera(false) + PictureSelector.create(context).openGallery(SelectMimeType.ofImage()) + .isGif(false).isMaxSelectEnabledMask(true).setFilterMinFileSize(100) + .setMaxSelectNum(3).isDisplayCamera(false) .setImageEngine(GlideLoadEngine.instance) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { @@ -390,8 +363,7 @@ return } LoadingDialogHub.show( - this@AddDeviceActivity, - "图片上传中,请稍后..." + this@AddDeviceActivity, "图片上传中,请稍后..." ) selectedImages = result // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 diff --git a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt index 3864f16..e4f19a4 100644 --- a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.content.Context +import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,19 +11,20 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityBigImageBinding import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager -import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : KotlinBaseActivity() { +class BigImageActivity : KotlinBaseActivity() { - override fun initLayoutView(): Int = R.layout.activity_big_image + override fun initViewBinding(): ActivityBigImageBinding { + return ActivityBigImageBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { PageNavigationManager.addActivity(this) @@ -30,16 +32,16 @@ ImmersionBar.with(this).statusBarDarkFont(false).init() } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) val urls = intent.getStringArrayListExtra(Constant.BIG_IMAGE_INTENT_DATA_KEY) if (urls == null || urls.size == 0) { return } - pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") - imagePagerView.adapter = BigImageAdapter(this, urls) - imagePagerView.currentItem = index - imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + binding.pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + binding.imagePagerView.adapter = BigImageAdapter(this, urls) + binding.imagePagerView.currentItem = index + binding.imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrollStateChanged(state: Int) { } @@ -53,7 +55,8 @@ } override fun onPageSelected(position: Int) { - pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + binding.pageNumberView.text = + String.format("(" + (position + 1) + "/" + urls.size + ")") } }) } @@ -63,7 +66,7 @@ } override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } + binding.leftBackView.setOnClickListener { this.finish() } } class BigImageAdapter(private var context: Context, imageList: ArrayList) : diff --git a/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt b/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt index 072953f..f036a78 100644 --- a/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.graphics.Color +import android.os.Bundle import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -10,6 +11,7 @@ import com.amap.api.services.geocoder.RegeocodeQuery import com.amap.api.services.geocoder.RegeocodeResult import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityDeviceDetailBinding import com.casic.smarttube.extensions.combineImagePath import com.casic.smarttube.extensions.toSignalImage import com.casic.smarttube.model.DeviceDetailModel @@ -25,51 +27,39 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState -import kotlinx.android.synthetic.main.activity_device_detail.densityView -import kotlinx.android.synthetic.main.activity_device_detail.descriptionView -import kotlinx.android.synthetic.main.activity_device_detail.deviceBatteryView -import kotlinx.android.synthetic.main.activity_device_detail.deviceCodeView -import kotlinx.android.synthetic.main.activity_device_detail.deviceNameView -import kotlinx.android.synthetic.main.activity_device_detail.deviceStateView -import kotlinx.android.synthetic.main.activity_device_detail.imageGridView -import kotlinx.android.synthetic.main.activity_device_detail.lastDataView -import kotlinx.android.synthetic.main.activity_device_detail.leftBackView -import kotlinx.android.synthetic.main.activity_device_detail.locationView -import kotlinx.android.synthetic.main.activity_device_detail.projectGroupView -import kotlinx.android.synthetic.main.activity_device_detail.rightOptionView -import kotlinx.android.synthetic.main.activity_device_detail.signalImageView -import kotlinx.android.synthetic.main.activity_device_detail.titleView -class DeviceDetailActivity : KotlinBaseActivity() { +class DeviceDetailActivity : KotlinBaseActivity() { private val kTag = "DeviceDetailActivity" private lateinit var deviceViewModel: DeviceViewModel private lateinit var deviceModel: DeviceDetailModel.DataModel private val geocoderSearch by lazy { GeocodeSearch(this) } - override fun initLayoutView(): Int = R.layout.activity_device_detail + override fun initViewBinding(): ActivityDeviceDetailBinding { + return ActivityDeviceDetailBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "设备详情" - leftBackView.setOnClickListener { finish() } + binding.titleView.text = "设备详情" + binding.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! - deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] deviceViewModel.obtainDeviceDetail(params[0], params[1]) deviceViewModel.deviceDetailModel.observe(this) { if (it.code == 200) { val device = it.data this.deviceModel = device - deviceCodeView.text = device.devcode - deviceNameView.text = device.deviceName - projectGroupView.text = String.format("项目${device.groupId}") + binding.deviceCodeView.text = device.devcode + binding.deviceNameView.text = device.deviceName + binding.projectGroupView.text = String.format("项目${device.groupId}") if (device.latGaode.isBlank() || device.lngGaode.isBlank()) { - locationView.text = "经纬度异常,无法查看具体位置" + binding.locationView.text = "经纬度异常,无法查看具体位置" } else { val queryParam = RegeocodeQuery( LatLonPoint(device.latGaode.toDouble(), device.lngGaode.toDouble()), @@ -81,7 +71,7 @@ GeocodeSearch.OnGeocodeSearchListener { override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { if (rCode == 1000) { - locationView.text = result?.regeocodeAddress?.formatAddress + binding.locationView.text = result?.regeocodeAddress?.formatAddress } } @@ -90,12 +80,12 @@ } }) } - descriptionView.text = device.descn + binding.descriptionView.text = device.descn if (device.photos.toString().isBlank()) { - imageGridView.visibility = View.GONE + binding.imageGridView.visibility = View.GONE } else { - imageGridView.visibility = View.VISIBLE + binding.imageGridView.visibility = View.VISIBLE //处理图片地址 val urls: ArrayList = ArrayList() val imageArray = device.photos.toString().split(",") @@ -104,10 +94,9 @@ urls.add(path.combineImagePath()) } } - val imageAdapter = ReadOnlyImageAdapter(this) - imageAdapter.setImageList(urls) - imageGridView.adapter = imageAdapter - imageGridView.setOnItemClickListener { _, _, position, _ -> + val imageAdapter = ReadOnlyImageAdapter(this, urls) + binding.imageGridView.adapter = imageAdapter + binding.imageGridView.setOnItemClickListener { _, _, position, _ -> if (urls[position].isEmpty()) { "图片加载失败,无法查看大图".show(this) } else { @@ -119,18 +108,18 @@ val value = device.stregnth.toDouble().toInt() val level = "$value%" val ppm = "${value * 500}ppm" - densityView.text = "$level(相当于$ppm)" + binding.densityView.text = "$level(相当于$ppm)" - lastDataView.text = device.uptime + binding.lastDataView.text = device.uptime if (device.onlineState == "0") { - deviceStateView.text = "离线" - deviceStateView.setTextColor(Color.RED) + binding.deviceStateView.text = "离线" + binding.deviceStateView.setTextColor(Color.RED) } else { - deviceStateView.text = "在线" - deviceStateView.setTextColor(Color.GREEN) + binding.deviceStateView.text = "在线" + binding.deviceStateView.setTextColor(Color.GREEN) } - signalImageView.setBackgroundResource(device.rsrp.toSignalImage()) - deviceBatteryView.text = if (device.cell.isNullOrBlank()) { + binding.signalImageView.setBackgroundResource(device.rsrp.toSignalImage()) + binding.deviceBatteryView.text = if (device.cell.isNullOrBlank()) { "0%" } else { device.cell + "%" @@ -149,7 +138,7 @@ } override fun initEvent() { - rightOptionView.setOnClickListener { + binding.rightOptionView.setOnClickListener { val lat = deviceModel.latGaode.toString() val lng = deviceModel.lngGaode.toString() if (lat.isBlank() || lng.isBlank()) { diff --git a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt index 0ae8862..ba52ab8 100644 --- a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.content.Context +import android.os.Bundle import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -8,6 +9,7 @@ import androidx.recyclerview.widget.RecyclerView import com.casic.smarttube.R import com.casic.smarttube.adapter.DeviceListAdapter +import com.casic.smarttube.databinding.ActivityGroupDeviceBinding import com.casic.smarttube.extensions.showEmptyPage import com.casic.smarttube.model.DeviceListModel import com.casic.smarttube.utils.LoadingDialogHub @@ -28,14 +30,8 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.qmuiteam.qmui.recyclerView.QMUIRVItemSwipeAction import com.qmuiteam.qmui.recyclerView.QMUISwipeAction -import kotlinx.android.synthetic.main.activity_group_device.groupDeviceLayout -import kotlinx.android.synthetic.main.activity_group_device.groupDeviceView -import kotlinx.android.synthetic.main.activity_group_device.leftBackView -import kotlinx.android.synthetic.main.activity_group_device.rightOptionView -import kotlinx.android.synthetic.main.activity_group_device.titleView -import kotlinx.android.synthetic.main.include_empty_view.emptyView -class GroupDeviceActivity : KotlinBaseActivity() { +class GroupDeviceActivity : KotlinBaseActivity() { private lateinit var groupId: String private lateinit var weakReferenceHandler: WeakReferenceHandler @@ -51,18 +47,19 @@ private var clickedPosition = 0 private var isDeleteAll = false - override fun initLayoutView(): Int = R.layout.activity_group_device + override fun initViewBinding(): ActivityGroupDeviceBinding { + return ActivityGroupDeviceBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - leftBackView.setOnClickListener { finish() } - rightOptionView.setOnClickListener { + binding.leftBackView.setOnClickListener { finish() } + binding.rightOptionView.setOnClickListener { //改为Popup val easyPopupWindow = EasyPopupWindow(this) easyPopupWindow.setPopupMenuItem( - LocaleConstant.DEVICE_OPERATE_IMAGES, - LocaleConstant.DEVICE_OPERATE_TITLES + LocaleConstant.DEVICE_OPERATE_IMAGES, LocaleConstant.DEVICE_OPERATE_TITLES ) easyPopupWindow.setOnPopupWindowClickListener(object : EasyPopupWindow.OnPopupWindowClickListener { @@ -77,13 +74,11 @@ pageIndex = 1 obtainDeviceListByPage() } + 1 -> { - AlertControlDialog.Builder() - .setContext(context) - .setTitle("提示") + AlertControlDialog.Builder().setContext(context).setTitle("提示") .setMessage("删除后将无法恢复,是否继续?") - .setNegativeButton("容我想想") - .setPositiveButton("已经想好") + .setNegativeButton("容我想想").setPositiveButton("已经想好") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onCancelClick() { @@ -103,13 +98,11 @@ } }).build().show() } + 2 -> { - MultiSelectDialog.Builder() - .setContext(this@GroupDeviceActivity) - .setTitle("选择设备") - .setDataSource(dataBeans) - .setNegativeButton("取消") - .setPositiveButton("选好了") + MultiSelectDialog.Builder().setContext(this@GroupDeviceActivity) + .setTitle("选择设备").setDataSource(dataBeans) + .setNegativeButton("取消").setPositiveButton("选好了") .setOnDialogButtonClickListener(object : MultiSelectDialog.OnDialogButtonClickListener { override fun onConfirmClick(selectedModels: MutableList) { @@ -126,21 +119,20 @@ override fun onCancelClick() { } - }) - .build().show() + }).build().show() } } } }) easyPopupWindow.setBackgroundDrawable(null) - val x: Int = rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(rightOptionView, x, 0) + val x: Int = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { groupId = intent.getStringExtra(Constant.INTENT_PARAM)!! - titleView.text = String.format(groupId + "项目设备列表") + binding.titleView.text = String.format(groupId + "项目设备列表") weakReferenceHandler = WeakReferenceHandler(callback) groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java] deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] @@ -157,13 +149,13 @@ } override fun initEvent() { - groupDeviceLayout.setOnRefreshListener { + binding.groupDeviceLayout.setOnRefreshListener { isRefresh = true //刷新之后页码重置 pageIndex = 1 obtainDeviceListByPage() } - groupDeviceLayout.setOnLoadMoreListener { + binding.groupDeviceLayout.setOnLoadMoreListener { isLoadMore = true pageIndex++ obtainDeviceListByPage() @@ -176,7 +168,7 @@ isRefresh -> { dataBeans.clear() dataBeans = dataRows!! - groupDeviceLayout.finishRefresh() + binding.groupDeviceLayout.finishRefresh() isRefresh = false } @@ -185,7 +177,7 @@ "到底了,别拉了".show(this) } dataBeans.addAll(dataRows!!) - groupDeviceLayout.finishLoadMore() + binding.groupDeviceLayout.finishLoadMore() isLoadMore = false } @@ -211,7 +203,7 @@ ) } if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { pageIndex = 1 obtainDeviceListByPage() } @@ -230,15 +222,15 @@ deviceAdapter.notifyDataSetChanged() } else { if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { pageIndex = 1 obtainDeviceListByPage() } } else { - emptyView!!.hide() + binding.emptyInclude.emptyView.hide() deviceAdapter = DeviceListAdapter(this, dataBeans) //绑定侧滑事件 - swipeAction.attachToRecyclerView(groupDeviceView) + swipeAction.attachToRecyclerView(binding.groupDeviceView) val linearLayoutManager = object : LinearLayoutManager(this) { override fun generateDefaultLayoutParams(): RecyclerView.LayoutParams { return RecyclerView.LayoutParams( @@ -247,8 +239,8 @@ ) } } - groupDeviceView.layoutManager = linearLayoutManager - groupDeviceView.adapter = deviceAdapter + binding.groupDeviceView.layoutManager = linearLayoutManager + binding.groupDeviceView.adapter = deviceAdapter deviceAdapter.setOnItemClickListener(object : DeviceListAdapter.OnItemClickListener { override fun onClicked(position: Int) { @@ -311,13 +303,9 @@ }) private fun deleteItem(adapterPosition: Int) { - AlertControlDialog.Builder() - .setContext(this) - .setTitle("提示") - .setMessage("删除后将无法恢复,是否继续?") - .setNegativeButton("容我想想") - .setPositiveButton("已经想好") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(this).setTitle("提示") + .setMessage("删除后将无法恢复,是否继续?").setNegativeButton("容我想想") + .setPositiveButton("已经想好").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onCancelClick() { diff --git a/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt b/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt index 71f438c..70e49f0 100644 --- a/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt @@ -1,9 +1,11 @@ package com.casic.smarttube.view +import android.os.Bundle import android.view.View import android.widget.AdapterView import androidx.lifecycle.ViewModelProvider import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityHistoryDataBinding import com.casic.smarttube.extensions.dateToMonthDay import com.casic.smarttube.extensions.getQuarterOfYear import com.casic.smarttube.utils.ChartViewHelper @@ -22,27 +24,26 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState -import kotlinx.android.synthetic.main.activity_history_data.dataLineChart -import kotlinx.android.synthetic.main.activity_history_data.leftBackView -import kotlinx.android.synthetic.main.activity_history_data.periodSpinner import java.util.Calendar -class HistoryDataActivity : KotlinBaseActivity() { +class HistoryDataActivity : KotlinBaseActivity() { private val kTag = "HistoryDataActivity" private lateinit var deviceViewModel: DeviceViewModel private lateinit var groupId: String private lateinit var devCode: String - override fun initLayoutView(): Int = R.layout.activity_history_data + override fun initViewBinding(): ActivityHistoryDataBinding { + return ActivityHistoryDataBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - leftBackView.setOnClickListener { finish() } + binding.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! groupId = params[0] devCode = params[1] @@ -61,8 +62,8 @@ override fun initEvent() { //默认选择近7天的数据 - periodSpinner.setSelection(3) - periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + binding.periodSpinner.setSelection(3) + binding.periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onItemSelected( parent: AdapterView<*>?, view: View?, position: Int, id: Long ) { @@ -76,6 +77,7 @@ groupId, devCode, "$year-01-01", time.timestampToCompleteDate() ) } + 1 -> { //本季度 val startDate = when (time.getQuarterOfYear()) { @@ -89,6 +91,7 @@ groupId, devCode, startDate, time.timestampToCompleteDate() ) } + 2 -> { //近30日 deviceViewModel.obtainDeviceHistoryData( @@ -98,6 +101,7 @@ time.timestampToCompleteDate() ) } + 3 -> { //近7日 deviceViewModel.obtainDeviceHistoryData( @@ -107,19 +111,18 @@ time.timestampToCompleteDate() ) } + 4 -> { //今日 deviceViewModel.obtainDeviceHistoryData( groupId, devCode, time.timestampToDate(), time.timestampToCompleteDate() ) } + 5 -> { - DateSelectDialog.Builder() - .setContext(this@HistoryDataActivity) - .setTitle("选择日期") - .setNegativeButton("取消") - .setPositiveButton("选好了") - .setOnDialogButtonClickListener(object : + DateSelectDialog.Builder().setContext(this@HistoryDataActivity) + .setTitle("选择日期").setNegativeButton("取消") + .setPositiveButton("选好了").setOnDialogButtonClickListener(object : DateSelectDialog.OnDialogButtonClickListener { override fun onConfirmClick(startDate: String, endDate: String) { deviceViewModel.obtainDeviceHistoryData( @@ -129,12 +132,10 @@ override fun onCancelClick() { //选择取消就默认加载近7天的数据 - periodSpinner.setSelection(3) + binding.periodSpinner.setSelection(3) } - }) - .setFragmentManager(supportFragmentManager) - .setCalendarType(Type.YEAR_MONTH_DAY) - .build().show() + }).setFragmentManager(supportFragmentManager) + .setCalendarType(Type.YEAR_MONTH_DAY).build().show() } } } @@ -159,7 +160,9 @@ Entry(i.toFloat(), rowsBean.stregnth!!.toFloat(), "浓度") ) } - ChartViewHelper.setLineChartData(dataLineChart, xAxisLabels, strengthEntries) + ChartViewHelper.setLineChartData( + binding.dataLineChart, xAxisLabels, strengthEntries + ) } } } diff --git a/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt b/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt index ebca433..f947b2c 100644 --- a/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt @@ -1,7 +1,8 @@ package com.casic.smarttube.view +import android.os.Bundle import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityLoginBinding import com.casic.smarttube.utils.AuthenticationHelper import com.casic.smarttube.utils.LoadingDialogHub import com.casic.smarttube.utils.LocaleConstant @@ -14,26 +15,29 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues -import kotlinx.android.synthetic.main.activity_login.loginButton -import kotlinx.android.synthetic.main.activity_login.userNameView -import kotlinx.android.synthetic.main.activity_login.userPasswordView -class LoginActivity : KotlinBaseActivity() { +class LoginActivity : KotlinBaseActivity() { private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginViewModel: LoginViewModel private lateinit var userViewModel: UserViewModel - override fun initLayoutView(): Int = R.layout.activity_login + override fun initViewBinding(): ActivityLoginBinding { + return ActivityLoginBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(true).init() } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { // 设置默认账号密码 - userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) - userPasswordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + binding.userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + binding.userPasswordView.setText( + SaveKeyValues.getValue( + LocaleConstant.PASSWORD, "" + ) as String + ) authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] @@ -50,9 +54,9 @@ } override fun initEvent() { - loginButton.setOnClickListener { - val account = userNameView.text.toString().trim() - val userPassword = userPasswordView.text.toString().trim() + binding.loginButton.setOnClickListener { + val account = binding.userNameView.text.toString().trim() + val userPassword = binding.userPasswordView.text.toString().trim() if (account.isBlank()) { "用户名不能为空".show(this) return@setOnClickListener @@ -74,8 +78,8 @@ AuthenticationHelper.savePublicKey(keyString) val publicKey = RSAUtils.keyStrToPublicKey(keyString) - val account = userNameView.text.toString() - val userPassword = userPasswordView.text.toString() + val account = binding.userNameView.text.toString() + val userPassword = binding.userPasswordView.text.toString() val dataByPublicKey = RSAUtils.encryptDataByPublicKey(userPassword.toByteArray(), publicKey!!) //登录并获取Token,POST请求 diff --git a/app/src/main/java/com/casic/smarttube/view/MainActivity.kt b/app/src/main/java/com/casic/smarttube/view/MainActivity.kt index 4461757..575e1ee 100644 --- a/app/src/main/java/com/casic/smarttube/view/MainActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/MainActivity.kt @@ -1,5 +1,6 @@ package com.casic.smarttube.view +import android.os.Bundle import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment @@ -7,6 +8,7 @@ import androidx.fragment.app.FragmentPagerAdapter import androidx.viewpager.widget.ViewPager import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityMainBinding import com.casic.smarttube.fragment.HomePageFragment import com.casic.smarttube.fragment.MinePageFragment import com.casic.smarttube.fragment.OverviewFragment @@ -15,9 +17,8 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_main.* -class MainActivity : KotlinBaseActivity() { +class MainActivity : KotlinBaseActivity() { private var menuItem: MenuItem? = null private var fragmentList: MutableList = ArrayList() @@ -29,32 +30,36 @@ fragmentList.add(MinePageFragment()) } - override fun initLayoutView(): Int = R.layout.activity_main + override fun initViewBinding(): ActivityMainBinding { + return ActivityMainBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { //保留icon原图颜色 - bottomNavigation.itemIconTintList = null - bottomNavigation.setOnItemSelectedListener { menuItem -> + binding.bottomNavigation.itemIconTintList = null + binding.bottomNavigation.setOnItemSelectedListener { menuItem -> when (menuItem.itemId) { R.id.nav_home -> { - mainViewPager.currentItem = 0 + binding.mainViewPager.currentItem = 0 } + R.id.nav_overview -> { - mainViewPager.currentItem = 1 + binding.mainViewPager.currentItem = 1 } + R.id.nav_mine -> { - mainViewPager.currentItem = 2 + binding.mainViewPager.currentItem = 2 } } false } - mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) - mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 + binding.mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + binding.mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun observeRequestState() { @@ -62,7 +67,7 @@ } override fun initEvent() { - mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + binding.mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrollStateChanged(state: Int) { } @@ -77,9 +82,9 @@ if (menuItem != null) { menuItem!!.isChecked = false } else { - bottomNavigation.menu.getItem(0).isChecked = false + binding.bottomNavigation.menu.getItem(0).isChecked = false } - menuItem = bottomNavigation.menu.getItem(position) + menuItem = binding.bottomNavigation.menu.getItem(position) menuItem!!.isChecked = true } }) diff --git a/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt b/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt index f00e0ca..908aade 100644 --- a/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt @@ -15,6 +15,7 @@ import com.amap.api.services.geocoder.RegeocodeQuery import com.amap.api.services.geocoder.RegeocodeResult import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityMapDeviceBriefBinding import com.casic.smarttube.utils.LoadingDialogHub import com.casic.smarttube.utils.RouteOnMap import com.casic.smarttube.vm.DeviceViewModel @@ -24,16 +25,8 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState -import kotlinx.android.synthetic.main.activity_map_device_brief.deviceCodeView -import kotlinx.android.synthetic.main.activity_map_device_brief.deviceModelView -import kotlinx.android.synthetic.main.activity_map_device_brief.deviceValueView -import kotlinx.android.synthetic.main.activity_map_device_brief.locationView -import kotlinx.android.synthetic.main.activity_map_device_brief.mapView -import kotlinx.android.synthetic.main.activity_map_device_brief.updateTimeView -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -class MapDeviceBriefActivity : KotlinBaseActivity() { +class MapDeviceBriefActivity : KotlinBaseActivity() { private val kTag = "MapDeviceBriefActivity" private lateinit var deviceViewModel: DeviceViewModel @@ -42,17 +35,19 @@ private val geocoderSearch by lazy { GeocodeSearch(this) } - override fun initLayoutView(): Int = R.layout.activity_map_device_brief + override fun initViewBinding(): ActivityMapDeviceBriefBinding { + return ActivityMapDeviceBriefBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "设备最新数据地图展示" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "设备最新数据地图展示" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { - aMap = mapView.map + override fun initOnCreate(savedInstanceState: Bundle?) { + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val uiSettings = aMap.uiSettings uiSettings.isCompassEnabled = true @@ -80,22 +75,22 @@ if (it.code == 200) { val device = it.data - deviceCodeView.text = String.format("设备编号: ${device.devcode}") - deviceModelView.text = String.format("设备模型: ${params[2]}") + binding.deviceCodeView.text = String.format("设备编号: ${device.devcode}") + binding.deviceModelView.text = String.format("设备模型: ${params[2]}") //获取设备最新浓度信息 deviceViewModel.obtainTubeLastData(device.groupId, device.devcode) deviceViewModel.lastDataModel.observe(this) { v -> if (v.code == 200) { - deviceValueView.text = String.format("最新浓度: ${v.data.strength}") - updateTimeView.text = String.format("更新时间: ${v.data.uptime}") + binding.deviceValueView.text = String.format("最新浓度: ${v.data.strength}") + binding.updateTimeView.text = String.format("更新时间: ${v.data.uptime}") } else { - deviceValueView.text = String.format("最新浓度: 未知") - updateTimeView.text = String.format("更新时间: 未知") + binding.deviceValueView.text = String.format("最新浓度: 未知") + binding.updateTimeView.text = String.format("更新时间: 未知") } } if (device.latGaode.isBlank() || device.lngGaode.isBlank()) { - locationView.text = "经纬度异常,无法查看具体位置" + binding.locationView.text = "经纬度异常,无法查看具体位置" } else { val queryParam = RegeocodeQuery( LatLonPoint(device.latGaode.toDouble(), device.lngGaode.toDouble()), @@ -108,7 +103,7 @@ GeocodeSearch.OnGeocodeSearchListener { override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { if (rCode == 1000) { - locationView.text = + binding.locationView.text = String.format("详细位置: ${result?.regeocodeAddress?.formatAddress}") } } @@ -123,8 +118,7 @@ aMap.animateCamera(newCameraPosition, 1500, object : AMap.CancelableCallback { override fun onFinish() { //添加Marker - val markerOptions = MarkerOptions() - .position(latLng) + val markerOptions = MarkerOptions().position(latLng) .icon(BitmapDescriptorFactory.fromResource(R.mipmap.well_location)) .draggable(false) aMap.addMarker(markerOptions) @@ -148,26 +142,26 @@ /**地图相关*********/ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - mapView.onCreate(savedInstanceState) + binding.mapView.onCreate(savedInstanceState) } override fun onResume() { super.onResume() - mapView.onResume() + binding.mapView.onResume() } override fun onPause() { super.onPause() - mapView.onPause() + binding.mapView.onPause() } override fun onDestroy() { - mapView.onDestroy() + binding.mapView.onDestroy() super.onDestroy() } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - mapView.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/view/PermissionActivity.kt b/app/src/main/java/com/casic/smarttube/view/PermissionActivity.kt index e872ef4..fc20978 100644 --- a/app/src/main/java/com/casic/smarttube/view/PermissionActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/PermissionActivity.kt @@ -13,7 +13,6 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。 if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) { startSplashScreenActivity() } else { diff --git a/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt b/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt index c639105..bb0b0ed 100644 --- a/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt @@ -13,33 +13,35 @@ import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.MyLocationStyle import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivitySelectLocationBinding import com.casic.smarttube.utils.CenterMarkerView import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_select_location.* -class SelectLocationActivity : KotlinBaseActivity(), AMap.OnMyLocationChangeListener, - OnMapLoadedListener, OnCameraChangeListener { +class SelectLocationActivity : KotlinBaseActivity(), + AMap.OnMyLocationChangeListener, OnMapLoadedListener, OnCameraChangeListener { private val kTag = "SelectLocationActivity" private lateinit var latLng: LatLng private lateinit var aMap: AMap private lateinit var centerMarkerView: CenterMarkerView - override fun initLayoutView(): Int = R.layout.activity_select_location + override fun initViewBinding(): ActivitySelectLocationBinding { + return ActivitySelectLocationBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "手动选点" - leftBackView.setOnClickListener { finish() } + binding.titleView.text = "手动选点" + binding.leftBackView.setOnClickListener { finish() } } - override fun initData() { - aMap = mapView.map + override fun initOnCreate(savedInstanceState: Bundle?) { + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val locationStyle = MyLocationStyle() //定位一次,且将视角移动到地图中心点 @@ -76,7 +78,7 @@ aMap.setOnMapLoadedListener(this) aMap.setOnCameraChangeListener(this) - rightOperateView.setOnClickListener { + binding.rightOperateView.setOnClickListener { val intent = Intent() intent.putExtra("longitude", latLng.longitude.toString()) intent.putExtra("latitude", latLng.latitude.toString()) @@ -110,27 +112,27 @@ /**地图相关*********/ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - mapView.onCreate(savedInstanceState) + binding.mapView.onCreate(savedInstanceState) } override fun onResume() { super.onResume() - mapView.onResume() + binding.mapView.onResume() } override fun onPause() { super.onPause() - mapView.onPause() + binding.mapView.onPause() } override fun onDestroy() { centerMarkerView.destroy() - mapView.onDestroy() + binding.mapView.onDestroy() super.onDestroy() } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - mapView.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/smarttube/view/SplashScreenActivity.kt index dafbe4d..baf5222 100644 --- a/app/src/main/java/com/casic/smarttube/view/SplashScreenActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/SplashScreenActivity.kt @@ -1,16 +1,17 @@ package com.casic.smarttube.view import android.annotation.SuppressLint +import android.os.Bundle import android.os.CountDownTimer import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivitySplashBinding import com.casic.smarttube.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo @SuppressLint("CustomSplashScreen") -class SplashScreenActivity : KotlinBaseActivity() { +class SplashScreenActivity : KotlinBaseActivity() { private lateinit var userDetailViewModel: UserViewModel private val countDownTimer = object : CountDownTimer(1000, 500) { @@ -34,13 +35,15 @@ } } - override fun initLayoutView(): Int = R.layout.activity_splash + override fun initViewBinding(): ActivitySplashBinding { + return ActivitySplashBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { userDetailViewModel = ViewModelProvider(this).get(UserViewModel::class.java) } diff --git a/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt b/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt index 23d1ac1..ae7df77 100644 --- a/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt +++ b/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt @@ -6,14 +6,19 @@ import android.view.Gravity import androidx.fragment.app.FragmentManager import com.casic.smarttube.R +import com.casic.smarttube.databinding.DialogSelectDateBinding import com.casic.smarttube.utils.LocaleConstant import com.jzxiang.pickerview.TimePickerDialog import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.* -import kotlinx.android.synthetic.main.dialog_select_date.* +import com.pengxh.kt.lite.extensions.binding +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.resetParams +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.extensions.timestampToTime import java.text.ParseException import java.text.SimpleDateFormat -import java.util.* +import java.util.Locale class DateSelectDialog private constructor(builder: Builder) : Dialog( builder.context, R.style.UserDefinedDialogStyle @@ -76,6 +81,8 @@ } } + private val binding: DialogSelectDateBinding by binding() + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) this.resetParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.85) @@ -84,10 +91,10 @@ setCanceledOnTouchOutside(false) if (title.isNotBlank()) { - dialogTitleView.text = title + binding.dialogTitleView.text = title } - startDateView.setOnClickListener { + binding.startDateView.setOnClickListener { TimePickerDialog.Builder() .setThemeColor(R.color.mainThemeColor.convertColor(ctx)) .setTitleStringId("请选择起始时间") @@ -102,11 +109,11 @@ } else { millSeconds.timestampToCompleteDate() } - startDateView.setText(textValue) + binding.startDateView.setText(textValue) }.build().show(fragmentManager, "DateSelectDialog") } - endDateView.setOnClickListener { + binding.endDateView.setOnClickListener { TimePickerDialog.Builder() .setThemeColor(R.color.mainThemeColor.convertColor(ctx)) .setTitleStringId("请选择起始时间") @@ -121,21 +128,21 @@ } else { millSeconds.timestampToCompleteDate() } - endDateView.setText(textValue) + binding.endDateView.setText(textValue) }.build().show(fragmentManager, "DateSelectDialog") } - dialogCancelButton.text = negativeBtn - dialogCancelButton.setOnClickListener { + binding.dialogCancelButton.text = negativeBtn + binding.dialogCancelButton.setOnClickListener { listener.onCancelClick() this.dismiss() } - dialogConfirmButton.text = positiveBtn - dialogConfirmButton.setOnClickListener { + binding.dialogConfirmButton.text = positiveBtn + binding.dialogConfirmButton.setOnClickListener { //判断其实时间和结束时间 - val startDate = startDateView.text.toString() - val endDate = endDateView.text.toString() + val startDate = binding.startDateView.text.toString() + val endDate = binding.endDateView.text.toString() if (isEarlierThanStart(startDate, endDate)) { "结束时间不能早于开始时间".show(ctx) return@setOnClickListener diff --git a/app/build.gradle b/app/build.gradle index 81dccf6..defbef7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,12 +2,11 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' android { signingConfigs { release { - storeFile file('/Users/a203/Desktop/AndroidProjects/CasicSmartTube/app/CasicSmartTube.jks') + storeFile file('CasicSmartTube.jks') storePassword '123456789' keyAlias 'key0' keyPassword '123456789' @@ -21,8 +20,6 @@ targetSdkVersion 33 versionCode 2 versionName "1.0.1" - - ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -47,6 +44,10 @@ } } + viewBinding { + enabled true + } + applicationVariants.configureEach { variant -> variant.outputs.configureEach { outputFileName = "GT_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" @@ -61,7 +62,7 @@ dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.5' implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.6.1' diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cccda6d..fd9277c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,7 +81,7 @@ + android:value="a6907c8bb931727374aa5fd500cda107" /> (), Handler.Callback, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { private val kTag = "HomePageFragment" private val geocoderSearch by lazy { GeocodeSearch(requireContext()) } - private lateinit var homeView: View private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var easyPopupWindow: EasyPopupWindow private lateinit var aMap: AMap private lateinit var deviceViewModel: DeviceViewModel private lateinit var groupViewModel: ProjectGroupViewModel @@ -83,34 +89,34 @@ * */ private var mapZooms = ArrayList() - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View { - homeView = inflater.inflate(R.layout.fragment_home, container, false) + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } - weakReferenceHandler = WeakReferenceHandler(callback) - val easyPopupWindow = EasyPopupWindow(requireContext()) - easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) - homeView.rightOptionView.setOnClickListener { - easyPopupWindow.setOnPopupWindowClickListener(object : - EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - easyPopupWindow.setBackgroundDrawable(null) - val x: Int = homeView.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(homeView.rightOptionView, x, 0) + override fun setupTopBarLayout() { + + } + + override fun observeRequestState() { + groupViewModel.loadState.observe(this) { state -> + when (state) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") + else -> LoadingDialogHub.dismiss() + } } + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + weakReferenceHandler = WeakReferenceHandler(this) + + easyPopupWindow = EasyPopupWindow(requireContext()) + easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) //初始化vm - deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) - groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) - - observeRequestState() + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java] //默认数据 groupViewModel.obtainProGroupList() @@ -119,12 +125,8 @@ mapZooms.add(13f) initMap(savedInstanceState) - homeView.addDeviceButton.setOnClickListener { - requireContext().navigatePageTo() - } - //数据监听 - deviceViewModel.mapDeviceModel.observe(this, { + deviceViewModel.mapDeviceModel.observe(this) { if (it.code == 200) { if (allMarkerOptions.isNotEmpty()) { allMarkerOptions.clear() @@ -149,10 +151,8 @@ longitudeList.add(longitude) //将所有设备信息转化缓存为Marker点 allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(device.devcode) - .snippet(device.modelName) + MarkerOptions().position(LatLng(latitude, longitude)) + .title(device.devcode).snippet(device.modelName) ) } } @@ -160,8 +160,8 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 13f) } - }) - groupViewModel.groupModel.observe(this, { + } + groupViewModel.groupModel.observe(this) { if (it.code == 200) { val dataRows = it.data when { @@ -170,14 +170,15 @@ dataBeans = dataRows!! isRefresh = false } + else -> { dataBeans = dataRows!! } } weakReferenceHandler.sendEmptyMessage(2022090201) } - }) - groupViewModel.groupDeviceModel.observe(this, { + } + groupViewModel.groupDeviceModel.observe(this) { if (it.code == 200) { val latitudeList: MutableList = ArrayList() val longitudeList: MutableList = ArrayList() @@ -199,22 +200,33 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 16f) } - }) - return homeView + } } - private fun observeRequestState() { - groupViewModel.loadState.observe(this, { state -> - when (state) { - LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") - else -> LoadingDialogHub.dismiss() - } - }) + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + easyPopupWindow.setOnPopupWindowClickListener(object : + EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + easyPopupWindow.setBackgroundDrawable(null) + val x: Int = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + binding.addDeviceButton.setOnClickListener { + requireContext().navigatePageTo() + } } override fun onResume() { super.onResume() - homeView.mapView.onResume() + binding.mapView.onResume() //获取所有设备数据 deviceViewModel.obtainMapDeviceList() @@ -222,16 +234,16 @@ groupViewModel.obtainProGroupList() } - private val callback = Handler.Callback { - if (it.what == 2022090201) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022090201) { if (isRefresh) { groupListAdapter.notifyDataSetChanged() } else { groupListAdapter = GroupListAdapter(requireContext(), dataBeans) - homeView.homeRecyclerView!!.addItemDecoration( + binding.homeRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - homeView.homeRecyclerView!!.adapter = groupListAdapter + binding.homeRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : GroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { @@ -241,12 +253,12 @@ }) } } - true + return true } private fun initMap(savedInstanceState: Bundle?) { - homeView.mapView.onCreate(savedInstanceState) - aMap = homeView.mapView.map + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val uiSettings = aMap.uiSettings uiSettings.isCompassEnabled = true @@ -322,10 +334,7 @@ if (!isInRange) { clustersMarkers.add( GaoDeClusterMarkerView( - requireContext(), - it, - proj, - LocaleConstant.RADIUS_SIZE + requireContext(), it, proj, LocaleConstant.RADIUS_SIZE ) )//相距多少才聚合 } @@ -363,9 +372,7 @@ //绑定数据 val clickedLatLng = marker?.position!! for (device in deviceModels) { - if (clickedLatLng.latitude == device.latGaode!!.toDouble() - && clickedLatLng.longitude == device.lngGaode!!.toDouble() - ) { + if (clickedLatLng.latitude == device.latGaode!!.toDouble() && clickedLatLng.longitude == device.lngGaode!!.toDouble()) { deviceCodeView.text = String.format("设备编号: ${device.devcode}") deviceModelView.text = String.format("设备模型: ${device.modelName}") //获取设备最新浓度信息 @@ -395,8 +402,7 @@ val address = result?.regeocodeAddress?.formatAddress val temp = StringBuilder() if (address!!.length > 16) { - temp.append(address.substring(0, 14)) - .append("\r\n") + temp.append(address.substring(0, 14)).append("\r\n") .append(address.substring(16)) } else { temp.append(address) @@ -430,9 +436,7 @@ } } //查看聚合点,单独开页面导航过去 - BottomActionSheet.Builder() - .setContext(requireContext()) - .setActionItemTitle(multiDevice) + BottomActionSheet.Builder().setContext(requireContext()).setActionItemTitle(multiDevice) .setItemTextColor(Color.BLUE) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { @@ -455,12 +459,8 @@ override fun onInfoWindowClick(p0: Marker?) { if (p0 != null) { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -487,16 +487,16 @@ 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 onDestroy() { super.onDestroy() - homeView.mapView.onDestroy() + binding.mapView.onDestroy() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt index a4e964c..cc35197 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt @@ -4,11 +4,15 @@ import android.content.Intent import android.net.Uri import android.os.Build +import android.os.Bundle import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider import com.casic.smarttube.BuildConfig import com.casic.smarttube.R +import com.casic.smarttube.databinding.FragmentMineBinding import com.casic.smarttube.extensions.appendDownloadUrl import com.casic.smarttube.model.UserDetailModel import com.casic.smarttube.utils.AuthenticationHelper @@ -36,22 +40,10 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.ChangePasswordDialog -import kotlinx.android.synthetic.main.fragment_mine.aboutUsLayout -import kotlinx.android.synthetic.main.fragment_mine.cacheSizeView -import kotlinx.android.synthetic.main.fragment_mine.changePwdLayout -import kotlinx.android.synthetic.main.fragment_mine.clearCacheLayout -import kotlinx.android.synthetic.main.fragment_mine.loginOutButton -import kotlinx.android.synthetic.main.fragment_mine.updateLogLayout -import kotlinx.android.synthetic.main.fragment_mine.updateUserButton -import kotlinx.android.synthetic.main.fragment_mine.updateVersionLayout -import kotlinx.android.synthetic.main.fragment_mine.userDeptView -import kotlinx.android.synthetic.main.fragment_mine.userImageView -import kotlinx.android.synthetic.main.fragment_mine.userNameView -import kotlinx.android.synthetic.main.fragment_mine.userPhoneView import java.io.File import java.nio.charset.StandardCharsets -class MinePageFragment : KotlinBaseFragment() { +class MinePageFragment : KotlinBaseFragment() { private val kTag = "MinePageFragment" private lateinit var userData: UserDetailModel.Data @@ -60,13 +52,17 @@ private lateinit var versionViewModel: VersionViewModel private lateinit var progressDialog: ProgressDialog - override fun initLayoutView(): Int = R.layout.fragment_mine + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentMineBinding { + return FragmentMineBinding.inflate(inflater, container, false) + } override fun setupTopBarLayout() { } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java] @@ -98,8 +94,7 @@ versionViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show( - requireActivity(), - "检查版本中,请稍后" + requireActivity(), "检查版本中,请稍后" ) else -> LoadingDialogHub.dismiss() @@ -108,49 +103,45 @@ } override fun initEvent() { - userImageView.setOnClickListener { + binding.userImageView.setOnClickListener { "尽情期待~".show(requireContext()) } - updateUserButton.setOnClickListener { + binding.updateUserButton.setOnClickListener { LoadingDialogHub.show(requireActivity(), "同步中,请稍后...") userViewModel.obtainUserDetail() } - changePwdLayout.setOnClickListener { - ChangePasswordDialog.Builder() - .setContext(requireContext()) + binding.changePwdLayout.setOnClickListener { + ChangePasswordDialog.Builder().setContext(requireContext()) .setOnDialogButtonClickListener(object : ChangePasswordDialog.OnDialogButtonClickListener { override fun onConfirmClick(oldPwd: String, newPwd: String) { - val publicKey = - RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! val oldPassKey = RSAUtils.encryptDataByPublicKey( - oldPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + oldPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) val newPassKey = RSAUtils.encryptDataByPublicKey( - newPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + newPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) userViewModel.changePassword(oldPassKey, newPassKey) } }).build().show() } - aboutUsLayout.setOnClickListener { + binding.aboutUsLayout.setOnClickListener { requireContext().navigatePageTo() } - updateVersionLayout.setOnClickListener { + binding.updateVersionLayout.setOnClickListener { versionViewModel.updateVersion() } - updateLogLayout.setOnClickListener { + binding.updateLogLayout.setOnClickListener { "尽情期待~".show(requireContext()) } - clearCacheLayout.setOnClickListener { + binding.clearCacheLayout.setOnClickListener { //删除缓存之后在设置缓存大小 LoadingDialogHub.show(requireActivity(), "清理中,请稍后") File(requireContext().cacheDir.path).deleteFile() @@ -161,18 +152,14 @@ override fun onFinish() { LoadingDialogHub.dismiss() - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() } }.start() } - loginOutButton.setOnClickListener { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("退出登录") - .setMessage("确定要退出吗?") - .setNegativeButton("取消") - .setPositiveButton("确定") + binding.loginOutButton.setOnClickListener { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("退出登录") + .setMessage("确定要退出吗?").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -203,13 +190,9 @@ if (BuildConfig.VERSION_NAME == it.version) { "已是最新版本,无需更新".show(requireContext()) } else { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("提示") - .setMessage("有新版本,是否更新?") - .setNegativeButton("稍后再说") - .setPositiveButton("立即下载") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(requireContext()).setTitle("提示") + .setMessage("有新版本,是否更新?").setNegativeButton("稍后再说") + .setPositiveButton("立即下载").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { downloadApk(it.downloadUrl) @@ -244,7 +227,7 @@ updateUserInfo() } //缓存 - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() super.onResume() } @@ -258,9 +241,9 @@ // R.color.mainThemeColor.convertColor(requireContext()) // ) // userImageView.setImageDrawable(roundDrawable) - userNameView.text = userData.name - userPhoneView.text = String.format("电话:${userData.phone}") - userDeptView.text = String.format("部门:${userData.deptName}") + binding.userNameView.text = userData.name + binding.userPhoneView.text = String.format("电话:${userData.phone}") + binding.userDeptView.text = String.format("部门:${userData.deptName}") } private fun downloadApk(url: String?) { @@ -275,7 +258,8 @@ * */ val downloadPath = url!!.appendDownloadUrl() //开始下载 - downloadPath.downloadFile(requireContext().createDownloadFileDir().toString(), + downloadPath.downloadFile( + requireContext().createDownloadFileDir().toString(), object : OnDownloadListener { override fun onDownloadStart(totalBytes: Long) { progressDialog.max = totalBytes.toInt() diff --git a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt index b009850..c0afcc5 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt @@ -1,8 +1,11 @@ package com.casic.smarttube.fragment +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R import com.casic.smarttube.adapter.OverviewGroupListAdapter +import com.casic.smarttube.databinding.FragmentOverviewBinding import com.casic.smarttube.extensions.showEmptyPage import com.casic.smarttube.model.ProjectGroupModel import com.casic.smarttube.view.GroupDeviceActivity @@ -11,25 +14,25 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.widget.dialog.AlertInputDialog -import kotlinx.android.synthetic.main.fragment_overview.groupRecyclerView -import kotlinx.android.synthetic.main.fragment_overview.rightOptionView -import kotlinx.android.synthetic.main.fragment_overview.titleView -import kotlinx.android.synthetic.main.include_empty_view.emptyView -class OverviewFragment : KotlinBaseFragment() { +class OverviewFragment : KotlinBaseFragment() { private lateinit var groupViewModel: ProjectGroupViewModel private var dataBeans: MutableList = ArrayList() private lateinit var groupListAdapter: OverviewGroupListAdapter private var clickedPosition = 0 - override fun initLayoutView(): Int = R.layout.fragment_overview - - override fun setupTopBarLayout() { - titleView.text = "概览" + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentOverviewBinding { + return FragmentOverviewBinding.inflate(inflater, container, false) } - override fun initData() { + override fun setupTopBarLayout() { + binding.titleView.text = "概览" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) } @@ -43,7 +46,7 @@ } override fun initEvent() { - rightOptionView.setOnClickListener { + binding.rightOptionView.setOnClickListener { groupViewModel.obtainProGroupList() "刷新数据中,请稍后".show(requireContext()) } @@ -51,16 +54,16 @@ groupViewModel.groupModel.observe(this) { if (it.code == 200) { if (it.data.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { groupViewModel.obtainProGroupList() } } else { - emptyView!!.hide() + binding.emptyInclude.emptyView.hide() dataBeans.clear() dataBeans = it.data groupListAdapter = OverviewGroupListAdapter(requireContext(), it.data) - groupRecyclerView!!.adapter = groupListAdapter + binding.groupRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : OverviewGroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { diff --git a/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt b/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt index e424721..7f036b0 100644 --- a/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt +++ b/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt @@ -4,8 +4,8 @@ import android.graphics.Color import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.Poi -import com.pengxh.kt.lite.extensions.showBusRouteOnMap -import com.pengxh.kt.lite.extensions.showRouteOnMap +import com.casic.smarttube.extensions.showBusRouteOnMap +import com.casic.smarttube.extensions.showRouteOnMap import com.pengxh.kt.lite.widget.dialog.BottomActionSheet object RouteOnMap { diff --git a/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt b/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt index 65bba6f..598581a 100644 --- a/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt @@ -1,27 +1,29 @@ package com.casic.smarttube.view +import android.os.Bundle import com.casic.smarttube.BuildConfig import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityAboutUsBinding import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_about_us.* -import kotlinx.android.synthetic.main.include_base_title.* -class AboutUsActivity : KotlinBaseActivity() { +class AboutUsActivity : KotlinBaseActivity() { - override fun initLayoutView(): Int = R.layout.activity_about_us + override fun initViewBinding(): ActivityAboutUsBinding { + return ActivityAboutUsBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "关于我们" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "关于我们" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { - versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + override fun initOnCreate(savedInstanceState: Bundle?) { + binding.versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") } override fun observeRequestState() { diff --git a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt index 415f9dd..80b83bd 100644 --- a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.content.Intent import android.graphics.Color +import android.os.Bundle import android.os.CountDownTimer import android.os.Handler import android.text.Editable @@ -15,6 +16,7 @@ import com.amap.api.location.AMapLocation import com.casic.smarttube.R import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.smarttube.databinding.ActivityAddDeviceBinding import com.casic.smarttube.extensions.combineImagePath import com.casic.smarttube.extensions.compressImage import com.casic.smarttube.extensions.isNumber @@ -47,24 +49,9 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_add_device.addDeviceTimeView -import kotlinx.android.synthetic.main.activity_add_device.addImageRecyclerView -import kotlinx.android.synthetic.main.activity_add_device.collectIntervalView -import kotlinx.android.synthetic.main.activity_add_device.deviceCodeView -import kotlinx.android.synthetic.main.activity_add_device.deviceNameView -import kotlinx.android.synthetic.main.activity_add_device.inputLengthView -import kotlinx.android.synthetic.main.activity_add_device.latitudeView -import kotlinx.android.synthetic.main.activity_add_device.locationImageView -import kotlinx.android.synthetic.main.activity_add_device.longitudeView -import kotlinx.android.synthetic.main.activity_add_device.ownerShipView -import kotlinx.android.synthetic.main.activity_add_device.scannerView -import kotlinx.android.synthetic.main.activity_add_device.sceneEditView -import kotlinx.android.synthetic.main.activity_add_device.submitButton -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView import java.io.File -class AddDeviceActivity : KotlinBaseActivity() { +class AddDeviceActivity : KotlinBaseActivity() { private val kTag = "AddDeviceActivity" private lateinit var imageAdapter: EditableImageAdapter @@ -81,21 +68,23 @@ registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK) { val data = result.data!! - longitudeView.text = data.getStringExtra("longitude") - latitudeView.text = data.getStringExtra("latitude") + binding.longitudeView.text = data.getStringExtra("longitude") + binding.latitudeView.text = data.getStringExtra("latitude") } } - override fun initLayoutView(): Int = R.layout.activity_add_device + override fun initViewBinding(): ActivityAddDeviceBinding { + return ActivityAddDeviceBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "添加设备" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "添加设备" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { weakReferenceHandler = WeakReferenceHandler(callback) uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] @@ -119,17 +108,17 @@ override fun initEvent() { val manager = QrManager.getInstance().init(QrConfigCreator.create(this)) - scannerView.setOnClickListener { + binding.scannerView.setOnClickListener { manager.startScan(this) { if (it.content.isNumber()) { - deviceCodeView.setText(it.content) + binding.deviceCodeView.setText(it.content) } else { "设备编号错误,请检查标签".show(context) } } } - ownerShipView.setOnClickListener { + binding.ownerShipView.setOnClickListener { groupViewModel.obtainGroupList() } groupViewModel.groupListModel.observe(this) { @@ -147,19 +136,14 @@ groups.add("自定义") } if (groups.isNotEmpty()) { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(groups) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { if (groups[position] == "自定义") { - AlertInputDialog.Builder() - .setContext(context) - .setTitle("提示") + AlertInputDialog.Builder().setContext(context).setTitle("提示") .setHintMessage("请输入该设备所属项目名,如:项目203") - .setNegativeButton("取消") - .setPositiveButton("确定") + .setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertInputDialog.OnDialogButtonClickListener { override fun onCancelClick() { @@ -167,12 +151,11 @@ } override fun onConfirmClick(value: String) { - ownerShipView.text = value + binding.ownerShipView.text = value } - }) - .build().show() + }).build().show() } else { - ownerShipView.text = groups[position] + binding.ownerShipView.text = groups[position] } } }).build().show() @@ -180,27 +163,22 @@ } //默认频率1min - collectIntervalView.text = frequency[0] - collectIntervalView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + binding.collectIntervalView.text = frequency[0] + binding.collectIntervalView.setOnClickListener { + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(frequency) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { - collectIntervalView.text = frequency[position] + binding.collectIntervalView.text = frequency[position] } }).build().show() } - locationImageView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(context) - .setItemTextColor(Color.BLUE) + binding.locationImageView.setOnClickListener { + BottomActionSheet.Builder().setContext(context).setItemTextColor(Color.BLUE) .setActionItemTitle(arrayListOf("自动定位", "手动选点")) - .setOnActionSheetListener(object : - BottomActionSheet.OnActionSheetListener { + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { when (position) { 0 -> { @@ -210,30 +188,32 @@ override fun onAMapLocationGet(aMapLocation: AMapLocation?) { LoadingDialogHub.dismiss() if (aMapLocation == null) { - longitudeView.text = "定位失败" - latitudeView.text = "定位失败" + binding.longitudeView.text = "定位失败" + binding.latitudeView.text = "定位失败" - longitudeView.setTextColor( + binding.longitudeView.setTextColor( R.color.redTextColor.convertColor(context) ) - latitudeView.setTextColor( + binding.latitudeView.setTextColor( R.color.redTextColor.convertColor(context) ) } else { - longitudeView.text = + binding.longitudeView.text = aMapLocation.longitude.toString() - latitudeView.text = aMapLocation.latitude.toString() + binding.latitudeView.text = + aMapLocation.latitude.toString() - longitudeView.setTextColor( + binding.longitudeView.setTextColor( R.color.mainTextColor.convertColor(context) ) - latitudeView.setTextColor( + binding.latitudeView.setTextColor( R.color.mainTextColor.convertColor(context) ) } } }) } + 1 -> selectLocationLauncher.launch( Intent(context, SelectLocationActivity::class.java) ) @@ -243,7 +223,7 @@ } imageAdapter = EditableImageAdapter(this, 3, 13f) - addImageRecyclerView.adapter = imageAdapter + binding.addImageRecyclerView.adapter = imageAdapter imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { selectPicture() @@ -281,7 +261,7 @@ } } - sceneEditView.addTextChangedListener(object : TextWatcher { + binding.sceneEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { } @@ -292,31 +272,31 @@ override fun afterTextChanged(s: Editable?) { val text = s.toString().trim() - inputLengthView.text = String.format("${text.length}/100") + binding.inputLengthView.text = String.format("${text.length}/100") if (text.length > 100) { - inputLengthView.setTextColor(R.color.redTextColor.convertColor(context)) + binding.inputLengthView.setTextColor(R.color.redTextColor.convertColor(context)) "现场情况字符不能超过100个字符".show(context) } else { - inputLengthView.setTextColor(R.color.subTextColor.convertColor(context)) + binding.inputLengthView.setTextColor(R.color.subTextColor.convertColor(context)) } } }) - addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() + binding.addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() - submitButton.setOnClickListener { - val deviceCode = deviceCodeView.text.toString().trim() + binding.submitButton.setOnClickListener { + val deviceCode = binding.deviceCodeView.text.toString().trim() if (deviceCode.isBlank()) { "请输入设备编号".show(context) return@setOnClickListener } - val ownerShip = ownerShipView.text.toString().trim() + val ownerShip = binding.ownerShipView.text.toString().trim() if (ownerShip.isBlank()) { "请输入设备所属项目".show(context) return@setOnClickListener } - val longitude = longitudeView.text.toString().trim() - val latitude = latitudeView.text.toString().trim() + val longitude = binding.longitudeView.text.toString().trim() + val latitude = binding.latitudeView.text.toString().trim() if (longitude.isBlank() || latitude.isBlank()) { "请先获取当前经纬度".show(context) return@setOnClickListener @@ -329,14 +309,14 @@ ) deviceViewModel.addDevice( deviceCode, - deviceNameView.text.toString(), + binding.deviceNameView.text.toString(), ownerShip, - collectIntervalView.text.toString(), + binding.collectIntervalView.text.toString(), longitude, latitude, imagePaths.reformat(), - sceneEditView.text.toString().trim(), - addDeviceTimeView.text.toString(), + binding.sceneEditView.text.toString().trim(), + binding.addDeviceTimeView.text.toString(), userData.id.toString(), userData.deptId ) @@ -345,16 +325,13 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(listOf("拍照", "相册")) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { when (position) { 0 -> { - PictureSelector.create(context) - .openCamera(SelectMimeType.ofImage()) + PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { if (result == null) { @@ -362,8 +339,7 @@ return } LoadingDialogHub.show( - this@AddDeviceActivity, - "图片上传中,请稍后..." + this@AddDeviceActivity, "图片上传中,请稍后..." ) selectedImages = result analyticalSelectResults(result[0]) @@ -374,14 +350,11 @@ } }) } + 1 -> { - PictureSelector.create(context) - .openGallery(SelectMimeType.ofImage()) - .isGif(false) - .isMaxSelectEnabledMask(true) - .setFilterMinFileSize(100) - .setMaxSelectNum(3) - .isDisplayCamera(false) + PictureSelector.create(context).openGallery(SelectMimeType.ofImage()) + .isGif(false).isMaxSelectEnabledMask(true).setFilterMinFileSize(100) + .setMaxSelectNum(3).isDisplayCamera(false) .setImageEngine(GlideLoadEngine.instance) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { @@ -390,8 +363,7 @@ return } LoadingDialogHub.show( - this@AddDeviceActivity, - "图片上传中,请稍后..." + this@AddDeviceActivity, "图片上传中,请稍后..." ) selectedImages = result // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 diff --git a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt index 3864f16..e4f19a4 100644 --- a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.content.Context +import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,19 +11,20 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityBigImageBinding import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager -import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : KotlinBaseActivity() { +class BigImageActivity : KotlinBaseActivity() { - override fun initLayoutView(): Int = R.layout.activity_big_image + override fun initViewBinding(): ActivityBigImageBinding { + return ActivityBigImageBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { PageNavigationManager.addActivity(this) @@ -30,16 +32,16 @@ ImmersionBar.with(this).statusBarDarkFont(false).init() } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) val urls = intent.getStringArrayListExtra(Constant.BIG_IMAGE_INTENT_DATA_KEY) if (urls == null || urls.size == 0) { return } - pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") - imagePagerView.adapter = BigImageAdapter(this, urls) - imagePagerView.currentItem = index - imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + binding.pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + binding.imagePagerView.adapter = BigImageAdapter(this, urls) + binding.imagePagerView.currentItem = index + binding.imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrollStateChanged(state: Int) { } @@ -53,7 +55,8 @@ } override fun onPageSelected(position: Int) { - pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + binding.pageNumberView.text = + String.format("(" + (position + 1) + "/" + urls.size + ")") } }) } @@ -63,7 +66,7 @@ } override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } + binding.leftBackView.setOnClickListener { this.finish() } } class BigImageAdapter(private var context: Context, imageList: ArrayList) : diff --git a/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt b/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt index 072953f..f036a78 100644 --- a/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.graphics.Color +import android.os.Bundle import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -10,6 +11,7 @@ import com.amap.api.services.geocoder.RegeocodeQuery import com.amap.api.services.geocoder.RegeocodeResult import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityDeviceDetailBinding import com.casic.smarttube.extensions.combineImagePath import com.casic.smarttube.extensions.toSignalImage import com.casic.smarttube.model.DeviceDetailModel @@ -25,51 +27,39 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState -import kotlinx.android.synthetic.main.activity_device_detail.densityView -import kotlinx.android.synthetic.main.activity_device_detail.descriptionView -import kotlinx.android.synthetic.main.activity_device_detail.deviceBatteryView -import kotlinx.android.synthetic.main.activity_device_detail.deviceCodeView -import kotlinx.android.synthetic.main.activity_device_detail.deviceNameView -import kotlinx.android.synthetic.main.activity_device_detail.deviceStateView -import kotlinx.android.synthetic.main.activity_device_detail.imageGridView -import kotlinx.android.synthetic.main.activity_device_detail.lastDataView -import kotlinx.android.synthetic.main.activity_device_detail.leftBackView -import kotlinx.android.synthetic.main.activity_device_detail.locationView -import kotlinx.android.synthetic.main.activity_device_detail.projectGroupView -import kotlinx.android.synthetic.main.activity_device_detail.rightOptionView -import kotlinx.android.synthetic.main.activity_device_detail.signalImageView -import kotlinx.android.synthetic.main.activity_device_detail.titleView -class DeviceDetailActivity : KotlinBaseActivity() { +class DeviceDetailActivity : KotlinBaseActivity() { private val kTag = "DeviceDetailActivity" private lateinit var deviceViewModel: DeviceViewModel private lateinit var deviceModel: DeviceDetailModel.DataModel private val geocoderSearch by lazy { GeocodeSearch(this) } - override fun initLayoutView(): Int = R.layout.activity_device_detail + override fun initViewBinding(): ActivityDeviceDetailBinding { + return ActivityDeviceDetailBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "设备详情" - leftBackView.setOnClickListener { finish() } + binding.titleView.text = "设备详情" + binding.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! - deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] deviceViewModel.obtainDeviceDetail(params[0], params[1]) deviceViewModel.deviceDetailModel.observe(this) { if (it.code == 200) { val device = it.data this.deviceModel = device - deviceCodeView.text = device.devcode - deviceNameView.text = device.deviceName - projectGroupView.text = String.format("项目${device.groupId}") + binding.deviceCodeView.text = device.devcode + binding.deviceNameView.text = device.deviceName + binding.projectGroupView.text = String.format("项目${device.groupId}") if (device.latGaode.isBlank() || device.lngGaode.isBlank()) { - locationView.text = "经纬度异常,无法查看具体位置" + binding.locationView.text = "经纬度异常,无法查看具体位置" } else { val queryParam = RegeocodeQuery( LatLonPoint(device.latGaode.toDouble(), device.lngGaode.toDouble()), @@ -81,7 +71,7 @@ GeocodeSearch.OnGeocodeSearchListener { override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { if (rCode == 1000) { - locationView.text = result?.regeocodeAddress?.formatAddress + binding.locationView.text = result?.regeocodeAddress?.formatAddress } } @@ -90,12 +80,12 @@ } }) } - descriptionView.text = device.descn + binding.descriptionView.text = device.descn if (device.photos.toString().isBlank()) { - imageGridView.visibility = View.GONE + binding.imageGridView.visibility = View.GONE } else { - imageGridView.visibility = View.VISIBLE + binding.imageGridView.visibility = View.VISIBLE //处理图片地址 val urls: ArrayList = ArrayList() val imageArray = device.photos.toString().split(",") @@ -104,10 +94,9 @@ urls.add(path.combineImagePath()) } } - val imageAdapter = ReadOnlyImageAdapter(this) - imageAdapter.setImageList(urls) - imageGridView.adapter = imageAdapter - imageGridView.setOnItemClickListener { _, _, position, _ -> + val imageAdapter = ReadOnlyImageAdapter(this, urls) + binding.imageGridView.adapter = imageAdapter + binding.imageGridView.setOnItemClickListener { _, _, position, _ -> if (urls[position].isEmpty()) { "图片加载失败,无法查看大图".show(this) } else { @@ -119,18 +108,18 @@ val value = device.stregnth.toDouble().toInt() val level = "$value%" val ppm = "${value * 500}ppm" - densityView.text = "$level(相当于$ppm)" + binding.densityView.text = "$level(相当于$ppm)" - lastDataView.text = device.uptime + binding.lastDataView.text = device.uptime if (device.onlineState == "0") { - deviceStateView.text = "离线" - deviceStateView.setTextColor(Color.RED) + binding.deviceStateView.text = "离线" + binding.deviceStateView.setTextColor(Color.RED) } else { - deviceStateView.text = "在线" - deviceStateView.setTextColor(Color.GREEN) + binding.deviceStateView.text = "在线" + binding.deviceStateView.setTextColor(Color.GREEN) } - signalImageView.setBackgroundResource(device.rsrp.toSignalImage()) - deviceBatteryView.text = if (device.cell.isNullOrBlank()) { + binding.signalImageView.setBackgroundResource(device.rsrp.toSignalImage()) + binding.deviceBatteryView.text = if (device.cell.isNullOrBlank()) { "0%" } else { device.cell + "%" @@ -149,7 +138,7 @@ } override fun initEvent() { - rightOptionView.setOnClickListener { + binding.rightOptionView.setOnClickListener { val lat = deviceModel.latGaode.toString() val lng = deviceModel.lngGaode.toString() if (lat.isBlank() || lng.isBlank()) { diff --git a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt index 0ae8862..ba52ab8 100644 --- a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.content.Context +import android.os.Bundle import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -8,6 +9,7 @@ import androidx.recyclerview.widget.RecyclerView import com.casic.smarttube.R import com.casic.smarttube.adapter.DeviceListAdapter +import com.casic.smarttube.databinding.ActivityGroupDeviceBinding import com.casic.smarttube.extensions.showEmptyPage import com.casic.smarttube.model.DeviceListModel import com.casic.smarttube.utils.LoadingDialogHub @@ -28,14 +30,8 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.qmuiteam.qmui.recyclerView.QMUIRVItemSwipeAction import com.qmuiteam.qmui.recyclerView.QMUISwipeAction -import kotlinx.android.synthetic.main.activity_group_device.groupDeviceLayout -import kotlinx.android.synthetic.main.activity_group_device.groupDeviceView -import kotlinx.android.synthetic.main.activity_group_device.leftBackView -import kotlinx.android.synthetic.main.activity_group_device.rightOptionView -import kotlinx.android.synthetic.main.activity_group_device.titleView -import kotlinx.android.synthetic.main.include_empty_view.emptyView -class GroupDeviceActivity : KotlinBaseActivity() { +class GroupDeviceActivity : KotlinBaseActivity() { private lateinit var groupId: String private lateinit var weakReferenceHandler: WeakReferenceHandler @@ -51,18 +47,19 @@ private var clickedPosition = 0 private var isDeleteAll = false - override fun initLayoutView(): Int = R.layout.activity_group_device + override fun initViewBinding(): ActivityGroupDeviceBinding { + return ActivityGroupDeviceBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - leftBackView.setOnClickListener { finish() } - rightOptionView.setOnClickListener { + binding.leftBackView.setOnClickListener { finish() } + binding.rightOptionView.setOnClickListener { //改为Popup val easyPopupWindow = EasyPopupWindow(this) easyPopupWindow.setPopupMenuItem( - LocaleConstant.DEVICE_OPERATE_IMAGES, - LocaleConstant.DEVICE_OPERATE_TITLES + LocaleConstant.DEVICE_OPERATE_IMAGES, LocaleConstant.DEVICE_OPERATE_TITLES ) easyPopupWindow.setOnPopupWindowClickListener(object : EasyPopupWindow.OnPopupWindowClickListener { @@ -77,13 +74,11 @@ pageIndex = 1 obtainDeviceListByPage() } + 1 -> { - AlertControlDialog.Builder() - .setContext(context) - .setTitle("提示") + AlertControlDialog.Builder().setContext(context).setTitle("提示") .setMessage("删除后将无法恢复,是否继续?") - .setNegativeButton("容我想想") - .setPositiveButton("已经想好") + .setNegativeButton("容我想想").setPositiveButton("已经想好") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onCancelClick() { @@ -103,13 +98,11 @@ } }).build().show() } + 2 -> { - MultiSelectDialog.Builder() - .setContext(this@GroupDeviceActivity) - .setTitle("选择设备") - .setDataSource(dataBeans) - .setNegativeButton("取消") - .setPositiveButton("选好了") + MultiSelectDialog.Builder().setContext(this@GroupDeviceActivity) + .setTitle("选择设备").setDataSource(dataBeans) + .setNegativeButton("取消").setPositiveButton("选好了") .setOnDialogButtonClickListener(object : MultiSelectDialog.OnDialogButtonClickListener { override fun onConfirmClick(selectedModels: MutableList) { @@ -126,21 +119,20 @@ override fun onCancelClick() { } - }) - .build().show() + }).build().show() } } } }) easyPopupWindow.setBackgroundDrawable(null) - val x: Int = rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(rightOptionView, x, 0) + val x: Int = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { groupId = intent.getStringExtra(Constant.INTENT_PARAM)!! - titleView.text = String.format(groupId + "项目设备列表") + binding.titleView.text = String.format(groupId + "项目设备列表") weakReferenceHandler = WeakReferenceHandler(callback) groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java] deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] @@ -157,13 +149,13 @@ } override fun initEvent() { - groupDeviceLayout.setOnRefreshListener { + binding.groupDeviceLayout.setOnRefreshListener { isRefresh = true //刷新之后页码重置 pageIndex = 1 obtainDeviceListByPage() } - groupDeviceLayout.setOnLoadMoreListener { + binding.groupDeviceLayout.setOnLoadMoreListener { isLoadMore = true pageIndex++ obtainDeviceListByPage() @@ -176,7 +168,7 @@ isRefresh -> { dataBeans.clear() dataBeans = dataRows!! - groupDeviceLayout.finishRefresh() + binding.groupDeviceLayout.finishRefresh() isRefresh = false } @@ -185,7 +177,7 @@ "到底了,别拉了".show(this) } dataBeans.addAll(dataRows!!) - groupDeviceLayout.finishLoadMore() + binding.groupDeviceLayout.finishLoadMore() isLoadMore = false } @@ -211,7 +203,7 @@ ) } if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { pageIndex = 1 obtainDeviceListByPage() } @@ -230,15 +222,15 @@ deviceAdapter.notifyDataSetChanged() } else { if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { pageIndex = 1 obtainDeviceListByPage() } } else { - emptyView!!.hide() + binding.emptyInclude.emptyView.hide() deviceAdapter = DeviceListAdapter(this, dataBeans) //绑定侧滑事件 - swipeAction.attachToRecyclerView(groupDeviceView) + swipeAction.attachToRecyclerView(binding.groupDeviceView) val linearLayoutManager = object : LinearLayoutManager(this) { override fun generateDefaultLayoutParams(): RecyclerView.LayoutParams { return RecyclerView.LayoutParams( @@ -247,8 +239,8 @@ ) } } - groupDeviceView.layoutManager = linearLayoutManager - groupDeviceView.adapter = deviceAdapter + binding.groupDeviceView.layoutManager = linearLayoutManager + binding.groupDeviceView.adapter = deviceAdapter deviceAdapter.setOnItemClickListener(object : DeviceListAdapter.OnItemClickListener { override fun onClicked(position: Int) { @@ -311,13 +303,9 @@ }) private fun deleteItem(adapterPosition: Int) { - AlertControlDialog.Builder() - .setContext(this) - .setTitle("提示") - .setMessage("删除后将无法恢复,是否继续?") - .setNegativeButton("容我想想") - .setPositiveButton("已经想好") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(this).setTitle("提示") + .setMessage("删除后将无法恢复,是否继续?").setNegativeButton("容我想想") + .setPositiveButton("已经想好").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onCancelClick() { diff --git a/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt b/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt index 71f438c..70e49f0 100644 --- a/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt @@ -1,9 +1,11 @@ package com.casic.smarttube.view +import android.os.Bundle import android.view.View import android.widget.AdapterView import androidx.lifecycle.ViewModelProvider import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityHistoryDataBinding import com.casic.smarttube.extensions.dateToMonthDay import com.casic.smarttube.extensions.getQuarterOfYear import com.casic.smarttube.utils.ChartViewHelper @@ -22,27 +24,26 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState -import kotlinx.android.synthetic.main.activity_history_data.dataLineChart -import kotlinx.android.synthetic.main.activity_history_data.leftBackView -import kotlinx.android.synthetic.main.activity_history_data.periodSpinner import java.util.Calendar -class HistoryDataActivity : KotlinBaseActivity() { +class HistoryDataActivity : KotlinBaseActivity() { private val kTag = "HistoryDataActivity" private lateinit var deviceViewModel: DeviceViewModel private lateinit var groupId: String private lateinit var devCode: String - override fun initLayoutView(): Int = R.layout.activity_history_data + override fun initViewBinding(): ActivityHistoryDataBinding { + return ActivityHistoryDataBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - leftBackView.setOnClickListener { finish() } + binding.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! groupId = params[0] devCode = params[1] @@ -61,8 +62,8 @@ override fun initEvent() { //默认选择近7天的数据 - periodSpinner.setSelection(3) - periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + binding.periodSpinner.setSelection(3) + binding.periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onItemSelected( parent: AdapterView<*>?, view: View?, position: Int, id: Long ) { @@ -76,6 +77,7 @@ groupId, devCode, "$year-01-01", time.timestampToCompleteDate() ) } + 1 -> { //本季度 val startDate = when (time.getQuarterOfYear()) { @@ -89,6 +91,7 @@ groupId, devCode, startDate, time.timestampToCompleteDate() ) } + 2 -> { //近30日 deviceViewModel.obtainDeviceHistoryData( @@ -98,6 +101,7 @@ time.timestampToCompleteDate() ) } + 3 -> { //近7日 deviceViewModel.obtainDeviceHistoryData( @@ -107,19 +111,18 @@ time.timestampToCompleteDate() ) } + 4 -> { //今日 deviceViewModel.obtainDeviceHistoryData( groupId, devCode, time.timestampToDate(), time.timestampToCompleteDate() ) } + 5 -> { - DateSelectDialog.Builder() - .setContext(this@HistoryDataActivity) - .setTitle("选择日期") - .setNegativeButton("取消") - .setPositiveButton("选好了") - .setOnDialogButtonClickListener(object : + DateSelectDialog.Builder().setContext(this@HistoryDataActivity) + .setTitle("选择日期").setNegativeButton("取消") + .setPositiveButton("选好了").setOnDialogButtonClickListener(object : DateSelectDialog.OnDialogButtonClickListener { override fun onConfirmClick(startDate: String, endDate: String) { deviceViewModel.obtainDeviceHistoryData( @@ -129,12 +132,10 @@ override fun onCancelClick() { //选择取消就默认加载近7天的数据 - periodSpinner.setSelection(3) + binding.periodSpinner.setSelection(3) } - }) - .setFragmentManager(supportFragmentManager) - .setCalendarType(Type.YEAR_MONTH_DAY) - .build().show() + }).setFragmentManager(supportFragmentManager) + .setCalendarType(Type.YEAR_MONTH_DAY).build().show() } } } @@ -159,7 +160,9 @@ Entry(i.toFloat(), rowsBean.stregnth!!.toFloat(), "浓度") ) } - ChartViewHelper.setLineChartData(dataLineChart, xAxisLabels, strengthEntries) + ChartViewHelper.setLineChartData( + binding.dataLineChart, xAxisLabels, strengthEntries + ) } } } diff --git a/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt b/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt index ebca433..f947b2c 100644 --- a/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt @@ -1,7 +1,8 @@ package com.casic.smarttube.view +import android.os.Bundle import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityLoginBinding import com.casic.smarttube.utils.AuthenticationHelper import com.casic.smarttube.utils.LoadingDialogHub import com.casic.smarttube.utils.LocaleConstant @@ -14,26 +15,29 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues -import kotlinx.android.synthetic.main.activity_login.loginButton -import kotlinx.android.synthetic.main.activity_login.userNameView -import kotlinx.android.synthetic.main.activity_login.userPasswordView -class LoginActivity : KotlinBaseActivity() { +class LoginActivity : KotlinBaseActivity() { private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginViewModel: LoginViewModel private lateinit var userViewModel: UserViewModel - override fun initLayoutView(): Int = R.layout.activity_login + override fun initViewBinding(): ActivityLoginBinding { + return ActivityLoginBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(true).init() } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { // 设置默认账号密码 - userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) - userPasswordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + binding.userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + binding.userPasswordView.setText( + SaveKeyValues.getValue( + LocaleConstant.PASSWORD, "" + ) as String + ) authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] @@ -50,9 +54,9 @@ } override fun initEvent() { - loginButton.setOnClickListener { - val account = userNameView.text.toString().trim() - val userPassword = userPasswordView.text.toString().trim() + binding.loginButton.setOnClickListener { + val account = binding.userNameView.text.toString().trim() + val userPassword = binding.userPasswordView.text.toString().trim() if (account.isBlank()) { "用户名不能为空".show(this) return@setOnClickListener @@ -74,8 +78,8 @@ AuthenticationHelper.savePublicKey(keyString) val publicKey = RSAUtils.keyStrToPublicKey(keyString) - val account = userNameView.text.toString() - val userPassword = userPasswordView.text.toString() + val account = binding.userNameView.text.toString() + val userPassword = binding.userPasswordView.text.toString() val dataByPublicKey = RSAUtils.encryptDataByPublicKey(userPassword.toByteArray(), publicKey!!) //登录并获取Token,POST请求 diff --git a/app/src/main/java/com/casic/smarttube/view/MainActivity.kt b/app/src/main/java/com/casic/smarttube/view/MainActivity.kt index 4461757..575e1ee 100644 --- a/app/src/main/java/com/casic/smarttube/view/MainActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/MainActivity.kt @@ -1,5 +1,6 @@ package com.casic.smarttube.view +import android.os.Bundle import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment @@ -7,6 +8,7 @@ import androidx.fragment.app.FragmentPagerAdapter import androidx.viewpager.widget.ViewPager import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityMainBinding import com.casic.smarttube.fragment.HomePageFragment import com.casic.smarttube.fragment.MinePageFragment import com.casic.smarttube.fragment.OverviewFragment @@ -15,9 +17,8 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_main.* -class MainActivity : KotlinBaseActivity() { +class MainActivity : KotlinBaseActivity() { private var menuItem: MenuItem? = null private var fragmentList: MutableList = ArrayList() @@ -29,32 +30,36 @@ fragmentList.add(MinePageFragment()) } - override fun initLayoutView(): Int = R.layout.activity_main + override fun initViewBinding(): ActivityMainBinding { + return ActivityMainBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { //保留icon原图颜色 - bottomNavigation.itemIconTintList = null - bottomNavigation.setOnItemSelectedListener { menuItem -> + binding.bottomNavigation.itemIconTintList = null + binding.bottomNavigation.setOnItemSelectedListener { menuItem -> when (menuItem.itemId) { R.id.nav_home -> { - mainViewPager.currentItem = 0 + binding.mainViewPager.currentItem = 0 } + R.id.nav_overview -> { - mainViewPager.currentItem = 1 + binding.mainViewPager.currentItem = 1 } + R.id.nav_mine -> { - mainViewPager.currentItem = 2 + binding.mainViewPager.currentItem = 2 } } false } - mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) - mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 + binding.mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + binding.mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun observeRequestState() { @@ -62,7 +67,7 @@ } override fun initEvent() { - mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + binding.mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrollStateChanged(state: Int) { } @@ -77,9 +82,9 @@ if (menuItem != null) { menuItem!!.isChecked = false } else { - bottomNavigation.menu.getItem(0).isChecked = false + binding.bottomNavigation.menu.getItem(0).isChecked = false } - menuItem = bottomNavigation.menu.getItem(position) + menuItem = binding.bottomNavigation.menu.getItem(position) menuItem!!.isChecked = true } }) diff --git a/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt b/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt index f00e0ca..908aade 100644 --- a/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt @@ -15,6 +15,7 @@ import com.amap.api.services.geocoder.RegeocodeQuery import com.amap.api.services.geocoder.RegeocodeResult import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityMapDeviceBriefBinding import com.casic.smarttube.utils.LoadingDialogHub import com.casic.smarttube.utils.RouteOnMap import com.casic.smarttube.vm.DeviceViewModel @@ -24,16 +25,8 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState -import kotlinx.android.synthetic.main.activity_map_device_brief.deviceCodeView -import kotlinx.android.synthetic.main.activity_map_device_brief.deviceModelView -import kotlinx.android.synthetic.main.activity_map_device_brief.deviceValueView -import kotlinx.android.synthetic.main.activity_map_device_brief.locationView -import kotlinx.android.synthetic.main.activity_map_device_brief.mapView -import kotlinx.android.synthetic.main.activity_map_device_brief.updateTimeView -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -class MapDeviceBriefActivity : KotlinBaseActivity() { +class MapDeviceBriefActivity : KotlinBaseActivity() { private val kTag = "MapDeviceBriefActivity" private lateinit var deviceViewModel: DeviceViewModel @@ -42,17 +35,19 @@ private val geocoderSearch by lazy { GeocodeSearch(this) } - override fun initLayoutView(): Int = R.layout.activity_map_device_brief + override fun initViewBinding(): ActivityMapDeviceBriefBinding { + return ActivityMapDeviceBriefBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "设备最新数据地图展示" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "设备最新数据地图展示" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { - aMap = mapView.map + override fun initOnCreate(savedInstanceState: Bundle?) { + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val uiSettings = aMap.uiSettings uiSettings.isCompassEnabled = true @@ -80,22 +75,22 @@ if (it.code == 200) { val device = it.data - deviceCodeView.text = String.format("设备编号: ${device.devcode}") - deviceModelView.text = String.format("设备模型: ${params[2]}") + binding.deviceCodeView.text = String.format("设备编号: ${device.devcode}") + binding.deviceModelView.text = String.format("设备模型: ${params[2]}") //获取设备最新浓度信息 deviceViewModel.obtainTubeLastData(device.groupId, device.devcode) deviceViewModel.lastDataModel.observe(this) { v -> if (v.code == 200) { - deviceValueView.text = String.format("最新浓度: ${v.data.strength}") - updateTimeView.text = String.format("更新时间: ${v.data.uptime}") + binding.deviceValueView.text = String.format("最新浓度: ${v.data.strength}") + binding.updateTimeView.text = String.format("更新时间: ${v.data.uptime}") } else { - deviceValueView.text = String.format("最新浓度: 未知") - updateTimeView.text = String.format("更新时间: 未知") + binding.deviceValueView.text = String.format("最新浓度: 未知") + binding.updateTimeView.text = String.format("更新时间: 未知") } } if (device.latGaode.isBlank() || device.lngGaode.isBlank()) { - locationView.text = "经纬度异常,无法查看具体位置" + binding.locationView.text = "经纬度异常,无法查看具体位置" } else { val queryParam = RegeocodeQuery( LatLonPoint(device.latGaode.toDouble(), device.lngGaode.toDouble()), @@ -108,7 +103,7 @@ GeocodeSearch.OnGeocodeSearchListener { override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { if (rCode == 1000) { - locationView.text = + binding.locationView.text = String.format("详细位置: ${result?.regeocodeAddress?.formatAddress}") } } @@ -123,8 +118,7 @@ aMap.animateCamera(newCameraPosition, 1500, object : AMap.CancelableCallback { override fun onFinish() { //添加Marker - val markerOptions = MarkerOptions() - .position(latLng) + val markerOptions = MarkerOptions().position(latLng) .icon(BitmapDescriptorFactory.fromResource(R.mipmap.well_location)) .draggable(false) aMap.addMarker(markerOptions) @@ -148,26 +142,26 @@ /**地图相关*********/ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - mapView.onCreate(savedInstanceState) + binding.mapView.onCreate(savedInstanceState) } override fun onResume() { super.onResume() - mapView.onResume() + binding.mapView.onResume() } override fun onPause() { super.onPause() - mapView.onPause() + binding.mapView.onPause() } override fun onDestroy() { - mapView.onDestroy() + binding.mapView.onDestroy() super.onDestroy() } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - mapView.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/view/PermissionActivity.kt b/app/src/main/java/com/casic/smarttube/view/PermissionActivity.kt index e872ef4..fc20978 100644 --- a/app/src/main/java/com/casic/smarttube/view/PermissionActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/PermissionActivity.kt @@ -13,7 +13,6 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。 if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) { startSplashScreenActivity() } else { diff --git a/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt b/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt index c639105..bb0b0ed 100644 --- a/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt @@ -13,33 +13,35 @@ import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.MyLocationStyle import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivitySelectLocationBinding import com.casic.smarttube.utils.CenterMarkerView import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_select_location.* -class SelectLocationActivity : KotlinBaseActivity(), AMap.OnMyLocationChangeListener, - OnMapLoadedListener, OnCameraChangeListener { +class SelectLocationActivity : KotlinBaseActivity(), + AMap.OnMyLocationChangeListener, OnMapLoadedListener, OnCameraChangeListener { private val kTag = "SelectLocationActivity" private lateinit var latLng: LatLng private lateinit var aMap: AMap private lateinit var centerMarkerView: CenterMarkerView - override fun initLayoutView(): Int = R.layout.activity_select_location + override fun initViewBinding(): ActivitySelectLocationBinding { + return ActivitySelectLocationBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "手动选点" - leftBackView.setOnClickListener { finish() } + binding.titleView.text = "手动选点" + binding.leftBackView.setOnClickListener { finish() } } - override fun initData() { - aMap = mapView.map + override fun initOnCreate(savedInstanceState: Bundle?) { + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val locationStyle = MyLocationStyle() //定位一次,且将视角移动到地图中心点 @@ -76,7 +78,7 @@ aMap.setOnMapLoadedListener(this) aMap.setOnCameraChangeListener(this) - rightOperateView.setOnClickListener { + binding.rightOperateView.setOnClickListener { val intent = Intent() intent.putExtra("longitude", latLng.longitude.toString()) intent.putExtra("latitude", latLng.latitude.toString()) @@ -110,27 +112,27 @@ /**地图相关*********/ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - mapView.onCreate(savedInstanceState) + binding.mapView.onCreate(savedInstanceState) } override fun onResume() { super.onResume() - mapView.onResume() + binding.mapView.onResume() } override fun onPause() { super.onPause() - mapView.onPause() + binding.mapView.onPause() } override fun onDestroy() { centerMarkerView.destroy() - mapView.onDestroy() + binding.mapView.onDestroy() super.onDestroy() } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - mapView.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/smarttube/view/SplashScreenActivity.kt index dafbe4d..baf5222 100644 --- a/app/src/main/java/com/casic/smarttube/view/SplashScreenActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/SplashScreenActivity.kt @@ -1,16 +1,17 @@ package com.casic.smarttube.view import android.annotation.SuppressLint +import android.os.Bundle import android.os.CountDownTimer import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivitySplashBinding import com.casic.smarttube.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo @SuppressLint("CustomSplashScreen") -class SplashScreenActivity : KotlinBaseActivity() { +class SplashScreenActivity : KotlinBaseActivity() { private lateinit var userDetailViewModel: UserViewModel private val countDownTimer = object : CountDownTimer(1000, 500) { @@ -34,13 +35,15 @@ } } - override fun initLayoutView(): Int = R.layout.activity_splash + override fun initViewBinding(): ActivitySplashBinding { + return ActivitySplashBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { userDetailViewModel = ViewModelProvider(this).get(UserViewModel::class.java) } diff --git a/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt b/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt index 23d1ac1..ae7df77 100644 --- a/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt +++ b/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt @@ -6,14 +6,19 @@ import android.view.Gravity import androidx.fragment.app.FragmentManager import com.casic.smarttube.R +import com.casic.smarttube.databinding.DialogSelectDateBinding import com.casic.smarttube.utils.LocaleConstant import com.jzxiang.pickerview.TimePickerDialog import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.* -import kotlinx.android.synthetic.main.dialog_select_date.* +import com.pengxh.kt.lite.extensions.binding +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.resetParams +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.extensions.timestampToTime import java.text.ParseException import java.text.SimpleDateFormat -import java.util.* +import java.util.Locale class DateSelectDialog private constructor(builder: Builder) : Dialog( builder.context, R.style.UserDefinedDialogStyle @@ -76,6 +81,8 @@ } } + private val binding: DialogSelectDateBinding by binding() + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) this.resetParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.85) @@ -84,10 +91,10 @@ setCanceledOnTouchOutside(false) if (title.isNotBlank()) { - dialogTitleView.text = title + binding.dialogTitleView.text = title } - startDateView.setOnClickListener { + binding.startDateView.setOnClickListener { TimePickerDialog.Builder() .setThemeColor(R.color.mainThemeColor.convertColor(ctx)) .setTitleStringId("请选择起始时间") @@ -102,11 +109,11 @@ } else { millSeconds.timestampToCompleteDate() } - startDateView.setText(textValue) + binding.startDateView.setText(textValue) }.build().show(fragmentManager, "DateSelectDialog") } - endDateView.setOnClickListener { + binding.endDateView.setOnClickListener { TimePickerDialog.Builder() .setThemeColor(R.color.mainThemeColor.convertColor(ctx)) .setTitleStringId("请选择起始时间") @@ -121,21 +128,21 @@ } else { millSeconds.timestampToCompleteDate() } - endDateView.setText(textValue) + binding.endDateView.setText(textValue) }.build().show(fragmentManager, "DateSelectDialog") } - dialogCancelButton.text = negativeBtn - dialogCancelButton.setOnClickListener { + binding.dialogCancelButton.text = negativeBtn + binding.dialogCancelButton.setOnClickListener { listener.onCancelClick() this.dismiss() } - dialogConfirmButton.text = positiveBtn - dialogConfirmButton.setOnClickListener { + binding.dialogConfirmButton.text = positiveBtn + binding.dialogConfirmButton.setOnClickListener { //判断其实时间和结束时间 - val startDate = startDateView.text.toString() - val endDate = endDateView.text.toString() + val startDate = binding.startDateView.text.toString() + val endDate = binding.endDateView.text.toString() if (isEarlierThanStart(startDate, endDate)) { "结束时间不能早于开始时间".show(ctx) return@setOnClickListener diff --git a/app/src/main/java/com/casic/smarttube/widgets/MultiSelectDialog.kt b/app/src/main/java/com/casic/smarttube/widgets/MultiSelectDialog.kt index 7e3a63e..cb9316d 100644 --- a/app/src/main/java/com/casic/smarttube/widgets/MultiSelectDialog.kt +++ b/app/src/main/java/com/casic/smarttube/widgets/MultiSelectDialog.kt @@ -8,9 +8,10 @@ import androidx.recyclerview.widget.RecyclerView import com.casic.smarttube.R import com.casic.smarttube.adapter.DialogDeviceListAdapter +import com.casic.smarttube.databinding.DialogMultiSelectBinding import com.casic.smarttube.model.DeviceListModel +import com.pengxh.kt.lite.extensions.binding import com.pengxh.kt.lite.extensions.resetParams -import kotlinx.android.synthetic.main.dialog_multi_select.* class MultiSelectDialog private constructor(builder: Builder) : Dialog( builder.activity, R.style.UserDefinedDialogStyle @@ -67,6 +68,8 @@ } } + private val binding: DialogMultiSelectBinding by binding() + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) this.resetParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.85) @@ -75,21 +78,25 @@ setCanceledOnTouchOutside(false) if (title.isNotBlank()) { - dialogTitleView.text = title + binding.dialogTitleView.text = title } val dialogDeviceListAdapter = DialogDeviceListAdapter(act, dataModels) - dataRecyclerView.addItemDecoration(DividerItemDecoration(act, RecyclerView.VERTICAL)) - dataRecyclerView.adapter = dialogDeviceListAdapter + binding.dataRecyclerView.addItemDecoration( + DividerItemDecoration( + act, RecyclerView.VERTICAL + ) + ) + binding.dataRecyclerView.adapter = dialogDeviceListAdapter - dialogCancelButton.text = negativeBtn - dialogCancelButton.setOnClickListener { + binding.dialogCancelButton.text = negativeBtn + binding.dialogCancelButton.setOnClickListener { listener.onCancelClick() this.dismiss() } - dialogConfirmButton.text = positiveBtn - dialogConfirmButton.setOnClickListener { + binding.dialogConfirmButton.text = positiveBtn + binding.dialogConfirmButton.setOnClickListener { // 处理数据 listener.onConfirmClick(dialogDeviceListAdapter.selectedModels) this.dismiss() diff --git a/app/build.gradle b/app/build.gradle index 81dccf6..defbef7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,12 +2,11 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' android { signingConfigs { release { - storeFile file('/Users/a203/Desktop/AndroidProjects/CasicSmartTube/app/CasicSmartTube.jks') + storeFile file('CasicSmartTube.jks') storePassword '123456789' keyAlias 'key0' keyPassword '123456789' @@ -21,8 +20,6 @@ targetSdkVersion 33 versionCode 2 versionName "1.0.1" - - ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8" } } buildTypes { @@ -47,6 +44,10 @@ } } + viewBinding { + enabled true + } + applicationVariants.configureEach { variant -> variant.outputs.configureEach { outputFileName = "GT_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" @@ -61,7 +62,7 @@ dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.5' implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.6.1' diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cccda6d..fd9277c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,7 +81,7 @@ + android:value="a6907c8bb931727374aa5fd500cda107" /> (), Handler.Callback, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { private val kTag = "HomePageFragment" private val geocoderSearch by lazy { GeocodeSearch(requireContext()) } - private lateinit var homeView: View private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var easyPopupWindow: EasyPopupWindow private lateinit var aMap: AMap private lateinit var deviceViewModel: DeviceViewModel private lateinit var groupViewModel: ProjectGroupViewModel @@ -83,34 +89,34 @@ * */ private var mapZooms = ArrayList() - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View { - homeView = inflater.inflate(R.layout.fragment_home, container, false) + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } - weakReferenceHandler = WeakReferenceHandler(callback) - val easyPopupWindow = EasyPopupWindow(requireContext()) - easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) - homeView.rightOptionView.setOnClickListener { - easyPopupWindow.setOnPopupWindowClickListener(object : - EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - easyPopupWindow.setBackgroundDrawable(null) - val x: Int = homeView.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(homeView.rightOptionView, x, 0) + override fun setupTopBarLayout() { + + } + + override fun observeRequestState() { + groupViewModel.loadState.observe(this) { state -> + when (state) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") + else -> LoadingDialogHub.dismiss() + } } + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + weakReferenceHandler = WeakReferenceHandler(this) + + easyPopupWindow = EasyPopupWindow(requireContext()) + easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) //初始化vm - deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) - groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) - - observeRequestState() + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java] //默认数据 groupViewModel.obtainProGroupList() @@ -119,12 +125,8 @@ mapZooms.add(13f) initMap(savedInstanceState) - homeView.addDeviceButton.setOnClickListener { - requireContext().navigatePageTo() - } - //数据监听 - deviceViewModel.mapDeviceModel.observe(this, { + deviceViewModel.mapDeviceModel.observe(this) { if (it.code == 200) { if (allMarkerOptions.isNotEmpty()) { allMarkerOptions.clear() @@ -149,10 +151,8 @@ longitudeList.add(longitude) //将所有设备信息转化缓存为Marker点 allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(device.devcode) - .snippet(device.modelName) + MarkerOptions().position(LatLng(latitude, longitude)) + .title(device.devcode).snippet(device.modelName) ) } } @@ -160,8 +160,8 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 13f) } - }) - groupViewModel.groupModel.observe(this, { + } + groupViewModel.groupModel.observe(this) { if (it.code == 200) { val dataRows = it.data when { @@ -170,14 +170,15 @@ dataBeans = dataRows!! isRefresh = false } + else -> { dataBeans = dataRows!! } } weakReferenceHandler.sendEmptyMessage(2022090201) } - }) - groupViewModel.groupDeviceModel.observe(this, { + } + groupViewModel.groupDeviceModel.observe(this) { if (it.code == 200) { val latitudeList: MutableList = ArrayList() val longitudeList: MutableList = ArrayList() @@ -199,22 +200,33 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 16f) } - }) - return homeView + } } - private fun observeRequestState() { - groupViewModel.loadState.observe(this, { state -> - when (state) { - LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") - else -> LoadingDialogHub.dismiss() - } - }) + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + easyPopupWindow.setOnPopupWindowClickListener(object : + EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + easyPopupWindow.setBackgroundDrawable(null) + val x: Int = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + binding.addDeviceButton.setOnClickListener { + requireContext().navigatePageTo() + } } override fun onResume() { super.onResume() - homeView.mapView.onResume() + binding.mapView.onResume() //获取所有设备数据 deviceViewModel.obtainMapDeviceList() @@ -222,16 +234,16 @@ groupViewModel.obtainProGroupList() } - private val callback = Handler.Callback { - if (it.what == 2022090201) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022090201) { if (isRefresh) { groupListAdapter.notifyDataSetChanged() } else { groupListAdapter = GroupListAdapter(requireContext(), dataBeans) - homeView.homeRecyclerView!!.addItemDecoration( + binding.homeRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - homeView.homeRecyclerView!!.adapter = groupListAdapter + binding.homeRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : GroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { @@ -241,12 +253,12 @@ }) } } - true + return true } private fun initMap(savedInstanceState: Bundle?) { - homeView.mapView.onCreate(savedInstanceState) - aMap = homeView.mapView.map + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val uiSettings = aMap.uiSettings uiSettings.isCompassEnabled = true @@ -322,10 +334,7 @@ if (!isInRange) { clustersMarkers.add( GaoDeClusterMarkerView( - requireContext(), - it, - proj, - LocaleConstant.RADIUS_SIZE + requireContext(), it, proj, LocaleConstant.RADIUS_SIZE ) )//相距多少才聚合 } @@ -363,9 +372,7 @@ //绑定数据 val clickedLatLng = marker?.position!! for (device in deviceModels) { - if (clickedLatLng.latitude == device.latGaode!!.toDouble() - && clickedLatLng.longitude == device.lngGaode!!.toDouble() - ) { + if (clickedLatLng.latitude == device.latGaode!!.toDouble() && clickedLatLng.longitude == device.lngGaode!!.toDouble()) { deviceCodeView.text = String.format("设备编号: ${device.devcode}") deviceModelView.text = String.format("设备模型: ${device.modelName}") //获取设备最新浓度信息 @@ -395,8 +402,7 @@ val address = result?.regeocodeAddress?.formatAddress val temp = StringBuilder() if (address!!.length > 16) { - temp.append(address.substring(0, 14)) - .append("\r\n") + temp.append(address.substring(0, 14)).append("\r\n") .append(address.substring(16)) } else { temp.append(address) @@ -430,9 +436,7 @@ } } //查看聚合点,单独开页面导航过去 - BottomActionSheet.Builder() - .setContext(requireContext()) - .setActionItemTitle(multiDevice) + BottomActionSheet.Builder().setContext(requireContext()).setActionItemTitle(multiDevice) .setItemTextColor(Color.BLUE) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { @@ -455,12 +459,8 @@ override fun onInfoWindowClick(p0: Marker?) { if (p0 != null) { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -487,16 +487,16 @@ 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 onDestroy() { super.onDestroy() - homeView.mapView.onDestroy() + binding.mapView.onDestroy() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt index a4e964c..cc35197 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt @@ -4,11 +4,15 @@ import android.content.Intent import android.net.Uri import android.os.Build +import android.os.Bundle import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider import com.casic.smarttube.BuildConfig import com.casic.smarttube.R +import com.casic.smarttube.databinding.FragmentMineBinding import com.casic.smarttube.extensions.appendDownloadUrl import com.casic.smarttube.model.UserDetailModel import com.casic.smarttube.utils.AuthenticationHelper @@ -36,22 +40,10 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.ChangePasswordDialog -import kotlinx.android.synthetic.main.fragment_mine.aboutUsLayout -import kotlinx.android.synthetic.main.fragment_mine.cacheSizeView -import kotlinx.android.synthetic.main.fragment_mine.changePwdLayout -import kotlinx.android.synthetic.main.fragment_mine.clearCacheLayout -import kotlinx.android.synthetic.main.fragment_mine.loginOutButton -import kotlinx.android.synthetic.main.fragment_mine.updateLogLayout -import kotlinx.android.synthetic.main.fragment_mine.updateUserButton -import kotlinx.android.synthetic.main.fragment_mine.updateVersionLayout -import kotlinx.android.synthetic.main.fragment_mine.userDeptView -import kotlinx.android.synthetic.main.fragment_mine.userImageView -import kotlinx.android.synthetic.main.fragment_mine.userNameView -import kotlinx.android.synthetic.main.fragment_mine.userPhoneView import java.io.File import java.nio.charset.StandardCharsets -class MinePageFragment : KotlinBaseFragment() { +class MinePageFragment : KotlinBaseFragment() { private val kTag = "MinePageFragment" private lateinit var userData: UserDetailModel.Data @@ -60,13 +52,17 @@ private lateinit var versionViewModel: VersionViewModel private lateinit var progressDialog: ProgressDialog - override fun initLayoutView(): Int = R.layout.fragment_mine + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentMineBinding { + return FragmentMineBinding.inflate(inflater, container, false) + } override fun setupTopBarLayout() { } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java] @@ -98,8 +94,7 @@ versionViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show( - requireActivity(), - "检查版本中,请稍后" + requireActivity(), "检查版本中,请稍后" ) else -> LoadingDialogHub.dismiss() @@ -108,49 +103,45 @@ } override fun initEvent() { - userImageView.setOnClickListener { + binding.userImageView.setOnClickListener { "尽情期待~".show(requireContext()) } - updateUserButton.setOnClickListener { + binding.updateUserButton.setOnClickListener { LoadingDialogHub.show(requireActivity(), "同步中,请稍后...") userViewModel.obtainUserDetail() } - changePwdLayout.setOnClickListener { - ChangePasswordDialog.Builder() - .setContext(requireContext()) + binding.changePwdLayout.setOnClickListener { + ChangePasswordDialog.Builder().setContext(requireContext()) .setOnDialogButtonClickListener(object : ChangePasswordDialog.OnDialogButtonClickListener { override fun onConfirmClick(oldPwd: String, newPwd: String) { - val publicKey = - RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! val oldPassKey = RSAUtils.encryptDataByPublicKey( - oldPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + oldPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) val newPassKey = RSAUtils.encryptDataByPublicKey( - newPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + newPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) userViewModel.changePassword(oldPassKey, newPassKey) } }).build().show() } - aboutUsLayout.setOnClickListener { + binding.aboutUsLayout.setOnClickListener { requireContext().navigatePageTo() } - updateVersionLayout.setOnClickListener { + binding.updateVersionLayout.setOnClickListener { versionViewModel.updateVersion() } - updateLogLayout.setOnClickListener { + binding.updateLogLayout.setOnClickListener { "尽情期待~".show(requireContext()) } - clearCacheLayout.setOnClickListener { + binding.clearCacheLayout.setOnClickListener { //删除缓存之后在设置缓存大小 LoadingDialogHub.show(requireActivity(), "清理中,请稍后") File(requireContext().cacheDir.path).deleteFile() @@ -161,18 +152,14 @@ override fun onFinish() { LoadingDialogHub.dismiss() - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() } }.start() } - loginOutButton.setOnClickListener { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("退出登录") - .setMessage("确定要退出吗?") - .setNegativeButton("取消") - .setPositiveButton("确定") + binding.loginOutButton.setOnClickListener { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("退出登录") + .setMessage("确定要退出吗?").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -203,13 +190,9 @@ if (BuildConfig.VERSION_NAME == it.version) { "已是最新版本,无需更新".show(requireContext()) } else { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("提示") - .setMessage("有新版本,是否更新?") - .setNegativeButton("稍后再说") - .setPositiveButton("立即下载") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(requireContext()).setTitle("提示") + .setMessage("有新版本,是否更新?").setNegativeButton("稍后再说") + .setPositiveButton("立即下载").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { downloadApk(it.downloadUrl) @@ -244,7 +227,7 @@ updateUserInfo() } //缓存 - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() super.onResume() } @@ -258,9 +241,9 @@ // R.color.mainThemeColor.convertColor(requireContext()) // ) // userImageView.setImageDrawable(roundDrawable) - userNameView.text = userData.name - userPhoneView.text = String.format("电话:${userData.phone}") - userDeptView.text = String.format("部门:${userData.deptName}") + binding.userNameView.text = userData.name + binding.userPhoneView.text = String.format("电话:${userData.phone}") + binding.userDeptView.text = String.format("部门:${userData.deptName}") } private fun downloadApk(url: String?) { @@ -275,7 +258,8 @@ * */ val downloadPath = url!!.appendDownloadUrl() //开始下载 - downloadPath.downloadFile(requireContext().createDownloadFileDir().toString(), + downloadPath.downloadFile( + requireContext().createDownloadFileDir().toString(), object : OnDownloadListener { override fun onDownloadStart(totalBytes: Long) { progressDialog.max = totalBytes.toInt() diff --git a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt index b009850..c0afcc5 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt @@ -1,8 +1,11 @@ package com.casic.smarttube.fragment +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R import com.casic.smarttube.adapter.OverviewGroupListAdapter +import com.casic.smarttube.databinding.FragmentOverviewBinding import com.casic.smarttube.extensions.showEmptyPage import com.casic.smarttube.model.ProjectGroupModel import com.casic.smarttube.view.GroupDeviceActivity @@ -11,25 +14,25 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.widget.dialog.AlertInputDialog -import kotlinx.android.synthetic.main.fragment_overview.groupRecyclerView -import kotlinx.android.synthetic.main.fragment_overview.rightOptionView -import kotlinx.android.synthetic.main.fragment_overview.titleView -import kotlinx.android.synthetic.main.include_empty_view.emptyView -class OverviewFragment : KotlinBaseFragment() { +class OverviewFragment : KotlinBaseFragment() { private lateinit var groupViewModel: ProjectGroupViewModel private var dataBeans: MutableList = ArrayList() private lateinit var groupListAdapter: OverviewGroupListAdapter private var clickedPosition = 0 - override fun initLayoutView(): Int = R.layout.fragment_overview - - override fun setupTopBarLayout() { - titleView.text = "概览" + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentOverviewBinding { + return FragmentOverviewBinding.inflate(inflater, container, false) } - override fun initData() { + override fun setupTopBarLayout() { + binding.titleView.text = "概览" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) } @@ -43,7 +46,7 @@ } override fun initEvent() { - rightOptionView.setOnClickListener { + binding.rightOptionView.setOnClickListener { groupViewModel.obtainProGroupList() "刷新数据中,请稍后".show(requireContext()) } @@ -51,16 +54,16 @@ groupViewModel.groupModel.observe(this) { if (it.code == 200) { if (it.data.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { groupViewModel.obtainProGroupList() } } else { - emptyView!!.hide() + binding.emptyInclude.emptyView.hide() dataBeans.clear() dataBeans = it.data groupListAdapter = OverviewGroupListAdapter(requireContext(), it.data) - groupRecyclerView!!.adapter = groupListAdapter + binding.groupRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : OverviewGroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { diff --git a/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt b/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt index e424721..7f036b0 100644 --- a/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt +++ b/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt @@ -4,8 +4,8 @@ import android.graphics.Color import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.Poi -import com.pengxh.kt.lite.extensions.showBusRouteOnMap -import com.pengxh.kt.lite.extensions.showRouteOnMap +import com.casic.smarttube.extensions.showBusRouteOnMap +import com.casic.smarttube.extensions.showRouteOnMap import com.pengxh.kt.lite.widget.dialog.BottomActionSheet object RouteOnMap { diff --git a/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt b/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt index 65bba6f..598581a 100644 --- a/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt @@ -1,27 +1,29 @@ package com.casic.smarttube.view +import android.os.Bundle import com.casic.smarttube.BuildConfig import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityAboutUsBinding import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_about_us.* -import kotlinx.android.synthetic.main.include_base_title.* -class AboutUsActivity : KotlinBaseActivity() { +class AboutUsActivity : KotlinBaseActivity() { - override fun initLayoutView(): Int = R.layout.activity_about_us + override fun initViewBinding(): ActivityAboutUsBinding { + return ActivityAboutUsBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "关于我们" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "关于我们" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { - versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + override fun initOnCreate(savedInstanceState: Bundle?) { + binding.versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") } override fun observeRequestState() { diff --git a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt index 415f9dd..80b83bd 100644 --- a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.content.Intent import android.graphics.Color +import android.os.Bundle import android.os.CountDownTimer import android.os.Handler import android.text.Editable @@ -15,6 +16,7 @@ import com.amap.api.location.AMapLocation import com.casic.smarttube.R import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.smarttube.databinding.ActivityAddDeviceBinding import com.casic.smarttube.extensions.combineImagePath import com.casic.smarttube.extensions.compressImage import com.casic.smarttube.extensions.isNumber @@ -47,24 +49,9 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_add_device.addDeviceTimeView -import kotlinx.android.synthetic.main.activity_add_device.addImageRecyclerView -import kotlinx.android.synthetic.main.activity_add_device.collectIntervalView -import kotlinx.android.synthetic.main.activity_add_device.deviceCodeView -import kotlinx.android.synthetic.main.activity_add_device.deviceNameView -import kotlinx.android.synthetic.main.activity_add_device.inputLengthView -import kotlinx.android.synthetic.main.activity_add_device.latitudeView -import kotlinx.android.synthetic.main.activity_add_device.locationImageView -import kotlinx.android.synthetic.main.activity_add_device.longitudeView -import kotlinx.android.synthetic.main.activity_add_device.ownerShipView -import kotlinx.android.synthetic.main.activity_add_device.scannerView -import kotlinx.android.synthetic.main.activity_add_device.sceneEditView -import kotlinx.android.synthetic.main.activity_add_device.submitButton -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView import java.io.File -class AddDeviceActivity : KotlinBaseActivity() { +class AddDeviceActivity : KotlinBaseActivity() { private val kTag = "AddDeviceActivity" private lateinit var imageAdapter: EditableImageAdapter @@ -81,21 +68,23 @@ registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK) { val data = result.data!! - longitudeView.text = data.getStringExtra("longitude") - latitudeView.text = data.getStringExtra("latitude") + binding.longitudeView.text = data.getStringExtra("longitude") + binding.latitudeView.text = data.getStringExtra("latitude") } } - override fun initLayoutView(): Int = R.layout.activity_add_device + override fun initViewBinding(): ActivityAddDeviceBinding { + return ActivityAddDeviceBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "添加设备" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "添加设备" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { weakReferenceHandler = WeakReferenceHandler(callback) uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] @@ -119,17 +108,17 @@ override fun initEvent() { val manager = QrManager.getInstance().init(QrConfigCreator.create(this)) - scannerView.setOnClickListener { + binding.scannerView.setOnClickListener { manager.startScan(this) { if (it.content.isNumber()) { - deviceCodeView.setText(it.content) + binding.deviceCodeView.setText(it.content) } else { "设备编号错误,请检查标签".show(context) } } } - ownerShipView.setOnClickListener { + binding.ownerShipView.setOnClickListener { groupViewModel.obtainGroupList() } groupViewModel.groupListModel.observe(this) { @@ -147,19 +136,14 @@ groups.add("自定义") } if (groups.isNotEmpty()) { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(groups) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { if (groups[position] == "自定义") { - AlertInputDialog.Builder() - .setContext(context) - .setTitle("提示") + AlertInputDialog.Builder().setContext(context).setTitle("提示") .setHintMessage("请输入该设备所属项目名,如:项目203") - .setNegativeButton("取消") - .setPositiveButton("确定") + .setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertInputDialog.OnDialogButtonClickListener { override fun onCancelClick() { @@ -167,12 +151,11 @@ } override fun onConfirmClick(value: String) { - ownerShipView.text = value + binding.ownerShipView.text = value } - }) - .build().show() + }).build().show() } else { - ownerShipView.text = groups[position] + binding.ownerShipView.text = groups[position] } } }).build().show() @@ -180,27 +163,22 @@ } //默认频率1min - collectIntervalView.text = frequency[0] - collectIntervalView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + binding.collectIntervalView.text = frequency[0] + binding.collectIntervalView.setOnClickListener { + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(frequency) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { - collectIntervalView.text = frequency[position] + binding.collectIntervalView.text = frequency[position] } }).build().show() } - locationImageView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(context) - .setItemTextColor(Color.BLUE) + binding.locationImageView.setOnClickListener { + BottomActionSheet.Builder().setContext(context).setItemTextColor(Color.BLUE) .setActionItemTitle(arrayListOf("自动定位", "手动选点")) - .setOnActionSheetListener(object : - BottomActionSheet.OnActionSheetListener { + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { when (position) { 0 -> { @@ -210,30 +188,32 @@ override fun onAMapLocationGet(aMapLocation: AMapLocation?) { LoadingDialogHub.dismiss() if (aMapLocation == null) { - longitudeView.text = "定位失败" - latitudeView.text = "定位失败" + binding.longitudeView.text = "定位失败" + binding.latitudeView.text = "定位失败" - longitudeView.setTextColor( + binding.longitudeView.setTextColor( R.color.redTextColor.convertColor(context) ) - latitudeView.setTextColor( + binding.latitudeView.setTextColor( R.color.redTextColor.convertColor(context) ) } else { - longitudeView.text = + binding.longitudeView.text = aMapLocation.longitude.toString() - latitudeView.text = aMapLocation.latitude.toString() + binding.latitudeView.text = + aMapLocation.latitude.toString() - longitudeView.setTextColor( + binding.longitudeView.setTextColor( R.color.mainTextColor.convertColor(context) ) - latitudeView.setTextColor( + binding.latitudeView.setTextColor( R.color.mainTextColor.convertColor(context) ) } } }) } + 1 -> selectLocationLauncher.launch( Intent(context, SelectLocationActivity::class.java) ) @@ -243,7 +223,7 @@ } imageAdapter = EditableImageAdapter(this, 3, 13f) - addImageRecyclerView.adapter = imageAdapter + binding.addImageRecyclerView.adapter = imageAdapter imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { selectPicture() @@ -281,7 +261,7 @@ } } - sceneEditView.addTextChangedListener(object : TextWatcher { + binding.sceneEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { } @@ -292,31 +272,31 @@ override fun afterTextChanged(s: Editable?) { val text = s.toString().trim() - inputLengthView.text = String.format("${text.length}/100") + binding.inputLengthView.text = String.format("${text.length}/100") if (text.length > 100) { - inputLengthView.setTextColor(R.color.redTextColor.convertColor(context)) + binding.inputLengthView.setTextColor(R.color.redTextColor.convertColor(context)) "现场情况字符不能超过100个字符".show(context) } else { - inputLengthView.setTextColor(R.color.subTextColor.convertColor(context)) + binding.inputLengthView.setTextColor(R.color.subTextColor.convertColor(context)) } } }) - addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() + binding.addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() - submitButton.setOnClickListener { - val deviceCode = deviceCodeView.text.toString().trim() + binding.submitButton.setOnClickListener { + val deviceCode = binding.deviceCodeView.text.toString().trim() if (deviceCode.isBlank()) { "请输入设备编号".show(context) return@setOnClickListener } - val ownerShip = ownerShipView.text.toString().trim() + val ownerShip = binding.ownerShipView.text.toString().trim() if (ownerShip.isBlank()) { "请输入设备所属项目".show(context) return@setOnClickListener } - val longitude = longitudeView.text.toString().trim() - val latitude = latitudeView.text.toString().trim() + val longitude = binding.longitudeView.text.toString().trim() + val latitude = binding.latitudeView.text.toString().trim() if (longitude.isBlank() || latitude.isBlank()) { "请先获取当前经纬度".show(context) return@setOnClickListener @@ -329,14 +309,14 @@ ) deviceViewModel.addDevice( deviceCode, - deviceNameView.text.toString(), + binding.deviceNameView.text.toString(), ownerShip, - collectIntervalView.text.toString(), + binding.collectIntervalView.text.toString(), longitude, latitude, imagePaths.reformat(), - sceneEditView.text.toString().trim(), - addDeviceTimeView.text.toString(), + binding.sceneEditView.text.toString().trim(), + binding.addDeviceTimeView.text.toString(), userData.id.toString(), userData.deptId ) @@ -345,16 +325,13 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(listOf("拍照", "相册")) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { when (position) { 0 -> { - PictureSelector.create(context) - .openCamera(SelectMimeType.ofImage()) + PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { if (result == null) { @@ -362,8 +339,7 @@ return } LoadingDialogHub.show( - this@AddDeviceActivity, - "图片上传中,请稍后..." + this@AddDeviceActivity, "图片上传中,请稍后..." ) selectedImages = result analyticalSelectResults(result[0]) @@ -374,14 +350,11 @@ } }) } + 1 -> { - PictureSelector.create(context) - .openGallery(SelectMimeType.ofImage()) - .isGif(false) - .isMaxSelectEnabledMask(true) - .setFilterMinFileSize(100) - .setMaxSelectNum(3) - .isDisplayCamera(false) + PictureSelector.create(context).openGallery(SelectMimeType.ofImage()) + .isGif(false).isMaxSelectEnabledMask(true).setFilterMinFileSize(100) + .setMaxSelectNum(3).isDisplayCamera(false) .setImageEngine(GlideLoadEngine.instance) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { @@ -390,8 +363,7 @@ return } LoadingDialogHub.show( - this@AddDeviceActivity, - "图片上传中,请稍后..." + this@AddDeviceActivity, "图片上传中,请稍后..." ) selectedImages = result // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 diff --git a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt index 3864f16..e4f19a4 100644 --- a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.content.Context +import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,19 +11,20 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityBigImageBinding import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager -import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : KotlinBaseActivity() { +class BigImageActivity : KotlinBaseActivity() { - override fun initLayoutView(): Int = R.layout.activity_big_image + override fun initViewBinding(): ActivityBigImageBinding { + return ActivityBigImageBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { PageNavigationManager.addActivity(this) @@ -30,16 +32,16 @@ ImmersionBar.with(this).statusBarDarkFont(false).init() } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) val urls = intent.getStringArrayListExtra(Constant.BIG_IMAGE_INTENT_DATA_KEY) if (urls == null || urls.size == 0) { return } - pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") - imagePagerView.adapter = BigImageAdapter(this, urls) - imagePagerView.currentItem = index - imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + binding.pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + binding.imagePagerView.adapter = BigImageAdapter(this, urls) + binding.imagePagerView.currentItem = index + binding.imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrollStateChanged(state: Int) { } @@ -53,7 +55,8 @@ } override fun onPageSelected(position: Int) { - pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + binding.pageNumberView.text = + String.format("(" + (position + 1) + "/" + urls.size + ")") } }) } @@ -63,7 +66,7 @@ } override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } + binding.leftBackView.setOnClickListener { this.finish() } } class BigImageAdapter(private var context: Context, imageList: ArrayList) : diff --git a/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt b/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt index 072953f..f036a78 100644 --- a/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.graphics.Color +import android.os.Bundle import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -10,6 +11,7 @@ import com.amap.api.services.geocoder.RegeocodeQuery import com.amap.api.services.geocoder.RegeocodeResult import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityDeviceDetailBinding import com.casic.smarttube.extensions.combineImagePath import com.casic.smarttube.extensions.toSignalImage import com.casic.smarttube.model.DeviceDetailModel @@ -25,51 +27,39 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState -import kotlinx.android.synthetic.main.activity_device_detail.densityView -import kotlinx.android.synthetic.main.activity_device_detail.descriptionView -import kotlinx.android.synthetic.main.activity_device_detail.deviceBatteryView -import kotlinx.android.synthetic.main.activity_device_detail.deviceCodeView -import kotlinx.android.synthetic.main.activity_device_detail.deviceNameView -import kotlinx.android.synthetic.main.activity_device_detail.deviceStateView -import kotlinx.android.synthetic.main.activity_device_detail.imageGridView -import kotlinx.android.synthetic.main.activity_device_detail.lastDataView -import kotlinx.android.synthetic.main.activity_device_detail.leftBackView -import kotlinx.android.synthetic.main.activity_device_detail.locationView -import kotlinx.android.synthetic.main.activity_device_detail.projectGroupView -import kotlinx.android.synthetic.main.activity_device_detail.rightOptionView -import kotlinx.android.synthetic.main.activity_device_detail.signalImageView -import kotlinx.android.synthetic.main.activity_device_detail.titleView -class DeviceDetailActivity : KotlinBaseActivity() { +class DeviceDetailActivity : KotlinBaseActivity() { private val kTag = "DeviceDetailActivity" private lateinit var deviceViewModel: DeviceViewModel private lateinit var deviceModel: DeviceDetailModel.DataModel private val geocoderSearch by lazy { GeocodeSearch(this) } - override fun initLayoutView(): Int = R.layout.activity_device_detail + override fun initViewBinding(): ActivityDeviceDetailBinding { + return ActivityDeviceDetailBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "设备详情" - leftBackView.setOnClickListener { finish() } + binding.titleView.text = "设备详情" + binding.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! - deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] deviceViewModel.obtainDeviceDetail(params[0], params[1]) deviceViewModel.deviceDetailModel.observe(this) { if (it.code == 200) { val device = it.data this.deviceModel = device - deviceCodeView.text = device.devcode - deviceNameView.text = device.deviceName - projectGroupView.text = String.format("项目${device.groupId}") + binding.deviceCodeView.text = device.devcode + binding.deviceNameView.text = device.deviceName + binding.projectGroupView.text = String.format("项目${device.groupId}") if (device.latGaode.isBlank() || device.lngGaode.isBlank()) { - locationView.text = "经纬度异常,无法查看具体位置" + binding.locationView.text = "经纬度异常,无法查看具体位置" } else { val queryParam = RegeocodeQuery( LatLonPoint(device.latGaode.toDouble(), device.lngGaode.toDouble()), @@ -81,7 +71,7 @@ GeocodeSearch.OnGeocodeSearchListener { override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { if (rCode == 1000) { - locationView.text = result?.regeocodeAddress?.formatAddress + binding.locationView.text = result?.regeocodeAddress?.formatAddress } } @@ -90,12 +80,12 @@ } }) } - descriptionView.text = device.descn + binding.descriptionView.text = device.descn if (device.photos.toString().isBlank()) { - imageGridView.visibility = View.GONE + binding.imageGridView.visibility = View.GONE } else { - imageGridView.visibility = View.VISIBLE + binding.imageGridView.visibility = View.VISIBLE //处理图片地址 val urls: ArrayList = ArrayList() val imageArray = device.photos.toString().split(",") @@ -104,10 +94,9 @@ urls.add(path.combineImagePath()) } } - val imageAdapter = ReadOnlyImageAdapter(this) - imageAdapter.setImageList(urls) - imageGridView.adapter = imageAdapter - imageGridView.setOnItemClickListener { _, _, position, _ -> + val imageAdapter = ReadOnlyImageAdapter(this, urls) + binding.imageGridView.adapter = imageAdapter + binding.imageGridView.setOnItemClickListener { _, _, position, _ -> if (urls[position].isEmpty()) { "图片加载失败,无法查看大图".show(this) } else { @@ -119,18 +108,18 @@ val value = device.stregnth.toDouble().toInt() val level = "$value%" val ppm = "${value * 500}ppm" - densityView.text = "$level(相当于$ppm)" + binding.densityView.text = "$level(相当于$ppm)" - lastDataView.text = device.uptime + binding.lastDataView.text = device.uptime if (device.onlineState == "0") { - deviceStateView.text = "离线" - deviceStateView.setTextColor(Color.RED) + binding.deviceStateView.text = "离线" + binding.deviceStateView.setTextColor(Color.RED) } else { - deviceStateView.text = "在线" - deviceStateView.setTextColor(Color.GREEN) + binding.deviceStateView.text = "在线" + binding.deviceStateView.setTextColor(Color.GREEN) } - signalImageView.setBackgroundResource(device.rsrp.toSignalImage()) - deviceBatteryView.text = if (device.cell.isNullOrBlank()) { + binding.signalImageView.setBackgroundResource(device.rsrp.toSignalImage()) + binding.deviceBatteryView.text = if (device.cell.isNullOrBlank()) { "0%" } else { device.cell + "%" @@ -149,7 +138,7 @@ } override fun initEvent() { - rightOptionView.setOnClickListener { + binding.rightOptionView.setOnClickListener { val lat = deviceModel.latGaode.toString() val lng = deviceModel.lngGaode.toString() if (lat.isBlank() || lng.isBlank()) { diff --git a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt index 0ae8862..ba52ab8 100644 --- a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.content.Context +import android.os.Bundle import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -8,6 +9,7 @@ import androidx.recyclerview.widget.RecyclerView import com.casic.smarttube.R import com.casic.smarttube.adapter.DeviceListAdapter +import com.casic.smarttube.databinding.ActivityGroupDeviceBinding import com.casic.smarttube.extensions.showEmptyPage import com.casic.smarttube.model.DeviceListModel import com.casic.smarttube.utils.LoadingDialogHub @@ -28,14 +30,8 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.qmuiteam.qmui.recyclerView.QMUIRVItemSwipeAction import com.qmuiteam.qmui.recyclerView.QMUISwipeAction -import kotlinx.android.synthetic.main.activity_group_device.groupDeviceLayout -import kotlinx.android.synthetic.main.activity_group_device.groupDeviceView -import kotlinx.android.synthetic.main.activity_group_device.leftBackView -import kotlinx.android.synthetic.main.activity_group_device.rightOptionView -import kotlinx.android.synthetic.main.activity_group_device.titleView -import kotlinx.android.synthetic.main.include_empty_view.emptyView -class GroupDeviceActivity : KotlinBaseActivity() { +class GroupDeviceActivity : KotlinBaseActivity() { private lateinit var groupId: String private lateinit var weakReferenceHandler: WeakReferenceHandler @@ -51,18 +47,19 @@ private var clickedPosition = 0 private var isDeleteAll = false - override fun initLayoutView(): Int = R.layout.activity_group_device + override fun initViewBinding(): ActivityGroupDeviceBinding { + return ActivityGroupDeviceBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - leftBackView.setOnClickListener { finish() } - rightOptionView.setOnClickListener { + binding.leftBackView.setOnClickListener { finish() } + binding.rightOptionView.setOnClickListener { //改为Popup val easyPopupWindow = EasyPopupWindow(this) easyPopupWindow.setPopupMenuItem( - LocaleConstant.DEVICE_OPERATE_IMAGES, - LocaleConstant.DEVICE_OPERATE_TITLES + LocaleConstant.DEVICE_OPERATE_IMAGES, LocaleConstant.DEVICE_OPERATE_TITLES ) easyPopupWindow.setOnPopupWindowClickListener(object : EasyPopupWindow.OnPopupWindowClickListener { @@ -77,13 +74,11 @@ pageIndex = 1 obtainDeviceListByPage() } + 1 -> { - AlertControlDialog.Builder() - .setContext(context) - .setTitle("提示") + AlertControlDialog.Builder().setContext(context).setTitle("提示") .setMessage("删除后将无法恢复,是否继续?") - .setNegativeButton("容我想想") - .setPositiveButton("已经想好") + .setNegativeButton("容我想想").setPositiveButton("已经想好") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onCancelClick() { @@ -103,13 +98,11 @@ } }).build().show() } + 2 -> { - MultiSelectDialog.Builder() - .setContext(this@GroupDeviceActivity) - .setTitle("选择设备") - .setDataSource(dataBeans) - .setNegativeButton("取消") - .setPositiveButton("选好了") + MultiSelectDialog.Builder().setContext(this@GroupDeviceActivity) + .setTitle("选择设备").setDataSource(dataBeans) + .setNegativeButton("取消").setPositiveButton("选好了") .setOnDialogButtonClickListener(object : MultiSelectDialog.OnDialogButtonClickListener { override fun onConfirmClick(selectedModels: MutableList) { @@ -126,21 +119,20 @@ override fun onCancelClick() { } - }) - .build().show() + }).build().show() } } } }) easyPopupWindow.setBackgroundDrawable(null) - val x: Int = rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(rightOptionView, x, 0) + val x: Int = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { groupId = intent.getStringExtra(Constant.INTENT_PARAM)!! - titleView.text = String.format(groupId + "项目设备列表") + binding.titleView.text = String.format(groupId + "项目设备列表") weakReferenceHandler = WeakReferenceHandler(callback) groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java] deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] @@ -157,13 +149,13 @@ } override fun initEvent() { - groupDeviceLayout.setOnRefreshListener { + binding.groupDeviceLayout.setOnRefreshListener { isRefresh = true //刷新之后页码重置 pageIndex = 1 obtainDeviceListByPage() } - groupDeviceLayout.setOnLoadMoreListener { + binding.groupDeviceLayout.setOnLoadMoreListener { isLoadMore = true pageIndex++ obtainDeviceListByPage() @@ -176,7 +168,7 @@ isRefresh -> { dataBeans.clear() dataBeans = dataRows!! - groupDeviceLayout.finishRefresh() + binding.groupDeviceLayout.finishRefresh() isRefresh = false } @@ -185,7 +177,7 @@ "到底了,别拉了".show(this) } dataBeans.addAll(dataRows!!) - groupDeviceLayout.finishLoadMore() + binding.groupDeviceLayout.finishLoadMore() isLoadMore = false } @@ -211,7 +203,7 @@ ) } if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { pageIndex = 1 obtainDeviceListByPage() } @@ -230,15 +222,15 @@ deviceAdapter.notifyDataSetChanged() } else { if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { pageIndex = 1 obtainDeviceListByPage() } } else { - emptyView!!.hide() + binding.emptyInclude.emptyView.hide() deviceAdapter = DeviceListAdapter(this, dataBeans) //绑定侧滑事件 - swipeAction.attachToRecyclerView(groupDeviceView) + swipeAction.attachToRecyclerView(binding.groupDeviceView) val linearLayoutManager = object : LinearLayoutManager(this) { override fun generateDefaultLayoutParams(): RecyclerView.LayoutParams { return RecyclerView.LayoutParams( @@ -247,8 +239,8 @@ ) } } - groupDeviceView.layoutManager = linearLayoutManager - groupDeviceView.adapter = deviceAdapter + binding.groupDeviceView.layoutManager = linearLayoutManager + binding.groupDeviceView.adapter = deviceAdapter deviceAdapter.setOnItemClickListener(object : DeviceListAdapter.OnItemClickListener { override fun onClicked(position: Int) { @@ -311,13 +303,9 @@ }) private fun deleteItem(adapterPosition: Int) { - AlertControlDialog.Builder() - .setContext(this) - .setTitle("提示") - .setMessage("删除后将无法恢复,是否继续?") - .setNegativeButton("容我想想") - .setPositiveButton("已经想好") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(this).setTitle("提示") + .setMessage("删除后将无法恢复,是否继续?").setNegativeButton("容我想想") + .setPositiveButton("已经想好").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onCancelClick() { diff --git a/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt b/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt index 71f438c..70e49f0 100644 --- a/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt @@ -1,9 +1,11 @@ package com.casic.smarttube.view +import android.os.Bundle import android.view.View import android.widget.AdapterView import androidx.lifecycle.ViewModelProvider import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityHistoryDataBinding import com.casic.smarttube.extensions.dateToMonthDay import com.casic.smarttube.extensions.getQuarterOfYear import com.casic.smarttube.utils.ChartViewHelper @@ -22,27 +24,26 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState -import kotlinx.android.synthetic.main.activity_history_data.dataLineChart -import kotlinx.android.synthetic.main.activity_history_data.leftBackView -import kotlinx.android.synthetic.main.activity_history_data.periodSpinner import java.util.Calendar -class HistoryDataActivity : KotlinBaseActivity() { +class HistoryDataActivity : KotlinBaseActivity() { private val kTag = "HistoryDataActivity" private lateinit var deviceViewModel: DeviceViewModel private lateinit var groupId: String private lateinit var devCode: String - override fun initLayoutView(): Int = R.layout.activity_history_data + override fun initViewBinding(): ActivityHistoryDataBinding { + return ActivityHistoryDataBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - leftBackView.setOnClickListener { finish() } + binding.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! groupId = params[0] devCode = params[1] @@ -61,8 +62,8 @@ override fun initEvent() { //默认选择近7天的数据 - periodSpinner.setSelection(3) - periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + binding.periodSpinner.setSelection(3) + binding.periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onItemSelected( parent: AdapterView<*>?, view: View?, position: Int, id: Long ) { @@ -76,6 +77,7 @@ groupId, devCode, "$year-01-01", time.timestampToCompleteDate() ) } + 1 -> { //本季度 val startDate = when (time.getQuarterOfYear()) { @@ -89,6 +91,7 @@ groupId, devCode, startDate, time.timestampToCompleteDate() ) } + 2 -> { //近30日 deviceViewModel.obtainDeviceHistoryData( @@ -98,6 +101,7 @@ time.timestampToCompleteDate() ) } + 3 -> { //近7日 deviceViewModel.obtainDeviceHistoryData( @@ -107,19 +111,18 @@ time.timestampToCompleteDate() ) } + 4 -> { //今日 deviceViewModel.obtainDeviceHistoryData( groupId, devCode, time.timestampToDate(), time.timestampToCompleteDate() ) } + 5 -> { - DateSelectDialog.Builder() - .setContext(this@HistoryDataActivity) - .setTitle("选择日期") - .setNegativeButton("取消") - .setPositiveButton("选好了") - .setOnDialogButtonClickListener(object : + DateSelectDialog.Builder().setContext(this@HistoryDataActivity) + .setTitle("选择日期").setNegativeButton("取消") + .setPositiveButton("选好了").setOnDialogButtonClickListener(object : DateSelectDialog.OnDialogButtonClickListener { override fun onConfirmClick(startDate: String, endDate: String) { deviceViewModel.obtainDeviceHistoryData( @@ -129,12 +132,10 @@ override fun onCancelClick() { //选择取消就默认加载近7天的数据 - periodSpinner.setSelection(3) + binding.periodSpinner.setSelection(3) } - }) - .setFragmentManager(supportFragmentManager) - .setCalendarType(Type.YEAR_MONTH_DAY) - .build().show() + }).setFragmentManager(supportFragmentManager) + .setCalendarType(Type.YEAR_MONTH_DAY).build().show() } } } @@ -159,7 +160,9 @@ Entry(i.toFloat(), rowsBean.stregnth!!.toFloat(), "浓度") ) } - ChartViewHelper.setLineChartData(dataLineChart, xAxisLabels, strengthEntries) + ChartViewHelper.setLineChartData( + binding.dataLineChart, xAxisLabels, strengthEntries + ) } } } diff --git a/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt b/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt index ebca433..f947b2c 100644 --- a/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt @@ -1,7 +1,8 @@ package com.casic.smarttube.view +import android.os.Bundle import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityLoginBinding import com.casic.smarttube.utils.AuthenticationHelper import com.casic.smarttube.utils.LoadingDialogHub import com.casic.smarttube.utils.LocaleConstant @@ -14,26 +15,29 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues -import kotlinx.android.synthetic.main.activity_login.loginButton -import kotlinx.android.synthetic.main.activity_login.userNameView -import kotlinx.android.synthetic.main.activity_login.userPasswordView -class LoginActivity : KotlinBaseActivity() { +class LoginActivity : KotlinBaseActivity() { private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginViewModel: LoginViewModel private lateinit var userViewModel: UserViewModel - override fun initLayoutView(): Int = R.layout.activity_login + override fun initViewBinding(): ActivityLoginBinding { + return ActivityLoginBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(true).init() } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { // 设置默认账号密码 - userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) - userPasswordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + binding.userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + binding.userPasswordView.setText( + SaveKeyValues.getValue( + LocaleConstant.PASSWORD, "" + ) as String + ) authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] @@ -50,9 +54,9 @@ } override fun initEvent() { - loginButton.setOnClickListener { - val account = userNameView.text.toString().trim() - val userPassword = userPasswordView.text.toString().trim() + binding.loginButton.setOnClickListener { + val account = binding.userNameView.text.toString().trim() + val userPassword = binding.userPasswordView.text.toString().trim() if (account.isBlank()) { "用户名不能为空".show(this) return@setOnClickListener @@ -74,8 +78,8 @@ AuthenticationHelper.savePublicKey(keyString) val publicKey = RSAUtils.keyStrToPublicKey(keyString) - val account = userNameView.text.toString() - val userPassword = userPasswordView.text.toString() + val account = binding.userNameView.text.toString() + val userPassword = binding.userPasswordView.text.toString() val dataByPublicKey = RSAUtils.encryptDataByPublicKey(userPassword.toByteArray(), publicKey!!) //登录并获取Token,POST请求 diff --git a/app/src/main/java/com/casic/smarttube/view/MainActivity.kt b/app/src/main/java/com/casic/smarttube/view/MainActivity.kt index 4461757..575e1ee 100644 --- a/app/src/main/java/com/casic/smarttube/view/MainActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/MainActivity.kt @@ -1,5 +1,6 @@ package com.casic.smarttube.view +import android.os.Bundle import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment @@ -7,6 +8,7 @@ import androidx.fragment.app.FragmentPagerAdapter import androidx.viewpager.widget.ViewPager import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityMainBinding import com.casic.smarttube.fragment.HomePageFragment import com.casic.smarttube.fragment.MinePageFragment import com.casic.smarttube.fragment.OverviewFragment @@ -15,9 +17,8 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_main.* -class MainActivity : KotlinBaseActivity() { +class MainActivity : KotlinBaseActivity() { private var menuItem: MenuItem? = null private var fragmentList: MutableList = ArrayList() @@ -29,32 +30,36 @@ fragmentList.add(MinePageFragment()) } - override fun initLayoutView(): Int = R.layout.activity_main + override fun initViewBinding(): ActivityMainBinding { + return ActivityMainBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { //保留icon原图颜色 - bottomNavigation.itemIconTintList = null - bottomNavigation.setOnItemSelectedListener { menuItem -> + binding.bottomNavigation.itemIconTintList = null + binding.bottomNavigation.setOnItemSelectedListener { menuItem -> when (menuItem.itemId) { R.id.nav_home -> { - mainViewPager.currentItem = 0 + binding.mainViewPager.currentItem = 0 } + R.id.nav_overview -> { - mainViewPager.currentItem = 1 + binding.mainViewPager.currentItem = 1 } + R.id.nav_mine -> { - mainViewPager.currentItem = 2 + binding.mainViewPager.currentItem = 2 } } false } - mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) - mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 + binding.mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + binding.mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun observeRequestState() { @@ -62,7 +67,7 @@ } override fun initEvent() { - mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + binding.mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrollStateChanged(state: Int) { } @@ -77,9 +82,9 @@ if (menuItem != null) { menuItem!!.isChecked = false } else { - bottomNavigation.menu.getItem(0).isChecked = false + binding.bottomNavigation.menu.getItem(0).isChecked = false } - menuItem = bottomNavigation.menu.getItem(position) + menuItem = binding.bottomNavigation.menu.getItem(position) menuItem!!.isChecked = true } }) diff --git a/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt b/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt index f00e0ca..908aade 100644 --- a/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt @@ -15,6 +15,7 @@ import com.amap.api.services.geocoder.RegeocodeQuery import com.amap.api.services.geocoder.RegeocodeResult import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityMapDeviceBriefBinding import com.casic.smarttube.utils.LoadingDialogHub import com.casic.smarttube.utils.RouteOnMap import com.casic.smarttube.vm.DeviceViewModel @@ -24,16 +25,8 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState -import kotlinx.android.synthetic.main.activity_map_device_brief.deviceCodeView -import kotlinx.android.synthetic.main.activity_map_device_brief.deviceModelView -import kotlinx.android.synthetic.main.activity_map_device_brief.deviceValueView -import kotlinx.android.synthetic.main.activity_map_device_brief.locationView -import kotlinx.android.synthetic.main.activity_map_device_brief.mapView -import kotlinx.android.synthetic.main.activity_map_device_brief.updateTimeView -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -class MapDeviceBriefActivity : KotlinBaseActivity() { +class MapDeviceBriefActivity : KotlinBaseActivity() { private val kTag = "MapDeviceBriefActivity" private lateinit var deviceViewModel: DeviceViewModel @@ -42,17 +35,19 @@ private val geocoderSearch by lazy { GeocodeSearch(this) } - override fun initLayoutView(): Int = R.layout.activity_map_device_brief + override fun initViewBinding(): ActivityMapDeviceBriefBinding { + return ActivityMapDeviceBriefBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "设备最新数据地图展示" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "设备最新数据地图展示" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { - aMap = mapView.map + override fun initOnCreate(savedInstanceState: Bundle?) { + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val uiSettings = aMap.uiSettings uiSettings.isCompassEnabled = true @@ -80,22 +75,22 @@ if (it.code == 200) { val device = it.data - deviceCodeView.text = String.format("设备编号: ${device.devcode}") - deviceModelView.text = String.format("设备模型: ${params[2]}") + binding.deviceCodeView.text = String.format("设备编号: ${device.devcode}") + binding.deviceModelView.text = String.format("设备模型: ${params[2]}") //获取设备最新浓度信息 deviceViewModel.obtainTubeLastData(device.groupId, device.devcode) deviceViewModel.lastDataModel.observe(this) { v -> if (v.code == 200) { - deviceValueView.text = String.format("最新浓度: ${v.data.strength}") - updateTimeView.text = String.format("更新时间: ${v.data.uptime}") + binding.deviceValueView.text = String.format("最新浓度: ${v.data.strength}") + binding.updateTimeView.text = String.format("更新时间: ${v.data.uptime}") } else { - deviceValueView.text = String.format("最新浓度: 未知") - updateTimeView.text = String.format("更新时间: 未知") + binding.deviceValueView.text = String.format("最新浓度: 未知") + binding.updateTimeView.text = String.format("更新时间: 未知") } } if (device.latGaode.isBlank() || device.lngGaode.isBlank()) { - locationView.text = "经纬度异常,无法查看具体位置" + binding.locationView.text = "经纬度异常,无法查看具体位置" } else { val queryParam = RegeocodeQuery( LatLonPoint(device.latGaode.toDouble(), device.lngGaode.toDouble()), @@ -108,7 +103,7 @@ GeocodeSearch.OnGeocodeSearchListener { override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { if (rCode == 1000) { - locationView.text = + binding.locationView.text = String.format("详细位置: ${result?.regeocodeAddress?.formatAddress}") } } @@ -123,8 +118,7 @@ aMap.animateCamera(newCameraPosition, 1500, object : AMap.CancelableCallback { override fun onFinish() { //添加Marker - val markerOptions = MarkerOptions() - .position(latLng) + val markerOptions = MarkerOptions().position(latLng) .icon(BitmapDescriptorFactory.fromResource(R.mipmap.well_location)) .draggable(false) aMap.addMarker(markerOptions) @@ -148,26 +142,26 @@ /**地图相关*********/ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - mapView.onCreate(savedInstanceState) + binding.mapView.onCreate(savedInstanceState) } override fun onResume() { super.onResume() - mapView.onResume() + binding.mapView.onResume() } override fun onPause() { super.onPause() - mapView.onPause() + binding.mapView.onPause() } override fun onDestroy() { - mapView.onDestroy() + binding.mapView.onDestroy() super.onDestroy() } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - mapView.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/view/PermissionActivity.kt b/app/src/main/java/com/casic/smarttube/view/PermissionActivity.kt index e872ef4..fc20978 100644 --- a/app/src/main/java/com/casic/smarttube/view/PermissionActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/PermissionActivity.kt @@ -13,7 +13,6 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。 if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) { startSplashScreenActivity() } else { diff --git a/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt b/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt index c639105..bb0b0ed 100644 --- a/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt @@ -13,33 +13,35 @@ import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.MyLocationStyle import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivitySelectLocationBinding import com.casic.smarttube.utils.CenterMarkerView import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_select_location.* -class SelectLocationActivity : KotlinBaseActivity(), AMap.OnMyLocationChangeListener, - OnMapLoadedListener, OnCameraChangeListener { +class SelectLocationActivity : KotlinBaseActivity(), + AMap.OnMyLocationChangeListener, OnMapLoadedListener, OnCameraChangeListener { private val kTag = "SelectLocationActivity" private lateinit var latLng: LatLng private lateinit var aMap: AMap private lateinit var centerMarkerView: CenterMarkerView - override fun initLayoutView(): Int = R.layout.activity_select_location + override fun initViewBinding(): ActivitySelectLocationBinding { + return ActivitySelectLocationBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "手动选点" - leftBackView.setOnClickListener { finish() } + binding.titleView.text = "手动选点" + binding.leftBackView.setOnClickListener { finish() } } - override fun initData() { - aMap = mapView.map + override fun initOnCreate(savedInstanceState: Bundle?) { + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val locationStyle = MyLocationStyle() //定位一次,且将视角移动到地图中心点 @@ -76,7 +78,7 @@ aMap.setOnMapLoadedListener(this) aMap.setOnCameraChangeListener(this) - rightOperateView.setOnClickListener { + binding.rightOperateView.setOnClickListener { val intent = Intent() intent.putExtra("longitude", latLng.longitude.toString()) intent.putExtra("latitude", latLng.latitude.toString()) @@ -110,27 +112,27 @@ /**地图相关*********/ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - mapView.onCreate(savedInstanceState) + binding.mapView.onCreate(savedInstanceState) } override fun onResume() { super.onResume() - mapView.onResume() + binding.mapView.onResume() } override fun onPause() { super.onPause() - mapView.onPause() + binding.mapView.onPause() } override fun onDestroy() { centerMarkerView.destroy() - mapView.onDestroy() + binding.mapView.onDestroy() super.onDestroy() } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - mapView.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/smarttube/view/SplashScreenActivity.kt index dafbe4d..baf5222 100644 --- a/app/src/main/java/com/casic/smarttube/view/SplashScreenActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/SplashScreenActivity.kt @@ -1,16 +1,17 @@ package com.casic.smarttube.view import android.annotation.SuppressLint +import android.os.Bundle import android.os.CountDownTimer import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivitySplashBinding import com.casic.smarttube.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo @SuppressLint("CustomSplashScreen") -class SplashScreenActivity : KotlinBaseActivity() { +class SplashScreenActivity : KotlinBaseActivity() { private lateinit var userDetailViewModel: UserViewModel private val countDownTimer = object : CountDownTimer(1000, 500) { @@ -34,13 +35,15 @@ } } - override fun initLayoutView(): Int = R.layout.activity_splash + override fun initViewBinding(): ActivitySplashBinding { + return ActivitySplashBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { userDetailViewModel = ViewModelProvider(this).get(UserViewModel::class.java) } diff --git a/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt b/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt index 23d1ac1..ae7df77 100644 --- a/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt +++ b/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt @@ -6,14 +6,19 @@ import android.view.Gravity import androidx.fragment.app.FragmentManager import com.casic.smarttube.R +import com.casic.smarttube.databinding.DialogSelectDateBinding import com.casic.smarttube.utils.LocaleConstant import com.jzxiang.pickerview.TimePickerDialog import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.* -import kotlinx.android.synthetic.main.dialog_select_date.* +import com.pengxh.kt.lite.extensions.binding +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.resetParams +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.extensions.timestampToTime import java.text.ParseException import java.text.SimpleDateFormat -import java.util.* +import java.util.Locale class DateSelectDialog private constructor(builder: Builder) : Dialog( builder.context, R.style.UserDefinedDialogStyle @@ -76,6 +81,8 @@ } } + private val binding: DialogSelectDateBinding by binding() + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) this.resetParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.85) @@ -84,10 +91,10 @@ setCanceledOnTouchOutside(false) if (title.isNotBlank()) { - dialogTitleView.text = title + binding.dialogTitleView.text = title } - startDateView.setOnClickListener { + binding.startDateView.setOnClickListener { TimePickerDialog.Builder() .setThemeColor(R.color.mainThemeColor.convertColor(ctx)) .setTitleStringId("请选择起始时间") @@ -102,11 +109,11 @@ } else { millSeconds.timestampToCompleteDate() } - startDateView.setText(textValue) + binding.startDateView.setText(textValue) }.build().show(fragmentManager, "DateSelectDialog") } - endDateView.setOnClickListener { + binding.endDateView.setOnClickListener { TimePickerDialog.Builder() .setThemeColor(R.color.mainThemeColor.convertColor(ctx)) .setTitleStringId("请选择起始时间") @@ -121,21 +128,21 @@ } else { millSeconds.timestampToCompleteDate() } - endDateView.setText(textValue) + binding.endDateView.setText(textValue) }.build().show(fragmentManager, "DateSelectDialog") } - dialogCancelButton.text = negativeBtn - dialogCancelButton.setOnClickListener { + binding.dialogCancelButton.text = negativeBtn + binding.dialogCancelButton.setOnClickListener { listener.onCancelClick() this.dismiss() } - dialogConfirmButton.text = positiveBtn - dialogConfirmButton.setOnClickListener { + binding.dialogConfirmButton.text = positiveBtn + binding.dialogConfirmButton.setOnClickListener { //判断其实时间和结束时间 - val startDate = startDateView.text.toString() - val endDate = endDateView.text.toString() + val startDate = binding.startDateView.text.toString() + val endDate = binding.endDateView.text.toString() if (isEarlierThanStart(startDate, endDate)) { "结束时间不能早于开始时间".show(ctx) return@setOnClickListener diff --git a/app/src/main/java/com/casic/smarttube/widgets/MultiSelectDialog.kt b/app/src/main/java/com/casic/smarttube/widgets/MultiSelectDialog.kt index 7e3a63e..cb9316d 100644 --- a/app/src/main/java/com/casic/smarttube/widgets/MultiSelectDialog.kt +++ b/app/src/main/java/com/casic/smarttube/widgets/MultiSelectDialog.kt @@ -8,9 +8,10 @@ import androidx.recyclerview.widget.RecyclerView import com.casic.smarttube.R import com.casic.smarttube.adapter.DialogDeviceListAdapter +import com.casic.smarttube.databinding.DialogMultiSelectBinding import com.casic.smarttube.model.DeviceListModel +import com.pengxh.kt.lite.extensions.binding import com.pengxh.kt.lite.extensions.resetParams -import kotlinx.android.synthetic.main.dialog_multi_select.* class MultiSelectDialog private constructor(builder: Builder) : Dialog( builder.activity, R.style.UserDefinedDialogStyle @@ -67,6 +68,8 @@ } } + private val binding: DialogMultiSelectBinding by binding() + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) this.resetParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.85) @@ -75,21 +78,25 @@ setCanceledOnTouchOutside(false) if (title.isNotBlank()) { - dialogTitleView.text = title + binding.dialogTitleView.text = title } val dialogDeviceListAdapter = DialogDeviceListAdapter(act, dataModels) - dataRecyclerView.addItemDecoration(DividerItemDecoration(act, RecyclerView.VERTICAL)) - dataRecyclerView.adapter = dialogDeviceListAdapter + binding.dataRecyclerView.addItemDecoration( + DividerItemDecoration( + act, RecyclerView.VERTICAL + ) + ) + binding.dataRecyclerView.adapter = dialogDeviceListAdapter - dialogCancelButton.text = negativeBtn - dialogCancelButton.setOnClickListener { + binding.dialogCancelButton.text = negativeBtn + binding.dialogCancelButton.setOnClickListener { listener.onCancelClick() this.dismiss() } - dialogConfirmButton.text = positiveBtn - dialogConfirmButton.setOnClickListener { + binding.dialogConfirmButton.text = positiveBtn + binding.dialogConfirmButton.setOnClickListener { // 处理数据 listener.onConfirmClick(dialogDeviceListAdapter.selectedModels) this.dismiss() diff --git a/app/src/main/res/layout/activity_about_us.xml b/app/src/main/res/layout/activity_about_us.xml index c67a714..69dc539 100644 --- a/app/src/main/res/layout/activity_about_us.xml +++ b/app/src/main/res/layout/activity_about_us.xml @@ -7,7 +7,9 @@ android:orientation="vertical" tools:context=".view.AboutUsActivity"> - + variant.outputs.configureEach { outputFileName = "GT_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" @@ -61,7 +62,7 @@ dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.5' implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.6.1' diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cccda6d..fd9277c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,7 +81,7 @@ + android:value="a6907c8bb931727374aa5fd500cda107" /> (), Handler.Callback, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { private val kTag = "HomePageFragment" private val geocoderSearch by lazy { GeocodeSearch(requireContext()) } - private lateinit var homeView: View private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var easyPopupWindow: EasyPopupWindow private lateinit var aMap: AMap private lateinit var deviceViewModel: DeviceViewModel private lateinit var groupViewModel: ProjectGroupViewModel @@ -83,34 +89,34 @@ * */ private var mapZooms = ArrayList() - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View { - homeView = inflater.inflate(R.layout.fragment_home, container, false) + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } - weakReferenceHandler = WeakReferenceHandler(callback) - val easyPopupWindow = EasyPopupWindow(requireContext()) - easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) - homeView.rightOptionView.setOnClickListener { - easyPopupWindow.setOnPopupWindowClickListener(object : - EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - easyPopupWindow.setBackgroundDrawable(null) - val x: Int = homeView.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(homeView.rightOptionView, x, 0) + override fun setupTopBarLayout() { + + } + + override fun observeRequestState() { + groupViewModel.loadState.observe(this) { state -> + when (state) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") + else -> LoadingDialogHub.dismiss() + } } + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + weakReferenceHandler = WeakReferenceHandler(this) + + easyPopupWindow = EasyPopupWindow(requireContext()) + easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) //初始化vm - deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) - groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) - - observeRequestState() + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java] //默认数据 groupViewModel.obtainProGroupList() @@ -119,12 +125,8 @@ mapZooms.add(13f) initMap(savedInstanceState) - homeView.addDeviceButton.setOnClickListener { - requireContext().navigatePageTo() - } - //数据监听 - deviceViewModel.mapDeviceModel.observe(this, { + deviceViewModel.mapDeviceModel.observe(this) { if (it.code == 200) { if (allMarkerOptions.isNotEmpty()) { allMarkerOptions.clear() @@ -149,10 +151,8 @@ longitudeList.add(longitude) //将所有设备信息转化缓存为Marker点 allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(device.devcode) - .snippet(device.modelName) + MarkerOptions().position(LatLng(latitude, longitude)) + .title(device.devcode).snippet(device.modelName) ) } } @@ -160,8 +160,8 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 13f) } - }) - groupViewModel.groupModel.observe(this, { + } + groupViewModel.groupModel.observe(this) { if (it.code == 200) { val dataRows = it.data when { @@ -170,14 +170,15 @@ dataBeans = dataRows!! isRefresh = false } + else -> { dataBeans = dataRows!! } } weakReferenceHandler.sendEmptyMessage(2022090201) } - }) - groupViewModel.groupDeviceModel.observe(this, { + } + groupViewModel.groupDeviceModel.observe(this) { if (it.code == 200) { val latitudeList: MutableList = ArrayList() val longitudeList: MutableList = ArrayList() @@ -199,22 +200,33 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 16f) } - }) - return homeView + } } - private fun observeRequestState() { - groupViewModel.loadState.observe(this, { state -> - when (state) { - LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") - else -> LoadingDialogHub.dismiss() - } - }) + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + easyPopupWindow.setOnPopupWindowClickListener(object : + EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + easyPopupWindow.setBackgroundDrawable(null) + val x: Int = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + binding.addDeviceButton.setOnClickListener { + requireContext().navigatePageTo() + } } override fun onResume() { super.onResume() - homeView.mapView.onResume() + binding.mapView.onResume() //获取所有设备数据 deviceViewModel.obtainMapDeviceList() @@ -222,16 +234,16 @@ groupViewModel.obtainProGroupList() } - private val callback = Handler.Callback { - if (it.what == 2022090201) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022090201) { if (isRefresh) { groupListAdapter.notifyDataSetChanged() } else { groupListAdapter = GroupListAdapter(requireContext(), dataBeans) - homeView.homeRecyclerView!!.addItemDecoration( + binding.homeRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - homeView.homeRecyclerView!!.adapter = groupListAdapter + binding.homeRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : GroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { @@ -241,12 +253,12 @@ }) } } - true + return true } private fun initMap(savedInstanceState: Bundle?) { - homeView.mapView.onCreate(savedInstanceState) - aMap = homeView.mapView.map + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val uiSettings = aMap.uiSettings uiSettings.isCompassEnabled = true @@ -322,10 +334,7 @@ if (!isInRange) { clustersMarkers.add( GaoDeClusterMarkerView( - requireContext(), - it, - proj, - LocaleConstant.RADIUS_SIZE + requireContext(), it, proj, LocaleConstant.RADIUS_SIZE ) )//相距多少才聚合 } @@ -363,9 +372,7 @@ //绑定数据 val clickedLatLng = marker?.position!! for (device in deviceModels) { - if (clickedLatLng.latitude == device.latGaode!!.toDouble() - && clickedLatLng.longitude == device.lngGaode!!.toDouble() - ) { + if (clickedLatLng.latitude == device.latGaode!!.toDouble() && clickedLatLng.longitude == device.lngGaode!!.toDouble()) { deviceCodeView.text = String.format("设备编号: ${device.devcode}") deviceModelView.text = String.format("设备模型: ${device.modelName}") //获取设备最新浓度信息 @@ -395,8 +402,7 @@ val address = result?.regeocodeAddress?.formatAddress val temp = StringBuilder() if (address!!.length > 16) { - temp.append(address.substring(0, 14)) - .append("\r\n") + temp.append(address.substring(0, 14)).append("\r\n") .append(address.substring(16)) } else { temp.append(address) @@ -430,9 +436,7 @@ } } //查看聚合点,单独开页面导航过去 - BottomActionSheet.Builder() - .setContext(requireContext()) - .setActionItemTitle(multiDevice) + BottomActionSheet.Builder().setContext(requireContext()).setActionItemTitle(multiDevice) .setItemTextColor(Color.BLUE) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { @@ -455,12 +459,8 @@ override fun onInfoWindowClick(p0: Marker?) { if (p0 != null) { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -487,16 +487,16 @@ 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 onDestroy() { super.onDestroy() - homeView.mapView.onDestroy() + binding.mapView.onDestroy() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt index a4e964c..cc35197 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt @@ -4,11 +4,15 @@ import android.content.Intent import android.net.Uri import android.os.Build +import android.os.Bundle import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider import com.casic.smarttube.BuildConfig import com.casic.smarttube.R +import com.casic.smarttube.databinding.FragmentMineBinding import com.casic.smarttube.extensions.appendDownloadUrl import com.casic.smarttube.model.UserDetailModel import com.casic.smarttube.utils.AuthenticationHelper @@ -36,22 +40,10 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.ChangePasswordDialog -import kotlinx.android.synthetic.main.fragment_mine.aboutUsLayout -import kotlinx.android.synthetic.main.fragment_mine.cacheSizeView -import kotlinx.android.synthetic.main.fragment_mine.changePwdLayout -import kotlinx.android.synthetic.main.fragment_mine.clearCacheLayout -import kotlinx.android.synthetic.main.fragment_mine.loginOutButton -import kotlinx.android.synthetic.main.fragment_mine.updateLogLayout -import kotlinx.android.synthetic.main.fragment_mine.updateUserButton -import kotlinx.android.synthetic.main.fragment_mine.updateVersionLayout -import kotlinx.android.synthetic.main.fragment_mine.userDeptView -import kotlinx.android.synthetic.main.fragment_mine.userImageView -import kotlinx.android.synthetic.main.fragment_mine.userNameView -import kotlinx.android.synthetic.main.fragment_mine.userPhoneView import java.io.File import java.nio.charset.StandardCharsets -class MinePageFragment : KotlinBaseFragment() { +class MinePageFragment : KotlinBaseFragment() { private val kTag = "MinePageFragment" private lateinit var userData: UserDetailModel.Data @@ -60,13 +52,17 @@ private lateinit var versionViewModel: VersionViewModel private lateinit var progressDialog: ProgressDialog - override fun initLayoutView(): Int = R.layout.fragment_mine + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentMineBinding { + return FragmentMineBinding.inflate(inflater, container, false) + } override fun setupTopBarLayout() { } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java] @@ -98,8 +94,7 @@ versionViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show( - requireActivity(), - "检查版本中,请稍后" + requireActivity(), "检查版本中,请稍后" ) else -> LoadingDialogHub.dismiss() @@ -108,49 +103,45 @@ } override fun initEvent() { - userImageView.setOnClickListener { + binding.userImageView.setOnClickListener { "尽情期待~".show(requireContext()) } - updateUserButton.setOnClickListener { + binding.updateUserButton.setOnClickListener { LoadingDialogHub.show(requireActivity(), "同步中,请稍后...") userViewModel.obtainUserDetail() } - changePwdLayout.setOnClickListener { - ChangePasswordDialog.Builder() - .setContext(requireContext()) + binding.changePwdLayout.setOnClickListener { + ChangePasswordDialog.Builder().setContext(requireContext()) .setOnDialogButtonClickListener(object : ChangePasswordDialog.OnDialogButtonClickListener { override fun onConfirmClick(oldPwd: String, newPwd: String) { - val publicKey = - RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! val oldPassKey = RSAUtils.encryptDataByPublicKey( - oldPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + oldPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) val newPassKey = RSAUtils.encryptDataByPublicKey( - newPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + newPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) userViewModel.changePassword(oldPassKey, newPassKey) } }).build().show() } - aboutUsLayout.setOnClickListener { + binding.aboutUsLayout.setOnClickListener { requireContext().navigatePageTo() } - updateVersionLayout.setOnClickListener { + binding.updateVersionLayout.setOnClickListener { versionViewModel.updateVersion() } - updateLogLayout.setOnClickListener { + binding.updateLogLayout.setOnClickListener { "尽情期待~".show(requireContext()) } - clearCacheLayout.setOnClickListener { + binding.clearCacheLayout.setOnClickListener { //删除缓存之后在设置缓存大小 LoadingDialogHub.show(requireActivity(), "清理中,请稍后") File(requireContext().cacheDir.path).deleteFile() @@ -161,18 +152,14 @@ override fun onFinish() { LoadingDialogHub.dismiss() - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() } }.start() } - loginOutButton.setOnClickListener { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("退出登录") - .setMessage("确定要退出吗?") - .setNegativeButton("取消") - .setPositiveButton("确定") + binding.loginOutButton.setOnClickListener { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("退出登录") + .setMessage("确定要退出吗?").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -203,13 +190,9 @@ if (BuildConfig.VERSION_NAME == it.version) { "已是最新版本,无需更新".show(requireContext()) } else { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("提示") - .setMessage("有新版本,是否更新?") - .setNegativeButton("稍后再说") - .setPositiveButton("立即下载") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(requireContext()).setTitle("提示") + .setMessage("有新版本,是否更新?").setNegativeButton("稍后再说") + .setPositiveButton("立即下载").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { downloadApk(it.downloadUrl) @@ -244,7 +227,7 @@ updateUserInfo() } //缓存 - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() super.onResume() } @@ -258,9 +241,9 @@ // R.color.mainThemeColor.convertColor(requireContext()) // ) // userImageView.setImageDrawable(roundDrawable) - userNameView.text = userData.name - userPhoneView.text = String.format("电话:${userData.phone}") - userDeptView.text = String.format("部门:${userData.deptName}") + binding.userNameView.text = userData.name + binding.userPhoneView.text = String.format("电话:${userData.phone}") + binding.userDeptView.text = String.format("部门:${userData.deptName}") } private fun downloadApk(url: String?) { @@ -275,7 +258,8 @@ * */ val downloadPath = url!!.appendDownloadUrl() //开始下载 - downloadPath.downloadFile(requireContext().createDownloadFileDir().toString(), + downloadPath.downloadFile( + requireContext().createDownloadFileDir().toString(), object : OnDownloadListener { override fun onDownloadStart(totalBytes: Long) { progressDialog.max = totalBytes.toInt() diff --git a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt index b009850..c0afcc5 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt @@ -1,8 +1,11 @@ package com.casic.smarttube.fragment +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R import com.casic.smarttube.adapter.OverviewGroupListAdapter +import com.casic.smarttube.databinding.FragmentOverviewBinding import com.casic.smarttube.extensions.showEmptyPage import com.casic.smarttube.model.ProjectGroupModel import com.casic.smarttube.view.GroupDeviceActivity @@ -11,25 +14,25 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.widget.dialog.AlertInputDialog -import kotlinx.android.synthetic.main.fragment_overview.groupRecyclerView -import kotlinx.android.synthetic.main.fragment_overview.rightOptionView -import kotlinx.android.synthetic.main.fragment_overview.titleView -import kotlinx.android.synthetic.main.include_empty_view.emptyView -class OverviewFragment : KotlinBaseFragment() { +class OverviewFragment : KotlinBaseFragment() { private lateinit var groupViewModel: ProjectGroupViewModel private var dataBeans: MutableList = ArrayList() private lateinit var groupListAdapter: OverviewGroupListAdapter private var clickedPosition = 0 - override fun initLayoutView(): Int = R.layout.fragment_overview - - override fun setupTopBarLayout() { - titleView.text = "概览" + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentOverviewBinding { + return FragmentOverviewBinding.inflate(inflater, container, false) } - override fun initData() { + override fun setupTopBarLayout() { + binding.titleView.text = "概览" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) } @@ -43,7 +46,7 @@ } override fun initEvent() { - rightOptionView.setOnClickListener { + binding.rightOptionView.setOnClickListener { groupViewModel.obtainProGroupList() "刷新数据中,请稍后".show(requireContext()) } @@ -51,16 +54,16 @@ groupViewModel.groupModel.observe(this) { if (it.code == 200) { if (it.data.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { groupViewModel.obtainProGroupList() } } else { - emptyView!!.hide() + binding.emptyInclude.emptyView.hide() dataBeans.clear() dataBeans = it.data groupListAdapter = OverviewGroupListAdapter(requireContext(), it.data) - groupRecyclerView!!.adapter = groupListAdapter + binding.groupRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : OverviewGroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { diff --git a/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt b/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt index e424721..7f036b0 100644 --- a/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt +++ b/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt @@ -4,8 +4,8 @@ import android.graphics.Color import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.Poi -import com.pengxh.kt.lite.extensions.showBusRouteOnMap -import com.pengxh.kt.lite.extensions.showRouteOnMap +import com.casic.smarttube.extensions.showBusRouteOnMap +import com.casic.smarttube.extensions.showRouteOnMap import com.pengxh.kt.lite.widget.dialog.BottomActionSheet object RouteOnMap { diff --git a/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt b/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt index 65bba6f..598581a 100644 --- a/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt @@ -1,27 +1,29 @@ package com.casic.smarttube.view +import android.os.Bundle import com.casic.smarttube.BuildConfig import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityAboutUsBinding import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_about_us.* -import kotlinx.android.synthetic.main.include_base_title.* -class AboutUsActivity : KotlinBaseActivity() { +class AboutUsActivity : KotlinBaseActivity() { - override fun initLayoutView(): Int = R.layout.activity_about_us + override fun initViewBinding(): ActivityAboutUsBinding { + return ActivityAboutUsBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "关于我们" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "关于我们" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { - versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + override fun initOnCreate(savedInstanceState: Bundle?) { + binding.versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") } override fun observeRequestState() { diff --git a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt index 415f9dd..80b83bd 100644 --- a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.content.Intent import android.graphics.Color +import android.os.Bundle import android.os.CountDownTimer import android.os.Handler import android.text.Editable @@ -15,6 +16,7 @@ import com.amap.api.location.AMapLocation import com.casic.smarttube.R import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.smarttube.databinding.ActivityAddDeviceBinding import com.casic.smarttube.extensions.combineImagePath import com.casic.smarttube.extensions.compressImage import com.casic.smarttube.extensions.isNumber @@ -47,24 +49,9 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_add_device.addDeviceTimeView -import kotlinx.android.synthetic.main.activity_add_device.addImageRecyclerView -import kotlinx.android.synthetic.main.activity_add_device.collectIntervalView -import kotlinx.android.synthetic.main.activity_add_device.deviceCodeView -import kotlinx.android.synthetic.main.activity_add_device.deviceNameView -import kotlinx.android.synthetic.main.activity_add_device.inputLengthView -import kotlinx.android.synthetic.main.activity_add_device.latitudeView -import kotlinx.android.synthetic.main.activity_add_device.locationImageView -import kotlinx.android.synthetic.main.activity_add_device.longitudeView -import kotlinx.android.synthetic.main.activity_add_device.ownerShipView -import kotlinx.android.synthetic.main.activity_add_device.scannerView -import kotlinx.android.synthetic.main.activity_add_device.sceneEditView -import kotlinx.android.synthetic.main.activity_add_device.submitButton -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView import java.io.File -class AddDeviceActivity : KotlinBaseActivity() { +class AddDeviceActivity : KotlinBaseActivity() { private val kTag = "AddDeviceActivity" private lateinit var imageAdapter: EditableImageAdapter @@ -81,21 +68,23 @@ registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK) { val data = result.data!! - longitudeView.text = data.getStringExtra("longitude") - latitudeView.text = data.getStringExtra("latitude") + binding.longitudeView.text = data.getStringExtra("longitude") + binding.latitudeView.text = data.getStringExtra("latitude") } } - override fun initLayoutView(): Int = R.layout.activity_add_device + override fun initViewBinding(): ActivityAddDeviceBinding { + return ActivityAddDeviceBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "添加设备" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "添加设备" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { weakReferenceHandler = WeakReferenceHandler(callback) uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] @@ -119,17 +108,17 @@ override fun initEvent() { val manager = QrManager.getInstance().init(QrConfigCreator.create(this)) - scannerView.setOnClickListener { + binding.scannerView.setOnClickListener { manager.startScan(this) { if (it.content.isNumber()) { - deviceCodeView.setText(it.content) + binding.deviceCodeView.setText(it.content) } else { "设备编号错误,请检查标签".show(context) } } } - ownerShipView.setOnClickListener { + binding.ownerShipView.setOnClickListener { groupViewModel.obtainGroupList() } groupViewModel.groupListModel.observe(this) { @@ -147,19 +136,14 @@ groups.add("自定义") } if (groups.isNotEmpty()) { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(groups) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { if (groups[position] == "自定义") { - AlertInputDialog.Builder() - .setContext(context) - .setTitle("提示") + AlertInputDialog.Builder().setContext(context).setTitle("提示") .setHintMessage("请输入该设备所属项目名,如:项目203") - .setNegativeButton("取消") - .setPositiveButton("确定") + .setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertInputDialog.OnDialogButtonClickListener { override fun onCancelClick() { @@ -167,12 +151,11 @@ } override fun onConfirmClick(value: String) { - ownerShipView.text = value + binding.ownerShipView.text = value } - }) - .build().show() + }).build().show() } else { - ownerShipView.text = groups[position] + binding.ownerShipView.text = groups[position] } } }).build().show() @@ -180,27 +163,22 @@ } //默认频率1min - collectIntervalView.text = frequency[0] - collectIntervalView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + binding.collectIntervalView.text = frequency[0] + binding.collectIntervalView.setOnClickListener { + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(frequency) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { - collectIntervalView.text = frequency[position] + binding.collectIntervalView.text = frequency[position] } }).build().show() } - locationImageView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(context) - .setItemTextColor(Color.BLUE) + binding.locationImageView.setOnClickListener { + BottomActionSheet.Builder().setContext(context).setItemTextColor(Color.BLUE) .setActionItemTitle(arrayListOf("自动定位", "手动选点")) - .setOnActionSheetListener(object : - BottomActionSheet.OnActionSheetListener { + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { when (position) { 0 -> { @@ -210,30 +188,32 @@ override fun onAMapLocationGet(aMapLocation: AMapLocation?) { LoadingDialogHub.dismiss() if (aMapLocation == null) { - longitudeView.text = "定位失败" - latitudeView.text = "定位失败" + binding.longitudeView.text = "定位失败" + binding.latitudeView.text = "定位失败" - longitudeView.setTextColor( + binding.longitudeView.setTextColor( R.color.redTextColor.convertColor(context) ) - latitudeView.setTextColor( + binding.latitudeView.setTextColor( R.color.redTextColor.convertColor(context) ) } else { - longitudeView.text = + binding.longitudeView.text = aMapLocation.longitude.toString() - latitudeView.text = aMapLocation.latitude.toString() + binding.latitudeView.text = + aMapLocation.latitude.toString() - longitudeView.setTextColor( + binding.longitudeView.setTextColor( R.color.mainTextColor.convertColor(context) ) - latitudeView.setTextColor( + binding.latitudeView.setTextColor( R.color.mainTextColor.convertColor(context) ) } } }) } + 1 -> selectLocationLauncher.launch( Intent(context, SelectLocationActivity::class.java) ) @@ -243,7 +223,7 @@ } imageAdapter = EditableImageAdapter(this, 3, 13f) - addImageRecyclerView.adapter = imageAdapter + binding.addImageRecyclerView.adapter = imageAdapter imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { selectPicture() @@ -281,7 +261,7 @@ } } - sceneEditView.addTextChangedListener(object : TextWatcher { + binding.sceneEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { } @@ -292,31 +272,31 @@ override fun afterTextChanged(s: Editable?) { val text = s.toString().trim() - inputLengthView.text = String.format("${text.length}/100") + binding.inputLengthView.text = String.format("${text.length}/100") if (text.length > 100) { - inputLengthView.setTextColor(R.color.redTextColor.convertColor(context)) + binding.inputLengthView.setTextColor(R.color.redTextColor.convertColor(context)) "现场情况字符不能超过100个字符".show(context) } else { - inputLengthView.setTextColor(R.color.subTextColor.convertColor(context)) + binding.inputLengthView.setTextColor(R.color.subTextColor.convertColor(context)) } } }) - addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() + binding.addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() - submitButton.setOnClickListener { - val deviceCode = deviceCodeView.text.toString().trim() + binding.submitButton.setOnClickListener { + val deviceCode = binding.deviceCodeView.text.toString().trim() if (deviceCode.isBlank()) { "请输入设备编号".show(context) return@setOnClickListener } - val ownerShip = ownerShipView.text.toString().trim() + val ownerShip = binding.ownerShipView.text.toString().trim() if (ownerShip.isBlank()) { "请输入设备所属项目".show(context) return@setOnClickListener } - val longitude = longitudeView.text.toString().trim() - val latitude = latitudeView.text.toString().trim() + val longitude = binding.longitudeView.text.toString().trim() + val latitude = binding.latitudeView.text.toString().trim() if (longitude.isBlank() || latitude.isBlank()) { "请先获取当前经纬度".show(context) return@setOnClickListener @@ -329,14 +309,14 @@ ) deviceViewModel.addDevice( deviceCode, - deviceNameView.text.toString(), + binding.deviceNameView.text.toString(), ownerShip, - collectIntervalView.text.toString(), + binding.collectIntervalView.text.toString(), longitude, latitude, imagePaths.reformat(), - sceneEditView.text.toString().trim(), - addDeviceTimeView.text.toString(), + binding.sceneEditView.text.toString().trim(), + binding.addDeviceTimeView.text.toString(), userData.id.toString(), userData.deptId ) @@ -345,16 +325,13 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(listOf("拍照", "相册")) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { when (position) { 0 -> { - PictureSelector.create(context) - .openCamera(SelectMimeType.ofImage()) + PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { if (result == null) { @@ -362,8 +339,7 @@ return } LoadingDialogHub.show( - this@AddDeviceActivity, - "图片上传中,请稍后..." + this@AddDeviceActivity, "图片上传中,请稍后..." ) selectedImages = result analyticalSelectResults(result[0]) @@ -374,14 +350,11 @@ } }) } + 1 -> { - PictureSelector.create(context) - .openGallery(SelectMimeType.ofImage()) - .isGif(false) - .isMaxSelectEnabledMask(true) - .setFilterMinFileSize(100) - .setMaxSelectNum(3) - .isDisplayCamera(false) + PictureSelector.create(context).openGallery(SelectMimeType.ofImage()) + .isGif(false).isMaxSelectEnabledMask(true).setFilterMinFileSize(100) + .setMaxSelectNum(3).isDisplayCamera(false) .setImageEngine(GlideLoadEngine.instance) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { @@ -390,8 +363,7 @@ return } LoadingDialogHub.show( - this@AddDeviceActivity, - "图片上传中,请稍后..." + this@AddDeviceActivity, "图片上传中,请稍后..." ) selectedImages = result // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 diff --git a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt index 3864f16..e4f19a4 100644 --- a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.content.Context +import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,19 +11,20 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityBigImageBinding import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager -import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : KotlinBaseActivity() { +class BigImageActivity : KotlinBaseActivity() { - override fun initLayoutView(): Int = R.layout.activity_big_image + override fun initViewBinding(): ActivityBigImageBinding { + return ActivityBigImageBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { PageNavigationManager.addActivity(this) @@ -30,16 +32,16 @@ ImmersionBar.with(this).statusBarDarkFont(false).init() } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) val urls = intent.getStringArrayListExtra(Constant.BIG_IMAGE_INTENT_DATA_KEY) if (urls == null || urls.size == 0) { return } - pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") - imagePagerView.adapter = BigImageAdapter(this, urls) - imagePagerView.currentItem = index - imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + binding.pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + binding.imagePagerView.adapter = BigImageAdapter(this, urls) + binding.imagePagerView.currentItem = index + binding.imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrollStateChanged(state: Int) { } @@ -53,7 +55,8 @@ } override fun onPageSelected(position: Int) { - pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + binding.pageNumberView.text = + String.format("(" + (position + 1) + "/" + urls.size + ")") } }) } @@ -63,7 +66,7 @@ } override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } + binding.leftBackView.setOnClickListener { this.finish() } } class BigImageAdapter(private var context: Context, imageList: ArrayList) : diff --git a/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt b/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt index 072953f..f036a78 100644 --- a/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.graphics.Color +import android.os.Bundle import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -10,6 +11,7 @@ import com.amap.api.services.geocoder.RegeocodeQuery import com.amap.api.services.geocoder.RegeocodeResult import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityDeviceDetailBinding import com.casic.smarttube.extensions.combineImagePath import com.casic.smarttube.extensions.toSignalImage import com.casic.smarttube.model.DeviceDetailModel @@ -25,51 +27,39 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState -import kotlinx.android.synthetic.main.activity_device_detail.densityView -import kotlinx.android.synthetic.main.activity_device_detail.descriptionView -import kotlinx.android.synthetic.main.activity_device_detail.deviceBatteryView -import kotlinx.android.synthetic.main.activity_device_detail.deviceCodeView -import kotlinx.android.synthetic.main.activity_device_detail.deviceNameView -import kotlinx.android.synthetic.main.activity_device_detail.deviceStateView -import kotlinx.android.synthetic.main.activity_device_detail.imageGridView -import kotlinx.android.synthetic.main.activity_device_detail.lastDataView -import kotlinx.android.synthetic.main.activity_device_detail.leftBackView -import kotlinx.android.synthetic.main.activity_device_detail.locationView -import kotlinx.android.synthetic.main.activity_device_detail.projectGroupView -import kotlinx.android.synthetic.main.activity_device_detail.rightOptionView -import kotlinx.android.synthetic.main.activity_device_detail.signalImageView -import kotlinx.android.synthetic.main.activity_device_detail.titleView -class DeviceDetailActivity : KotlinBaseActivity() { +class DeviceDetailActivity : KotlinBaseActivity() { private val kTag = "DeviceDetailActivity" private lateinit var deviceViewModel: DeviceViewModel private lateinit var deviceModel: DeviceDetailModel.DataModel private val geocoderSearch by lazy { GeocodeSearch(this) } - override fun initLayoutView(): Int = R.layout.activity_device_detail + override fun initViewBinding(): ActivityDeviceDetailBinding { + return ActivityDeviceDetailBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "设备详情" - leftBackView.setOnClickListener { finish() } + binding.titleView.text = "设备详情" + binding.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! - deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] deviceViewModel.obtainDeviceDetail(params[0], params[1]) deviceViewModel.deviceDetailModel.observe(this) { if (it.code == 200) { val device = it.data this.deviceModel = device - deviceCodeView.text = device.devcode - deviceNameView.text = device.deviceName - projectGroupView.text = String.format("项目${device.groupId}") + binding.deviceCodeView.text = device.devcode + binding.deviceNameView.text = device.deviceName + binding.projectGroupView.text = String.format("项目${device.groupId}") if (device.latGaode.isBlank() || device.lngGaode.isBlank()) { - locationView.text = "经纬度异常,无法查看具体位置" + binding.locationView.text = "经纬度异常,无法查看具体位置" } else { val queryParam = RegeocodeQuery( LatLonPoint(device.latGaode.toDouble(), device.lngGaode.toDouble()), @@ -81,7 +71,7 @@ GeocodeSearch.OnGeocodeSearchListener { override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { if (rCode == 1000) { - locationView.text = result?.regeocodeAddress?.formatAddress + binding.locationView.text = result?.regeocodeAddress?.formatAddress } } @@ -90,12 +80,12 @@ } }) } - descriptionView.text = device.descn + binding.descriptionView.text = device.descn if (device.photos.toString().isBlank()) { - imageGridView.visibility = View.GONE + binding.imageGridView.visibility = View.GONE } else { - imageGridView.visibility = View.VISIBLE + binding.imageGridView.visibility = View.VISIBLE //处理图片地址 val urls: ArrayList = ArrayList() val imageArray = device.photos.toString().split(",") @@ -104,10 +94,9 @@ urls.add(path.combineImagePath()) } } - val imageAdapter = ReadOnlyImageAdapter(this) - imageAdapter.setImageList(urls) - imageGridView.adapter = imageAdapter - imageGridView.setOnItemClickListener { _, _, position, _ -> + val imageAdapter = ReadOnlyImageAdapter(this, urls) + binding.imageGridView.adapter = imageAdapter + binding.imageGridView.setOnItemClickListener { _, _, position, _ -> if (urls[position].isEmpty()) { "图片加载失败,无法查看大图".show(this) } else { @@ -119,18 +108,18 @@ val value = device.stregnth.toDouble().toInt() val level = "$value%" val ppm = "${value * 500}ppm" - densityView.text = "$level(相当于$ppm)" + binding.densityView.text = "$level(相当于$ppm)" - lastDataView.text = device.uptime + binding.lastDataView.text = device.uptime if (device.onlineState == "0") { - deviceStateView.text = "离线" - deviceStateView.setTextColor(Color.RED) + binding.deviceStateView.text = "离线" + binding.deviceStateView.setTextColor(Color.RED) } else { - deviceStateView.text = "在线" - deviceStateView.setTextColor(Color.GREEN) + binding.deviceStateView.text = "在线" + binding.deviceStateView.setTextColor(Color.GREEN) } - signalImageView.setBackgroundResource(device.rsrp.toSignalImage()) - deviceBatteryView.text = if (device.cell.isNullOrBlank()) { + binding.signalImageView.setBackgroundResource(device.rsrp.toSignalImage()) + binding.deviceBatteryView.text = if (device.cell.isNullOrBlank()) { "0%" } else { device.cell + "%" @@ -149,7 +138,7 @@ } override fun initEvent() { - rightOptionView.setOnClickListener { + binding.rightOptionView.setOnClickListener { val lat = deviceModel.latGaode.toString() val lng = deviceModel.lngGaode.toString() if (lat.isBlank() || lng.isBlank()) { diff --git a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt index 0ae8862..ba52ab8 100644 --- a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.content.Context +import android.os.Bundle import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -8,6 +9,7 @@ import androidx.recyclerview.widget.RecyclerView import com.casic.smarttube.R import com.casic.smarttube.adapter.DeviceListAdapter +import com.casic.smarttube.databinding.ActivityGroupDeviceBinding import com.casic.smarttube.extensions.showEmptyPage import com.casic.smarttube.model.DeviceListModel import com.casic.smarttube.utils.LoadingDialogHub @@ -28,14 +30,8 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.qmuiteam.qmui.recyclerView.QMUIRVItemSwipeAction import com.qmuiteam.qmui.recyclerView.QMUISwipeAction -import kotlinx.android.synthetic.main.activity_group_device.groupDeviceLayout -import kotlinx.android.synthetic.main.activity_group_device.groupDeviceView -import kotlinx.android.synthetic.main.activity_group_device.leftBackView -import kotlinx.android.synthetic.main.activity_group_device.rightOptionView -import kotlinx.android.synthetic.main.activity_group_device.titleView -import kotlinx.android.synthetic.main.include_empty_view.emptyView -class GroupDeviceActivity : KotlinBaseActivity() { +class GroupDeviceActivity : KotlinBaseActivity() { private lateinit var groupId: String private lateinit var weakReferenceHandler: WeakReferenceHandler @@ -51,18 +47,19 @@ private var clickedPosition = 0 private var isDeleteAll = false - override fun initLayoutView(): Int = R.layout.activity_group_device + override fun initViewBinding(): ActivityGroupDeviceBinding { + return ActivityGroupDeviceBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - leftBackView.setOnClickListener { finish() } - rightOptionView.setOnClickListener { + binding.leftBackView.setOnClickListener { finish() } + binding.rightOptionView.setOnClickListener { //改为Popup val easyPopupWindow = EasyPopupWindow(this) easyPopupWindow.setPopupMenuItem( - LocaleConstant.DEVICE_OPERATE_IMAGES, - LocaleConstant.DEVICE_OPERATE_TITLES + LocaleConstant.DEVICE_OPERATE_IMAGES, LocaleConstant.DEVICE_OPERATE_TITLES ) easyPopupWindow.setOnPopupWindowClickListener(object : EasyPopupWindow.OnPopupWindowClickListener { @@ -77,13 +74,11 @@ pageIndex = 1 obtainDeviceListByPage() } + 1 -> { - AlertControlDialog.Builder() - .setContext(context) - .setTitle("提示") + AlertControlDialog.Builder().setContext(context).setTitle("提示") .setMessage("删除后将无法恢复,是否继续?") - .setNegativeButton("容我想想") - .setPositiveButton("已经想好") + .setNegativeButton("容我想想").setPositiveButton("已经想好") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onCancelClick() { @@ -103,13 +98,11 @@ } }).build().show() } + 2 -> { - MultiSelectDialog.Builder() - .setContext(this@GroupDeviceActivity) - .setTitle("选择设备") - .setDataSource(dataBeans) - .setNegativeButton("取消") - .setPositiveButton("选好了") + MultiSelectDialog.Builder().setContext(this@GroupDeviceActivity) + .setTitle("选择设备").setDataSource(dataBeans) + .setNegativeButton("取消").setPositiveButton("选好了") .setOnDialogButtonClickListener(object : MultiSelectDialog.OnDialogButtonClickListener { override fun onConfirmClick(selectedModels: MutableList) { @@ -126,21 +119,20 @@ override fun onCancelClick() { } - }) - .build().show() + }).build().show() } } } }) easyPopupWindow.setBackgroundDrawable(null) - val x: Int = rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(rightOptionView, x, 0) + val x: Int = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { groupId = intent.getStringExtra(Constant.INTENT_PARAM)!! - titleView.text = String.format(groupId + "项目设备列表") + binding.titleView.text = String.format(groupId + "项目设备列表") weakReferenceHandler = WeakReferenceHandler(callback) groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java] deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] @@ -157,13 +149,13 @@ } override fun initEvent() { - groupDeviceLayout.setOnRefreshListener { + binding.groupDeviceLayout.setOnRefreshListener { isRefresh = true //刷新之后页码重置 pageIndex = 1 obtainDeviceListByPage() } - groupDeviceLayout.setOnLoadMoreListener { + binding.groupDeviceLayout.setOnLoadMoreListener { isLoadMore = true pageIndex++ obtainDeviceListByPage() @@ -176,7 +168,7 @@ isRefresh -> { dataBeans.clear() dataBeans = dataRows!! - groupDeviceLayout.finishRefresh() + binding.groupDeviceLayout.finishRefresh() isRefresh = false } @@ -185,7 +177,7 @@ "到底了,别拉了".show(this) } dataBeans.addAll(dataRows!!) - groupDeviceLayout.finishLoadMore() + binding.groupDeviceLayout.finishLoadMore() isLoadMore = false } @@ -211,7 +203,7 @@ ) } if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { pageIndex = 1 obtainDeviceListByPage() } @@ -230,15 +222,15 @@ deviceAdapter.notifyDataSetChanged() } else { if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { pageIndex = 1 obtainDeviceListByPage() } } else { - emptyView!!.hide() + binding.emptyInclude.emptyView.hide() deviceAdapter = DeviceListAdapter(this, dataBeans) //绑定侧滑事件 - swipeAction.attachToRecyclerView(groupDeviceView) + swipeAction.attachToRecyclerView(binding.groupDeviceView) val linearLayoutManager = object : LinearLayoutManager(this) { override fun generateDefaultLayoutParams(): RecyclerView.LayoutParams { return RecyclerView.LayoutParams( @@ -247,8 +239,8 @@ ) } } - groupDeviceView.layoutManager = linearLayoutManager - groupDeviceView.adapter = deviceAdapter + binding.groupDeviceView.layoutManager = linearLayoutManager + binding.groupDeviceView.adapter = deviceAdapter deviceAdapter.setOnItemClickListener(object : DeviceListAdapter.OnItemClickListener { override fun onClicked(position: Int) { @@ -311,13 +303,9 @@ }) private fun deleteItem(adapterPosition: Int) { - AlertControlDialog.Builder() - .setContext(this) - .setTitle("提示") - .setMessage("删除后将无法恢复,是否继续?") - .setNegativeButton("容我想想") - .setPositiveButton("已经想好") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(this).setTitle("提示") + .setMessage("删除后将无法恢复,是否继续?").setNegativeButton("容我想想") + .setPositiveButton("已经想好").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onCancelClick() { diff --git a/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt b/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt index 71f438c..70e49f0 100644 --- a/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt @@ -1,9 +1,11 @@ package com.casic.smarttube.view +import android.os.Bundle import android.view.View import android.widget.AdapterView import androidx.lifecycle.ViewModelProvider import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityHistoryDataBinding import com.casic.smarttube.extensions.dateToMonthDay import com.casic.smarttube.extensions.getQuarterOfYear import com.casic.smarttube.utils.ChartViewHelper @@ -22,27 +24,26 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState -import kotlinx.android.synthetic.main.activity_history_data.dataLineChart -import kotlinx.android.synthetic.main.activity_history_data.leftBackView -import kotlinx.android.synthetic.main.activity_history_data.periodSpinner import java.util.Calendar -class HistoryDataActivity : KotlinBaseActivity() { +class HistoryDataActivity : KotlinBaseActivity() { private val kTag = "HistoryDataActivity" private lateinit var deviceViewModel: DeviceViewModel private lateinit var groupId: String private lateinit var devCode: String - override fun initLayoutView(): Int = R.layout.activity_history_data + override fun initViewBinding(): ActivityHistoryDataBinding { + return ActivityHistoryDataBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - leftBackView.setOnClickListener { finish() } + binding.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! groupId = params[0] devCode = params[1] @@ -61,8 +62,8 @@ override fun initEvent() { //默认选择近7天的数据 - periodSpinner.setSelection(3) - periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + binding.periodSpinner.setSelection(3) + binding.periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onItemSelected( parent: AdapterView<*>?, view: View?, position: Int, id: Long ) { @@ -76,6 +77,7 @@ groupId, devCode, "$year-01-01", time.timestampToCompleteDate() ) } + 1 -> { //本季度 val startDate = when (time.getQuarterOfYear()) { @@ -89,6 +91,7 @@ groupId, devCode, startDate, time.timestampToCompleteDate() ) } + 2 -> { //近30日 deviceViewModel.obtainDeviceHistoryData( @@ -98,6 +101,7 @@ time.timestampToCompleteDate() ) } + 3 -> { //近7日 deviceViewModel.obtainDeviceHistoryData( @@ -107,19 +111,18 @@ time.timestampToCompleteDate() ) } + 4 -> { //今日 deviceViewModel.obtainDeviceHistoryData( groupId, devCode, time.timestampToDate(), time.timestampToCompleteDate() ) } + 5 -> { - DateSelectDialog.Builder() - .setContext(this@HistoryDataActivity) - .setTitle("选择日期") - .setNegativeButton("取消") - .setPositiveButton("选好了") - .setOnDialogButtonClickListener(object : + DateSelectDialog.Builder().setContext(this@HistoryDataActivity) + .setTitle("选择日期").setNegativeButton("取消") + .setPositiveButton("选好了").setOnDialogButtonClickListener(object : DateSelectDialog.OnDialogButtonClickListener { override fun onConfirmClick(startDate: String, endDate: String) { deviceViewModel.obtainDeviceHistoryData( @@ -129,12 +132,10 @@ override fun onCancelClick() { //选择取消就默认加载近7天的数据 - periodSpinner.setSelection(3) + binding.periodSpinner.setSelection(3) } - }) - .setFragmentManager(supportFragmentManager) - .setCalendarType(Type.YEAR_MONTH_DAY) - .build().show() + }).setFragmentManager(supportFragmentManager) + .setCalendarType(Type.YEAR_MONTH_DAY).build().show() } } } @@ -159,7 +160,9 @@ Entry(i.toFloat(), rowsBean.stregnth!!.toFloat(), "浓度") ) } - ChartViewHelper.setLineChartData(dataLineChart, xAxisLabels, strengthEntries) + ChartViewHelper.setLineChartData( + binding.dataLineChart, xAxisLabels, strengthEntries + ) } } } diff --git a/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt b/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt index ebca433..f947b2c 100644 --- a/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt @@ -1,7 +1,8 @@ package com.casic.smarttube.view +import android.os.Bundle import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityLoginBinding import com.casic.smarttube.utils.AuthenticationHelper import com.casic.smarttube.utils.LoadingDialogHub import com.casic.smarttube.utils.LocaleConstant @@ -14,26 +15,29 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues -import kotlinx.android.synthetic.main.activity_login.loginButton -import kotlinx.android.synthetic.main.activity_login.userNameView -import kotlinx.android.synthetic.main.activity_login.userPasswordView -class LoginActivity : KotlinBaseActivity() { +class LoginActivity : KotlinBaseActivity() { private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginViewModel: LoginViewModel private lateinit var userViewModel: UserViewModel - override fun initLayoutView(): Int = R.layout.activity_login + override fun initViewBinding(): ActivityLoginBinding { + return ActivityLoginBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(true).init() } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { // 设置默认账号密码 - userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) - userPasswordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + binding.userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + binding.userPasswordView.setText( + SaveKeyValues.getValue( + LocaleConstant.PASSWORD, "" + ) as String + ) authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] @@ -50,9 +54,9 @@ } override fun initEvent() { - loginButton.setOnClickListener { - val account = userNameView.text.toString().trim() - val userPassword = userPasswordView.text.toString().trim() + binding.loginButton.setOnClickListener { + val account = binding.userNameView.text.toString().trim() + val userPassword = binding.userPasswordView.text.toString().trim() if (account.isBlank()) { "用户名不能为空".show(this) return@setOnClickListener @@ -74,8 +78,8 @@ AuthenticationHelper.savePublicKey(keyString) val publicKey = RSAUtils.keyStrToPublicKey(keyString) - val account = userNameView.text.toString() - val userPassword = userPasswordView.text.toString() + val account = binding.userNameView.text.toString() + val userPassword = binding.userPasswordView.text.toString() val dataByPublicKey = RSAUtils.encryptDataByPublicKey(userPassword.toByteArray(), publicKey!!) //登录并获取Token,POST请求 diff --git a/app/src/main/java/com/casic/smarttube/view/MainActivity.kt b/app/src/main/java/com/casic/smarttube/view/MainActivity.kt index 4461757..575e1ee 100644 --- a/app/src/main/java/com/casic/smarttube/view/MainActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/MainActivity.kt @@ -1,5 +1,6 @@ package com.casic.smarttube.view +import android.os.Bundle import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment @@ -7,6 +8,7 @@ import androidx.fragment.app.FragmentPagerAdapter import androidx.viewpager.widget.ViewPager import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityMainBinding import com.casic.smarttube.fragment.HomePageFragment import com.casic.smarttube.fragment.MinePageFragment import com.casic.smarttube.fragment.OverviewFragment @@ -15,9 +17,8 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_main.* -class MainActivity : KotlinBaseActivity() { +class MainActivity : KotlinBaseActivity() { private var menuItem: MenuItem? = null private var fragmentList: MutableList = ArrayList() @@ -29,32 +30,36 @@ fragmentList.add(MinePageFragment()) } - override fun initLayoutView(): Int = R.layout.activity_main + override fun initViewBinding(): ActivityMainBinding { + return ActivityMainBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { //保留icon原图颜色 - bottomNavigation.itemIconTintList = null - bottomNavigation.setOnItemSelectedListener { menuItem -> + binding.bottomNavigation.itemIconTintList = null + binding.bottomNavigation.setOnItemSelectedListener { menuItem -> when (menuItem.itemId) { R.id.nav_home -> { - mainViewPager.currentItem = 0 + binding.mainViewPager.currentItem = 0 } + R.id.nav_overview -> { - mainViewPager.currentItem = 1 + binding.mainViewPager.currentItem = 1 } + R.id.nav_mine -> { - mainViewPager.currentItem = 2 + binding.mainViewPager.currentItem = 2 } } false } - mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) - mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 + binding.mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + binding.mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun observeRequestState() { @@ -62,7 +67,7 @@ } override fun initEvent() { - mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + binding.mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrollStateChanged(state: Int) { } @@ -77,9 +82,9 @@ if (menuItem != null) { menuItem!!.isChecked = false } else { - bottomNavigation.menu.getItem(0).isChecked = false + binding.bottomNavigation.menu.getItem(0).isChecked = false } - menuItem = bottomNavigation.menu.getItem(position) + menuItem = binding.bottomNavigation.menu.getItem(position) menuItem!!.isChecked = true } }) diff --git a/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt b/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt index f00e0ca..908aade 100644 --- a/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt @@ -15,6 +15,7 @@ import com.amap.api.services.geocoder.RegeocodeQuery import com.amap.api.services.geocoder.RegeocodeResult import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityMapDeviceBriefBinding import com.casic.smarttube.utils.LoadingDialogHub import com.casic.smarttube.utils.RouteOnMap import com.casic.smarttube.vm.DeviceViewModel @@ -24,16 +25,8 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState -import kotlinx.android.synthetic.main.activity_map_device_brief.deviceCodeView -import kotlinx.android.synthetic.main.activity_map_device_brief.deviceModelView -import kotlinx.android.synthetic.main.activity_map_device_brief.deviceValueView -import kotlinx.android.synthetic.main.activity_map_device_brief.locationView -import kotlinx.android.synthetic.main.activity_map_device_brief.mapView -import kotlinx.android.synthetic.main.activity_map_device_brief.updateTimeView -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -class MapDeviceBriefActivity : KotlinBaseActivity() { +class MapDeviceBriefActivity : KotlinBaseActivity() { private val kTag = "MapDeviceBriefActivity" private lateinit var deviceViewModel: DeviceViewModel @@ -42,17 +35,19 @@ private val geocoderSearch by lazy { GeocodeSearch(this) } - override fun initLayoutView(): Int = R.layout.activity_map_device_brief + override fun initViewBinding(): ActivityMapDeviceBriefBinding { + return ActivityMapDeviceBriefBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "设备最新数据地图展示" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "设备最新数据地图展示" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { - aMap = mapView.map + override fun initOnCreate(savedInstanceState: Bundle?) { + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val uiSettings = aMap.uiSettings uiSettings.isCompassEnabled = true @@ -80,22 +75,22 @@ if (it.code == 200) { val device = it.data - deviceCodeView.text = String.format("设备编号: ${device.devcode}") - deviceModelView.text = String.format("设备模型: ${params[2]}") + binding.deviceCodeView.text = String.format("设备编号: ${device.devcode}") + binding.deviceModelView.text = String.format("设备模型: ${params[2]}") //获取设备最新浓度信息 deviceViewModel.obtainTubeLastData(device.groupId, device.devcode) deviceViewModel.lastDataModel.observe(this) { v -> if (v.code == 200) { - deviceValueView.text = String.format("最新浓度: ${v.data.strength}") - updateTimeView.text = String.format("更新时间: ${v.data.uptime}") + binding.deviceValueView.text = String.format("最新浓度: ${v.data.strength}") + binding.updateTimeView.text = String.format("更新时间: ${v.data.uptime}") } else { - deviceValueView.text = String.format("最新浓度: 未知") - updateTimeView.text = String.format("更新时间: 未知") + binding.deviceValueView.text = String.format("最新浓度: 未知") + binding.updateTimeView.text = String.format("更新时间: 未知") } } if (device.latGaode.isBlank() || device.lngGaode.isBlank()) { - locationView.text = "经纬度异常,无法查看具体位置" + binding.locationView.text = "经纬度异常,无法查看具体位置" } else { val queryParam = RegeocodeQuery( LatLonPoint(device.latGaode.toDouble(), device.lngGaode.toDouble()), @@ -108,7 +103,7 @@ GeocodeSearch.OnGeocodeSearchListener { override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { if (rCode == 1000) { - locationView.text = + binding.locationView.text = String.format("详细位置: ${result?.regeocodeAddress?.formatAddress}") } } @@ -123,8 +118,7 @@ aMap.animateCamera(newCameraPosition, 1500, object : AMap.CancelableCallback { override fun onFinish() { //添加Marker - val markerOptions = MarkerOptions() - .position(latLng) + val markerOptions = MarkerOptions().position(latLng) .icon(BitmapDescriptorFactory.fromResource(R.mipmap.well_location)) .draggable(false) aMap.addMarker(markerOptions) @@ -148,26 +142,26 @@ /**地图相关*********/ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - mapView.onCreate(savedInstanceState) + binding.mapView.onCreate(savedInstanceState) } override fun onResume() { super.onResume() - mapView.onResume() + binding.mapView.onResume() } override fun onPause() { super.onPause() - mapView.onPause() + binding.mapView.onPause() } override fun onDestroy() { - mapView.onDestroy() + binding.mapView.onDestroy() super.onDestroy() } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - mapView.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/view/PermissionActivity.kt b/app/src/main/java/com/casic/smarttube/view/PermissionActivity.kt index e872ef4..fc20978 100644 --- a/app/src/main/java/com/casic/smarttube/view/PermissionActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/PermissionActivity.kt @@ -13,7 +13,6 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。 if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) { startSplashScreenActivity() } else { diff --git a/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt b/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt index c639105..bb0b0ed 100644 --- a/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt @@ -13,33 +13,35 @@ import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.MyLocationStyle import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivitySelectLocationBinding import com.casic.smarttube.utils.CenterMarkerView import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_select_location.* -class SelectLocationActivity : KotlinBaseActivity(), AMap.OnMyLocationChangeListener, - OnMapLoadedListener, OnCameraChangeListener { +class SelectLocationActivity : KotlinBaseActivity(), + AMap.OnMyLocationChangeListener, OnMapLoadedListener, OnCameraChangeListener { private val kTag = "SelectLocationActivity" private lateinit var latLng: LatLng private lateinit var aMap: AMap private lateinit var centerMarkerView: CenterMarkerView - override fun initLayoutView(): Int = R.layout.activity_select_location + override fun initViewBinding(): ActivitySelectLocationBinding { + return ActivitySelectLocationBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "手动选点" - leftBackView.setOnClickListener { finish() } + binding.titleView.text = "手动选点" + binding.leftBackView.setOnClickListener { finish() } } - override fun initData() { - aMap = mapView.map + override fun initOnCreate(savedInstanceState: Bundle?) { + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val locationStyle = MyLocationStyle() //定位一次,且将视角移动到地图中心点 @@ -76,7 +78,7 @@ aMap.setOnMapLoadedListener(this) aMap.setOnCameraChangeListener(this) - rightOperateView.setOnClickListener { + binding.rightOperateView.setOnClickListener { val intent = Intent() intent.putExtra("longitude", latLng.longitude.toString()) intent.putExtra("latitude", latLng.latitude.toString()) @@ -110,27 +112,27 @@ /**地图相关*********/ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - mapView.onCreate(savedInstanceState) + binding.mapView.onCreate(savedInstanceState) } override fun onResume() { super.onResume() - mapView.onResume() + binding.mapView.onResume() } override fun onPause() { super.onPause() - mapView.onPause() + binding.mapView.onPause() } override fun onDestroy() { centerMarkerView.destroy() - mapView.onDestroy() + binding.mapView.onDestroy() super.onDestroy() } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - mapView.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/smarttube/view/SplashScreenActivity.kt index dafbe4d..baf5222 100644 --- a/app/src/main/java/com/casic/smarttube/view/SplashScreenActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/SplashScreenActivity.kt @@ -1,16 +1,17 @@ package com.casic.smarttube.view import android.annotation.SuppressLint +import android.os.Bundle import android.os.CountDownTimer import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivitySplashBinding import com.casic.smarttube.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo @SuppressLint("CustomSplashScreen") -class SplashScreenActivity : KotlinBaseActivity() { +class SplashScreenActivity : KotlinBaseActivity() { private lateinit var userDetailViewModel: UserViewModel private val countDownTimer = object : CountDownTimer(1000, 500) { @@ -34,13 +35,15 @@ } } - override fun initLayoutView(): Int = R.layout.activity_splash + override fun initViewBinding(): ActivitySplashBinding { + return ActivitySplashBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { userDetailViewModel = ViewModelProvider(this).get(UserViewModel::class.java) } diff --git a/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt b/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt index 23d1ac1..ae7df77 100644 --- a/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt +++ b/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt @@ -6,14 +6,19 @@ import android.view.Gravity import androidx.fragment.app.FragmentManager import com.casic.smarttube.R +import com.casic.smarttube.databinding.DialogSelectDateBinding import com.casic.smarttube.utils.LocaleConstant import com.jzxiang.pickerview.TimePickerDialog import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.* -import kotlinx.android.synthetic.main.dialog_select_date.* +import com.pengxh.kt.lite.extensions.binding +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.resetParams +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.extensions.timestampToTime import java.text.ParseException import java.text.SimpleDateFormat -import java.util.* +import java.util.Locale class DateSelectDialog private constructor(builder: Builder) : Dialog( builder.context, R.style.UserDefinedDialogStyle @@ -76,6 +81,8 @@ } } + private val binding: DialogSelectDateBinding by binding() + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) this.resetParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.85) @@ -84,10 +91,10 @@ setCanceledOnTouchOutside(false) if (title.isNotBlank()) { - dialogTitleView.text = title + binding.dialogTitleView.text = title } - startDateView.setOnClickListener { + binding.startDateView.setOnClickListener { TimePickerDialog.Builder() .setThemeColor(R.color.mainThemeColor.convertColor(ctx)) .setTitleStringId("请选择起始时间") @@ -102,11 +109,11 @@ } else { millSeconds.timestampToCompleteDate() } - startDateView.setText(textValue) + binding.startDateView.setText(textValue) }.build().show(fragmentManager, "DateSelectDialog") } - endDateView.setOnClickListener { + binding.endDateView.setOnClickListener { TimePickerDialog.Builder() .setThemeColor(R.color.mainThemeColor.convertColor(ctx)) .setTitleStringId("请选择起始时间") @@ -121,21 +128,21 @@ } else { millSeconds.timestampToCompleteDate() } - endDateView.setText(textValue) + binding.endDateView.setText(textValue) }.build().show(fragmentManager, "DateSelectDialog") } - dialogCancelButton.text = negativeBtn - dialogCancelButton.setOnClickListener { + binding.dialogCancelButton.text = negativeBtn + binding.dialogCancelButton.setOnClickListener { listener.onCancelClick() this.dismiss() } - dialogConfirmButton.text = positiveBtn - dialogConfirmButton.setOnClickListener { + binding.dialogConfirmButton.text = positiveBtn + binding.dialogConfirmButton.setOnClickListener { //判断其实时间和结束时间 - val startDate = startDateView.text.toString() - val endDate = endDateView.text.toString() + val startDate = binding.startDateView.text.toString() + val endDate = binding.endDateView.text.toString() if (isEarlierThanStart(startDate, endDate)) { "结束时间不能早于开始时间".show(ctx) return@setOnClickListener diff --git a/app/src/main/java/com/casic/smarttube/widgets/MultiSelectDialog.kt b/app/src/main/java/com/casic/smarttube/widgets/MultiSelectDialog.kt index 7e3a63e..cb9316d 100644 --- a/app/src/main/java/com/casic/smarttube/widgets/MultiSelectDialog.kt +++ b/app/src/main/java/com/casic/smarttube/widgets/MultiSelectDialog.kt @@ -8,9 +8,10 @@ import androidx.recyclerview.widget.RecyclerView import com.casic.smarttube.R import com.casic.smarttube.adapter.DialogDeviceListAdapter +import com.casic.smarttube.databinding.DialogMultiSelectBinding import com.casic.smarttube.model.DeviceListModel +import com.pengxh.kt.lite.extensions.binding import com.pengxh.kt.lite.extensions.resetParams -import kotlinx.android.synthetic.main.dialog_multi_select.* class MultiSelectDialog private constructor(builder: Builder) : Dialog( builder.activity, R.style.UserDefinedDialogStyle @@ -67,6 +68,8 @@ } } + private val binding: DialogMultiSelectBinding by binding() + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) this.resetParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.85) @@ -75,21 +78,25 @@ setCanceledOnTouchOutside(false) if (title.isNotBlank()) { - dialogTitleView.text = title + binding.dialogTitleView.text = title } val dialogDeviceListAdapter = DialogDeviceListAdapter(act, dataModels) - dataRecyclerView.addItemDecoration(DividerItemDecoration(act, RecyclerView.VERTICAL)) - dataRecyclerView.adapter = dialogDeviceListAdapter + binding.dataRecyclerView.addItemDecoration( + DividerItemDecoration( + act, RecyclerView.VERTICAL + ) + ) + binding.dataRecyclerView.adapter = dialogDeviceListAdapter - dialogCancelButton.text = negativeBtn - dialogCancelButton.setOnClickListener { + binding.dialogCancelButton.text = negativeBtn + binding.dialogCancelButton.setOnClickListener { listener.onCancelClick() this.dismiss() } - dialogConfirmButton.text = positiveBtn - dialogConfirmButton.setOnClickListener { + binding.dialogConfirmButton.text = positiveBtn + binding.dialogConfirmButton.setOnClickListener { // 处理数据 listener.onConfirmClick(dialogDeviceListAdapter.selectedModels) this.dismiss() diff --git a/app/src/main/res/layout/activity_about_us.xml b/app/src/main/res/layout/activity_about_us.xml index c67a714..69dc539 100644 --- a/app/src/main/res/layout/activity_about_us.xml +++ b/app/src/main/res/layout/activity_about_us.xml @@ -7,7 +7,9 @@ android:orientation="vertical" tools:context=".view.AboutUsActivity"> - + - + variant.outputs.configureEach { outputFileName = "GT_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" @@ -61,7 +62,7 @@ dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.5' implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.6.1' diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cccda6d..fd9277c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,7 +81,7 @@ + android:value="a6907c8bb931727374aa5fd500cda107" /> (), Handler.Callback, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { private val kTag = "HomePageFragment" private val geocoderSearch by lazy { GeocodeSearch(requireContext()) } - private lateinit var homeView: View private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var easyPopupWindow: EasyPopupWindow private lateinit var aMap: AMap private lateinit var deviceViewModel: DeviceViewModel private lateinit var groupViewModel: ProjectGroupViewModel @@ -83,34 +89,34 @@ * */ private var mapZooms = ArrayList() - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View { - homeView = inflater.inflate(R.layout.fragment_home, container, false) + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } - weakReferenceHandler = WeakReferenceHandler(callback) - val easyPopupWindow = EasyPopupWindow(requireContext()) - easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) - homeView.rightOptionView.setOnClickListener { - easyPopupWindow.setOnPopupWindowClickListener(object : - EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - easyPopupWindow.setBackgroundDrawable(null) - val x: Int = homeView.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(homeView.rightOptionView, x, 0) + override fun setupTopBarLayout() { + + } + + override fun observeRequestState() { + groupViewModel.loadState.observe(this) { state -> + when (state) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") + else -> LoadingDialogHub.dismiss() + } } + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + weakReferenceHandler = WeakReferenceHandler(this) + + easyPopupWindow = EasyPopupWindow(requireContext()) + easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) //初始化vm - deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) - groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) - - observeRequestState() + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java] //默认数据 groupViewModel.obtainProGroupList() @@ -119,12 +125,8 @@ mapZooms.add(13f) initMap(savedInstanceState) - homeView.addDeviceButton.setOnClickListener { - requireContext().navigatePageTo() - } - //数据监听 - deviceViewModel.mapDeviceModel.observe(this, { + deviceViewModel.mapDeviceModel.observe(this) { if (it.code == 200) { if (allMarkerOptions.isNotEmpty()) { allMarkerOptions.clear() @@ -149,10 +151,8 @@ longitudeList.add(longitude) //将所有设备信息转化缓存为Marker点 allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(device.devcode) - .snippet(device.modelName) + MarkerOptions().position(LatLng(latitude, longitude)) + .title(device.devcode).snippet(device.modelName) ) } } @@ -160,8 +160,8 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 13f) } - }) - groupViewModel.groupModel.observe(this, { + } + groupViewModel.groupModel.observe(this) { if (it.code == 200) { val dataRows = it.data when { @@ -170,14 +170,15 @@ dataBeans = dataRows!! isRefresh = false } + else -> { dataBeans = dataRows!! } } weakReferenceHandler.sendEmptyMessage(2022090201) } - }) - groupViewModel.groupDeviceModel.observe(this, { + } + groupViewModel.groupDeviceModel.observe(this) { if (it.code == 200) { val latitudeList: MutableList = ArrayList() val longitudeList: MutableList = ArrayList() @@ -199,22 +200,33 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 16f) } - }) - return homeView + } } - private fun observeRequestState() { - groupViewModel.loadState.observe(this, { state -> - when (state) { - LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") - else -> LoadingDialogHub.dismiss() - } - }) + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + easyPopupWindow.setOnPopupWindowClickListener(object : + EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + easyPopupWindow.setBackgroundDrawable(null) + val x: Int = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + binding.addDeviceButton.setOnClickListener { + requireContext().navigatePageTo() + } } override fun onResume() { super.onResume() - homeView.mapView.onResume() + binding.mapView.onResume() //获取所有设备数据 deviceViewModel.obtainMapDeviceList() @@ -222,16 +234,16 @@ groupViewModel.obtainProGroupList() } - private val callback = Handler.Callback { - if (it.what == 2022090201) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022090201) { if (isRefresh) { groupListAdapter.notifyDataSetChanged() } else { groupListAdapter = GroupListAdapter(requireContext(), dataBeans) - homeView.homeRecyclerView!!.addItemDecoration( + binding.homeRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - homeView.homeRecyclerView!!.adapter = groupListAdapter + binding.homeRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : GroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { @@ -241,12 +253,12 @@ }) } } - true + return true } private fun initMap(savedInstanceState: Bundle?) { - homeView.mapView.onCreate(savedInstanceState) - aMap = homeView.mapView.map + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val uiSettings = aMap.uiSettings uiSettings.isCompassEnabled = true @@ -322,10 +334,7 @@ if (!isInRange) { clustersMarkers.add( GaoDeClusterMarkerView( - requireContext(), - it, - proj, - LocaleConstant.RADIUS_SIZE + requireContext(), it, proj, LocaleConstant.RADIUS_SIZE ) )//相距多少才聚合 } @@ -363,9 +372,7 @@ //绑定数据 val clickedLatLng = marker?.position!! for (device in deviceModels) { - if (clickedLatLng.latitude == device.latGaode!!.toDouble() - && clickedLatLng.longitude == device.lngGaode!!.toDouble() - ) { + if (clickedLatLng.latitude == device.latGaode!!.toDouble() && clickedLatLng.longitude == device.lngGaode!!.toDouble()) { deviceCodeView.text = String.format("设备编号: ${device.devcode}") deviceModelView.text = String.format("设备模型: ${device.modelName}") //获取设备最新浓度信息 @@ -395,8 +402,7 @@ val address = result?.regeocodeAddress?.formatAddress val temp = StringBuilder() if (address!!.length > 16) { - temp.append(address.substring(0, 14)) - .append("\r\n") + temp.append(address.substring(0, 14)).append("\r\n") .append(address.substring(16)) } else { temp.append(address) @@ -430,9 +436,7 @@ } } //查看聚合点,单独开页面导航过去 - BottomActionSheet.Builder() - .setContext(requireContext()) - .setActionItemTitle(multiDevice) + BottomActionSheet.Builder().setContext(requireContext()).setActionItemTitle(multiDevice) .setItemTextColor(Color.BLUE) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { @@ -455,12 +459,8 @@ override fun onInfoWindowClick(p0: Marker?) { if (p0 != null) { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -487,16 +487,16 @@ 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 onDestroy() { super.onDestroy() - homeView.mapView.onDestroy() + binding.mapView.onDestroy() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt index a4e964c..cc35197 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt @@ -4,11 +4,15 @@ import android.content.Intent import android.net.Uri import android.os.Build +import android.os.Bundle import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider import com.casic.smarttube.BuildConfig import com.casic.smarttube.R +import com.casic.smarttube.databinding.FragmentMineBinding import com.casic.smarttube.extensions.appendDownloadUrl import com.casic.smarttube.model.UserDetailModel import com.casic.smarttube.utils.AuthenticationHelper @@ -36,22 +40,10 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.ChangePasswordDialog -import kotlinx.android.synthetic.main.fragment_mine.aboutUsLayout -import kotlinx.android.synthetic.main.fragment_mine.cacheSizeView -import kotlinx.android.synthetic.main.fragment_mine.changePwdLayout -import kotlinx.android.synthetic.main.fragment_mine.clearCacheLayout -import kotlinx.android.synthetic.main.fragment_mine.loginOutButton -import kotlinx.android.synthetic.main.fragment_mine.updateLogLayout -import kotlinx.android.synthetic.main.fragment_mine.updateUserButton -import kotlinx.android.synthetic.main.fragment_mine.updateVersionLayout -import kotlinx.android.synthetic.main.fragment_mine.userDeptView -import kotlinx.android.synthetic.main.fragment_mine.userImageView -import kotlinx.android.synthetic.main.fragment_mine.userNameView -import kotlinx.android.synthetic.main.fragment_mine.userPhoneView import java.io.File import java.nio.charset.StandardCharsets -class MinePageFragment : KotlinBaseFragment() { +class MinePageFragment : KotlinBaseFragment() { private val kTag = "MinePageFragment" private lateinit var userData: UserDetailModel.Data @@ -60,13 +52,17 @@ private lateinit var versionViewModel: VersionViewModel private lateinit var progressDialog: ProgressDialog - override fun initLayoutView(): Int = R.layout.fragment_mine + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentMineBinding { + return FragmentMineBinding.inflate(inflater, container, false) + } override fun setupTopBarLayout() { } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java] @@ -98,8 +94,7 @@ versionViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show( - requireActivity(), - "检查版本中,请稍后" + requireActivity(), "检查版本中,请稍后" ) else -> LoadingDialogHub.dismiss() @@ -108,49 +103,45 @@ } override fun initEvent() { - userImageView.setOnClickListener { + binding.userImageView.setOnClickListener { "尽情期待~".show(requireContext()) } - updateUserButton.setOnClickListener { + binding.updateUserButton.setOnClickListener { LoadingDialogHub.show(requireActivity(), "同步中,请稍后...") userViewModel.obtainUserDetail() } - changePwdLayout.setOnClickListener { - ChangePasswordDialog.Builder() - .setContext(requireContext()) + binding.changePwdLayout.setOnClickListener { + ChangePasswordDialog.Builder().setContext(requireContext()) .setOnDialogButtonClickListener(object : ChangePasswordDialog.OnDialogButtonClickListener { override fun onConfirmClick(oldPwd: String, newPwd: String) { - val publicKey = - RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! val oldPassKey = RSAUtils.encryptDataByPublicKey( - oldPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + oldPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) val newPassKey = RSAUtils.encryptDataByPublicKey( - newPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + newPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) userViewModel.changePassword(oldPassKey, newPassKey) } }).build().show() } - aboutUsLayout.setOnClickListener { + binding.aboutUsLayout.setOnClickListener { requireContext().navigatePageTo() } - updateVersionLayout.setOnClickListener { + binding.updateVersionLayout.setOnClickListener { versionViewModel.updateVersion() } - updateLogLayout.setOnClickListener { + binding.updateLogLayout.setOnClickListener { "尽情期待~".show(requireContext()) } - clearCacheLayout.setOnClickListener { + binding.clearCacheLayout.setOnClickListener { //删除缓存之后在设置缓存大小 LoadingDialogHub.show(requireActivity(), "清理中,请稍后") File(requireContext().cacheDir.path).deleteFile() @@ -161,18 +152,14 @@ override fun onFinish() { LoadingDialogHub.dismiss() - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() } }.start() } - loginOutButton.setOnClickListener { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("退出登录") - .setMessage("确定要退出吗?") - .setNegativeButton("取消") - .setPositiveButton("确定") + binding.loginOutButton.setOnClickListener { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("退出登录") + .setMessage("确定要退出吗?").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -203,13 +190,9 @@ if (BuildConfig.VERSION_NAME == it.version) { "已是最新版本,无需更新".show(requireContext()) } else { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("提示") - .setMessage("有新版本,是否更新?") - .setNegativeButton("稍后再说") - .setPositiveButton("立即下载") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(requireContext()).setTitle("提示") + .setMessage("有新版本,是否更新?").setNegativeButton("稍后再说") + .setPositiveButton("立即下载").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { downloadApk(it.downloadUrl) @@ -244,7 +227,7 @@ updateUserInfo() } //缓存 - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() super.onResume() } @@ -258,9 +241,9 @@ // R.color.mainThemeColor.convertColor(requireContext()) // ) // userImageView.setImageDrawable(roundDrawable) - userNameView.text = userData.name - userPhoneView.text = String.format("电话:${userData.phone}") - userDeptView.text = String.format("部门:${userData.deptName}") + binding.userNameView.text = userData.name + binding.userPhoneView.text = String.format("电话:${userData.phone}") + binding.userDeptView.text = String.format("部门:${userData.deptName}") } private fun downloadApk(url: String?) { @@ -275,7 +258,8 @@ * */ val downloadPath = url!!.appendDownloadUrl() //开始下载 - downloadPath.downloadFile(requireContext().createDownloadFileDir().toString(), + downloadPath.downloadFile( + requireContext().createDownloadFileDir().toString(), object : OnDownloadListener { override fun onDownloadStart(totalBytes: Long) { progressDialog.max = totalBytes.toInt() diff --git a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt index b009850..c0afcc5 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt @@ -1,8 +1,11 @@ package com.casic.smarttube.fragment +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R import com.casic.smarttube.adapter.OverviewGroupListAdapter +import com.casic.smarttube.databinding.FragmentOverviewBinding import com.casic.smarttube.extensions.showEmptyPage import com.casic.smarttube.model.ProjectGroupModel import com.casic.smarttube.view.GroupDeviceActivity @@ -11,25 +14,25 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.widget.dialog.AlertInputDialog -import kotlinx.android.synthetic.main.fragment_overview.groupRecyclerView -import kotlinx.android.synthetic.main.fragment_overview.rightOptionView -import kotlinx.android.synthetic.main.fragment_overview.titleView -import kotlinx.android.synthetic.main.include_empty_view.emptyView -class OverviewFragment : KotlinBaseFragment() { +class OverviewFragment : KotlinBaseFragment() { private lateinit var groupViewModel: ProjectGroupViewModel private var dataBeans: MutableList = ArrayList() private lateinit var groupListAdapter: OverviewGroupListAdapter private var clickedPosition = 0 - override fun initLayoutView(): Int = R.layout.fragment_overview - - override fun setupTopBarLayout() { - titleView.text = "概览" + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentOverviewBinding { + return FragmentOverviewBinding.inflate(inflater, container, false) } - override fun initData() { + override fun setupTopBarLayout() { + binding.titleView.text = "概览" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) } @@ -43,7 +46,7 @@ } override fun initEvent() { - rightOptionView.setOnClickListener { + binding.rightOptionView.setOnClickListener { groupViewModel.obtainProGroupList() "刷新数据中,请稍后".show(requireContext()) } @@ -51,16 +54,16 @@ groupViewModel.groupModel.observe(this) { if (it.code == 200) { if (it.data.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { groupViewModel.obtainProGroupList() } } else { - emptyView!!.hide() + binding.emptyInclude.emptyView.hide() dataBeans.clear() dataBeans = it.data groupListAdapter = OverviewGroupListAdapter(requireContext(), it.data) - groupRecyclerView!!.adapter = groupListAdapter + binding.groupRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : OverviewGroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { diff --git a/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt b/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt index e424721..7f036b0 100644 --- a/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt +++ b/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt @@ -4,8 +4,8 @@ import android.graphics.Color import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.Poi -import com.pengxh.kt.lite.extensions.showBusRouteOnMap -import com.pengxh.kt.lite.extensions.showRouteOnMap +import com.casic.smarttube.extensions.showBusRouteOnMap +import com.casic.smarttube.extensions.showRouteOnMap import com.pengxh.kt.lite.widget.dialog.BottomActionSheet object RouteOnMap { diff --git a/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt b/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt index 65bba6f..598581a 100644 --- a/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt @@ -1,27 +1,29 @@ package com.casic.smarttube.view +import android.os.Bundle import com.casic.smarttube.BuildConfig import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityAboutUsBinding import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_about_us.* -import kotlinx.android.synthetic.main.include_base_title.* -class AboutUsActivity : KotlinBaseActivity() { +class AboutUsActivity : KotlinBaseActivity() { - override fun initLayoutView(): Int = R.layout.activity_about_us + override fun initViewBinding(): ActivityAboutUsBinding { + return ActivityAboutUsBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "关于我们" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "关于我们" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { - versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + override fun initOnCreate(savedInstanceState: Bundle?) { + binding.versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") } override fun observeRequestState() { diff --git a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt index 415f9dd..80b83bd 100644 --- a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.content.Intent import android.graphics.Color +import android.os.Bundle import android.os.CountDownTimer import android.os.Handler import android.text.Editable @@ -15,6 +16,7 @@ import com.amap.api.location.AMapLocation import com.casic.smarttube.R import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.smarttube.databinding.ActivityAddDeviceBinding import com.casic.smarttube.extensions.combineImagePath import com.casic.smarttube.extensions.compressImage import com.casic.smarttube.extensions.isNumber @@ -47,24 +49,9 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_add_device.addDeviceTimeView -import kotlinx.android.synthetic.main.activity_add_device.addImageRecyclerView -import kotlinx.android.synthetic.main.activity_add_device.collectIntervalView -import kotlinx.android.synthetic.main.activity_add_device.deviceCodeView -import kotlinx.android.synthetic.main.activity_add_device.deviceNameView -import kotlinx.android.synthetic.main.activity_add_device.inputLengthView -import kotlinx.android.synthetic.main.activity_add_device.latitudeView -import kotlinx.android.synthetic.main.activity_add_device.locationImageView -import kotlinx.android.synthetic.main.activity_add_device.longitudeView -import kotlinx.android.synthetic.main.activity_add_device.ownerShipView -import kotlinx.android.synthetic.main.activity_add_device.scannerView -import kotlinx.android.synthetic.main.activity_add_device.sceneEditView -import kotlinx.android.synthetic.main.activity_add_device.submitButton -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView import java.io.File -class AddDeviceActivity : KotlinBaseActivity() { +class AddDeviceActivity : KotlinBaseActivity() { private val kTag = "AddDeviceActivity" private lateinit var imageAdapter: EditableImageAdapter @@ -81,21 +68,23 @@ registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK) { val data = result.data!! - longitudeView.text = data.getStringExtra("longitude") - latitudeView.text = data.getStringExtra("latitude") + binding.longitudeView.text = data.getStringExtra("longitude") + binding.latitudeView.text = data.getStringExtra("latitude") } } - override fun initLayoutView(): Int = R.layout.activity_add_device + override fun initViewBinding(): ActivityAddDeviceBinding { + return ActivityAddDeviceBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "添加设备" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "添加设备" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { weakReferenceHandler = WeakReferenceHandler(callback) uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] @@ -119,17 +108,17 @@ override fun initEvent() { val manager = QrManager.getInstance().init(QrConfigCreator.create(this)) - scannerView.setOnClickListener { + binding.scannerView.setOnClickListener { manager.startScan(this) { if (it.content.isNumber()) { - deviceCodeView.setText(it.content) + binding.deviceCodeView.setText(it.content) } else { "设备编号错误,请检查标签".show(context) } } } - ownerShipView.setOnClickListener { + binding.ownerShipView.setOnClickListener { groupViewModel.obtainGroupList() } groupViewModel.groupListModel.observe(this) { @@ -147,19 +136,14 @@ groups.add("自定义") } if (groups.isNotEmpty()) { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(groups) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { if (groups[position] == "自定义") { - AlertInputDialog.Builder() - .setContext(context) - .setTitle("提示") + AlertInputDialog.Builder().setContext(context).setTitle("提示") .setHintMessage("请输入该设备所属项目名,如:项目203") - .setNegativeButton("取消") - .setPositiveButton("确定") + .setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertInputDialog.OnDialogButtonClickListener { override fun onCancelClick() { @@ -167,12 +151,11 @@ } override fun onConfirmClick(value: String) { - ownerShipView.text = value + binding.ownerShipView.text = value } - }) - .build().show() + }).build().show() } else { - ownerShipView.text = groups[position] + binding.ownerShipView.text = groups[position] } } }).build().show() @@ -180,27 +163,22 @@ } //默认频率1min - collectIntervalView.text = frequency[0] - collectIntervalView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + binding.collectIntervalView.text = frequency[0] + binding.collectIntervalView.setOnClickListener { + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(frequency) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { - collectIntervalView.text = frequency[position] + binding.collectIntervalView.text = frequency[position] } }).build().show() } - locationImageView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(context) - .setItemTextColor(Color.BLUE) + binding.locationImageView.setOnClickListener { + BottomActionSheet.Builder().setContext(context).setItemTextColor(Color.BLUE) .setActionItemTitle(arrayListOf("自动定位", "手动选点")) - .setOnActionSheetListener(object : - BottomActionSheet.OnActionSheetListener { + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { when (position) { 0 -> { @@ -210,30 +188,32 @@ override fun onAMapLocationGet(aMapLocation: AMapLocation?) { LoadingDialogHub.dismiss() if (aMapLocation == null) { - longitudeView.text = "定位失败" - latitudeView.text = "定位失败" + binding.longitudeView.text = "定位失败" + binding.latitudeView.text = "定位失败" - longitudeView.setTextColor( + binding.longitudeView.setTextColor( R.color.redTextColor.convertColor(context) ) - latitudeView.setTextColor( + binding.latitudeView.setTextColor( R.color.redTextColor.convertColor(context) ) } else { - longitudeView.text = + binding.longitudeView.text = aMapLocation.longitude.toString() - latitudeView.text = aMapLocation.latitude.toString() + binding.latitudeView.text = + aMapLocation.latitude.toString() - longitudeView.setTextColor( + binding.longitudeView.setTextColor( R.color.mainTextColor.convertColor(context) ) - latitudeView.setTextColor( + binding.latitudeView.setTextColor( R.color.mainTextColor.convertColor(context) ) } } }) } + 1 -> selectLocationLauncher.launch( Intent(context, SelectLocationActivity::class.java) ) @@ -243,7 +223,7 @@ } imageAdapter = EditableImageAdapter(this, 3, 13f) - addImageRecyclerView.adapter = imageAdapter + binding.addImageRecyclerView.adapter = imageAdapter imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { selectPicture() @@ -281,7 +261,7 @@ } } - sceneEditView.addTextChangedListener(object : TextWatcher { + binding.sceneEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { } @@ -292,31 +272,31 @@ override fun afterTextChanged(s: Editable?) { val text = s.toString().trim() - inputLengthView.text = String.format("${text.length}/100") + binding.inputLengthView.text = String.format("${text.length}/100") if (text.length > 100) { - inputLengthView.setTextColor(R.color.redTextColor.convertColor(context)) + binding.inputLengthView.setTextColor(R.color.redTextColor.convertColor(context)) "现场情况字符不能超过100个字符".show(context) } else { - inputLengthView.setTextColor(R.color.subTextColor.convertColor(context)) + binding.inputLengthView.setTextColor(R.color.subTextColor.convertColor(context)) } } }) - addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() + binding.addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() - submitButton.setOnClickListener { - val deviceCode = deviceCodeView.text.toString().trim() + binding.submitButton.setOnClickListener { + val deviceCode = binding.deviceCodeView.text.toString().trim() if (deviceCode.isBlank()) { "请输入设备编号".show(context) return@setOnClickListener } - val ownerShip = ownerShipView.text.toString().trim() + val ownerShip = binding.ownerShipView.text.toString().trim() if (ownerShip.isBlank()) { "请输入设备所属项目".show(context) return@setOnClickListener } - val longitude = longitudeView.text.toString().trim() - val latitude = latitudeView.text.toString().trim() + val longitude = binding.longitudeView.text.toString().trim() + val latitude = binding.latitudeView.text.toString().trim() if (longitude.isBlank() || latitude.isBlank()) { "请先获取当前经纬度".show(context) return@setOnClickListener @@ -329,14 +309,14 @@ ) deviceViewModel.addDevice( deviceCode, - deviceNameView.text.toString(), + binding.deviceNameView.text.toString(), ownerShip, - collectIntervalView.text.toString(), + binding.collectIntervalView.text.toString(), longitude, latitude, imagePaths.reformat(), - sceneEditView.text.toString().trim(), - addDeviceTimeView.text.toString(), + binding.sceneEditView.text.toString().trim(), + binding.addDeviceTimeView.text.toString(), userData.id.toString(), userData.deptId ) @@ -345,16 +325,13 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(listOf("拍照", "相册")) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { when (position) { 0 -> { - PictureSelector.create(context) - .openCamera(SelectMimeType.ofImage()) + PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { if (result == null) { @@ -362,8 +339,7 @@ return } LoadingDialogHub.show( - this@AddDeviceActivity, - "图片上传中,请稍后..." + this@AddDeviceActivity, "图片上传中,请稍后..." ) selectedImages = result analyticalSelectResults(result[0]) @@ -374,14 +350,11 @@ } }) } + 1 -> { - PictureSelector.create(context) - .openGallery(SelectMimeType.ofImage()) - .isGif(false) - .isMaxSelectEnabledMask(true) - .setFilterMinFileSize(100) - .setMaxSelectNum(3) - .isDisplayCamera(false) + PictureSelector.create(context).openGallery(SelectMimeType.ofImage()) + .isGif(false).isMaxSelectEnabledMask(true).setFilterMinFileSize(100) + .setMaxSelectNum(3).isDisplayCamera(false) .setImageEngine(GlideLoadEngine.instance) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { @@ -390,8 +363,7 @@ return } LoadingDialogHub.show( - this@AddDeviceActivity, - "图片上传中,请稍后..." + this@AddDeviceActivity, "图片上传中,请稍后..." ) selectedImages = result // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 diff --git a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt index 3864f16..e4f19a4 100644 --- a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.content.Context +import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,19 +11,20 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityBigImageBinding import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager -import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : KotlinBaseActivity() { +class BigImageActivity : KotlinBaseActivity() { - override fun initLayoutView(): Int = R.layout.activity_big_image + override fun initViewBinding(): ActivityBigImageBinding { + return ActivityBigImageBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { PageNavigationManager.addActivity(this) @@ -30,16 +32,16 @@ ImmersionBar.with(this).statusBarDarkFont(false).init() } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) val urls = intent.getStringArrayListExtra(Constant.BIG_IMAGE_INTENT_DATA_KEY) if (urls == null || urls.size == 0) { return } - pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") - imagePagerView.adapter = BigImageAdapter(this, urls) - imagePagerView.currentItem = index - imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + binding.pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + binding.imagePagerView.adapter = BigImageAdapter(this, urls) + binding.imagePagerView.currentItem = index + binding.imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrollStateChanged(state: Int) { } @@ -53,7 +55,8 @@ } override fun onPageSelected(position: Int) { - pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + binding.pageNumberView.text = + String.format("(" + (position + 1) + "/" + urls.size + ")") } }) } @@ -63,7 +66,7 @@ } override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } + binding.leftBackView.setOnClickListener { this.finish() } } class BigImageAdapter(private var context: Context, imageList: ArrayList) : diff --git a/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt b/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt index 072953f..f036a78 100644 --- a/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.graphics.Color +import android.os.Bundle import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -10,6 +11,7 @@ import com.amap.api.services.geocoder.RegeocodeQuery import com.amap.api.services.geocoder.RegeocodeResult import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityDeviceDetailBinding import com.casic.smarttube.extensions.combineImagePath import com.casic.smarttube.extensions.toSignalImage import com.casic.smarttube.model.DeviceDetailModel @@ -25,51 +27,39 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState -import kotlinx.android.synthetic.main.activity_device_detail.densityView -import kotlinx.android.synthetic.main.activity_device_detail.descriptionView -import kotlinx.android.synthetic.main.activity_device_detail.deviceBatteryView -import kotlinx.android.synthetic.main.activity_device_detail.deviceCodeView -import kotlinx.android.synthetic.main.activity_device_detail.deviceNameView -import kotlinx.android.synthetic.main.activity_device_detail.deviceStateView -import kotlinx.android.synthetic.main.activity_device_detail.imageGridView -import kotlinx.android.synthetic.main.activity_device_detail.lastDataView -import kotlinx.android.synthetic.main.activity_device_detail.leftBackView -import kotlinx.android.synthetic.main.activity_device_detail.locationView -import kotlinx.android.synthetic.main.activity_device_detail.projectGroupView -import kotlinx.android.synthetic.main.activity_device_detail.rightOptionView -import kotlinx.android.synthetic.main.activity_device_detail.signalImageView -import kotlinx.android.synthetic.main.activity_device_detail.titleView -class DeviceDetailActivity : KotlinBaseActivity() { +class DeviceDetailActivity : KotlinBaseActivity() { private val kTag = "DeviceDetailActivity" private lateinit var deviceViewModel: DeviceViewModel private lateinit var deviceModel: DeviceDetailModel.DataModel private val geocoderSearch by lazy { GeocodeSearch(this) } - override fun initLayoutView(): Int = R.layout.activity_device_detail + override fun initViewBinding(): ActivityDeviceDetailBinding { + return ActivityDeviceDetailBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "设备详情" - leftBackView.setOnClickListener { finish() } + binding.titleView.text = "设备详情" + binding.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! - deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] deviceViewModel.obtainDeviceDetail(params[0], params[1]) deviceViewModel.deviceDetailModel.observe(this) { if (it.code == 200) { val device = it.data this.deviceModel = device - deviceCodeView.text = device.devcode - deviceNameView.text = device.deviceName - projectGroupView.text = String.format("项目${device.groupId}") + binding.deviceCodeView.text = device.devcode + binding.deviceNameView.text = device.deviceName + binding.projectGroupView.text = String.format("项目${device.groupId}") if (device.latGaode.isBlank() || device.lngGaode.isBlank()) { - locationView.text = "经纬度异常,无法查看具体位置" + binding.locationView.text = "经纬度异常,无法查看具体位置" } else { val queryParam = RegeocodeQuery( LatLonPoint(device.latGaode.toDouble(), device.lngGaode.toDouble()), @@ -81,7 +71,7 @@ GeocodeSearch.OnGeocodeSearchListener { override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { if (rCode == 1000) { - locationView.text = result?.regeocodeAddress?.formatAddress + binding.locationView.text = result?.regeocodeAddress?.formatAddress } } @@ -90,12 +80,12 @@ } }) } - descriptionView.text = device.descn + binding.descriptionView.text = device.descn if (device.photos.toString().isBlank()) { - imageGridView.visibility = View.GONE + binding.imageGridView.visibility = View.GONE } else { - imageGridView.visibility = View.VISIBLE + binding.imageGridView.visibility = View.VISIBLE //处理图片地址 val urls: ArrayList = ArrayList() val imageArray = device.photos.toString().split(",") @@ -104,10 +94,9 @@ urls.add(path.combineImagePath()) } } - val imageAdapter = ReadOnlyImageAdapter(this) - imageAdapter.setImageList(urls) - imageGridView.adapter = imageAdapter - imageGridView.setOnItemClickListener { _, _, position, _ -> + val imageAdapter = ReadOnlyImageAdapter(this, urls) + binding.imageGridView.adapter = imageAdapter + binding.imageGridView.setOnItemClickListener { _, _, position, _ -> if (urls[position].isEmpty()) { "图片加载失败,无法查看大图".show(this) } else { @@ -119,18 +108,18 @@ val value = device.stregnth.toDouble().toInt() val level = "$value%" val ppm = "${value * 500}ppm" - densityView.text = "$level(相当于$ppm)" + binding.densityView.text = "$level(相当于$ppm)" - lastDataView.text = device.uptime + binding.lastDataView.text = device.uptime if (device.onlineState == "0") { - deviceStateView.text = "离线" - deviceStateView.setTextColor(Color.RED) + binding.deviceStateView.text = "离线" + binding.deviceStateView.setTextColor(Color.RED) } else { - deviceStateView.text = "在线" - deviceStateView.setTextColor(Color.GREEN) + binding.deviceStateView.text = "在线" + binding.deviceStateView.setTextColor(Color.GREEN) } - signalImageView.setBackgroundResource(device.rsrp.toSignalImage()) - deviceBatteryView.text = if (device.cell.isNullOrBlank()) { + binding.signalImageView.setBackgroundResource(device.rsrp.toSignalImage()) + binding.deviceBatteryView.text = if (device.cell.isNullOrBlank()) { "0%" } else { device.cell + "%" @@ -149,7 +138,7 @@ } override fun initEvent() { - rightOptionView.setOnClickListener { + binding.rightOptionView.setOnClickListener { val lat = deviceModel.latGaode.toString() val lng = deviceModel.lngGaode.toString() if (lat.isBlank() || lng.isBlank()) { diff --git a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt index 0ae8862..ba52ab8 100644 --- a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.content.Context +import android.os.Bundle import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -8,6 +9,7 @@ import androidx.recyclerview.widget.RecyclerView import com.casic.smarttube.R import com.casic.smarttube.adapter.DeviceListAdapter +import com.casic.smarttube.databinding.ActivityGroupDeviceBinding import com.casic.smarttube.extensions.showEmptyPage import com.casic.smarttube.model.DeviceListModel import com.casic.smarttube.utils.LoadingDialogHub @@ -28,14 +30,8 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.qmuiteam.qmui.recyclerView.QMUIRVItemSwipeAction import com.qmuiteam.qmui.recyclerView.QMUISwipeAction -import kotlinx.android.synthetic.main.activity_group_device.groupDeviceLayout -import kotlinx.android.synthetic.main.activity_group_device.groupDeviceView -import kotlinx.android.synthetic.main.activity_group_device.leftBackView -import kotlinx.android.synthetic.main.activity_group_device.rightOptionView -import kotlinx.android.synthetic.main.activity_group_device.titleView -import kotlinx.android.synthetic.main.include_empty_view.emptyView -class GroupDeviceActivity : KotlinBaseActivity() { +class GroupDeviceActivity : KotlinBaseActivity() { private lateinit var groupId: String private lateinit var weakReferenceHandler: WeakReferenceHandler @@ -51,18 +47,19 @@ private var clickedPosition = 0 private var isDeleteAll = false - override fun initLayoutView(): Int = R.layout.activity_group_device + override fun initViewBinding(): ActivityGroupDeviceBinding { + return ActivityGroupDeviceBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - leftBackView.setOnClickListener { finish() } - rightOptionView.setOnClickListener { + binding.leftBackView.setOnClickListener { finish() } + binding.rightOptionView.setOnClickListener { //改为Popup val easyPopupWindow = EasyPopupWindow(this) easyPopupWindow.setPopupMenuItem( - LocaleConstant.DEVICE_OPERATE_IMAGES, - LocaleConstant.DEVICE_OPERATE_TITLES + LocaleConstant.DEVICE_OPERATE_IMAGES, LocaleConstant.DEVICE_OPERATE_TITLES ) easyPopupWindow.setOnPopupWindowClickListener(object : EasyPopupWindow.OnPopupWindowClickListener { @@ -77,13 +74,11 @@ pageIndex = 1 obtainDeviceListByPage() } + 1 -> { - AlertControlDialog.Builder() - .setContext(context) - .setTitle("提示") + AlertControlDialog.Builder().setContext(context).setTitle("提示") .setMessage("删除后将无法恢复,是否继续?") - .setNegativeButton("容我想想") - .setPositiveButton("已经想好") + .setNegativeButton("容我想想").setPositiveButton("已经想好") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onCancelClick() { @@ -103,13 +98,11 @@ } }).build().show() } + 2 -> { - MultiSelectDialog.Builder() - .setContext(this@GroupDeviceActivity) - .setTitle("选择设备") - .setDataSource(dataBeans) - .setNegativeButton("取消") - .setPositiveButton("选好了") + MultiSelectDialog.Builder().setContext(this@GroupDeviceActivity) + .setTitle("选择设备").setDataSource(dataBeans) + .setNegativeButton("取消").setPositiveButton("选好了") .setOnDialogButtonClickListener(object : MultiSelectDialog.OnDialogButtonClickListener { override fun onConfirmClick(selectedModels: MutableList) { @@ -126,21 +119,20 @@ override fun onCancelClick() { } - }) - .build().show() + }).build().show() } } } }) easyPopupWindow.setBackgroundDrawable(null) - val x: Int = rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(rightOptionView, x, 0) + val x: Int = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { groupId = intent.getStringExtra(Constant.INTENT_PARAM)!! - titleView.text = String.format(groupId + "项目设备列表") + binding.titleView.text = String.format(groupId + "项目设备列表") weakReferenceHandler = WeakReferenceHandler(callback) groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java] deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] @@ -157,13 +149,13 @@ } override fun initEvent() { - groupDeviceLayout.setOnRefreshListener { + binding.groupDeviceLayout.setOnRefreshListener { isRefresh = true //刷新之后页码重置 pageIndex = 1 obtainDeviceListByPage() } - groupDeviceLayout.setOnLoadMoreListener { + binding.groupDeviceLayout.setOnLoadMoreListener { isLoadMore = true pageIndex++ obtainDeviceListByPage() @@ -176,7 +168,7 @@ isRefresh -> { dataBeans.clear() dataBeans = dataRows!! - groupDeviceLayout.finishRefresh() + binding.groupDeviceLayout.finishRefresh() isRefresh = false } @@ -185,7 +177,7 @@ "到底了,别拉了".show(this) } dataBeans.addAll(dataRows!!) - groupDeviceLayout.finishLoadMore() + binding.groupDeviceLayout.finishLoadMore() isLoadMore = false } @@ -211,7 +203,7 @@ ) } if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { pageIndex = 1 obtainDeviceListByPage() } @@ -230,15 +222,15 @@ deviceAdapter.notifyDataSetChanged() } else { if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { pageIndex = 1 obtainDeviceListByPage() } } else { - emptyView!!.hide() + binding.emptyInclude.emptyView.hide() deviceAdapter = DeviceListAdapter(this, dataBeans) //绑定侧滑事件 - swipeAction.attachToRecyclerView(groupDeviceView) + swipeAction.attachToRecyclerView(binding.groupDeviceView) val linearLayoutManager = object : LinearLayoutManager(this) { override fun generateDefaultLayoutParams(): RecyclerView.LayoutParams { return RecyclerView.LayoutParams( @@ -247,8 +239,8 @@ ) } } - groupDeviceView.layoutManager = linearLayoutManager - groupDeviceView.adapter = deviceAdapter + binding.groupDeviceView.layoutManager = linearLayoutManager + binding.groupDeviceView.adapter = deviceAdapter deviceAdapter.setOnItemClickListener(object : DeviceListAdapter.OnItemClickListener { override fun onClicked(position: Int) { @@ -311,13 +303,9 @@ }) private fun deleteItem(adapterPosition: Int) { - AlertControlDialog.Builder() - .setContext(this) - .setTitle("提示") - .setMessage("删除后将无法恢复,是否继续?") - .setNegativeButton("容我想想") - .setPositiveButton("已经想好") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(this).setTitle("提示") + .setMessage("删除后将无法恢复,是否继续?").setNegativeButton("容我想想") + .setPositiveButton("已经想好").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onCancelClick() { diff --git a/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt b/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt index 71f438c..70e49f0 100644 --- a/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt @@ -1,9 +1,11 @@ package com.casic.smarttube.view +import android.os.Bundle import android.view.View import android.widget.AdapterView import androidx.lifecycle.ViewModelProvider import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityHistoryDataBinding import com.casic.smarttube.extensions.dateToMonthDay import com.casic.smarttube.extensions.getQuarterOfYear import com.casic.smarttube.utils.ChartViewHelper @@ -22,27 +24,26 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState -import kotlinx.android.synthetic.main.activity_history_data.dataLineChart -import kotlinx.android.synthetic.main.activity_history_data.leftBackView -import kotlinx.android.synthetic.main.activity_history_data.periodSpinner import java.util.Calendar -class HistoryDataActivity : KotlinBaseActivity() { +class HistoryDataActivity : KotlinBaseActivity() { private val kTag = "HistoryDataActivity" private lateinit var deviceViewModel: DeviceViewModel private lateinit var groupId: String private lateinit var devCode: String - override fun initLayoutView(): Int = R.layout.activity_history_data + override fun initViewBinding(): ActivityHistoryDataBinding { + return ActivityHistoryDataBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - leftBackView.setOnClickListener { finish() } + binding.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! groupId = params[0] devCode = params[1] @@ -61,8 +62,8 @@ override fun initEvent() { //默认选择近7天的数据 - periodSpinner.setSelection(3) - periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + binding.periodSpinner.setSelection(3) + binding.periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onItemSelected( parent: AdapterView<*>?, view: View?, position: Int, id: Long ) { @@ -76,6 +77,7 @@ groupId, devCode, "$year-01-01", time.timestampToCompleteDate() ) } + 1 -> { //本季度 val startDate = when (time.getQuarterOfYear()) { @@ -89,6 +91,7 @@ groupId, devCode, startDate, time.timestampToCompleteDate() ) } + 2 -> { //近30日 deviceViewModel.obtainDeviceHistoryData( @@ -98,6 +101,7 @@ time.timestampToCompleteDate() ) } + 3 -> { //近7日 deviceViewModel.obtainDeviceHistoryData( @@ -107,19 +111,18 @@ time.timestampToCompleteDate() ) } + 4 -> { //今日 deviceViewModel.obtainDeviceHistoryData( groupId, devCode, time.timestampToDate(), time.timestampToCompleteDate() ) } + 5 -> { - DateSelectDialog.Builder() - .setContext(this@HistoryDataActivity) - .setTitle("选择日期") - .setNegativeButton("取消") - .setPositiveButton("选好了") - .setOnDialogButtonClickListener(object : + DateSelectDialog.Builder().setContext(this@HistoryDataActivity) + .setTitle("选择日期").setNegativeButton("取消") + .setPositiveButton("选好了").setOnDialogButtonClickListener(object : DateSelectDialog.OnDialogButtonClickListener { override fun onConfirmClick(startDate: String, endDate: String) { deviceViewModel.obtainDeviceHistoryData( @@ -129,12 +132,10 @@ override fun onCancelClick() { //选择取消就默认加载近7天的数据 - periodSpinner.setSelection(3) + binding.periodSpinner.setSelection(3) } - }) - .setFragmentManager(supportFragmentManager) - .setCalendarType(Type.YEAR_MONTH_DAY) - .build().show() + }).setFragmentManager(supportFragmentManager) + .setCalendarType(Type.YEAR_MONTH_DAY).build().show() } } } @@ -159,7 +160,9 @@ Entry(i.toFloat(), rowsBean.stregnth!!.toFloat(), "浓度") ) } - ChartViewHelper.setLineChartData(dataLineChart, xAxisLabels, strengthEntries) + ChartViewHelper.setLineChartData( + binding.dataLineChart, xAxisLabels, strengthEntries + ) } } } diff --git a/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt b/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt index ebca433..f947b2c 100644 --- a/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt @@ -1,7 +1,8 @@ package com.casic.smarttube.view +import android.os.Bundle import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityLoginBinding import com.casic.smarttube.utils.AuthenticationHelper import com.casic.smarttube.utils.LoadingDialogHub import com.casic.smarttube.utils.LocaleConstant @@ -14,26 +15,29 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues -import kotlinx.android.synthetic.main.activity_login.loginButton -import kotlinx.android.synthetic.main.activity_login.userNameView -import kotlinx.android.synthetic.main.activity_login.userPasswordView -class LoginActivity : KotlinBaseActivity() { +class LoginActivity : KotlinBaseActivity() { private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginViewModel: LoginViewModel private lateinit var userViewModel: UserViewModel - override fun initLayoutView(): Int = R.layout.activity_login + override fun initViewBinding(): ActivityLoginBinding { + return ActivityLoginBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(true).init() } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { // 设置默认账号密码 - userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) - userPasswordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + binding.userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + binding.userPasswordView.setText( + SaveKeyValues.getValue( + LocaleConstant.PASSWORD, "" + ) as String + ) authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] @@ -50,9 +54,9 @@ } override fun initEvent() { - loginButton.setOnClickListener { - val account = userNameView.text.toString().trim() - val userPassword = userPasswordView.text.toString().trim() + binding.loginButton.setOnClickListener { + val account = binding.userNameView.text.toString().trim() + val userPassword = binding.userPasswordView.text.toString().trim() if (account.isBlank()) { "用户名不能为空".show(this) return@setOnClickListener @@ -74,8 +78,8 @@ AuthenticationHelper.savePublicKey(keyString) val publicKey = RSAUtils.keyStrToPublicKey(keyString) - val account = userNameView.text.toString() - val userPassword = userPasswordView.text.toString() + val account = binding.userNameView.text.toString() + val userPassword = binding.userPasswordView.text.toString() val dataByPublicKey = RSAUtils.encryptDataByPublicKey(userPassword.toByteArray(), publicKey!!) //登录并获取Token,POST请求 diff --git a/app/src/main/java/com/casic/smarttube/view/MainActivity.kt b/app/src/main/java/com/casic/smarttube/view/MainActivity.kt index 4461757..575e1ee 100644 --- a/app/src/main/java/com/casic/smarttube/view/MainActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/MainActivity.kt @@ -1,5 +1,6 @@ package com.casic.smarttube.view +import android.os.Bundle import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment @@ -7,6 +8,7 @@ import androidx.fragment.app.FragmentPagerAdapter import androidx.viewpager.widget.ViewPager import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityMainBinding import com.casic.smarttube.fragment.HomePageFragment import com.casic.smarttube.fragment.MinePageFragment import com.casic.smarttube.fragment.OverviewFragment @@ -15,9 +17,8 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_main.* -class MainActivity : KotlinBaseActivity() { +class MainActivity : KotlinBaseActivity() { private var menuItem: MenuItem? = null private var fragmentList: MutableList = ArrayList() @@ -29,32 +30,36 @@ fragmentList.add(MinePageFragment()) } - override fun initLayoutView(): Int = R.layout.activity_main + override fun initViewBinding(): ActivityMainBinding { + return ActivityMainBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { //保留icon原图颜色 - bottomNavigation.itemIconTintList = null - bottomNavigation.setOnItemSelectedListener { menuItem -> + binding.bottomNavigation.itemIconTintList = null + binding.bottomNavigation.setOnItemSelectedListener { menuItem -> when (menuItem.itemId) { R.id.nav_home -> { - mainViewPager.currentItem = 0 + binding.mainViewPager.currentItem = 0 } + R.id.nav_overview -> { - mainViewPager.currentItem = 1 + binding.mainViewPager.currentItem = 1 } + R.id.nav_mine -> { - mainViewPager.currentItem = 2 + binding.mainViewPager.currentItem = 2 } } false } - mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) - mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 + binding.mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + binding.mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun observeRequestState() { @@ -62,7 +67,7 @@ } override fun initEvent() { - mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + binding.mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrollStateChanged(state: Int) { } @@ -77,9 +82,9 @@ if (menuItem != null) { menuItem!!.isChecked = false } else { - bottomNavigation.menu.getItem(0).isChecked = false + binding.bottomNavigation.menu.getItem(0).isChecked = false } - menuItem = bottomNavigation.menu.getItem(position) + menuItem = binding.bottomNavigation.menu.getItem(position) menuItem!!.isChecked = true } }) diff --git a/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt b/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt index f00e0ca..908aade 100644 --- a/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt @@ -15,6 +15,7 @@ import com.amap.api.services.geocoder.RegeocodeQuery import com.amap.api.services.geocoder.RegeocodeResult import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityMapDeviceBriefBinding import com.casic.smarttube.utils.LoadingDialogHub import com.casic.smarttube.utils.RouteOnMap import com.casic.smarttube.vm.DeviceViewModel @@ -24,16 +25,8 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState -import kotlinx.android.synthetic.main.activity_map_device_brief.deviceCodeView -import kotlinx.android.synthetic.main.activity_map_device_brief.deviceModelView -import kotlinx.android.synthetic.main.activity_map_device_brief.deviceValueView -import kotlinx.android.synthetic.main.activity_map_device_brief.locationView -import kotlinx.android.synthetic.main.activity_map_device_brief.mapView -import kotlinx.android.synthetic.main.activity_map_device_brief.updateTimeView -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -class MapDeviceBriefActivity : KotlinBaseActivity() { +class MapDeviceBriefActivity : KotlinBaseActivity() { private val kTag = "MapDeviceBriefActivity" private lateinit var deviceViewModel: DeviceViewModel @@ -42,17 +35,19 @@ private val geocoderSearch by lazy { GeocodeSearch(this) } - override fun initLayoutView(): Int = R.layout.activity_map_device_brief + override fun initViewBinding(): ActivityMapDeviceBriefBinding { + return ActivityMapDeviceBriefBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "设备最新数据地图展示" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "设备最新数据地图展示" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { - aMap = mapView.map + override fun initOnCreate(savedInstanceState: Bundle?) { + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val uiSettings = aMap.uiSettings uiSettings.isCompassEnabled = true @@ -80,22 +75,22 @@ if (it.code == 200) { val device = it.data - deviceCodeView.text = String.format("设备编号: ${device.devcode}") - deviceModelView.text = String.format("设备模型: ${params[2]}") + binding.deviceCodeView.text = String.format("设备编号: ${device.devcode}") + binding.deviceModelView.text = String.format("设备模型: ${params[2]}") //获取设备最新浓度信息 deviceViewModel.obtainTubeLastData(device.groupId, device.devcode) deviceViewModel.lastDataModel.observe(this) { v -> if (v.code == 200) { - deviceValueView.text = String.format("最新浓度: ${v.data.strength}") - updateTimeView.text = String.format("更新时间: ${v.data.uptime}") + binding.deviceValueView.text = String.format("最新浓度: ${v.data.strength}") + binding.updateTimeView.text = String.format("更新时间: ${v.data.uptime}") } else { - deviceValueView.text = String.format("最新浓度: 未知") - updateTimeView.text = String.format("更新时间: 未知") + binding.deviceValueView.text = String.format("最新浓度: 未知") + binding.updateTimeView.text = String.format("更新时间: 未知") } } if (device.latGaode.isBlank() || device.lngGaode.isBlank()) { - locationView.text = "经纬度异常,无法查看具体位置" + binding.locationView.text = "经纬度异常,无法查看具体位置" } else { val queryParam = RegeocodeQuery( LatLonPoint(device.latGaode.toDouble(), device.lngGaode.toDouble()), @@ -108,7 +103,7 @@ GeocodeSearch.OnGeocodeSearchListener { override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { if (rCode == 1000) { - locationView.text = + binding.locationView.text = String.format("详细位置: ${result?.regeocodeAddress?.formatAddress}") } } @@ -123,8 +118,7 @@ aMap.animateCamera(newCameraPosition, 1500, object : AMap.CancelableCallback { override fun onFinish() { //添加Marker - val markerOptions = MarkerOptions() - .position(latLng) + val markerOptions = MarkerOptions().position(latLng) .icon(BitmapDescriptorFactory.fromResource(R.mipmap.well_location)) .draggable(false) aMap.addMarker(markerOptions) @@ -148,26 +142,26 @@ /**地图相关*********/ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - mapView.onCreate(savedInstanceState) + binding.mapView.onCreate(savedInstanceState) } override fun onResume() { super.onResume() - mapView.onResume() + binding.mapView.onResume() } override fun onPause() { super.onPause() - mapView.onPause() + binding.mapView.onPause() } override fun onDestroy() { - mapView.onDestroy() + binding.mapView.onDestroy() super.onDestroy() } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - mapView.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/view/PermissionActivity.kt b/app/src/main/java/com/casic/smarttube/view/PermissionActivity.kt index e872ef4..fc20978 100644 --- a/app/src/main/java/com/casic/smarttube/view/PermissionActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/PermissionActivity.kt @@ -13,7 +13,6 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。 if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) { startSplashScreenActivity() } else { diff --git a/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt b/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt index c639105..bb0b0ed 100644 --- a/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt @@ -13,33 +13,35 @@ import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.MyLocationStyle import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivitySelectLocationBinding import com.casic.smarttube.utils.CenterMarkerView import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_select_location.* -class SelectLocationActivity : KotlinBaseActivity(), AMap.OnMyLocationChangeListener, - OnMapLoadedListener, OnCameraChangeListener { +class SelectLocationActivity : KotlinBaseActivity(), + AMap.OnMyLocationChangeListener, OnMapLoadedListener, OnCameraChangeListener { private val kTag = "SelectLocationActivity" private lateinit var latLng: LatLng private lateinit var aMap: AMap private lateinit var centerMarkerView: CenterMarkerView - override fun initLayoutView(): Int = R.layout.activity_select_location + override fun initViewBinding(): ActivitySelectLocationBinding { + return ActivitySelectLocationBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "手动选点" - leftBackView.setOnClickListener { finish() } + binding.titleView.text = "手动选点" + binding.leftBackView.setOnClickListener { finish() } } - override fun initData() { - aMap = mapView.map + override fun initOnCreate(savedInstanceState: Bundle?) { + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val locationStyle = MyLocationStyle() //定位一次,且将视角移动到地图中心点 @@ -76,7 +78,7 @@ aMap.setOnMapLoadedListener(this) aMap.setOnCameraChangeListener(this) - rightOperateView.setOnClickListener { + binding.rightOperateView.setOnClickListener { val intent = Intent() intent.putExtra("longitude", latLng.longitude.toString()) intent.putExtra("latitude", latLng.latitude.toString()) @@ -110,27 +112,27 @@ /**地图相关*********/ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - mapView.onCreate(savedInstanceState) + binding.mapView.onCreate(savedInstanceState) } override fun onResume() { super.onResume() - mapView.onResume() + binding.mapView.onResume() } override fun onPause() { super.onPause() - mapView.onPause() + binding.mapView.onPause() } override fun onDestroy() { centerMarkerView.destroy() - mapView.onDestroy() + binding.mapView.onDestroy() super.onDestroy() } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - mapView.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/smarttube/view/SplashScreenActivity.kt index dafbe4d..baf5222 100644 --- a/app/src/main/java/com/casic/smarttube/view/SplashScreenActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/SplashScreenActivity.kt @@ -1,16 +1,17 @@ package com.casic.smarttube.view import android.annotation.SuppressLint +import android.os.Bundle import android.os.CountDownTimer import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivitySplashBinding import com.casic.smarttube.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo @SuppressLint("CustomSplashScreen") -class SplashScreenActivity : KotlinBaseActivity() { +class SplashScreenActivity : KotlinBaseActivity() { private lateinit var userDetailViewModel: UserViewModel private val countDownTimer = object : CountDownTimer(1000, 500) { @@ -34,13 +35,15 @@ } } - override fun initLayoutView(): Int = R.layout.activity_splash + override fun initViewBinding(): ActivitySplashBinding { + return ActivitySplashBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { userDetailViewModel = ViewModelProvider(this).get(UserViewModel::class.java) } diff --git a/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt b/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt index 23d1ac1..ae7df77 100644 --- a/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt +++ b/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt @@ -6,14 +6,19 @@ import android.view.Gravity import androidx.fragment.app.FragmentManager import com.casic.smarttube.R +import com.casic.smarttube.databinding.DialogSelectDateBinding import com.casic.smarttube.utils.LocaleConstant import com.jzxiang.pickerview.TimePickerDialog import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.* -import kotlinx.android.synthetic.main.dialog_select_date.* +import com.pengxh.kt.lite.extensions.binding +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.resetParams +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.extensions.timestampToTime import java.text.ParseException import java.text.SimpleDateFormat -import java.util.* +import java.util.Locale class DateSelectDialog private constructor(builder: Builder) : Dialog( builder.context, R.style.UserDefinedDialogStyle @@ -76,6 +81,8 @@ } } + private val binding: DialogSelectDateBinding by binding() + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) this.resetParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.85) @@ -84,10 +91,10 @@ setCanceledOnTouchOutside(false) if (title.isNotBlank()) { - dialogTitleView.text = title + binding.dialogTitleView.text = title } - startDateView.setOnClickListener { + binding.startDateView.setOnClickListener { TimePickerDialog.Builder() .setThemeColor(R.color.mainThemeColor.convertColor(ctx)) .setTitleStringId("请选择起始时间") @@ -102,11 +109,11 @@ } else { millSeconds.timestampToCompleteDate() } - startDateView.setText(textValue) + binding.startDateView.setText(textValue) }.build().show(fragmentManager, "DateSelectDialog") } - endDateView.setOnClickListener { + binding.endDateView.setOnClickListener { TimePickerDialog.Builder() .setThemeColor(R.color.mainThemeColor.convertColor(ctx)) .setTitleStringId("请选择起始时间") @@ -121,21 +128,21 @@ } else { millSeconds.timestampToCompleteDate() } - endDateView.setText(textValue) + binding.endDateView.setText(textValue) }.build().show(fragmentManager, "DateSelectDialog") } - dialogCancelButton.text = negativeBtn - dialogCancelButton.setOnClickListener { + binding.dialogCancelButton.text = negativeBtn + binding.dialogCancelButton.setOnClickListener { listener.onCancelClick() this.dismiss() } - dialogConfirmButton.text = positiveBtn - dialogConfirmButton.setOnClickListener { + binding.dialogConfirmButton.text = positiveBtn + binding.dialogConfirmButton.setOnClickListener { //判断其实时间和结束时间 - val startDate = startDateView.text.toString() - val endDate = endDateView.text.toString() + val startDate = binding.startDateView.text.toString() + val endDate = binding.endDateView.text.toString() if (isEarlierThanStart(startDate, endDate)) { "结束时间不能早于开始时间".show(ctx) return@setOnClickListener diff --git a/app/src/main/java/com/casic/smarttube/widgets/MultiSelectDialog.kt b/app/src/main/java/com/casic/smarttube/widgets/MultiSelectDialog.kt index 7e3a63e..cb9316d 100644 --- a/app/src/main/java/com/casic/smarttube/widgets/MultiSelectDialog.kt +++ b/app/src/main/java/com/casic/smarttube/widgets/MultiSelectDialog.kt @@ -8,9 +8,10 @@ import androidx.recyclerview.widget.RecyclerView import com.casic.smarttube.R import com.casic.smarttube.adapter.DialogDeviceListAdapter +import com.casic.smarttube.databinding.DialogMultiSelectBinding import com.casic.smarttube.model.DeviceListModel +import com.pengxh.kt.lite.extensions.binding import com.pengxh.kt.lite.extensions.resetParams -import kotlinx.android.synthetic.main.dialog_multi_select.* class MultiSelectDialog private constructor(builder: Builder) : Dialog( builder.activity, R.style.UserDefinedDialogStyle @@ -67,6 +68,8 @@ } } + private val binding: DialogMultiSelectBinding by binding() + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) this.resetParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.85) @@ -75,21 +78,25 @@ setCanceledOnTouchOutside(false) if (title.isNotBlank()) { - dialogTitleView.text = title + binding.dialogTitleView.text = title } val dialogDeviceListAdapter = DialogDeviceListAdapter(act, dataModels) - dataRecyclerView.addItemDecoration(DividerItemDecoration(act, RecyclerView.VERTICAL)) - dataRecyclerView.adapter = dialogDeviceListAdapter + binding.dataRecyclerView.addItemDecoration( + DividerItemDecoration( + act, RecyclerView.VERTICAL + ) + ) + binding.dataRecyclerView.adapter = dialogDeviceListAdapter - dialogCancelButton.text = negativeBtn - dialogCancelButton.setOnClickListener { + binding.dialogCancelButton.text = negativeBtn + binding.dialogCancelButton.setOnClickListener { listener.onCancelClick() this.dismiss() } - dialogConfirmButton.text = positiveBtn - dialogConfirmButton.setOnClickListener { + binding.dialogConfirmButton.text = positiveBtn + binding.dialogConfirmButton.setOnClickListener { // 处理数据 listener.onConfirmClick(dialogDeviceListAdapter.selectedModels) this.dismiss() diff --git a/app/src/main/res/layout/activity_about_us.xml b/app/src/main/res/layout/activity_about_us.xml index c67a714..69dc539 100644 --- a/app/src/main/res/layout/activity_about_us.xml +++ b/app/src/main/res/layout/activity_about_us.xml @@ -7,7 +7,9 @@ android:orientation="vertical" tools:context=".view.AboutUsActivity"> - + - + - + variant.outputs.configureEach { outputFileName = "GT_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" @@ -61,7 +62,7 @@ dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.5' implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.6.1' diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cccda6d..fd9277c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,7 +81,7 @@ + android:value="a6907c8bb931727374aa5fd500cda107" /> (), Handler.Callback, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { private val kTag = "HomePageFragment" private val geocoderSearch by lazy { GeocodeSearch(requireContext()) } - private lateinit var homeView: View private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var easyPopupWindow: EasyPopupWindow private lateinit var aMap: AMap private lateinit var deviceViewModel: DeviceViewModel private lateinit var groupViewModel: ProjectGroupViewModel @@ -83,34 +89,34 @@ * */ private var mapZooms = ArrayList() - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View { - homeView = inflater.inflate(R.layout.fragment_home, container, false) + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } - weakReferenceHandler = WeakReferenceHandler(callback) - val easyPopupWindow = EasyPopupWindow(requireContext()) - easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) - homeView.rightOptionView.setOnClickListener { - easyPopupWindow.setOnPopupWindowClickListener(object : - EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - easyPopupWindow.setBackgroundDrawable(null) - val x: Int = homeView.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(homeView.rightOptionView, x, 0) + override fun setupTopBarLayout() { + + } + + override fun observeRequestState() { + groupViewModel.loadState.observe(this) { state -> + when (state) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") + else -> LoadingDialogHub.dismiss() + } } + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + weakReferenceHandler = WeakReferenceHandler(this) + + easyPopupWindow = EasyPopupWindow(requireContext()) + easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) //初始化vm - deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) - groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) - - observeRequestState() + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java] //默认数据 groupViewModel.obtainProGroupList() @@ -119,12 +125,8 @@ mapZooms.add(13f) initMap(savedInstanceState) - homeView.addDeviceButton.setOnClickListener { - requireContext().navigatePageTo() - } - //数据监听 - deviceViewModel.mapDeviceModel.observe(this, { + deviceViewModel.mapDeviceModel.observe(this) { if (it.code == 200) { if (allMarkerOptions.isNotEmpty()) { allMarkerOptions.clear() @@ -149,10 +151,8 @@ longitudeList.add(longitude) //将所有设备信息转化缓存为Marker点 allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(device.devcode) - .snippet(device.modelName) + MarkerOptions().position(LatLng(latitude, longitude)) + .title(device.devcode).snippet(device.modelName) ) } } @@ -160,8 +160,8 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 13f) } - }) - groupViewModel.groupModel.observe(this, { + } + groupViewModel.groupModel.observe(this) { if (it.code == 200) { val dataRows = it.data when { @@ -170,14 +170,15 @@ dataBeans = dataRows!! isRefresh = false } + else -> { dataBeans = dataRows!! } } weakReferenceHandler.sendEmptyMessage(2022090201) } - }) - groupViewModel.groupDeviceModel.observe(this, { + } + groupViewModel.groupDeviceModel.observe(this) { if (it.code == 200) { val latitudeList: MutableList = ArrayList() val longitudeList: MutableList = ArrayList() @@ -199,22 +200,33 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 16f) } - }) - return homeView + } } - private fun observeRequestState() { - groupViewModel.loadState.observe(this, { state -> - when (state) { - LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") - else -> LoadingDialogHub.dismiss() - } - }) + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + easyPopupWindow.setOnPopupWindowClickListener(object : + EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + easyPopupWindow.setBackgroundDrawable(null) + val x: Int = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + binding.addDeviceButton.setOnClickListener { + requireContext().navigatePageTo() + } } override fun onResume() { super.onResume() - homeView.mapView.onResume() + binding.mapView.onResume() //获取所有设备数据 deviceViewModel.obtainMapDeviceList() @@ -222,16 +234,16 @@ groupViewModel.obtainProGroupList() } - private val callback = Handler.Callback { - if (it.what == 2022090201) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022090201) { if (isRefresh) { groupListAdapter.notifyDataSetChanged() } else { groupListAdapter = GroupListAdapter(requireContext(), dataBeans) - homeView.homeRecyclerView!!.addItemDecoration( + binding.homeRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - homeView.homeRecyclerView!!.adapter = groupListAdapter + binding.homeRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : GroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { @@ -241,12 +253,12 @@ }) } } - true + return true } private fun initMap(savedInstanceState: Bundle?) { - homeView.mapView.onCreate(savedInstanceState) - aMap = homeView.mapView.map + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val uiSettings = aMap.uiSettings uiSettings.isCompassEnabled = true @@ -322,10 +334,7 @@ if (!isInRange) { clustersMarkers.add( GaoDeClusterMarkerView( - requireContext(), - it, - proj, - LocaleConstant.RADIUS_SIZE + requireContext(), it, proj, LocaleConstant.RADIUS_SIZE ) )//相距多少才聚合 } @@ -363,9 +372,7 @@ //绑定数据 val clickedLatLng = marker?.position!! for (device in deviceModels) { - if (clickedLatLng.latitude == device.latGaode!!.toDouble() - && clickedLatLng.longitude == device.lngGaode!!.toDouble() - ) { + if (clickedLatLng.latitude == device.latGaode!!.toDouble() && clickedLatLng.longitude == device.lngGaode!!.toDouble()) { deviceCodeView.text = String.format("设备编号: ${device.devcode}") deviceModelView.text = String.format("设备模型: ${device.modelName}") //获取设备最新浓度信息 @@ -395,8 +402,7 @@ val address = result?.regeocodeAddress?.formatAddress val temp = StringBuilder() if (address!!.length > 16) { - temp.append(address.substring(0, 14)) - .append("\r\n") + temp.append(address.substring(0, 14)).append("\r\n") .append(address.substring(16)) } else { temp.append(address) @@ -430,9 +436,7 @@ } } //查看聚合点,单独开页面导航过去 - BottomActionSheet.Builder() - .setContext(requireContext()) - .setActionItemTitle(multiDevice) + BottomActionSheet.Builder().setContext(requireContext()).setActionItemTitle(multiDevice) .setItemTextColor(Color.BLUE) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { @@ -455,12 +459,8 @@ override fun onInfoWindowClick(p0: Marker?) { if (p0 != null) { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -487,16 +487,16 @@ 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 onDestroy() { super.onDestroy() - homeView.mapView.onDestroy() + binding.mapView.onDestroy() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt index a4e964c..cc35197 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt @@ -4,11 +4,15 @@ import android.content.Intent import android.net.Uri import android.os.Build +import android.os.Bundle import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider import com.casic.smarttube.BuildConfig import com.casic.smarttube.R +import com.casic.smarttube.databinding.FragmentMineBinding import com.casic.smarttube.extensions.appendDownloadUrl import com.casic.smarttube.model.UserDetailModel import com.casic.smarttube.utils.AuthenticationHelper @@ -36,22 +40,10 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.ChangePasswordDialog -import kotlinx.android.synthetic.main.fragment_mine.aboutUsLayout -import kotlinx.android.synthetic.main.fragment_mine.cacheSizeView -import kotlinx.android.synthetic.main.fragment_mine.changePwdLayout -import kotlinx.android.synthetic.main.fragment_mine.clearCacheLayout -import kotlinx.android.synthetic.main.fragment_mine.loginOutButton -import kotlinx.android.synthetic.main.fragment_mine.updateLogLayout -import kotlinx.android.synthetic.main.fragment_mine.updateUserButton -import kotlinx.android.synthetic.main.fragment_mine.updateVersionLayout -import kotlinx.android.synthetic.main.fragment_mine.userDeptView -import kotlinx.android.synthetic.main.fragment_mine.userImageView -import kotlinx.android.synthetic.main.fragment_mine.userNameView -import kotlinx.android.synthetic.main.fragment_mine.userPhoneView import java.io.File import java.nio.charset.StandardCharsets -class MinePageFragment : KotlinBaseFragment() { +class MinePageFragment : KotlinBaseFragment() { private val kTag = "MinePageFragment" private lateinit var userData: UserDetailModel.Data @@ -60,13 +52,17 @@ private lateinit var versionViewModel: VersionViewModel private lateinit var progressDialog: ProgressDialog - override fun initLayoutView(): Int = R.layout.fragment_mine + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentMineBinding { + return FragmentMineBinding.inflate(inflater, container, false) + } override fun setupTopBarLayout() { } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java] @@ -98,8 +94,7 @@ versionViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show( - requireActivity(), - "检查版本中,请稍后" + requireActivity(), "检查版本中,请稍后" ) else -> LoadingDialogHub.dismiss() @@ -108,49 +103,45 @@ } override fun initEvent() { - userImageView.setOnClickListener { + binding.userImageView.setOnClickListener { "尽情期待~".show(requireContext()) } - updateUserButton.setOnClickListener { + binding.updateUserButton.setOnClickListener { LoadingDialogHub.show(requireActivity(), "同步中,请稍后...") userViewModel.obtainUserDetail() } - changePwdLayout.setOnClickListener { - ChangePasswordDialog.Builder() - .setContext(requireContext()) + binding.changePwdLayout.setOnClickListener { + ChangePasswordDialog.Builder().setContext(requireContext()) .setOnDialogButtonClickListener(object : ChangePasswordDialog.OnDialogButtonClickListener { override fun onConfirmClick(oldPwd: String, newPwd: String) { - val publicKey = - RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! val oldPassKey = RSAUtils.encryptDataByPublicKey( - oldPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + oldPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) val newPassKey = RSAUtils.encryptDataByPublicKey( - newPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + newPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) userViewModel.changePassword(oldPassKey, newPassKey) } }).build().show() } - aboutUsLayout.setOnClickListener { + binding.aboutUsLayout.setOnClickListener { requireContext().navigatePageTo() } - updateVersionLayout.setOnClickListener { + binding.updateVersionLayout.setOnClickListener { versionViewModel.updateVersion() } - updateLogLayout.setOnClickListener { + binding.updateLogLayout.setOnClickListener { "尽情期待~".show(requireContext()) } - clearCacheLayout.setOnClickListener { + binding.clearCacheLayout.setOnClickListener { //删除缓存之后在设置缓存大小 LoadingDialogHub.show(requireActivity(), "清理中,请稍后") File(requireContext().cacheDir.path).deleteFile() @@ -161,18 +152,14 @@ override fun onFinish() { LoadingDialogHub.dismiss() - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() } }.start() } - loginOutButton.setOnClickListener { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("退出登录") - .setMessage("确定要退出吗?") - .setNegativeButton("取消") - .setPositiveButton("确定") + binding.loginOutButton.setOnClickListener { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("退出登录") + .setMessage("确定要退出吗?").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -203,13 +190,9 @@ if (BuildConfig.VERSION_NAME == it.version) { "已是最新版本,无需更新".show(requireContext()) } else { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("提示") - .setMessage("有新版本,是否更新?") - .setNegativeButton("稍后再说") - .setPositiveButton("立即下载") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(requireContext()).setTitle("提示") + .setMessage("有新版本,是否更新?").setNegativeButton("稍后再说") + .setPositiveButton("立即下载").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { downloadApk(it.downloadUrl) @@ -244,7 +227,7 @@ updateUserInfo() } //缓存 - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() super.onResume() } @@ -258,9 +241,9 @@ // R.color.mainThemeColor.convertColor(requireContext()) // ) // userImageView.setImageDrawable(roundDrawable) - userNameView.text = userData.name - userPhoneView.text = String.format("电话:${userData.phone}") - userDeptView.text = String.format("部门:${userData.deptName}") + binding.userNameView.text = userData.name + binding.userPhoneView.text = String.format("电话:${userData.phone}") + binding.userDeptView.text = String.format("部门:${userData.deptName}") } private fun downloadApk(url: String?) { @@ -275,7 +258,8 @@ * */ val downloadPath = url!!.appendDownloadUrl() //开始下载 - downloadPath.downloadFile(requireContext().createDownloadFileDir().toString(), + downloadPath.downloadFile( + requireContext().createDownloadFileDir().toString(), object : OnDownloadListener { override fun onDownloadStart(totalBytes: Long) { progressDialog.max = totalBytes.toInt() diff --git a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt index b009850..c0afcc5 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt @@ -1,8 +1,11 @@ package com.casic.smarttube.fragment +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R import com.casic.smarttube.adapter.OverviewGroupListAdapter +import com.casic.smarttube.databinding.FragmentOverviewBinding import com.casic.smarttube.extensions.showEmptyPage import com.casic.smarttube.model.ProjectGroupModel import com.casic.smarttube.view.GroupDeviceActivity @@ -11,25 +14,25 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.widget.dialog.AlertInputDialog -import kotlinx.android.synthetic.main.fragment_overview.groupRecyclerView -import kotlinx.android.synthetic.main.fragment_overview.rightOptionView -import kotlinx.android.synthetic.main.fragment_overview.titleView -import kotlinx.android.synthetic.main.include_empty_view.emptyView -class OverviewFragment : KotlinBaseFragment() { +class OverviewFragment : KotlinBaseFragment() { private lateinit var groupViewModel: ProjectGroupViewModel private var dataBeans: MutableList = ArrayList() private lateinit var groupListAdapter: OverviewGroupListAdapter private var clickedPosition = 0 - override fun initLayoutView(): Int = R.layout.fragment_overview - - override fun setupTopBarLayout() { - titleView.text = "概览" + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentOverviewBinding { + return FragmentOverviewBinding.inflate(inflater, container, false) } - override fun initData() { + override fun setupTopBarLayout() { + binding.titleView.text = "概览" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) } @@ -43,7 +46,7 @@ } override fun initEvent() { - rightOptionView.setOnClickListener { + binding.rightOptionView.setOnClickListener { groupViewModel.obtainProGroupList() "刷新数据中,请稍后".show(requireContext()) } @@ -51,16 +54,16 @@ groupViewModel.groupModel.observe(this) { if (it.code == 200) { if (it.data.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { groupViewModel.obtainProGroupList() } } else { - emptyView!!.hide() + binding.emptyInclude.emptyView.hide() dataBeans.clear() dataBeans = it.data groupListAdapter = OverviewGroupListAdapter(requireContext(), it.data) - groupRecyclerView!!.adapter = groupListAdapter + binding.groupRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : OverviewGroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { diff --git a/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt b/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt index e424721..7f036b0 100644 --- a/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt +++ b/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt @@ -4,8 +4,8 @@ import android.graphics.Color import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.Poi -import com.pengxh.kt.lite.extensions.showBusRouteOnMap -import com.pengxh.kt.lite.extensions.showRouteOnMap +import com.casic.smarttube.extensions.showBusRouteOnMap +import com.casic.smarttube.extensions.showRouteOnMap import com.pengxh.kt.lite.widget.dialog.BottomActionSheet object RouteOnMap { diff --git a/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt b/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt index 65bba6f..598581a 100644 --- a/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt @@ -1,27 +1,29 @@ package com.casic.smarttube.view +import android.os.Bundle import com.casic.smarttube.BuildConfig import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityAboutUsBinding import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_about_us.* -import kotlinx.android.synthetic.main.include_base_title.* -class AboutUsActivity : KotlinBaseActivity() { +class AboutUsActivity : KotlinBaseActivity() { - override fun initLayoutView(): Int = R.layout.activity_about_us + override fun initViewBinding(): ActivityAboutUsBinding { + return ActivityAboutUsBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "关于我们" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "关于我们" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { - versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + override fun initOnCreate(savedInstanceState: Bundle?) { + binding.versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") } override fun observeRequestState() { diff --git a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt index 415f9dd..80b83bd 100644 --- a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.content.Intent import android.graphics.Color +import android.os.Bundle import android.os.CountDownTimer import android.os.Handler import android.text.Editable @@ -15,6 +16,7 @@ import com.amap.api.location.AMapLocation import com.casic.smarttube.R import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.smarttube.databinding.ActivityAddDeviceBinding import com.casic.smarttube.extensions.combineImagePath import com.casic.smarttube.extensions.compressImage import com.casic.smarttube.extensions.isNumber @@ -47,24 +49,9 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_add_device.addDeviceTimeView -import kotlinx.android.synthetic.main.activity_add_device.addImageRecyclerView -import kotlinx.android.synthetic.main.activity_add_device.collectIntervalView -import kotlinx.android.synthetic.main.activity_add_device.deviceCodeView -import kotlinx.android.synthetic.main.activity_add_device.deviceNameView -import kotlinx.android.synthetic.main.activity_add_device.inputLengthView -import kotlinx.android.synthetic.main.activity_add_device.latitudeView -import kotlinx.android.synthetic.main.activity_add_device.locationImageView -import kotlinx.android.synthetic.main.activity_add_device.longitudeView -import kotlinx.android.synthetic.main.activity_add_device.ownerShipView -import kotlinx.android.synthetic.main.activity_add_device.scannerView -import kotlinx.android.synthetic.main.activity_add_device.sceneEditView -import kotlinx.android.synthetic.main.activity_add_device.submitButton -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView import java.io.File -class AddDeviceActivity : KotlinBaseActivity() { +class AddDeviceActivity : KotlinBaseActivity() { private val kTag = "AddDeviceActivity" private lateinit var imageAdapter: EditableImageAdapter @@ -81,21 +68,23 @@ registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK) { val data = result.data!! - longitudeView.text = data.getStringExtra("longitude") - latitudeView.text = data.getStringExtra("latitude") + binding.longitudeView.text = data.getStringExtra("longitude") + binding.latitudeView.text = data.getStringExtra("latitude") } } - override fun initLayoutView(): Int = R.layout.activity_add_device + override fun initViewBinding(): ActivityAddDeviceBinding { + return ActivityAddDeviceBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "添加设备" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "添加设备" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { weakReferenceHandler = WeakReferenceHandler(callback) uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] @@ -119,17 +108,17 @@ override fun initEvent() { val manager = QrManager.getInstance().init(QrConfigCreator.create(this)) - scannerView.setOnClickListener { + binding.scannerView.setOnClickListener { manager.startScan(this) { if (it.content.isNumber()) { - deviceCodeView.setText(it.content) + binding.deviceCodeView.setText(it.content) } else { "设备编号错误,请检查标签".show(context) } } } - ownerShipView.setOnClickListener { + binding.ownerShipView.setOnClickListener { groupViewModel.obtainGroupList() } groupViewModel.groupListModel.observe(this) { @@ -147,19 +136,14 @@ groups.add("自定义") } if (groups.isNotEmpty()) { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(groups) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { if (groups[position] == "自定义") { - AlertInputDialog.Builder() - .setContext(context) - .setTitle("提示") + AlertInputDialog.Builder().setContext(context).setTitle("提示") .setHintMessage("请输入该设备所属项目名,如:项目203") - .setNegativeButton("取消") - .setPositiveButton("确定") + .setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertInputDialog.OnDialogButtonClickListener { override fun onCancelClick() { @@ -167,12 +151,11 @@ } override fun onConfirmClick(value: String) { - ownerShipView.text = value + binding.ownerShipView.text = value } - }) - .build().show() + }).build().show() } else { - ownerShipView.text = groups[position] + binding.ownerShipView.text = groups[position] } } }).build().show() @@ -180,27 +163,22 @@ } //默认频率1min - collectIntervalView.text = frequency[0] - collectIntervalView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + binding.collectIntervalView.text = frequency[0] + binding.collectIntervalView.setOnClickListener { + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(frequency) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { - collectIntervalView.text = frequency[position] + binding.collectIntervalView.text = frequency[position] } }).build().show() } - locationImageView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(context) - .setItemTextColor(Color.BLUE) + binding.locationImageView.setOnClickListener { + BottomActionSheet.Builder().setContext(context).setItemTextColor(Color.BLUE) .setActionItemTitle(arrayListOf("自动定位", "手动选点")) - .setOnActionSheetListener(object : - BottomActionSheet.OnActionSheetListener { + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { when (position) { 0 -> { @@ -210,30 +188,32 @@ override fun onAMapLocationGet(aMapLocation: AMapLocation?) { LoadingDialogHub.dismiss() if (aMapLocation == null) { - longitudeView.text = "定位失败" - latitudeView.text = "定位失败" + binding.longitudeView.text = "定位失败" + binding.latitudeView.text = "定位失败" - longitudeView.setTextColor( + binding.longitudeView.setTextColor( R.color.redTextColor.convertColor(context) ) - latitudeView.setTextColor( + binding.latitudeView.setTextColor( R.color.redTextColor.convertColor(context) ) } else { - longitudeView.text = + binding.longitudeView.text = aMapLocation.longitude.toString() - latitudeView.text = aMapLocation.latitude.toString() + binding.latitudeView.text = + aMapLocation.latitude.toString() - longitudeView.setTextColor( + binding.longitudeView.setTextColor( R.color.mainTextColor.convertColor(context) ) - latitudeView.setTextColor( + binding.latitudeView.setTextColor( R.color.mainTextColor.convertColor(context) ) } } }) } + 1 -> selectLocationLauncher.launch( Intent(context, SelectLocationActivity::class.java) ) @@ -243,7 +223,7 @@ } imageAdapter = EditableImageAdapter(this, 3, 13f) - addImageRecyclerView.adapter = imageAdapter + binding.addImageRecyclerView.adapter = imageAdapter imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { selectPicture() @@ -281,7 +261,7 @@ } } - sceneEditView.addTextChangedListener(object : TextWatcher { + binding.sceneEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { } @@ -292,31 +272,31 @@ override fun afterTextChanged(s: Editable?) { val text = s.toString().trim() - inputLengthView.text = String.format("${text.length}/100") + binding.inputLengthView.text = String.format("${text.length}/100") if (text.length > 100) { - inputLengthView.setTextColor(R.color.redTextColor.convertColor(context)) + binding.inputLengthView.setTextColor(R.color.redTextColor.convertColor(context)) "现场情况字符不能超过100个字符".show(context) } else { - inputLengthView.setTextColor(R.color.subTextColor.convertColor(context)) + binding.inputLengthView.setTextColor(R.color.subTextColor.convertColor(context)) } } }) - addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() + binding.addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() - submitButton.setOnClickListener { - val deviceCode = deviceCodeView.text.toString().trim() + binding.submitButton.setOnClickListener { + val deviceCode = binding.deviceCodeView.text.toString().trim() if (deviceCode.isBlank()) { "请输入设备编号".show(context) return@setOnClickListener } - val ownerShip = ownerShipView.text.toString().trim() + val ownerShip = binding.ownerShipView.text.toString().trim() if (ownerShip.isBlank()) { "请输入设备所属项目".show(context) return@setOnClickListener } - val longitude = longitudeView.text.toString().trim() - val latitude = latitudeView.text.toString().trim() + val longitude = binding.longitudeView.text.toString().trim() + val latitude = binding.latitudeView.text.toString().trim() if (longitude.isBlank() || latitude.isBlank()) { "请先获取当前经纬度".show(context) return@setOnClickListener @@ -329,14 +309,14 @@ ) deviceViewModel.addDevice( deviceCode, - deviceNameView.text.toString(), + binding.deviceNameView.text.toString(), ownerShip, - collectIntervalView.text.toString(), + binding.collectIntervalView.text.toString(), longitude, latitude, imagePaths.reformat(), - sceneEditView.text.toString().trim(), - addDeviceTimeView.text.toString(), + binding.sceneEditView.text.toString().trim(), + binding.addDeviceTimeView.text.toString(), userData.id.toString(), userData.deptId ) @@ -345,16 +325,13 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(listOf("拍照", "相册")) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { when (position) { 0 -> { - PictureSelector.create(context) - .openCamera(SelectMimeType.ofImage()) + PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { if (result == null) { @@ -362,8 +339,7 @@ return } LoadingDialogHub.show( - this@AddDeviceActivity, - "图片上传中,请稍后..." + this@AddDeviceActivity, "图片上传中,请稍后..." ) selectedImages = result analyticalSelectResults(result[0]) @@ -374,14 +350,11 @@ } }) } + 1 -> { - PictureSelector.create(context) - .openGallery(SelectMimeType.ofImage()) - .isGif(false) - .isMaxSelectEnabledMask(true) - .setFilterMinFileSize(100) - .setMaxSelectNum(3) - .isDisplayCamera(false) + PictureSelector.create(context).openGallery(SelectMimeType.ofImage()) + .isGif(false).isMaxSelectEnabledMask(true).setFilterMinFileSize(100) + .setMaxSelectNum(3).isDisplayCamera(false) .setImageEngine(GlideLoadEngine.instance) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { @@ -390,8 +363,7 @@ return } LoadingDialogHub.show( - this@AddDeviceActivity, - "图片上传中,请稍后..." + this@AddDeviceActivity, "图片上传中,请稍后..." ) selectedImages = result // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 diff --git a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt index 3864f16..e4f19a4 100644 --- a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.content.Context +import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,19 +11,20 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityBigImageBinding import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager -import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : KotlinBaseActivity() { +class BigImageActivity : KotlinBaseActivity() { - override fun initLayoutView(): Int = R.layout.activity_big_image + override fun initViewBinding(): ActivityBigImageBinding { + return ActivityBigImageBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { PageNavigationManager.addActivity(this) @@ -30,16 +32,16 @@ ImmersionBar.with(this).statusBarDarkFont(false).init() } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) val urls = intent.getStringArrayListExtra(Constant.BIG_IMAGE_INTENT_DATA_KEY) if (urls == null || urls.size == 0) { return } - pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") - imagePagerView.adapter = BigImageAdapter(this, urls) - imagePagerView.currentItem = index - imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + binding.pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + binding.imagePagerView.adapter = BigImageAdapter(this, urls) + binding.imagePagerView.currentItem = index + binding.imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrollStateChanged(state: Int) { } @@ -53,7 +55,8 @@ } override fun onPageSelected(position: Int) { - pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + binding.pageNumberView.text = + String.format("(" + (position + 1) + "/" + urls.size + ")") } }) } @@ -63,7 +66,7 @@ } override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } + binding.leftBackView.setOnClickListener { this.finish() } } class BigImageAdapter(private var context: Context, imageList: ArrayList) : diff --git a/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt b/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt index 072953f..f036a78 100644 --- a/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.graphics.Color +import android.os.Bundle import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -10,6 +11,7 @@ import com.amap.api.services.geocoder.RegeocodeQuery import com.amap.api.services.geocoder.RegeocodeResult import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityDeviceDetailBinding import com.casic.smarttube.extensions.combineImagePath import com.casic.smarttube.extensions.toSignalImage import com.casic.smarttube.model.DeviceDetailModel @@ -25,51 +27,39 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState -import kotlinx.android.synthetic.main.activity_device_detail.densityView -import kotlinx.android.synthetic.main.activity_device_detail.descriptionView -import kotlinx.android.synthetic.main.activity_device_detail.deviceBatteryView -import kotlinx.android.synthetic.main.activity_device_detail.deviceCodeView -import kotlinx.android.synthetic.main.activity_device_detail.deviceNameView -import kotlinx.android.synthetic.main.activity_device_detail.deviceStateView -import kotlinx.android.synthetic.main.activity_device_detail.imageGridView -import kotlinx.android.synthetic.main.activity_device_detail.lastDataView -import kotlinx.android.synthetic.main.activity_device_detail.leftBackView -import kotlinx.android.synthetic.main.activity_device_detail.locationView -import kotlinx.android.synthetic.main.activity_device_detail.projectGroupView -import kotlinx.android.synthetic.main.activity_device_detail.rightOptionView -import kotlinx.android.synthetic.main.activity_device_detail.signalImageView -import kotlinx.android.synthetic.main.activity_device_detail.titleView -class DeviceDetailActivity : KotlinBaseActivity() { +class DeviceDetailActivity : KotlinBaseActivity() { private val kTag = "DeviceDetailActivity" private lateinit var deviceViewModel: DeviceViewModel private lateinit var deviceModel: DeviceDetailModel.DataModel private val geocoderSearch by lazy { GeocodeSearch(this) } - override fun initLayoutView(): Int = R.layout.activity_device_detail + override fun initViewBinding(): ActivityDeviceDetailBinding { + return ActivityDeviceDetailBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "设备详情" - leftBackView.setOnClickListener { finish() } + binding.titleView.text = "设备详情" + binding.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! - deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] deviceViewModel.obtainDeviceDetail(params[0], params[1]) deviceViewModel.deviceDetailModel.observe(this) { if (it.code == 200) { val device = it.data this.deviceModel = device - deviceCodeView.text = device.devcode - deviceNameView.text = device.deviceName - projectGroupView.text = String.format("项目${device.groupId}") + binding.deviceCodeView.text = device.devcode + binding.deviceNameView.text = device.deviceName + binding.projectGroupView.text = String.format("项目${device.groupId}") if (device.latGaode.isBlank() || device.lngGaode.isBlank()) { - locationView.text = "经纬度异常,无法查看具体位置" + binding.locationView.text = "经纬度异常,无法查看具体位置" } else { val queryParam = RegeocodeQuery( LatLonPoint(device.latGaode.toDouble(), device.lngGaode.toDouble()), @@ -81,7 +71,7 @@ GeocodeSearch.OnGeocodeSearchListener { override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { if (rCode == 1000) { - locationView.text = result?.regeocodeAddress?.formatAddress + binding.locationView.text = result?.regeocodeAddress?.formatAddress } } @@ -90,12 +80,12 @@ } }) } - descriptionView.text = device.descn + binding.descriptionView.text = device.descn if (device.photos.toString().isBlank()) { - imageGridView.visibility = View.GONE + binding.imageGridView.visibility = View.GONE } else { - imageGridView.visibility = View.VISIBLE + binding.imageGridView.visibility = View.VISIBLE //处理图片地址 val urls: ArrayList = ArrayList() val imageArray = device.photos.toString().split(",") @@ -104,10 +94,9 @@ urls.add(path.combineImagePath()) } } - val imageAdapter = ReadOnlyImageAdapter(this) - imageAdapter.setImageList(urls) - imageGridView.adapter = imageAdapter - imageGridView.setOnItemClickListener { _, _, position, _ -> + val imageAdapter = ReadOnlyImageAdapter(this, urls) + binding.imageGridView.adapter = imageAdapter + binding.imageGridView.setOnItemClickListener { _, _, position, _ -> if (urls[position].isEmpty()) { "图片加载失败,无法查看大图".show(this) } else { @@ -119,18 +108,18 @@ val value = device.stregnth.toDouble().toInt() val level = "$value%" val ppm = "${value * 500}ppm" - densityView.text = "$level(相当于$ppm)" + binding.densityView.text = "$level(相当于$ppm)" - lastDataView.text = device.uptime + binding.lastDataView.text = device.uptime if (device.onlineState == "0") { - deviceStateView.text = "离线" - deviceStateView.setTextColor(Color.RED) + binding.deviceStateView.text = "离线" + binding.deviceStateView.setTextColor(Color.RED) } else { - deviceStateView.text = "在线" - deviceStateView.setTextColor(Color.GREEN) + binding.deviceStateView.text = "在线" + binding.deviceStateView.setTextColor(Color.GREEN) } - signalImageView.setBackgroundResource(device.rsrp.toSignalImage()) - deviceBatteryView.text = if (device.cell.isNullOrBlank()) { + binding.signalImageView.setBackgroundResource(device.rsrp.toSignalImage()) + binding.deviceBatteryView.text = if (device.cell.isNullOrBlank()) { "0%" } else { device.cell + "%" @@ -149,7 +138,7 @@ } override fun initEvent() { - rightOptionView.setOnClickListener { + binding.rightOptionView.setOnClickListener { val lat = deviceModel.latGaode.toString() val lng = deviceModel.lngGaode.toString() if (lat.isBlank() || lng.isBlank()) { diff --git a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt index 0ae8862..ba52ab8 100644 --- a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.content.Context +import android.os.Bundle import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -8,6 +9,7 @@ import androidx.recyclerview.widget.RecyclerView import com.casic.smarttube.R import com.casic.smarttube.adapter.DeviceListAdapter +import com.casic.smarttube.databinding.ActivityGroupDeviceBinding import com.casic.smarttube.extensions.showEmptyPage import com.casic.smarttube.model.DeviceListModel import com.casic.smarttube.utils.LoadingDialogHub @@ -28,14 +30,8 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.qmuiteam.qmui.recyclerView.QMUIRVItemSwipeAction import com.qmuiteam.qmui.recyclerView.QMUISwipeAction -import kotlinx.android.synthetic.main.activity_group_device.groupDeviceLayout -import kotlinx.android.synthetic.main.activity_group_device.groupDeviceView -import kotlinx.android.synthetic.main.activity_group_device.leftBackView -import kotlinx.android.synthetic.main.activity_group_device.rightOptionView -import kotlinx.android.synthetic.main.activity_group_device.titleView -import kotlinx.android.synthetic.main.include_empty_view.emptyView -class GroupDeviceActivity : KotlinBaseActivity() { +class GroupDeviceActivity : KotlinBaseActivity() { private lateinit var groupId: String private lateinit var weakReferenceHandler: WeakReferenceHandler @@ -51,18 +47,19 @@ private var clickedPosition = 0 private var isDeleteAll = false - override fun initLayoutView(): Int = R.layout.activity_group_device + override fun initViewBinding(): ActivityGroupDeviceBinding { + return ActivityGroupDeviceBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - leftBackView.setOnClickListener { finish() } - rightOptionView.setOnClickListener { + binding.leftBackView.setOnClickListener { finish() } + binding.rightOptionView.setOnClickListener { //改为Popup val easyPopupWindow = EasyPopupWindow(this) easyPopupWindow.setPopupMenuItem( - LocaleConstant.DEVICE_OPERATE_IMAGES, - LocaleConstant.DEVICE_OPERATE_TITLES + LocaleConstant.DEVICE_OPERATE_IMAGES, LocaleConstant.DEVICE_OPERATE_TITLES ) easyPopupWindow.setOnPopupWindowClickListener(object : EasyPopupWindow.OnPopupWindowClickListener { @@ -77,13 +74,11 @@ pageIndex = 1 obtainDeviceListByPage() } + 1 -> { - AlertControlDialog.Builder() - .setContext(context) - .setTitle("提示") + AlertControlDialog.Builder().setContext(context).setTitle("提示") .setMessage("删除后将无法恢复,是否继续?") - .setNegativeButton("容我想想") - .setPositiveButton("已经想好") + .setNegativeButton("容我想想").setPositiveButton("已经想好") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onCancelClick() { @@ -103,13 +98,11 @@ } }).build().show() } + 2 -> { - MultiSelectDialog.Builder() - .setContext(this@GroupDeviceActivity) - .setTitle("选择设备") - .setDataSource(dataBeans) - .setNegativeButton("取消") - .setPositiveButton("选好了") + MultiSelectDialog.Builder().setContext(this@GroupDeviceActivity) + .setTitle("选择设备").setDataSource(dataBeans) + .setNegativeButton("取消").setPositiveButton("选好了") .setOnDialogButtonClickListener(object : MultiSelectDialog.OnDialogButtonClickListener { override fun onConfirmClick(selectedModels: MutableList) { @@ -126,21 +119,20 @@ override fun onCancelClick() { } - }) - .build().show() + }).build().show() } } } }) easyPopupWindow.setBackgroundDrawable(null) - val x: Int = rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(rightOptionView, x, 0) + val x: Int = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { groupId = intent.getStringExtra(Constant.INTENT_PARAM)!! - titleView.text = String.format(groupId + "项目设备列表") + binding.titleView.text = String.format(groupId + "项目设备列表") weakReferenceHandler = WeakReferenceHandler(callback) groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java] deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] @@ -157,13 +149,13 @@ } override fun initEvent() { - groupDeviceLayout.setOnRefreshListener { + binding.groupDeviceLayout.setOnRefreshListener { isRefresh = true //刷新之后页码重置 pageIndex = 1 obtainDeviceListByPage() } - groupDeviceLayout.setOnLoadMoreListener { + binding.groupDeviceLayout.setOnLoadMoreListener { isLoadMore = true pageIndex++ obtainDeviceListByPage() @@ -176,7 +168,7 @@ isRefresh -> { dataBeans.clear() dataBeans = dataRows!! - groupDeviceLayout.finishRefresh() + binding.groupDeviceLayout.finishRefresh() isRefresh = false } @@ -185,7 +177,7 @@ "到底了,别拉了".show(this) } dataBeans.addAll(dataRows!!) - groupDeviceLayout.finishLoadMore() + binding.groupDeviceLayout.finishLoadMore() isLoadMore = false } @@ -211,7 +203,7 @@ ) } if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { pageIndex = 1 obtainDeviceListByPage() } @@ -230,15 +222,15 @@ deviceAdapter.notifyDataSetChanged() } else { if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { pageIndex = 1 obtainDeviceListByPage() } } else { - emptyView!!.hide() + binding.emptyInclude.emptyView.hide() deviceAdapter = DeviceListAdapter(this, dataBeans) //绑定侧滑事件 - swipeAction.attachToRecyclerView(groupDeviceView) + swipeAction.attachToRecyclerView(binding.groupDeviceView) val linearLayoutManager = object : LinearLayoutManager(this) { override fun generateDefaultLayoutParams(): RecyclerView.LayoutParams { return RecyclerView.LayoutParams( @@ -247,8 +239,8 @@ ) } } - groupDeviceView.layoutManager = linearLayoutManager - groupDeviceView.adapter = deviceAdapter + binding.groupDeviceView.layoutManager = linearLayoutManager + binding.groupDeviceView.adapter = deviceAdapter deviceAdapter.setOnItemClickListener(object : DeviceListAdapter.OnItemClickListener { override fun onClicked(position: Int) { @@ -311,13 +303,9 @@ }) private fun deleteItem(adapterPosition: Int) { - AlertControlDialog.Builder() - .setContext(this) - .setTitle("提示") - .setMessage("删除后将无法恢复,是否继续?") - .setNegativeButton("容我想想") - .setPositiveButton("已经想好") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(this).setTitle("提示") + .setMessage("删除后将无法恢复,是否继续?").setNegativeButton("容我想想") + .setPositiveButton("已经想好").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onCancelClick() { diff --git a/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt b/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt index 71f438c..70e49f0 100644 --- a/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt @@ -1,9 +1,11 @@ package com.casic.smarttube.view +import android.os.Bundle import android.view.View import android.widget.AdapterView import androidx.lifecycle.ViewModelProvider import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityHistoryDataBinding import com.casic.smarttube.extensions.dateToMonthDay import com.casic.smarttube.extensions.getQuarterOfYear import com.casic.smarttube.utils.ChartViewHelper @@ -22,27 +24,26 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState -import kotlinx.android.synthetic.main.activity_history_data.dataLineChart -import kotlinx.android.synthetic.main.activity_history_data.leftBackView -import kotlinx.android.synthetic.main.activity_history_data.periodSpinner import java.util.Calendar -class HistoryDataActivity : KotlinBaseActivity() { +class HistoryDataActivity : KotlinBaseActivity() { private val kTag = "HistoryDataActivity" private lateinit var deviceViewModel: DeviceViewModel private lateinit var groupId: String private lateinit var devCode: String - override fun initLayoutView(): Int = R.layout.activity_history_data + override fun initViewBinding(): ActivityHistoryDataBinding { + return ActivityHistoryDataBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - leftBackView.setOnClickListener { finish() } + binding.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! groupId = params[0] devCode = params[1] @@ -61,8 +62,8 @@ override fun initEvent() { //默认选择近7天的数据 - periodSpinner.setSelection(3) - periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + binding.periodSpinner.setSelection(3) + binding.periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onItemSelected( parent: AdapterView<*>?, view: View?, position: Int, id: Long ) { @@ -76,6 +77,7 @@ groupId, devCode, "$year-01-01", time.timestampToCompleteDate() ) } + 1 -> { //本季度 val startDate = when (time.getQuarterOfYear()) { @@ -89,6 +91,7 @@ groupId, devCode, startDate, time.timestampToCompleteDate() ) } + 2 -> { //近30日 deviceViewModel.obtainDeviceHistoryData( @@ -98,6 +101,7 @@ time.timestampToCompleteDate() ) } + 3 -> { //近7日 deviceViewModel.obtainDeviceHistoryData( @@ -107,19 +111,18 @@ time.timestampToCompleteDate() ) } + 4 -> { //今日 deviceViewModel.obtainDeviceHistoryData( groupId, devCode, time.timestampToDate(), time.timestampToCompleteDate() ) } + 5 -> { - DateSelectDialog.Builder() - .setContext(this@HistoryDataActivity) - .setTitle("选择日期") - .setNegativeButton("取消") - .setPositiveButton("选好了") - .setOnDialogButtonClickListener(object : + DateSelectDialog.Builder().setContext(this@HistoryDataActivity) + .setTitle("选择日期").setNegativeButton("取消") + .setPositiveButton("选好了").setOnDialogButtonClickListener(object : DateSelectDialog.OnDialogButtonClickListener { override fun onConfirmClick(startDate: String, endDate: String) { deviceViewModel.obtainDeviceHistoryData( @@ -129,12 +132,10 @@ override fun onCancelClick() { //选择取消就默认加载近7天的数据 - periodSpinner.setSelection(3) + binding.periodSpinner.setSelection(3) } - }) - .setFragmentManager(supportFragmentManager) - .setCalendarType(Type.YEAR_MONTH_DAY) - .build().show() + }).setFragmentManager(supportFragmentManager) + .setCalendarType(Type.YEAR_MONTH_DAY).build().show() } } } @@ -159,7 +160,9 @@ Entry(i.toFloat(), rowsBean.stregnth!!.toFloat(), "浓度") ) } - ChartViewHelper.setLineChartData(dataLineChart, xAxisLabels, strengthEntries) + ChartViewHelper.setLineChartData( + binding.dataLineChart, xAxisLabels, strengthEntries + ) } } } diff --git a/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt b/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt index ebca433..f947b2c 100644 --- a/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt @@ -1,7 +1,8 @@ package com.casic.smarttube.view +import android.os.Bundle import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityLoginBinding import com.casic.smarttube.utils.AuthenticationHelper import com.casic.smarttube.utils.LoadingDialogHub import com.casic.smarttube.utils.LocaleConstant @@ -14,26 +15,29 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues -import kotlinx.android.synthetic.main.activity_login.loginButton -import kotlinx.android.synthetic.main.activity_login.userNameView -import kotlinx.android.synthetic.main.activity_login.userPasswordView -class LoginActivity : KotlinBaseActivity() { +class LoginActivity : KotlinBaseActivity() { private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginViewModel: LoginViewModel private lateinit var userViewModel: UserViewModel - override fun initLayoutView(): Int = R.layout.activity_login + override fun initViewBinding(): ActivityLoginBinding { + return ActivityLoginBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(true).init() } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { // 设置默认账号密码 - userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) - userPasswordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + binding.userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + binding.userPasswordView.setText( + SaveKeyValues.getValue( + LocaleConstant.PASSWORD, "" + ) as String + ) authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] @@ -50,9 +54,9 @@ } override fun initEvent() { - loginButton.setOnClickListener { - val account = userNameView.text.toString().trim() - val userPassword = userPasswordView.text.toString().trim() + binding.loginButton.setOnClickListener { + val account = binding.userNameView.text.toString().trim() + val userPassword = binding.userPasswordView.text.toString().trim() if (account.isBlank()) { "用户名不能为空".show(this) return@setOnClickListener @@ -74,8 +78,8 @@ AuthenticationHelper.savePublicKey(keyString) val publicKey = RSAUtils.keyStrToPublicKey(keyString) - val account = userNameView.text.toString() - val userPassword = userPasswordView.text.toString() + val account = binding.userNameView.text.toString() + val userPassword = binding.userPasswordView.text.toString() val dataByPublicKey = RSAUtils.encryptDataByPublicKey(userPassword.toByteArray(), publicKey!!) //登录并获取Token,POST请求 diff --git a/app/src/main/java/com/casic/smarttube/view/MainActivity.kt b/app/src/main/java/com/casic/smarttube/view/MainActivity.kt index 4461757..575e1ee 100644 --- a/app/src/main/java/com/casic/smarttube/view/MainActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/MainActivity.kt @@ -1,5 +1,6 @@ package com.casic.smarttube.view +import android.os.Bundle import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment @@ -7,6 +8,7 @@ import androidx.fragment.app.FragmentPagerAdapter import androidx.viewpager.widget.ViewPager import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityMainBinding import com.casic.smarttube.fragment.HomePageFragment import com.casic.smarttube.fragment.MinePageFragment import com.casic.smarttube.fragment.OverviewFragment @@ -15,9 +17,8 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_main.* -class MainActivity : KotlinBaseActivity() { +class MainActivity : KotlinBaseActivity() { private var menuItem: MenuItem? = null private var fragmentList: MutableList = ArrayList() @@ -29,32 +30,36 @@ fragmentList.add(MinePageFragment()) } - override fun initLayoutView(): Int = R.layout.activity_main + override fun initViewBinding(): ActivityMainBinding { + return ActivityMainBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { //保留icon原图颜色 - bottomNavigation.itemIconTintList = null - bottomNavigation.setOnItemSelectedListener { menuItem -> + binding.bottomNavigation.itemIconTintList = null + binding.bottomNavigation.setOnItemSelectedListener { menuItem -> when (menuItem.itemId) { R.id.nav_home -> { - mainViewPager.currentItem = 0 + binding.mainViewPager.currentItem = 0 } + R.id.nav_overview -> { - mainViewPager.currentItem = 1 + binding.mainViewPager.currentItem = 1 } + R.id.nav_mine -> { - mainViewPager.currentItem = 2 + binding.mainViewPager.currentItem = 2 } } false } - mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) - mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 + binding.mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + binding.mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun observeRequestState() { @@ -62,7 +67,7 @@ } override fun initEvent() { - mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + binding.mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrollStateChanged(state: Int) { } @@ -77,9 +82,9 @@ if (menuItem != null) { menuItem!!.isChecked = false } else { - bottomNavigation.menu.getItem(0).isChecked = false + binding.bottomNavigation.menu.getItem(0).isChecked = false } - menuItem = bottomNavigation.menu.getItem(position) + menuItem = binding.bottomNavigation.menu.getItem(position) menuItem!!.isChecked = true } }) diff --git a/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt b/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt index f00e0ca..908aade 100644 --- a/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt @@ -15,6 +15,7 @@ import com.amap.api.services.geocoder.RegeocodeQuery import com.amap.api.services.geocoder.RegeocodeResult import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityMapDeviceBriefBinding import com.casic.smarttube.utils.LoadingDialogHub import com.casic.smarttube.utils.RouteOnMap import com.casic.smarttube.vm.DeviceViewModel @@ -24,16 +25,8 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState -import kotlinx.android.synthetic.main.activity_map_device_brief.deviceCodeView -import kotlinx.android.synthetic.main.activity_map_device_brief.deviceModelView -import kotlinx.android.synthetic.main.activity_map_device_brief.deviceValueView -import kotlinx.android.synthetic.main.activity_map_device_brief.locationView -import kotlinx.android.synthetic.main.activity_map_device_brief.mapView -import kotlinx.android.synthetic.main.activity_map_device_brief.updateTimeView -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -class MapDeviceBriefActivity : KotlinBaseActivity() { +class MapDeviceBriefActivity : KotlinBaseActivity() { private val kTag = "MapDeviceBriefActivity" private lateinit var deviceViewModel: DeviceViewModel @@ -42,17 +35,19 @@ private val geocoderSearch by lazy { GeocodeSearch(this) } - override fun initLayoutView(): Int = R.layout.activity_map_device_brief + override fun initViewBinding(): ActivityMapDeviceBriefBinding { + return ActivityMapDeviceBriefBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "设备最新数据地图展示" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "设备最新数据地图展示" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { - aMap = mapView.map + override fun initOnCreate(savedInstanceState: Bundle?) { + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val uiSettings = aMap.uiSettings uiSettings.isCompassEnabled = true @@ -80,22 +75,22 @@ if (it.code == 200) { val device = it.data - deviceCodeView.text = String.format("设备编号: ${device.devcode}") - deviceModelView.text = String.format("设备模型: ${params[2]}") + binding.deviceCodeView.text = String.format("设备编号: ${device.devcode}") + binding.deviceModelView.text = String.format("设备模型: ${params[2]}") //获取设备最新浓度信息 deviceViewModel.obtainTubeLastData(device.groupId, device.devcode) deviceViewModel.lastDataModel.observe(this) { v -> if (v.code == 200) { - deviceValueView.text = String.format("最新浓度: ${v.data.strength}") - updateTimeView.text = String.format("更新时间: ${v.data.uptime}") + binding.deviceValueView.text = String.format("最新浓度: ${v.data.strength}") + binding.updateTimeView.text = String.format("更新时间: ${v.data.uptime}") } else { - deviceValueView.text = String.format("最新浓度: 未知") - updateTimeView.text = String.format("更新时间: 未知") + binding.deviceValueView.text = String.format("最新浓度: 未知") + binding.updateTimeView.text = String.format("更新时间: 未知") } } if (device.latGaode.isBlank() || device.lngGaode.isBlank()) { - locationView.text = "经纬度异常,无法查看具体位置" + binding.locationView.text = "经纬度异常,无法查看具体位置" } else { val queryParam = RegeocodeQuery( LatLonPoint(device.latGaode.toDouble(), device.lngGaode.toDouble()), @@ -108,7 +103,7 @@ GeocodeSearch.OnGeocodeSearchListener { override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { if (rCode == 1000) { - locationView.text = + binding.locationView.text = String.format("详细位置: ${result?.regeocodeAddress?.formatAddress}") } } @@ -123,8 +118,7 @@ aMap.animateCamera(newCameraPosition, 1500, object : AMap.CancelableCallback { override fun onFinish() { //添加Marker - val markerOptions = MarkerOptions() - .position(latLng) + val markerOptions = MarkerOptions().position(latLng) .icon(BitmapDescriptorFactory.fromResource(R.mipmap.well_location)) .draggable(false) aMap.addMarker(markerOptions) @@ -148,26 +142,26 @@ /**地图相关*********/ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - mapView.onCreate(savedInstanceState) + binding.mapView.onCreate(savedInstanceState) } override fun onResume() { super.onResume() - mapView.onResume() + binding.mapView.onResume() } override fun onPause() { super.onPause() - mapView.onPause() + binding.mapView.onPause() } override fun onDestroy() { - mapView.onDestroy() + binding.mapView.onDestroy() super.onDestroy() } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - mapView.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/view/PermissionActivity.kt b/app/src/main/java/com/casic/smarttube/view/PermissionActivity.kt index e872ef4..fc20978 100644 --- a/app/src/main/java/com/casic/smarttube/view/PermissionActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/PermissionActivity.kt @@ -13,7 +13,6 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。 if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) { startSplashScreenActivity() } else { diff --git a/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt b/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt index c639105..bb0b0ed 100644 --- a/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt @@ -13,33 +13,35 @@ import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.MyLocationStyle import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivitySelectLocationBinding import com.casic.smarttube.utils.CenterMarkerView import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_select_location.* -class SelectLocationActivity : KotlinBaseActivity(), AMap.OnMyLocationChangeListener, - OnMapLoadedListener, OnCameraChangeListener { +class SelectLocationActivity : KotlinBaseActivity(), + AMap.OnMyLocationChangeListener, OnMapLoadedListener, OnCameraChangeListener { private val kTag = "SelectLocationActivity" private lateinit var latLng: LatLng private lateinit var aMap: AMap private lateinit var centerMarkerView: CenterMarkerView - override fun initLayoutView(): Int = R.layout.activity_select_location + override fun initViewBinding(): ActivitySelectLocationBinding { + return ActivitySelectLocationBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "手动选点" - leftBackView.setOnClickListener { finish() } + binding.titleView.text = "手动选点" + binding.leftBackView.setOnClickListener { finish() } } - override fun initData() { - aMap = mapView.map + override fun initOnCreate(savedInstanceState: Bundle?) { + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val locationStyle = MyLocationStyle() //定位一次,且将视角移动到地图中心点 @@ -76,7 +78,7 @@ aMap.setOnMapLoadedListener(this) aMap.setOnCameraChangeListener(this) - rightOperateView.setOnClickListener { + binding.rightOperateView.setOnClickListener { val intent = Intent() intent.putExtra("longitude", latLng.longitude.toString()) intent.putExtra("latitude", latLng.latitude.toString()) @@ -110,27 +112,27 @@ /**地图相关*********/ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - mapView.onCreate(savedInstanceState) + binding.mapView.onCreate(savedInstanceState) } override fun onResume() { super.onResume() - mapView.onResume() + binding.mapView.onResume() } override fun onPause() { super.onPause() - mapView.onPause() + binding.mapView.onPause() } override fun onDestroy() { centerMarkerView.destroy() - mapView.onDestroy() + binding.mapView.onDestroy() super.onDestroy() } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - mapView.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/smarttube/view/SplashScreenActivity.kt index dafbe4d..baf5222 100644 --- a/app/src/main/java/com/casic/smarttube/view/SplashScreenActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/SplashScreenActivity.kt @@ -1,16 +1,17 @@ package com.casic.smarttube.view import android.annotation.SuppressLint +import android.os.Bundle import android.os.CountDownTimer import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivitySplashBinding import com.casic.smarttube.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo @SuppressLint("CustomSplashScreen") -class SplashScreenActivity : KotlinBaseActivity() { +class SplashScreenActivity : KotlinBaseActivity() { private lateinit var userDetailViewModel: UserViewModel private val countDownTimer = object : CountDownTimer(1000, 500) { @@ -34,13 +35,15 @@ } } - override fun initLayoutView(): Int = R.layout.activity_splash + override fun initViewBinding(): ActivitySplashBinding { + return ActivitySplashBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { userDetailViewModel = ViewModelProvider(this).get(UserViewModel::class.java) } diff --git a/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt b/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt index 23d1ac1..ae7df77 100644 --- a/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt +++ b/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt @@ -6,14 +6,19 @@ import android.view.Gravity import androidx.fragment.app.FragmentManager import com.casic.smarttube.R +import com.casic.smarttube.databinding.DialogSelectDateBinding import com.casic.smarttube.utils.LocaleConstant import com.jzxiang.pickerview.TimePickerDialog import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.* -import kotlinx.android.synthetic.main.dialog_select_date.* +import com.pengxh.kt.lite.extensions.binding +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.resetParams +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.extensions.timestampToTime import java.text.ParseException import java.text.SimpleDateFormat -import java.util.* +import java.util.Locale class DateSelectDialog private constructor(builder: Builder) : Dialog( builder.context, R.style.UserDefinedDialogStyle @@ -76,6 +81,8 @@ } } + private val binding: DialogSelectDateBinding by binding() + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) this.resetParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.85) @@ -84,10 +91,10 @@ setCanceledOnTouchOutside(false) if (title.isNotBlank()) { - dialogTitleView.text = title + binding.dialogTitleView.text = title } - startDateView.setOnClickListener { + binding.startDateView.setOnClickListener { TimePickerDialog.Builder() .setThemeColor(R.color.mainThemeColor.convertColor(ctx)) .setTitleStringId("请选择起始时间") @@ -102,11 +109,11 @@ } else { millSeconds.timestampToCompleteDate() } - startDateView.setText(textValue) + binding.startDateView.setText(textValue) }.build().show(fragmentManager, "DateSelectDialog") } - endDateView.setOnClickListener { + binding.endDateView.setOnClickListener { TimePickerDialog.Builder() .setThemeColor(R.color.mainThemeColor.convertColor(ctx)) .setTitleStringId("请选择起始时间") @@ -121,21 +128,21 @@ } else { millSeconds.timestampToCompleteDate() } - endDateView.setText(textValue) + binding.endDateView.setText(textValue) }.build().show(fragmentManager, "DateSelectDialog") } - dialogCancelButton.text = negativeBtn - dialogCancelButton.setOnClickListener { + binding.dialogCancelButton.text = negativeBtn + binding.dialogCancelButton.setOnClickListener { listener.onCancelClick() this.dismiss() } - dialogConfirmButton.text = positiveBtn - dialogConfirmButton.setOnClickListener { + binding.dialogConfirmButton.text = positiveBtn + binding.dialogConfirmButton.setOnClickListener { //判断其实时间和结束时间 - val startDate = startDateView.text.toString() - val endDate = endDateView.text.toString() + val startDate = binding.startDateView.text.toString() + val endDate = binding.endDateView.text.toString() if (isEarlierThanStart(startDate, endDate)) { "结束时间不能早于开始时间".show(ctx) return@setOnClickListener diff --git a/app/src/main/java/com/casic/smarttube/widgets/MultiSelectDialog.kt b/app/src/main/java/com/casic/smarttube/widgets/MultiSelectDialog.kt index 7e3a63e..cb9316d 100644 --- a/app/src/main/java/com/casic/smarttube/widgets/MultiSelectDialog.kt +++ b/app/src/main/java/com/casic/smarttube/widgets/MultiSelectDialog.kt @@ -8,9 +8,10 @@ import androidx.recyclerview.widget.RecyclerView import com.casic.smarttube.R import com.casic.smarttube.adapter.DialogDeviceListAdapter +import com.casic.smarttube.databinding.DialogMultiSelectBinding import com.casic.smarttube.model.DeviceListModel +import com.pengxh.kt.lite.extensions.binding import com.pengxh.kt.lite.extensions.resetParams -import kotlinx.android.synthetic.main.dialog_multi_select.* class MultiSelectDialog private constructor(builder: Builder) : Dialog( builder.activity, R.style.UserDefinedDialogStyle @@ -67,6 +68,8 @@ } } + private val binding: DialogMultiSelectBinding by binding() + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) this.resetParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.85) @@ -75,21 +78,25 @@ setCanceledOnTouchOutside(false) if (title.isNotBlank()) { - dialogTitleView.text = title + binding.dialogTitleView.text = title } val dialogDeviceListAdapter = DialogDeviceListAdapter(act, dataModels) - dataRecyclerView.addItemDecoration(DividerItemDecoration(act, RecyclerView.VERTICAL)) - dataRecyclerView.adapter = dialogDeviceListAdapter + binding.dataRecyclerView.addItemDecoration( + DividerItemDecoration( + act, RecyclerView.VERTICAL + ) + ) + binding.dataRecyclerView.adapter = dialogDeviceListAdapter - dialogCancelButton.text = negativeBtn - dialogCancelButton.setOnClickListener { + binding.dialogCancelButton.text = negativeBtn + binding.dialogCancelButton.setOnClickListener { listener.onCancelClick() this.dismiss() } - dialogConfirmButton.text = positiveBtn - dialogConfirmButton.setOnClickListener { + binding.dialogConfirmButton.text = positiveBtn + binding.dialogConfirmButton.setOnClickListener { // 处理数据 listener.onConfirmClick(dialogDeviceListAdapter.selectedModels) this.dismiss() diff --git a/app/src/main/res/layout/activity_about_us.xml b/app/src/main/res/layout/activity_about_us.xml index c67a714..69dc539 100644 --- a/app/src/main/res/layout/activity_about_us.xml +++ b/app/src/main/res/layout/activity_about_us.xml @@ -7,7 +7,9 @@ android:orientation="vertical" tools:context=".view.AboutUsActivity"> - + - + - + - + variant.outputs.configureEach { outputFileName = "GT_" + getBuildDate() + "_" + defaultConfig.versionName + ".apk" @@ -61,7 +62,7 @@ dependencies { //基础依赖库 - implementation files('libs/lite-release.aar') + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.5' implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.6.1' diff --git a/app/libs/lite-release.aar b/app/libs/lite-release.aar deleted file mode 100644 index 9f8c814..0000000 --- a/app/libs/lite-release.aar +++ /dev/null Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cccda6d..fd9277c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,7 +81,7 @@ + android:value="a6907c8bb931727374aa5fd500cda107" /> (), Handler.Callback, + AMap.OnCameraChangeListener, AMap.OnMarkerClickListener, AMap.InfoWindowAdapter, + AMap.OnInfoWindowClickListener { private val kTag = "HomePageFragment" private val geocoderSearch by lazy { GeocodeSearch(requireContext()) } - private lateinit var homeView: View private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var easyPopupWindow: EasyPopupWindow private lateinit var aMap: AMap private lateinit var deviceViewModel: DeviceViewModel private lateinit var groupViewModel: ProjectGroupViewModel @@ -83,34 +89,34 @@ * */ private var mapZooms = ArrayList() - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View { - homeView = inflater.inflate(R.layout.fragment_home, container, false) + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentHomeBinding { + return FragmentHomeBinding.inflate(inflater, container, false) + } - weakReferenceHandler = WeakReferenceHandler(callback) - val easyPopupWindow = EasyPopupWindow(requireContext()) - easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) - homeView.rightOptionView.setOnClickListener { - easyPopupWindow.setOnPopupWindowClickListener(object : - EasyPopupWindow.OnPopupWindowClickListener { - override fun onPopupItemClicked(position: Int) { - when (position) { - 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL - 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE - } - } - }) - easyPopupWindow.setBackgroundDrawable(null) - val x: Int = homeView.rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(homeView.rightOptionView, x, 0) + override fun setupTopBarLayout() { + + } + + override fun observeRequestState() { + groupViewModel.loadState.observe(this) { state -> + when (state) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") + else -> LoadingDialogHub.dismiss() + } } + } + + override fun initOnCreate(savedInstanceState: Bundle?) { + weakReferenceHandler = WeakReferenceHandler(this) + + easyPopupWindow = EasyPopupWindow(requireContext()) + easyPopupWindow.setPopupMenuItem(LocaleConstant.POPUP_IMAGES, LocaleConstant.POPUP_TITLES) //初始化vm - deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) - groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) - - observeRequestState() + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java] //默认数据 groupViewModel.obtainProGroupList() @@ -119,12 +125,8 @@ mapZooms.add(13f) initMap(savedInstanceState) - homeView.addDeviceButton.setOnClickListener { - requireContext().navigatePageTo() - } - //数据监听 - deviceViewModel.mapDeviceModel.observe(this, { + deviceViewModel.mapDeviceModel.observe(this) { if (it.code == 200) { if (allMarkerOptions.isNotEmpty()) { allMarkerOptions.clear() @@ -149,10 +151,8 @@ longitudeList.add(longitude) //将所有设备信息转化缓存为Marker点 allMarkerOptions.add( - MarkerOptions() - .position(LatLng(latitude, longitude)) - .title(device.devcode) - .snippet(device.modelName) + MarkerOptions().position(LatLng(latitude, longitude)) + .title(device.devcode).snippet(device.modelName) ) } } @@ -160,8 +160,8 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 13f) } - }) - groupViewModel.groupModel.observe(this, { + } + groupViewModel.groupModel.observe(this) { if (it.code == 200) { val dataRows = it.data when { @@ -170,14 +170,15 @@ dataBeans = dataRows!! isRefresh = false } + else -> { dataBeans = dataRows!! } } weakReferenceHandler.sendEmptyMessage(2022090201) } - }) - groupViewModel.groupDeviceModel.observe(this, { + } + groupViewModel.groupDeviceModel.observe(this) { if (it.code == 200) { val latitudeList: MutableList = ArrayList() val longitudeList: MutableList = ArrayList() @@ -199,22 +200,33 @@ val centerLatLng = LatLng(latitudeList[0], longitudeList[0]) moveToPosition(centerLatLng, 16f) } - }) - return homeView + } } - private fun observeRequestState() { - groupViewModel.loadState.observe(this, { state -> - when (state) { - LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "数据加载中...") - else -> LoadingDialogHub.dismiss() - } - }) + override fun initEvent() { + binding.rightOptionView.setOnClickListener { + easyPopupWindow.setOnPopupWindowClickListener(object : + EasyPopupWindow.OnPopupWindowClickListener { + override fun onPopupItemClicked(position: Int) { + when (position) { + 0 -> aMap.mapType = AMap.MAP_TYPE_NORMAL + 1 -> aMap.mapType = AMap.MAP_TYPE_SATELLITE + } + } + }) + easyPopupWindow.setBackgroundDrawable(null) + val x: Int = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) + } + + binding.addDeviceButton.setOnClickListener { + requireContext().navigatePageTo() + } } override fun onResume() { super.onResume() - homeView.mapView.onResume() + binding.mapView.onResume() //获取所有设备数据 deviceViewModel.obtainMapDeviceList() @@ -222,16 +234,16 @@ groupViewModel.obtainProGroupList() } - private val callback = Handler.Callback { - if (it.what == 2022090201) { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == 2022090201) { if (isRefresh) { groupListAdapter.notifyDataSetChanged() } else { groupListAdapter = GroupListAdapter(requireContext(), dataBeans) - homeView.homeRecyclerView!!.addItemDecoration( + binding.homeRecyclerView.addItemDecoration( DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL) ) - homeView.homeRecyclerView!!.adapter = groupListAdapter + binding.homeRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : GroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { @@ -241,12 +253,12 @@ }) } } - true + return true } private fun initMap(savedInstanceState: Bundle?) { - homeView.mapView.onCreate(savedInstanceState) - aMap = homeView.mapView.map + binding.mapView.onCreate(savedInstanceState) + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val uiSettings = aMap.uiSettings uiSettings.isCompassEnabled = true @@ -322,10 +334,7 @@ if (!isInRange) { clustersMarkers.add( GaoDeClusterMarkerView( - requireContext(), - it, - proj, - LocaleConstant.RADIUS_SIZE + requireContext(), it, proj, LocaleConstant.RADIUS_SIZE ) )//相距多少才聚合 } @@ -363,9 +372,7 @@ //绑定数据 val clickedLatLng = marker?.position!! for (device in deviceModels) { - if (clickedLatLng.latitude == device.latGaode!!.toDouble() - && clickedLatLng.longitude == device.lngGaode!!.toDouble() - ) { + if (clickedLatLng.latitude == device.latGaode!!.toDouble() && clickedLatLng.longitude == device.lngGaode!!.toDouble()) { deviceCodeView.text = String.format("设备编号: ${device.devcode}") deviceModelView.text = String.format("设备模型: ${device.modelName}") //获取设备最新浓度信息 @@ -395,8 +402,7 @@ val address = result?.regeocodeAddress?.formatAddress val temp = StringBuilder() if (address!!.length > 16) { - temp.append(address.substring(0, 14)) - .append("\r\n") + temp.append(address.substring(0, 14)).append("\r\n") .append(address.substring(16)) } else { temp.append(address) @@ -430,9 +436,7 @@ } } //查看聚合点,单独开页面导航过去 - BottomActionSheet.Builder() - .setContext(requireContext()) - .setActionItemTitle(multiDevice) + BottomActionSheet.Builder().setContext(requireContext()).setActionItemTitle(multiDevice) .setItemTextColor(Color.BLUE) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { @@ -455,12 +459,8 @@ override fun onInfoWindowClick(p0: Marker?) { if (p0 != null) { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("操作提示") - .setMessage("确定要前往吗") - .setNegativeButton("取消") - .setPositiveButton("确定") + AlertControlDialog.Builder().setContext(requireContext()).setTitle("操作提示") + .setMessage("确定要前往吗").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -487,16 +487,16 @@ 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 onDestroy() { super.onDestroy() - homeView.mapView.onDestroy() + binding.mapView.onDestroy() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt index a4e964c..cc35197 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/MinePageFragment.kt @@ -4,11 +4,15 @@ import android.content.Intent import android.net.Uri import android.os.Build +import android.os.Bundle import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider import com.casic.smarttube.BuildConfig import com.casic.smarttube.R +import com.casic.smarttube.databinding.FragmentMineBinding import com.casic.smarttube.extensions.appendDownloadUrl import com.casic.smarttube.model.UserDetailModel import com.casic.smarttube.utils.AuthenticationHelper @@ -36,22 +40,10 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.ChangePasswordDialog -import kotlinx.android.synthetic.main.fragment_mine.aboutUsLayout -import kotlinx.android.synthetic.main.fragment_mine.cacheSizeView -import kotlinx.android.synthetic.main.fragment_mine.changePwdLayout -import kotlinx.android.synthetic.main.fragment_mine.clearCacheLayout -import kotlinx.android.synthetic.main.fragment_mine.loginOutButton -import kotlinx.android.synthetic.main.fragment_mine.updateLogLayout -import kotlinx.android.synthetic.main.fragment_mine.updateUserButton -import kotlinx.android.synthetic.main.fragment_mine.updateVersionLayout -import kotlinx.android.synthetic.main.fragment_mine.userDeptView -import kotlinx.android.synthetic.main.fragment_mine.userImageView -import kotlinx.android.synthetic.main.fragment_mine.userNameView -import kotlinx.android.synthetic.main.fragment_mine.userPhoneView import java.io.File import java.nio.charset.StandardCharsets -class MinePageFragment : KotlinBaseFragment() { +class MinePageFragment : KotlinBaseFragment() { private val kTag = "MinePageFragment" private lateinit var userData: UserDetailModel.Data @@ -60,13 +52,17 @@ private lateinit var versionViewModel: VersionViewModel private lateinit var progressDialog: ProgressDialog - override fun initLayoutView(): Int = R.layout.fragment_mine + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentMineBinding { + return FragmentMineBinding.inflate(inflater, container, false) + } override fun setupTopBarLayout() { } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { userViewModel = ViewModelProvider(this)[UserViewModel::class.java] loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java] @@ -98,8 +94,7 @@ versionViewModel.loadState.observe(this) { when (it) { is LoadState.Loading -> LoadingDialogHub.show( - requireActivity(), - "检查版本中,请稍后" + requireActivity(), "检查版本中,请稍后" ) else -> LoadingDialogHub.dismiss() @@ -108,49 +103,45 @@ } override fun initEvent() { - userImageView.setOnClickListener { + binding.userImageView.setOnClickListener { "尽情期待~".show(requireContext()) } - updateUserButton.setOnClickListener { + binding.updateUserButton.setOnClickListener { LoadingDialogHub.show(requireActivity(), "同步中,请稍后...") userViewModel.obtainUserDetail() } - changePwdLayout.setOnClickListener { - ChangePasswordDialog.Builder() - .setContext(requireContext()) + binding.changePwdLayout.setOnClickListener { + ChangePasswordDialog.Builder().setContext(requireContext()) .setOnDialogButtonClickListener(object : ChangePasswordDialog.OnDialogButtonClickListener { override fun onConfirmClick(oldPwd: String, newPwd: String) { - val publicKey = - RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! + val publicKey = RSAUtils.keyStrToPublicKey(AuthenticationHelper.publicKey)!! val oldPassKey = RSAUtils.encryptDataByPublicKey( - oldPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + oldPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) val newPassKey = RSAUtils.encryptDataByPublicKey( - newPwd.toByteArray(StandardCharsets.UTF_8), - publicKey + newPwd.toByteArray(StandardCharsets.UTF_8), publicKey ) userViewModel.changePassword(oldPassKey, newPassKey) } }).build().show() } - aboutUsLayout.setOnClickListener { + binding.aboutUsLayout.setOnClickListener { requireContext().navigatePageTo() } - updateVersionLayout.setOnClickListener { + binding.updateVersionLayout.setOnClickListener { versionViewModel.updateVersion() } - updateLogLayout.setOnClickListener { + binding.updateLogLayout.setOnClickListener { "尽情期待~".show(requireContext()) } - clearCacheLayout.setOnClickListener { + binding.clearCacheLayout.setOnClickListener { //删除缓存之后在设置缓存大小 LoadingDialogHub.show(requireActivity(), "清理中,请稍后") File(requireContext().cacheDir.path).deleteFile() @@ -161,18 +152,14 @@ override fun onFinish() { LoadingDialogHub.dismiss() - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() } }.start() } - loginOutButton.setOnClickListener { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("退出登录") - .setMessage("确定要退出吗?") - .setNegativeButton("取消") - .setPositiveButton("确定") + binding.loginOutButton.setOnClickListener { + AlertControlDialog.Builder().setContext(requireContext()).setTitle("退出登录") + .setMessage("确定要退出吗?").setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { @@ -203,13 +190,9 @@ if (BuildConfig.VERSION_NAME == it.version) { "已是最新版本,无需更新".show(requireContext()) } else { - AlertControlDialog.Builder() - .setContext(requireContext()) - .setTitle("提示") - .setMessage("有新版本,是否更新?") - .setNegativeButton("稍后再说") - .setPositiveButton("立即下载") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(requireContext()).setTitle("提示") + .setMessage("有新版本,是否更新?").setNegativeButton("稍后再说") + .setPositiveButton("立即下载").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { downloadApk(it.downloadUrl) @@ -244,7 +227,7 @@ updateUserInfo() } //缓存 - cacheSizeView.text = collectApplicationCache().formatFileSize() + binding.cacheSizeView.text = collectApplicationCache().formatFileSize() super.onResume() } @@ -258,9 +241,9 @@ // R.color.mainThemeColor.convertColor(requireContext()) // ) // userImageView.setImageDrawable(roundDrawable) - userNameView.text = userData.name - userPhoneView.text = String.format("电话:${userData.phone}") - userDeptView.text = String.format("部门:${userData.deptName}") + binding.userNameView.text = userData.name + binding.userPhoneView.text = String.format("电话:${userData.phone}") + binding.userDeptView.text = String.format("部门:${userData.deptName}") } private fun downloadApk(url: String?) { @@ -275,7 +258,8 @@ * */ val downloadPath = url!!.appendDownloadUrl() //开始下载 - downloadPath.downloadFile(requireContext().createDownloadFileDir().toString(), + downloadPath.downloadFile( + requireContext().createDownloadFileDir().toString(), object : OnDownloadListener { override fun onDownloadStart(totalBytes: Long) { progressDialog.max = totalBytes.toInt() diff --git a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt index b009850..c0afcc5 100644 --- a/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt +++ b/app/src/main/java/com/casic/smarttube/fragment/OverviewFragment.kt @@ -1,8 +1,11 @@ package com.casic.smarttube.fragment +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R import com.casic.smarttube.adapter.OverviewGroupListAdapter +import com.casic.smarttube.databinding.FragmentOverviewBinding import com.casic.smarttube.extensions.showEmptyPage import com.casic.smarttube.model.ProjectGroupModel import com.casic.smarttube.view.GroupDeviceActivity @@ -11,25 +14,25 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.widget.dialog.AlertInputDialog -import kotlinx.android.synthetic.main.fragment_overview.groupRecyclerView -import kotlinx.android.synthetic.main.fragment_overview.rightOptionView -import kotlinx.android.synthetic.main.fragment_overview.titleView -import kotlinx.android.synthetic.main.include_empty_view.emptyView -class OverviewFragment : KotlinBaseFragment() { +class OverviewFragment : KotlinBaseFragment() { private lateinit var groupViewModel: ProjectGroupViewModel private var dataBeans: MutableList = ArrayList() private lateinit var groupListAdapter: OverviewGroupListAdapter private var clickedPosition = 0 - override fun initLayoutView(): Int = R.layout.fragment_overview - - override fun setupTopBarLayout() { - titleView.text = "概览" + override fun initViewBinding( + inflater: LayoutInflater, container: ViewGroup? + ): FragmentOverviewBinding { + return FragmentOverviewBinding.inflate(inflater, container, false) } - override fun initData() { + override fun setupTopBarLayout() { + binding.titleView.text = "概览" + } + + override fun initOnCreate(savedInstanceState: Bundle?) { groupViewModel = ViewModelProvider(this).get(ProjectGroupViewModel::class.java) } @@ -43,7 +46,7 @@ } override fun initEvent() { - rightOptionView.setOnClickListener { + binding.rightOptionView.setOnClickListener { groupViewModel.obtainProGroupList() "刷新数据中,请稍后".show(requireContext()) } @@ -51,16 +54,16 @@ groupViewModel.groupModel.observe(this) { if (it.code == 200) { if (it.data.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { groupViewModel.obtainProGroupList() } } else { - emptyView!!.hide() + binding.emptyInclude.emptyView.hide() dataBeans.clear() dataBeans = it.data groupListAdapter = OverviewGroupListAdapter(requireContext(), it.data) - groupRecyclerView!!.adapter = groupListAdapter + binding.groupRecyclerView.adapter = groupListAdapter groupListAdapter.setOnItemClickListener(object : OverviewGroupListAdapter.OnItemClickListener { override fun onClicked(position: Int) { diff --git a/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt b/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt index e424721..7f036b0 100644 --- a/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt +++ b/app/src/main/java/com/casic/smarttube/utils/RouteOnMap.kt @@ -4,8 +4,8 @@ import android.graphics.Color import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.Poi -import com.pengxh.kt.lite.extensions.showBusRouteOnMap -import com.pengxh.kt.lite.extensions.showRouteOnMap +import com.casic.smarttube.extensions.showBusRouteOnMap +import com.casic.smarttube.extensions.showRouteOnMap import com.pengxh.kt.lite.widget.dialog.BottomActionSheet object RouteOnMap { diff --git a/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt b/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt index 65bba6f..598581a 100644 --- a/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AboutUsActivity.kt @@ -1,27 +1,29 @@ package com.casic.smarttube.view +import android.os.Bundle import com.casic.smarttube.BuildConfig import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityAboutUsBinding import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_about_us.* -import kotlinx.android.synthetic.main.include_base_title.* -class AboutUsActivity : KotlinBaseActivity() { +class AboutUsActivity : KotlinBaseActivity() { - override fun initLayoutView(): Int = R.layout.activity_about_us + override fun initViewBinding(): ActivityAboutUsBinding { + return ActivityAboutUsBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "关于我们" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "关于我们" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { - versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") + override fun initOnCreate(savedInstanceState: Bundle?) { + binding.versionCodeView.text = String.format("版本信息:V${BuildConfig.VERSION_NAME}") } override fun observeRequestState() { diff --git a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt index 415f9dd..80b83bd 100644 --- a/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/AddDeviceActivity.kt @@ -3,6 +3,7 @@ import android.content.Context import android.content.Intent import android.graphics.Color +import android.os.Bundle import android.os.CountDownTimer import android.os.Handler import android.text.Editable @@ -15,6 +16,7 @@ import com.amap.api.location.AMapLocation import com.casic.smarttube.R import com.casic.smarttube.callback.OnImageCompressListener +import com.casic.smarttube.databinding.ActivityAddDeviceBinding import com.casic.smarttube.extensions.combineImagePath import com.casic.smarttube.extensions.compressImage import com.casic.smarttube.extensions.isNumber @@ -47,24 +49,9 @@ import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet -import kotlinx.android.synthetic.main.activity_add_device.addDeviceTimeView -import kotlinx.android.synthetic.main.activity_add_device.addImageRecyclerView -import kotlinx.android.synthetic.main.activity_add_device.collectIntervalView -import kotlinx.android.synthetic.main.activity_add_device.deviceCodeView -import kotlinx.android.synthetic.main.activity_add_device.deviceNameView -import kotlinx.android.synthetic.main.activity_add_device.inputLengthView -import kotlinx.android.synthetic.main.activity_add_device.latitudeView -import kotlinx.android.synthetic.main.activity_add_device.locationImageView -import kotlinx.android.synthetic.main.activity_add_device.longitudeView -import kotlinx.android.synthetic.main.activity_add_device.ownerShipView -import kotlinx.android.synthetic.main.activity_add_device.scannerView -import kotlinx.android.synthetic.main.activity_add_device.sceneEditView -import kotlinx.android.synthetic.main.activity_add_device.submitButton -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView import java.io.File -class AddDeviceActivity : KotlinBaseActivity() { +class AddDeviceActivity : KotlinBaseActivity() { private val kTag = "AddDeviceActivity" private lateinit var imageAdapter: EditableImageAdapter @@ -81,21 +68,23 @@ registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == RESULT_OK) { val data = result.data!! - longitudeView.text = data.getStringExtra("longitude") - latitudeView.text = data.getStringExtra("latitude") + binding.longitudeView.text = data.getStringExtra("longitude") + binding.latitudeView.text = data.getStringExtra("latitude") } } - override fun initLayoutView(): Int = R.layout.activity_add_device + override fun initViewBinding(): ActivityAddDeviceBinding { + return ActivityAddDeviceBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "添加设备" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "添加设备" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { weakReferenceHandler = WeakReferenceHandler(callback) uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] @@ -119,17 +108,17 @@ override fun initEvent() { val manager = QrManager.getInstance().init(QrConfigCreator.create(this)) - scannerView.setOnClickListener { + binding.scannerView.setOnClickListener { manager.startScan(this) { if (it.content.isNumber()) { - deviceCodeView.setText(it.content) + binding.deviceCodeView.setText(it.content) } else { "设备编号错误,请检查标签".show(context) } } } - ownerShipView.setOnClickListener { + binding.ownerShipView.setOnClickListener { groupViewModel.obtainGroupList() } groupViewModel.groupListModel.observe(this) { @@ -147,19 +136,14 @@ groups.add("自定义") } if (groups.isNotEmpty()) { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(groups) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { if (groups[position] == "自定义") { - AlertInputDialog.Builder() - .setContext(context) - .setTitle("提示") + AlertInputDialog.Builder().setContext(context).setTitle("提示") .setHintMessage("请输入该设备所属项目名,如:项目203") - .setNegativeButton("取消") - .setPositiveButton("确定") + .setNegativeButton("取消").setPositiveButton("确定") .setOnDialogButtonClickListener(object : AlertInputDialog.OnDialogButtonClickListener { override fun onCancelClick() { @@ -167,12 +151,11 @@ } override fun onConfirmClick(value: String) { - ownerShipView.text = value + binding.ownerShipView.text = value } - }) - .build().show() + }).build().show() } else { - ownerShipView.text = groups[position] + binding.ownerShipView.text = groups[position] } } }).build().show() @@ -180,27 +163,22 @@ } //默认频率1min - collectIntervalView.text = frequency[0] - collectIntervalView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + binding.collectIntervalView.text = frequency[0] + binding.collectIntervalView.setOnClickListener { + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(frequency) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { - collectIntervalView.text = frequency[position] + binding.collectIntervalView.text = frequency[position] } }).build().show() } - locationImageView.setOnClickListener { - BottomActionSheet.Builder() - .setContext(context) - .setItemTextColor(Color.BLUE) + binding.locationImageView.setOnClickListener { + BottomActionSheet.Builder().setContext(context).setItemTextColor(Color.BLUE) .setActionItemTitle(arrayListOf("自动定位", "手动选点")) - .setOnActionSheetListener(object : - BottomActionSheet.OnActionSheetListener { + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { when (position) { 0 -> { @@ -210,30 +188,32 @@ override fun onAMapLocationGet(aMapLocation: AMapLocation?) { LoadingDialogHub.dismiss() if (aMapLocation == null) { - longitudeView.text = "定位失败" - latitudeView.text = "定位失败" + binding.longitudeView.text = "定位失败" + binding.latitudeView.text = "定位失败" - longitudeView.setTextColor( + binding.longitudeView.setTextColor( R.color.redTextColor.convertColor(context) ) - latitudeView.setTextColor( + binding.latitudeView.setTextColor( R.color.redTextColor.convertColor(context) ) } else { - longitudeView.text = + binding.longitudeView.text = aMapLocation.longitude.toString() - latitudeView.text = aMapLocation.latitude.toString() + binding.latitudeView.text = + aMapLocation.latitude.toString() - longitudeView.setTextColor( + binding.longitudeView.setTextColor( R.color.mainTextColor.convertColor(context) ) - latitudeView.setTextColor( + binding.latitudeView.setTextColor( R.color.mainTextColor.convertColor(context) ) } } }) } + 1 -> selectLocationLauncher.launch( Intent(context, SelectLocationActivity::class.java) ) @@ -243,7 +223,7 @@ } imageAdapter = EditableImageAdapter(this, 3, 13f) - addImageRecyclerView.adapter = imageAdapter + binding.addImageRecyclerView.adapter = imageAdapter imageAdapter.setOnItemClickListener(object : EditableImageAdapter.OnItemClickListener { override fun onAddImageClick() { selectPicture() @@ -281,7 +261,7 @@ } } - sceneEditView.addTextChangedListener(object : TextWatcher { + binding.sceneEditView.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { } @@ -292,31 +272,31 @@ override fun afterTextChanged(s: Editable?) { val text = s.toString().trim() - inputLengthView.text = String.format("${text.length}/100") + binding.inputLengthView.text = String.format("${text.length}/100") if (text.length > 100) { - inputLengthView.setTextColor(R.color.redTextColor.convertColor(context)) + binding.inputLengthView.setTextColor(R.color.redTextColor.convertColor(context)) "现场情况字符不能超过100个字符".show(context) } else { - inputLengthView.setTextColor(R.color.subTextColor.convertColor(context)) + binding.inputLengthView.setTextColor(R.color.subTextColor.convertColor(context)) } } }) - addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() + binding.addDeviceTimeView.text = System.currentTimeMillis().timestampToCompleteDate() - submitButton.setOnClickListener { - val deviceCode = deviceCodeView.text.toString().trim() + binding.submitButton.setOnClickListener { + val deviceCode = binding.deviceCodeView.text.toString().trim() if (deviceCode.isBlank()) { "请输入设备编号".show(context) return@setOnClickListener } - val ownerShip = ownerShipView.text.toString().trim() + val ownerShip = binding.ownerShipView.text.toString().trim() if (ownerShip.isBlank()) { "请输入设备所属项目".show(context) return@setOnClickListener } - val longitude = longitudeView.text.toString().trim() - val latitude = latitudeView.text.toString().trim() + val longitude = binding.longitudeView.text.toString().trim() + val latitude = binding.latitudeView.text.toString().trim() if (longitude.isBlank() || latitude.isBlank()) { "请先获取当前经纬度".show(context) return@setOnClickListener @@ -329,14 +309,14 @@ ) deviceViewModel.addDevice( deviceCode, - deviceNameView.text.toString(), + binding.deviceNameView.text.toString(), ownerShip, - collectIntervalView.text.toString(), + binding.collectIntervalView.text.toString(), longitude, latitude, imagePaths.reformat(), - sceneEditView.text.toString().trim(), - addDeviceTimeView.text.toString(), + binding.sceneEditView.text.toString().trim(), + binding.addDeviceTimeView.text.toString(), userData.id.toString(), userData.deptId ) @@ -345,16 +325,13 @@ } private fun selectPicture() { - BottomActionSheet.Builder() - .setContext(this) - .setItemTextColor(Color.BLUE) + BottomActionSheet.Builder().setContext(this).setItemTextColor(Color.BLUE) .setActionItemTitle(listOf("拍照", "相册")) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { when (position) { 0 -> { - PictureSelector.create(context) - .openCamera(SelectMimeType.ofImage()) + PictureSelector.create(context).openCamera(SelectMimeType.ofImage()) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { if (result == null) { @@ -362,8 +339,7 @@ return } LoadingDialogHub.show( - this@AddDeviceActivity, - "图片上传中,请稍后..." + this@AddDeviceActivity, "图片上传中,请稍后..." ) selectedImages = result analyticalSelectResults(result[0]) @@ -374,14 +350,11 @@ } }) } + 1 -> { - PictureSelector.create(context) - .openGallery(SelectMimeType.ofImage()) - .isGif(false) - .isMaxSelectEnabledMask(true) - .setFilterMinFileSize(100) - .setMaxSelectNum(3) - .isDisplayCamera(false) + PictureSelector.create(context).openGallery(SelectMimeType.ofImage()) + .isGif(false).isMaxSelectEnabledMask(true).setFilterMinFileSize(100) + .setMaxSelectNum(3).isDisplayCamera(false) .setImageEngine(GlideLoadEngine.instance) .forResult(object : OnResultCallbackListener { override fun onResult(result: ArrayList?) { @@ -390,8 +363,7 @@ return } LoadingDialogHub.show( - this@AddDeviceActivity, - "图片上传中,请稍后..." + this@AddDeviceActivity, "图片上传中,请稍后..." ) selectedImages = result // 线程控制图片压缩上传过程,防止速度过快导致压缩失败 diff --git a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt index 3864f16..e4f19a4 100644 --- a/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/BigImageActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.content.Context +import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -10,19 +11,20 @@ import androidx.viewpager.widget.ViewPager import com.bumptech.glide.Glide import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityBigImageBinding import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.photoview.PhotoView import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.utils.PageNavigationManager -import kotlinx.android.synthetic.main.activity_big_image.* -import java.util.* -class BigImageActivity : KotlinBaseActivity() { +class BigImageActivity : KotlinBaseActivity() { - override fun initLayoutView(): Int = R.layout.activity_big_image + override fun initViewBinding(): ActivityBigImageBinding { + return ActivityBigImageBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { PageNavigationManager.addActivity(this) @@ -30,16 +32,16 @@ ImmersionBar.with(this).statusBarDarkFont(false).init() } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val index = intent.getIntExtra(Constant.BIG_IMAGE_INTENT_INDEX_KEY, 0) val urls = intent.getStringArrayListExtra(Constant.BIG_IMAGE_INTENT_DATA_KEY) if (urls == null || urls.size == 0) { return } - pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") - imagePagerView.adapter = BigImageAdapter(this, urls) - imagePagerView.currentItem = index - imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + binding.pageNumberView.text = String.format("(" + (index + 1) + "/" + urls.size + ")") + binding.imagePagerView.adapter = BigImageAdapter(this, urls) + binding.imagePagerView.currentItem = index + binding.imagePagerView.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrollStateChanged(state: Int) { } @@ -53,7 +55,8 @@ } override fun onPageSelected(position: Int) { - pageNumberView.text = String.format("(" + (position + 1) + "/" + urls.size + ")") + binding.pageNumberView.text = + String.format("(" + (position + 1) + "/" + urls.size + ")") } }) } @@ -63,7 +66,7 @@ } override fun initEvent() { - leftBackView.setOnClickListener { this.finish() } + binding.leftBackView.setOnClickListener { this.finish() } } class BigImageAdapter(private var context: Context, imageList: ArrayList) : diff --git a/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt b/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt index 072953f..f036a78 100644 --- a/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/DeviceDetailActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.graphics.Color +import android.os.Bundle import android.view.View import androidx.lifecycle.ViewModelProvider import com.amap.api.maps.model.LatLng @@ -10,6 +11,7 @@ import com.amap.api.services.geocoder.RegeocodeQuery import com.amap.api.services.geocoder.RegeocodeResult import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityDeviceDetailBinding import com.casic.smarttube.extensions.combineImagePath import com.casic.smarttube.extensions.toSignalImage import com.casic.smarttube.model.DeviceDetailModel @@ -25,51 +27,39 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState -import kotlinx.android.synthetic.main.activity_device_detail.densityView -import kotlinx.android.synthetic.main.activity_device_detail.descriptionView -import kotlinx.android.synthetic.main.activity_device_detail.deviceBatteryView -import kotlinx.android.synthetic.main.activity_device_detail.deviceCodeView -import kotlinx.android.synthetic.main.activity_device_detail.deviceNameView -import kotlinx.android.synthetic.main.activity_device_detail.deviceStateView -import kotlinx.android.synthetic.main.activity_device_detail.imageGridView -import kotlinx.android.synthetic.main.activity_device_detail.lastDataView -import kotlinx.android.synthetic.main.activity_device_detail.leftBackView -import kotlinx.android.synthetic.main.activity_device_detail.locationView -import kotlinx.android.synthetic.main.activity_device_detail.projectGroupView -import kotlinx.android.synthetic.main.activity_device_detail.rightOptionView -import kotlinx.android.synthetic.main.activity_device_detail.signalImageView -import kotlinx.android.synthetic.main.activity_device_detail.titleView -class DeviceDetailActivity : KotlinBaseActivity() { +class DeviceDetailActivity : KotlinBaseActivity() { private val kTag = "DeviceDetailActivity" private lateinit var deviceViewModel: DeviceViewModel private lateinit var deviceModel: DeviceDetailModel.DataModel private val geocoderSearch by lazy { GeocodeSearch(this) } - override fun initLayoutView(): Int = R.layout.activity_device_detail + override fun initViewBinding(): ActivityDeviceDetailBinding { + return ActivityDeviceDetailBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "设备详情" - leftBackView.setOnClickListener { finish() } + binding.titleView.text = "设备详情" + binding.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! - deviceViewModel = ViewModelProvider(this).get(DeviceViewModel::class.java) + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] deviceViewModel.obtainDeviceDetail(params[0], params[1]) deviceViewModel.deviceDetailModel.observe(this) { if (it.code == 200) { val device = it.data this.deviceModel = device - deviceCodeView.text = device.devcode - deviceNameView.text = device.deviceName - projectGroupView.text = String.format("项目${device.groupId}") + binding.deviceCodeView.text = device.devcode + binding.deviceNameView.text = device.deviceName + binding.projectGroupView.text = String.format("项目${device.groupId}") if (device.latGaode.isBlank() || device.lngGaode.isBlank()) { - locationView.text = "经纬度异常,无法查看具体位置" + binding.locationView.text = "经纬度异常,无法查看具体位置" } else { val queryParam = RegeocodeQuery( LatLonPoint(device.latGaode.toDouble(), device.lngGaode.toDouble()), @@ -81,7 +71,7 @@ GeocodeSearch.OnGeocodeSearchListener { override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { if (rCode == 1000) { - locationView.text = result?.regeocodeAddress?.formatAddress + binding.locationView.text = result?.regeocodeAddress?.formatAddress } } @@ -90,12 +80,12 @@ } }) } - descriptionView.text = device.descn + binding.descriptionView.text = device.descn if (device.photos.toString().isBlank()) { - imageGridView.visibility = View.GONE + binding.imageGridView.visibility = View.GONE } else { - imageGridView.visibility = View.VISIBLE + binding.imageGridView.visibility = View.VISIBLE //处理图片地址 val urls: ArrayList = ArrayList() val imageArray = device.photos.toString().split(",") @@ -104,10 +94,9 @@ urls.add(path.combineImagePath()) } } - val imageAdapter = ReadOnlyImageAdapter(this) - imageAdapter.setImageList(urls) - imageGridView.adapter = imageAdapter - imageGridView.setOnItemClickListener { _, _, position, _ -> + val imageAdapter = ReadOnlyImageAdapter(this, urls) + binding.imageGridView.adapter = imageAdapter + binding.imageGridView.setOnItemClickListener { _, _, position, _ -> if (urls[position].isEmpty()) { "图片加载失败,无法查看大图".show(this) } else { @@ -119,18 +108,18 @@ val value = device.stregnth.toDouble().toInt() val level = "$value%" val ppm = "${value * 500}ppm" - densityView.text = "$level(相当于$ppm)" + binding.densityView.text = "$level(相当于$ppm)" - lastDataView.text = device.uptime + binding.lastDataView.text = device.uptime if (device.onlineState == "0") { - deviceStateView.text = "离线" - deviceStateView.setTextColor(Color.RED) + binding.deviceStateView.text = "离线" + binding.deviceStateView.setTextColor(Color.RED) } else { - deviceStateView.text = "在线" - deviceStateView.setTextColor(Color.GREEN) + binding.deviceStateView.text = "在线" + binding.deviceStateView.setTextColor(Color.GREEN) } - signalImageView.setBackgroundResource(device.rsrp.toSignalImage()) - deviceBatteryView.text = if (device.cell.isNullOrBlank()) { + binding.signalImageView.setBackgroundResource(device.rsrp.toSignalImage()) + binding.deviceBatteryView.text = if (device.cell.isNullOrBlank()) { "0%" } else { device.cell + "%" @@ -149,7 +138,7 @@ } override fun initEvent() { - rightOptionView.setOnClickListener { + binding.rightOptionView.setOnClickListener { val lat = deviceModel.latGaode.toString() val lng = deviceModel.lngGaode.toString() if (lat.isBlank() || lng.isBlank()) { diff --git a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt index 0ae8862..ba52ab8 100644 --- a/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/GroupDeviceActivity.kt @@ -1,6 +1,7 @@ package com.casic.smarttube.view import android.content.Context +import android.os.Bundle import android.os.Handler import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider @@ -8,6 +9,7 @@ import androidx.recyclerview.widget.RecyclerView import com.casic.smarttube.R import com.casic.smarttube.adapter.DeviceListAdapter +import com.casic.smarttube.databinding.ActivityGroupDeviceBinding import com.casic.smarttube.extensions.showEmptyPage import com.casic.smarttube.model.DeviceListModel import com.casic.smarttube.utils.LoadingDialogHub @@ -28,14 +30,8 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.qmuiteam.qmui.recyclerView.QMUIRVItemSwipeAction import com.qmuiteam.qmui.recyclerView.QMUISwipeAction -import kotlinx.android.synthetic.main.activity_group_device.groupDeviceLayout -import kotlinx.android.synthetic.main.activity_group_device.groupDeviceView -import kotlinx.android.synthetic.main.activity_group_device.leftBackView -import kotlinx.android.synthetic.main.activity_group_device.rightOptionView -import kotlinx.android.synthetic.main.activity_group_device.titleView -import kotlinx.android.synthetic.main.include_empty_view.emptyView -class GroupDeviceActivity : KotlinBaseActivity() { +class GroupDeviceActivity : KotlinBaseActivity() { private lateinit var groupId: String private lateinit var weakReferenceHandler: WeakReferenceHandler @@ -51,18 +47,19 @@ private var clickedPosition = 0 private var isDeleteAll = false - override fun initLayoutView(): Int = R.layout.activity_group_device + override fun initViewBinding(): ActivityGroupDeviceBinding { + return ActivityGroupDeviceBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - leftBackView.setOnClickListener { finish() } - rightOptionView.setOnClickListener { + binding.leftBackView.setOnClickListener { finish() } + binding.rightOptionView.setOnClickListener { //改为Popup val easyPopupWindow = EasyPopupWindow(this) easyPopupWindow.setPopupMenuItem( - LocaleConstant.DEVICE_OPERATE_IMAGES, - LocaleConstant.DEVICE_OPERATE_TITLES + LocaleConstant.DEVICE_OPERATE_IMAGES, LocaleConstant.DEVICE_OPERATE_TITLES ) easyPopupWindow.setOnPopupWindowClickListener(object : EasyPopupWindow.OnPopupWindowClickListener { @@ -77,13 +74,11 @@ pageIndex = 1 obtainDeviceListByPage() } + 1 -> { - AlertControlDialog.Builder() - .setContext(context) - .setTitle("提示") + AlertControlDialog.Builder().setContext(context).setTitle("提示") .setMessage("删除后将无法恢复,是否继续?") - .setNegativeButton("容我想想") - .setPositiveButton("已经想好") + .setNegativeButton("容我想想").setPositiveButton("已经想好") .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onCancelClick() { @@ -103,13 +98,11 @@ } }).build().show() } + 2 -> { - MultiSelectDialog.Builder() - .setContext(this@GroupDeviceActivity) - .setTitle("选择设备") - .setDataSource(dataBeans) - .setNegativeButton("取消") - .setPositiveButton("选好了") + MultiSelectDialog.Builder().setContext(this@GroupDeviceActivity) + .setTitle("选择设备").setDataSource(dataBeans) + .setNegativeButton("取消").setPositiveButton("选好了") .setOnDialogButtonClickListener(object : MultiSelectDialog.OnDialogButtonClickListener { override fun onConfirmClick(selectedModels: MutableList) { @@ -126,21 +119,20 @@ override fun onCancelClick() { } - }) - .build().show() + }).build().show() } } } }) easyPopupWindow.setBackgroundDrawable(null) - val x: Int = rightOptionView.width - easyPopupWindow.width - easyPopupWindow.showAsDropDown(rightOptionView, x, 0) + val x: Int = binding.rightOptionView.width - easyPopupWindow.width + easyPopupWindow.showAsDropDown(binding.rightOptionView, x, 0) } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { groupId = intent.getStringExtra(Constant.INTENT_PARAM)!! - titleView.text = String.format(groupId + "项目设备列表") + binding.titleView.text = String.format(groupId + "项目设备列表") weakReferenceHandler = WeakReferenceHandler(callback) groupViewModel = ViewModelProvider(this)[ProjectGroupViewModel::class.java] deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] @@ -157,13 +149,13 @@ } override fun initEvent() { - groupDeviceLayout.setOnRefreshListener { + binding.groupDeviceLayout.setOnRefreshListener { isRefresh = true //刷新之后页码重置 pageIndex = 1 obtainDeviceListByPage() } - groupDeviceLayout.setOnLoadMoreListener { + binding.groupDeviceLayout.setOnLoadMoreListener { isLoadMore = true pageIndex++ obtainDeviceListByPage() @@ -176,7 +168,7 @@ isRefresh -> { dataBeans.clear() dataBeans = dataRows!! - groupDeviceLayout.finishRefresh() + binding.groupDeviceLayout.finishRefresh() isRefresh = false } @@ -185,7 +177,7 @@ "到底了,别拉了".show(this) } dataBeans.addAll(dataRows!!) - groupDeviceLayout.finishLoadMore() + binding.groupDeviceLayout.finishLoadMore() isLoadMore = false } @@ -211,7 +203,7 @@ ) } if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { pageIndex = 1 obtainDeviceListByPage() } @@ -230,15 +222,15 @@ deviceAdapter.notifyDataSetChanged() } else { if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("这里什么都没有") { + binding.emptyInclude.emptyView.showEmptyPage("这里什么都没有") { pageIndex = 1 obtainDeviceListByPage() } } else { - emptyView!!.hide() + binding.emptyInclude.emptyView.hide() deviceAdapter = DeviceListAdapter(this, dataBeans) //绑定侧滑事件 - swipeAction.attachToRecyclerView(groupDeviceView) + swipeAction.attachToRecyclerView(binding.groupDeviceView) val linearLayoutManager = object : LinearLayoutManager(this) { override fun generateDefaultLayoutParams(): RecyclerView.LayoutParams { return RecyclerView.LayoutParams( @@ -247,8 +239,8 @@ ) } } - groupDeviceView.layoutManager = linearLayoutManager - groupDeviceView.adapter = deviceAdapter + binding.groupDeviceView.layoutManager = linearLayoutManager + binding.groupDeviceView.adapter = deviceAdapter deviceAdapter.setOnItemClickListener(object : DeviceListAdapter.OnItemClickListener { override fun onClicked(position: Int) { @@ -311,13 +303,9 @@ }) private fun deleteItem(adapterPosition: Int) { - AlertControlDialog.Builder() - .setContext(this) - .setTitle("提示") - .setMessage("删除后将无法恢复,是否继续?") - .setNegativeButton("容我想想") - .setPositiveButton("已经想好") - .setOnDialogButtonClickListener(object : + AlertControlDialog.Builder().setContext(this).setTitle("提示") + .setMessage("删除后将无法恢复,是否继续?").setNegativeButton("容我想想") + .setPositiveButton("已经想好").setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onCancelClick() { diff --git a/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt b/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt index 71f438c..70e49f0 100644 --- a/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/HistoryDataActivity.kt @@ -1,9 +1,11 @@ package com.casic.smarttube.view +import android.os.Bundle import android.view.View import android.widget.AdapterView import androidx.lifecycle.ViewModelProvider import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityHistoryDataBinding import com.casic.smarttube.extensions.dateToMonthDay import com.casic.smarttube.extensions.getQuarterOfYear import com.casic.smarttube.utils.ChartViewHelper @@ -22,27 +24,26 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState -import kotlinx.android.synthetic.main.activity_history_data.dataLineChart -import kotlinx.android.synthetic.main.activity_history_data.leftBackView -import kotlinx.android.synthetic.main.activity_history_data.periodSpinner import java.util.Calendar -class HistoryDataActivity : KotlinBaseActivity() { +class HistoryDataActivity : KotlinBaseActivity() { private val kTag = "HistoryDataActivity" private lateinit var deviceViewModel: DeviceViewModel private lateinit var groupId: String private lateinit var devCode: String - override fun initLayoutView(): Int = R.layout.activity_history_data + override fun initViewBinding(): ActivityHistoryDataBinding { + return ActivityHistoryDataBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - leftBackView.setOnClickListener { finish() } + binding.leftBackView.setOnClickListener { finish() } } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { val params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! groupId = params[0] devCode = params[1] @@ -61,8 +62,8 @@ override fun initEvent() { //默认选择近7天的数据 - periodSpinner.setSelection(3) - periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + binding.periodSpinner.setSelection(3) + binding.periodSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onItemSelected( parent: AdapterView<*>?, view: View?, position: Int, id: Long ) { @@ -76,6 +77,7 @@ groupId, devCode, "$year-01-01", time.timestampToCompleteDate() ) } + 1 -> { //本季度 val startDate = when (time.getQuarterOfYear()) { @@ -89,6 +91,7 @@ groupId, devCode, startDate, time.timestampToCompleteDate() ) } + 2 -> { //近30日 deviceViewModel.obtainDeviceHistoryData( @@ -98,6 +101,7 @@ time.timestampToCompleteDate() ) } + 3 -> { //近7日 deviceViewModel.obtainDeviceHistoryData( @@ -107,19 +111,18 @@ time.timestampToCompleteDate() ) } + 4 -> { //今日 deviceViewModel.obtainDeviceHistoryData( groupId, devCode, time.timestampToDate(), time.timestampToCompleteDate() ) } + 5 -> { - DateSelectDialog.Builder() - .setContext(this@HistoryDataActivity) - .setTitle("选择日期") - .setNegativeButton("取消") - .setPositiveButton("选好了") - .setOnDialogButtonClickListener(object : + DateSelectDialog.Builder().setContext(this@HistoryDataActivity) + .setTitle("选择日期").setNegativeButton("取消") + .setPositiveButton("选好了").setOnDialogButtonClickListener(object : DateSelectDialog.OnDialogButtonClickListener { override fun onConfirmClick(startDate: String, endDate: String) { deviceViewModel.obtainDeviceHistoryData( @@ -129,12 +132,10 @@ override fun onCancelClick() { //选择取消就默认加载近7天的数据 - periodSpinner.setSelection(3) + binding.periodSpinner.setSelection(3) } - }) - .setFragmentManager(supportFragmentManager) - .setCalendarType(Type.YEAR_MONTH_DAY) - .build().show() + }).setFragmentManager(supportFragmentManager) + .setCalendarType(Type.YEAR_MONTH_DAY).build().show() } } } @@ -159,7 +160,9 @@ Entry(i.toFloat(), rowsBean.stregnth!!.toFloat(), "浓度") ) } - ChartViewHelper.setLineChartData(dataLineChart, xAxisLabels, strengthEntries) + ChartViewHelper.setLineChartData( + binding.dataLineChart, xAxisLabels, strengthEntries + ) } } } diff --git a/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt b/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt index ebca433..f947b2c 100644 --- a/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/LoginActivity.kt @@ -1,7 +1,8 @@ package com.casic.smarttube.view +import android.os.Bundle import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityLoginBinding import com.casic.smarttube.utils.AuthenticationHelper import com.casic.smarttube.utils.LoadingDialogHub import com.casic.smarttube.utils.LocaleConstant @@ -14,26 +15,29 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues -import kotlinx.android.synthetic.main.activity_login.loginButton -import kotlinx.android.synthetic.main.activity_login.userNameView -import kotlinx.android.synthetic.main.activity_login.userPasswordView -class LoginActivity : KotlinBaseActivity() { +class LoginActivity : KotlinBaseActivity() { private lateinit var authenticateViewModel: AuthenticateViewModel private lateinit var loginViewModel: LoginViewModel private lateinit var userViewModel: UserViewModel - override fun initLayoutView(): Int = R.layout.activity_login + override fun initViewBinding(): ActivityLoginBinding { + return ActivityLoginBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(true).init() } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { // 设置默认账号密码 - userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) - userPasswordView.setText(SaveKeyValues.getValue(LocaleConstant.PASSWORD, "") as String) + binding.userNameView.setText(SaveKeyValues.getValue(LocaleConstant.ACCOUNT, "") as String) + binding.userPasswordView.setText( + SaveKeyValues.getValue( + LocaleConstant.PASSWORD, "" + ) as String + ) authenticateViewModel = ViewModelProvider(this)[AuthenticateViewModel::class.java] loginViewModel = ViewModelProvider(this)[LoginViewModel::class.java] userViewModel = ViewModelProvider(this)[UserViewModel::class.java] @@ -50,9 +54,9 @@ } override fun initEvent() { - loginButton.setOnClickListener { - val account = userNameView.text.toString().trim() - val userPassword = userPasswordView.text.toString().trim() + binding.loginButton.setOnClickListener { + val account = binding.userNameView.text.toString().trim() + val userPassword = binding.userPasswordView.text.toString().trim() if (account.isBlank()) { "用户名不能为空".show(this) return@setOnClickListener @@ -74,8 +78,8 @@ AuthenticationHelper.savePublicKey(keyString) val publicKey = RSAUtils.keyStrToPublicKey(keyString) - val account = userNameView.text.toString() - val userPassword = userPasswordView.text.toString() + val account = binding.userNameView.text.toString() + val userPassword = binding.userPasswordView.text.toString() val dataByPublicKey = RSAUtils.encryptDataByPublicKey(userPassword.toByteArray(), publicKey!!) //登录并获取Token,POST请求 diff --git a/app/src/main/java/com/casic/smarttube/view/MainActivity.kt b/app/src/main/java/com/casic/smarttube/view/MainActivity.kt index 4461757..575e1ee 100644 --- a/app/src/main/java/com/casic/smarttube/view/MainActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/MainActivity.kt @@ -1,5 +1,6 @@ package com.casic.smarttube.view +import android.os.Bundle import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment @@ -7,6 +8,7 @@ import androidx.fragment.app.FragmentPagerAdapter import androidx.viewpager.widget.ViewPager import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityMainBinding import com.casic.smarttube.fragment.HomePageFragment import com.casic.smarttube.fragment.MinePageFragment import com.casic.smarttube.fragment.OverviewFragment @@ -15,9 +17,8 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_main.* -class MainActivity : KotlinBaseActivity() { +class MainActivity : KotlinBaseActivity() { private var menuItem: MenuItem? = null private var fragmentList: MutableList = ArrayList() @@ -29,32 +30,36 @@ fragmentList.add(MinePageFragment()) } - override fun initLayoutView(): Int = R.layout.activity_main + override fun initViewBinding(): ActivityMainBinding { + return ActivityMainBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { //保留icon原图颜色 - bottomNavigation.itemIconTintList = null - bottomNavigation.setOnItemSelectedListener { menuItem -> + binding.bottomNavigation.itemIconTintList = null + binding.bottomNavigation.setOnItemSelectedListener { menuItem -> when (menuItem.itemId) { R.id.nav_home -> { - mainViewPager.currentItem = 0 + binding.mainViewPager.currentItem = 0 } + R.id.nav_overview -> { - mainViewPager.currentItem = 1 + binding.mainViewPager.currentItem = 1 } + R.id.nav_mine -> { - mainViewPager.currentItem = 2 + binding.mainViewPager.currentItem = 2 } } false } - mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) - mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 + binding.mainViewPager.adapter = ViewPagerAdapter(fragmentList, supportFragmentManager) + binding.mainViewPager.offscreenPageLimit = fragmentList.size //缓存页数 } override fun observeRequestState() { @@ -62,7 +67,7 @@ } override fun initEvent() { - mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + binding.mainViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrollStateChanged(state: Int) { } @@ -77,9 +82,9 @@ if (menuItem != null) { menuItem!!.isChecked = false } else { - bottomNavigation.menu.getItem(0).isChecked = false + binding.bottomNavigation.menu.getItem(0).isChecked = false } - menuItem = bottomNavigation.menu.getItem(position) + menuItem = binding.bottomNavigation.menu.getItem(position) menuItem!!.isChecked = true } }) diff --git a/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt b/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt index f00e0ca..908aade 100644 --- a/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/MapDeviceBriefActivity.kt @@ -15,6 +15,7 @@ import com.amap.api.services.geocoder.RegeocodeQuery import com.amap.api.services.geocoder.RegeocodeResult import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivityMapDeviceBriefBinding import com.casic.smarttube.utils.LoadingDialogHub import com.casic.smarttube.utils.RouteOnMap import com.casic.smarttube.vm.DeviceViewModel @@ -24,16 +25,8 @@ import com.pengxh.kt.lite.utils.Constant import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil import com.pengxh.kt.lite.vm.LoadState -import kotlinx.android.synthetic.main.activity_map_device_brief.deviceCodeView -import kotlinx.android.synthetic.main.activity_map_device_brief.deviceModelView -import kotlinx.android.synthetic.main.activity_map_device_brief.deviceValueView -import kotlinx.android.synthetic.main.activity_map_device_brief.locationView -import kotlinx.android.synthetic.main.activity_map_device_brief.mapView -import kotlinx.android.synthetic.main.activity_map_device_brief.updateTimeView -import kotlinx.android.synthetic.main.include_base_title.leftBackView -import kotlinx.android.synthetic.main.include_base_title.titleView -class MapDeviceBriefActivity : KotlinBaseActivity() { +class MapDeviceBriefActivity : KotlinBaseActivity() { private val kTag = "MapDeviceBriefActivity" private lateinit var deviceViewModel: DeviceViewModel @@ -42,17 +35,19 @@ private val geocoderSearch by lazy { GeocodeSearch(this) } - override fun initLayoutView(): Int = R.layout.activity_map_device_brief + override fun initViewBinding(): ActivityMapDeviceBriefBinding { + return ActivityMapDeviceBriefBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "设备最新数据地图展示" - leftBackView.setOnClickListener { finish() } + binding.titleInclude.titleView.text = "设备最新数据地图展示" + binding.titleInclude.leftBackView.setOnClickListener { finish() } } - override fun initData() { - aMap = mapView.map + override fun initOnCreate(savedInstanceState: Bundle?) { + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val uiSettings = aMap.uiSettings uiSettings.isCompassEnabled = true @@ -80,22 +75,22 @@ if (it.code == 200) { val device = it.data - deviceCodeView.text = String.format("设备编号: ${device.devcode}") - deviceModelView.text = String.format("设备模型: ${params[2]}") + binding.deviceCodeView.text = String.format("设备编号: ${device.devcode}") + binding.deviceModelView.text = String.format("设备模型: ${params[2]}") //获取设备最新浓度信息 deviceViewModel.obtainTubeLastData(device.groupId, device.devcode) deviceViewModel.lastDataModel.observe(this) { v -> if (v.code == 200) { - deviceValueView.text = String.format("最新浓度: ${v.data.strength}") - updateTimeView.text = String.format("更新时间: ${v.data.uptime}") + binding.deviceValueView.text = String.format("最新浓度: ${v.data.strength}") + binding.updateTimeView.text = String.format("更新时间: ${v.data.uptime}") } else { - deviceValueView.text = String.format("最新浓度: 未知") - updateTimeView.text = String.format("更新时间: 未知") + binding.deviceValueView.text = String.format("最新浓度: 未知") + binding.updateTimeView.text = String.format("更新时间: 未知") } } if (device.latGaode.isBlank() || device.lngGaode.isBlank()) { - locationView.text = "经纬度异常,无法查看具体位置" + binding.locationView.text = "经纬度异常,无法查看具体位置" } else { val queryParam = RegeocodeQuery( LatLonPoint(device.latGaode.toDouble(), device.lngGaode.toDouble()), @@ -108,7 +103,7 @@ GeocodeSearch.OnGeocodeSearchListener { override fun onRegeocodeSearched(result: RegeocodeResult?, rCode: Int) { if (rCode == 1000) { - locationView.text = + binding.locationView.text = String.format("详细位置: ${result?.regeocodeAddress?.formatAddress}") } } @@ -123,8 +118,7 @@ aMap.animateCamera(newCameraPosition, 1500, object : AMap.CancelableCallback { override fun onFinish() { //添加Marker - val markerOptions = MarkerOptions() - .position(latLng) + val markerOptions = MarkerOptions().position(latLng) .icon(BitmapDescriptorFactory.fromResource(R.mipmap.well_location)) .draggable(false) aMap.addMarker(markerOptions) @@ -148,26 +142,26 @@ /**地图相关*********/ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - mapView.onCreate(savedInstanceState) + binding.mapView.onCreate(savedInstanceState) } override fun onResume() { super.onResume() - mapView.onResume() + binding.mapView.onResume() } override fun onPause() { super.onPause() - mapView.onPause() + binding.mapView.onPause() } override fun onDestroy() { - mapView.onDestroy() + binding.mapView.onDestroy() super.onDestroy() } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - mapView.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/view/PermissionActivity.kt b/app/src/main/java/com/casic/smarttube/view/PermissionActivity.kt index e872ef4..fc20978 100644 --- a/app/src/main/java/com/casic/smarttube/view/PermissionActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/PermissionActivity.kt @@ -13,7 +13,6 @@ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - //判断是否有权限,如果版本大于5.1才需要判断(即6.0以上),其他则不需要判断。 if (EasyPermissions.hasPermissions(this, *LocaleConstant.USER_PERMISSIONS)) { startSplashScreenActivity() } else { diff --git a/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt b/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt index c639105..bb0b0ed 100644 --- a/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/SelectLocationActivity.kt @@ -13,33 +13,35 @@ import com.amap.api.maps.model.LatLng import com.amap.api.maps.model.MyLocationStyle import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivitySelectLocationBinding import com.casic.smarttube.utils.CenterMarkerView import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil -import kotlinx.android.synthetic.main.activity_select_location.* -class SelectLocationActivity : KotlinBaseActivity(), AMap.OnMyLocationChangeListener, - OnMapLoadedListener, OnCameraChangeListener { +class SelectLocationActivity : KotlinBaseActivity(), + AMap.OnMyLocationChangeListener, OnMapLoadedListener, OnCameraChangeListener { private val kTag = "SelectLocationActivity" private lateinit var latLng: LatLng private lateinit var aMap: AMap private lateinit var centerMarkerView: CenterMarkerView - override fun initLayoutView(): Int = R.layout.activity_select_location + override fun initViewBinding(): ActivitySelectLocationBinding { + return ActivitySelectLocationBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) - titleView.text = "手动选点" - leftBackView.setOnClickListener { finish() } + binding.titleView.text = "手动选点" + binding.leftBackView.setOnClickListener { finish() } } - override fun initData() { - aMap = mapView.map + override fun initOnCreate(savedInstanceState: Bundle?) { + aMap = binding.mapView.map aMap.mapType = AMap.MAP_TYPE_NORMAL val locationStyle = MyLocationStyle() //定位一次,且将视角移动到地图中心点 @@ -76,7 +78,7 @@ aMap.setOnMapLoadedListener(this) aMap.setOnCameraChangeListener(this) - rightOperateView.setOnClickListener { + binding.rightOperateView.setOnClickListener { val intent = Intent() intent.putExtra("longitude", latLng.longitude.toString()) intent.putExtra("latitude", latLng.latitude.toString()) @@ -110,27 +112,27 @@ /**地图相关*********/ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - mapView.onCreate(savedInstanceState) + binding.mapView.onCreate(savedInstanceState) } override fun onResume() { super.onResume() - mapView.onResume() + binding.mapView.onResume() } override fun onPause() { super.onPause() - mapView.onPause() + binding.mapView.onPause() } override fun onDestroy() { centerMarkerView.destroy() - mapView.onDestroy() + binding.mapView.onDestroy() super.onDestroy() } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) - mapView.onSaveInstanceState(outState) + binding.mapView.onSaveInstanceState(outState) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/smarttube/view/SplashScreenActivity.kt b/app/src/main/java/com/casic/smarttube/view/SplashScreenActivity.kt index dafbe4d..baf5222 100644 --- a/app/src/main/java/com/casic/smarttube/view/SplashScreenActivity.kt +++ b/app/src/main/java/com/casic/smarttube/view/SplashScreenActivity.kt @@ -1,16 +1,17 @@ package com.casic.smarttube.view import android.annotation.SuppressLint +import android.os.Bundle import android.os.CountDownTimer import androidx.lifecycle.ViewModelProvider -import com.casic.smarttube.R +import com.casic.smarttube.databinding.ActivitySplashBinding import com.casic.smarttube.vm.UserViewModel import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.navigatePageTo @SuppressLint("CustomSplashScreen") -class SplashScreenActivity : KotlinBaseActivity() { +class SplashScreenActivity : KotlinBaseActivity() { private lateinit var userDetailViewModel: UserViewModel private val countDownTimer = object : CountDownTimer(1000, 500) { @@ -34,13 +35,15 @@ } } - override fun initLayoutView(): Int = R.layout.activity_splash + override fun initViewBinding(): ActivitySplashBinding { + return ActivitySplashBinding.inflate(layoutInflater) + } override fun setupTopBarLayout() { ImmersionBar.with(this).statusBarDarkFont(false).init() } - override fun initData() { + override fun initOnCreate(savedInstanceState: Bundle?) { userDetailViewModel = ViewModelProvider(this).get(UserViewModel::class.java) } diff --git a/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt b/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt index 23d1ac1..ae7df77 100644 --- a/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt +++ b/app/src/main/java/com/casic/smarttube/widgets/DateSelectDialog.kt @@ -6,14 +6,19 @@ import android.view.Gravity import androidx.fragment.app.FragmentManager import com.casic.smarttube.R +import com.casic.smarttube.databinding.DialogSelectDateBinding import com.casic.smarttube.utils.LocaleConstant import com.jzxiang.pickerview.TimePickerDialog import com.jzxiang.pickerview.data.Type -import com.pengxh.kt.lite.extensions.* -import kotlinx.android.synthetic.main.dialog_select_date.* +import com.pengxh.kt.lite.extensions.binding +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.resetParams +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.timestampToCompleteDate +import com.pengxh.kt.lite.extensions.timestampToTime import java.text.ParseException import java.text.SimpleDateFormat -import java.util.* +import java.util.Locale class DateSelectDialog private constructor(builder: Builder) : Dialog( builder.context, R.style.UserDefinedDialogStyle @@ -76,6 +81,8 @@ } } + private val binding: DialogSelectDateBinding by binding() + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) this.resetParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.85) @@ -84,10 +91,10 @@ setCanceledOnTouchOutside(false) if (title.isNotBlank()) { - dialogTitleView.text = title + binding.dialogTitleView.text = title } - startDateView.setOnClickListener { + binding.startDateView.setOnClickListener { TimePickerDialog.Builder() .setThemeColor(R.color.mainThemeColor.convertColor(ctx)) .setTitleStringId("请选择起始时间") @@ -102,11 +109,11 @@ } else { millSeconds.timestampToCompleteDate() } - startDateView.setText(textValue) + binding.startDateView.setText(textValue) }.build().show(fragmentManager, "DateSelectDialog") } - endDateView.setOnClickListener { + binding.endDateView.setOnClickListener { TimePickerDialog.Builder() .setThemeColor(R.color.mainThemeColor.convertColor(ctx)) .setTitleStringId("请选择起始时间") @@ -121,21 +128,21 @@ } else { millSeconds.timestampToCompleteDate() } - endDateView.setText(textValue) + binding.endDateView.setText(textValue) }.build().show(fragmentManager, "DateSelectDialog") } - dialogCancelButton.text = negativeBtn - dialogCancelButton.setOnClickListener { + binding.dialogCancelButton.text = negativeBtn + binding.dialogCancelButton.setOnClickListener { listener.onCancelClick() this.dismiss() } - dialogConfirmButton.text = positiveBtn - dialogConfirmButton.setOnClickListener { + binding.dialogConfirmButton.text = positiveBtn + binding.dialogConfirmButton.setOnClickListener { //判断其实时间和结束时间 - val startDate = startDateView.text.toString() - val endDate = endDateView.text.toString() + val startDate = binding.startDateView.text.toString() + val endDate = binding.endDateView.text.toString() if (isEarlierThanStart(startDate, endDate)) { "结束时间不能早于开始时间".show(ctx) return@setOnClickListener diff --git a/app/src/main/java/com/casic/smarttube/widgets/MultiSelectDialog.kt b/app/src/main/java/com/casic/smarttube/widgets/MultiSelectDialog.kt index 7e3a63e..cb9316d 100644 --- a/app/src/main/java/com/casic/smarttube/widgets/MultiSelectDialog.kt +++ b/app/src/main/java/com/casic/smarttube/widgets/MultiSelectDialog.kt @@ -8,9 +8,10 @@ import androidx.recyclerview.widget.RecyclerView import com.casic.smarttube.R import com.casic.smarttube.adapter.DialogDeviceListAdapter +import com.casic.smarttube.databinding.DialogMultiSelectBinding import com.casic.smarttube.model.DeviceListModel +import com.pengxh.kt.lite.extensions.binding import com.pengxh.kt.lite.extensions.resetParams -import kotlinx.android.synthetic.main.dialog_multi_select.* class MultiSelectDialog private constructor(builder: Builder) : Dialog( builder.activity, R.style.UserDefinedDialogStyle @@ -67,6 +68,8 @@ } } + private val binding: DialogMultiSelectBinding by binding() + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) this.resetParams(Gravity.CENTER, R.style.UserDefinedAnimation, 0.85) @@ -75,21 +78,25 @@ setCanceledOnTouchOutside(false) if (title.isNotBlank()) { - dialogTitleView.text = title + binding.dialogTitleView.text = title } val dialogDeviceListAdapter = DialogDeviceListAdapter(act, dataModels) - dataRecyclerView.addItemDecoration(DividerItemDecoration(act, RecyclerView.VERTICAL)) - dataRecyclerView.adapter = dialogDeviceListAdapter + binding.dataRecyclerView.addItemDecoration( + DividerItemDecoration( + act, RecyclerView.VERTICAL + ) + ) + binding.dataRecyclerView.adapter = dialogDeviceListAdapter - dialogCancelButton.text = negativeBtn - dialogCancelButton.setOnClickListener { + binding.dialogCancelButton.text = negativeBtn + binding.dialogCancelButton.setOnClickListener { listener.onCancelClick() this.dismiss() } - dialogConfirmButton.text = positiveBtn - dialogConfirmButton.setOnClickListener { + binding.dialogConfirmButton.text = positiveBtn + binding.dialogConfirmButton.setOnClickListener { // 处理数据 listener.onConfirmClick(dialogDeviceListAdapter.selectedModels) this.dismiss() diff --git a/app/src/main/res/layout/activity_about_us.xml b/app/src/main/res/layout/activity_about_us.xml index c67a714..69dc539 100644 --- a/app/src/main/res/layout/activity_about_us.xml +++ b/app/src/main/res/layout/activity_about_us.xml @@ -7,7 +7,9 @@ android:orientation="vertical" tools:context=".view.AboutUsActivity"> - + - + - + - + - +