diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7949d16..6a3f570 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,10 @@ + + + + @@ -48,6 +52,7 @@ android:theme="@style/Theme.BigImageActivity" /> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7949d16..6a3f570 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,10 @@ + + + + @@ -48,6 +52,7 @@ android:theme="@style/Theme.BigImageActivity" /> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt new file mode 100644 index 0000000..b6b5281 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt @@ -0,0 +1,31 @@ +package com.casic.birmm.inspect.utils + +import android.bluetooth.BluetoothAdapter +import android.bluetooth.BluetoothDevice +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import com.casic.birmm.inspect.view.MapActivity + +class BluetoothStateBroadcastReceiver : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + when (intent?.action) { + BluetoothAdapter.ACTION_STATE_CHANGED -> { + when (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0)) { + BluetoothAdapter.STATE_OFF -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_OFF) + } + BluetoothAdapter.STATE_ON -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_ON) + } + } + } + BluetoothDevice.ACTION_ACL_CONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_CONNECTED) + } + BluetoothDevice.ACTION_ACL_DISCONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_DISCONNECTED) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7949d16..6a3f570 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,10 @@ + + + + @@ -48,6 +52,7 @@ android:theme="@style/Theme.BigImageActivity" /> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt new file mode 100644 index 0000000..b6b5281 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt @@ -0,0 +1,31 @@ +package com.casic.birmm.inspect.utils + +import android.bluetooth.BluetoothAdapter +import android.bluetooth.BluetoothDevice +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import com.casic.birmm.inspect.view.MapActivity + +class BluetoothStateBroadcastReceiver : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + when (intent?.action) { + BluetoothAdapter.ACTION_STATE_CHANGED -> { + when (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0)) { + BluetoothAdapter.STATE_OFF -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_OFF) + } + BluetoothAdapter.STATE_ON -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_ON) + } + } + } + BluetoothDevice.ACTION_ACL_CONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_CONNECTED) + } + BluetoothDevice.ACTION_ACL_DISCONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_DISCONNECTED) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 0ae38db..aef675a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -13,6 +13,10 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 15 + const val BLUETOOTH_ON = 20 + const val BLUETOOTH_OFF = 21 + const val DEVICE_CONNECTED = 22 + const val DEVICE_DISCONNECTED = 23 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7949d16..6a3f570 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,10 @@ + + + + @@ -48,6 +52,7 @@ android:theme="@style/Theme.BigImageActivity" /> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt new file mode 100644 index 0000000..b6b5281 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt @@ -0,0 +1,31 @@ +package com.casic.birmm.inspect.utils + +import android.bluetooth.BluetoothAdapter +import android.bluetooth.BluetoothDevice +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import com.casic.birmm.inspect.view.MapActivity + +class BluetoothStateBroadcastReceiver : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + when (intent?.action) { + BluetoothAdapter.ACTION_STATE_CHANGED -> { + when (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0)) { + BluetoothAdapter.STATE_OFF -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_OFF) + } + BluetoothAdapter.STATE_ON -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_ON) + } + } + } + BluetoothDevice.ACTION_ACL_CONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_CONNECTED) + } + BluetoothDevice.ACTION_ACL_DISCONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_DISCONNECTED) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 0ae38db..aef675a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -13,6 +13,10 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 15 + const val BLUETOOTH_ON = 20 + const val BLUETOOTH_OFF = 21 + const val DEVICE_CONNECTED = 22 + const val DEVICE_DISCONNECTED = 23 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt index 94d269e..c3b1e6b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -59,6 +59,7 @@ aMap = mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //根据id查询详情 id = intent.getStringExtra("id")!! @@ -120,6 +121,7 @@ } fun initEvent() { + leftBackView.setOnClickListener { this.finish() } eventButton.setChangeAlphaWhenPress(true) eventButton.setOnClickListener { val intent = Intent(this, EventListActivity::class.java) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7949d16..6a3f570 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,10 @@ + + + + @@ -48,6 +52,7 @@ android:theme="@style/Theme.BigImageActivity" /> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt new file mode 100644 index 0000000..b6b5281 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt @@ -0,0 +1,31 @@ +package com.casic.birmm.inspect.utils + +import android.bluetooth.BluetoothAdapter +import android.bluetooth.BluetoothDevice +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import com.casic.birmm.inspect.view.MapActivity + +class BluetoothStateBroadcastReceiver : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + when (intent?.action) { + BluetoothAdapter.ACTION_STATE_CHANGED -> { + when (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0)) { + BluetoothAdapter.STATE_OFF -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_OFF) + } + BluetoothAdapter.STATE_ON -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_ON) + } + } + } + BluetoothDevice.ACTION_ACL_CONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_CONNECTED) + } + BluetoothDevice.ACTION_ACL_DISCONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_DISCONNECTED) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 0ae38db..aef675a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -13,6 +13,10 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 15 + const val BLUETOOTH_ON = 20 + const val BLUETOOTH_OFF = 21 + const val DEVICE_CONNECTED = 22 + const val DEVICE_DISCONNECTED = 23 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt index 94d269e..c3b1e6b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -59,6 +59,7 @@ aMap = mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //根据id查询详情 id = intent.getStringExtra("id")!! @@ -120,6 +121,7 @@ } fun initEvent() { + leftBackView.setOnClickListener { this.finish() } eventButton.setChangeAlphaWhenPress(true) eventButton.setOnClickListener { val intent = Intent(this, EventListActivity::class.java) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 8ed4a0c..da4b03e 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -168,6 +168,5 @@ } } } - } } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7949d16..6a3f570 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,10 @@ + + + + @@ -48,6 +52,7 @@ android:theme="@style/Theme.BigImageActivity" /> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt new file mode 100644 index 0000000..b6b5281 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt @@ -0,0 +1,31 @@ +package com.casic.birmm.inspect.utils + +import android.bluetooth.BluetoothAdapter +import android.bluetooth.BluetoothDevice +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import com.casic.birmm.inspect.view.MapActivity + +class BluetoothStateBroadcastReceiver : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + when (intent?.action) { + BluetoothAdapter.ACTION_STATE_CHANGED -> { + when (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0)) { + BluetoothAdapter.STATE_OFF -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_OFF) + } + BluetoothAdapter.STATE_ON -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_ON) + } + } + } + BluetoothDevice.ACTION_ACL_CONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_CONNECTED) + } + BluetoothDevice.ACTION_ACL_DISCONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_DISCONNECTED) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 0ae38db..aef675a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -13,6 +13,10 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 15 + const val BLUETOOTH_ON = 20 + const val BLUETOOTH_OFF = 21 + const val DEVICE_CONNECTED = 22 + const val DEVICE_DISCONNECTED = 23 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt index 94d269e..c3b1e6b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -59,6 +59,7 @@ aMap = mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //根据id查询详情 id = intent.getStringExtra("id")!! @@ -120,6 +121,7 @@ } fun initEvent() { + leftBackView.setOnClickListener { this.finish() } eventButton.setChangeAlphaWhenPress(true) eventButton.setOnClickListener { val intent = Intent(this, EventListActivity::class.java) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 8ed4a0c..da4b03e 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -168,6 +168,5 @@ } } } - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 517203f..dddea49 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -132,9 +132,13 @@ .setNegativeButton("取消") .setPositiveButton("保存") .setOnDialogClickListener(object : InputDialog.OnDialogButtonClickListener { - override fun onButtonClick(input: String) { + override fun onConfirmClick(input: String) { SaveKeyValues.putValue(Constant.DEFAULT_SERVER_CONFIG, input) } + + override fun onCancelClick() { + + } }) .build().show() } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7949d16..6a3f570 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,10 @@ + + + + @@ -48,6 +52,7 @@ android:theme="@style/Theme.BigImageActivity" /> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt new file mode 100644 index 0000000..b6b5281 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt @@ -0,0 +1,31 @@ +package com.casic.birmm.inspect.utils + +import android.bluetooth.BluetoothAdapter +import android.bluetooth.BluetoothDevice +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import com.casic.birmm.inspect.view.MapActivity + +class BluetoothStateBroadcastReceiver : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + when (intent?.action) { + BluetoothAdapter.ACTION_STATE_CHANGED -> { + when (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0)) { + BluetoothAdapter.STATE_OFF -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_OFF) + } + BluetoothAdapter.STATE_ON -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_ON) + } + } + } + BluetoothDevice.ACTION_ACL_CONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_CONNECTED) + } + BluetoothDevice.ACTION_ACL_DISCONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_DISCONNECTED) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 0ae38db..aef675a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -13,6 +13,10 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 15 + const val BLUETOOTH_ON = 20 + const val BLUETOOTH_OFF = 21 + const val DEVICE_CONNECTED = 22 + const val DEVICE_DISCONNECTED = 23 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt index 94d269e..c3b1e6b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -59,6 +59,7 @@ aMap = mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //根据id查询详情 id = intent.getStringExtra("id")!! @@ -120,6 +121,7 @@ } fun initEvent() { + leftBackView.setOnClickListener { this.finish() } eventButton.setChangeAlphaWhenPress(true) eventButton.setOnClickListener { val intent = Intent(this, EventListActivity::class.java) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 8ed4a0c..da4b03e 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -168,6 +168,5 @@ } } } - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 517203f..dddea49 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -132,9 +132,13 @@ .setNegativeButton("取消") .setPositiveButton("保存") .setOnDialogClickListener(object : InputDialog.OnDialogButtonClickListener { - override fun onButtonClick(input: String) { + override fun onConfirmClick(input: String) { SaveKeyValues.putValue(Constant.DEFAULT_SERVER_CONFIG, input) } + + override fun onCancelClick() { + + } }) .build().show() } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 4ef86d3..2db634f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -15,9 +15,9 @@ import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.utils.StatusBarColorUtil import com.casic.birmm.inspect.vm.UserViewModel +import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* @@ -25,6 +25,7 @@ class MainActivity : BaseActivity() { private var clickTime: Long = 0 + private val itemList: List = arrayListOf("巡检记录", "事件记录") override fun initLayoutView(): Int = R.layout.activity_main @@ -53,26 +54,37 @@ override fun initEvent() { //新建巡检 createIssueLayout.setOnClickListener { - + startActivity(Intent(this, MapActivity::class.java)) } //记录查询 logSearchLayout.setOnClickListener { - QMUIBottomSheet.BottomListSheetBuilder(this) + SingleChoiceDialog.Builder() + .setContext(this) .setTitle("选择记录类型") - .addItem("巡检记录") - .addItem("事件记录") - .setGravityCenter(true) - .setOnSheetItemClickListener { dialog, _, position, _ -> - dialog?.dismiss() - when (position) { - 0 -> { - startActivity(Intent(this, InspectionQueryActivity::class.java)) - } - 1 -> { - startActivity(Intent(this, EventQueryActivity::class.java)) + .setChoiceItemButton(itemList) + .setOnDialogClickListener(object : SingleChoiceDialog.OnDialogItemClickListener { + override fun onItemClick(position: Int) { + when (position) { + 0 -> { + startActivity( + Intent( + this@MainActivity, + InspectionQueryActivity::class.java + ) + ) + } + 1 -> { + startActivity( + Intent( + this@MainActivity, + EventQueryActivity::class.java + ) + ) + } } } - }.build().show() + }) + .build().show() } //系统设置 settingsLayout.setOnClickListener { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7949d16..6a3f570 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,10 @@ + + + + @@ -48,6 +52,7 @@ android:theme="@style/Theme.BigImageActivity" /> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt new file mode 100644 index 0000000..b6b5281 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt @@ -0,0 +1,31 @@ +package com.casic.birmm.inspect.utils + +import android.bluetooth.BluetoothAdapter +import android.bluetooth.BluetoothDevice +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import com.casic.birmm.inspect.view.MapActivity + +class BluetoothStateBroadcastReceiver : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + when (intent?.action) { + BluetoothAdapter.ACTION_STATE_CHANGED -> { + when (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0)) { + BluetoothAdapter.STATE_OFF -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_OFF) + } + BluetoothAdapter.STATE_ON -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_ON) + } + } + } + BluetoothDevice.ACTION_ACL_CONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_CONNECTED) + } + BluetoothDevice.ACTION_ACL_DISCONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_DISCONNECTED) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 0ae38db..aef675a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -13,6 +13,10 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 15 + const val BLUETOOTH_ON = 20 + const val BLUETOOTH_OFF = 21 + const val DEVICE_CONNECTED = 22 + const val DEVICE_DISCONNECTED = 23 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt index 94d269e..c3b1e6b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -59,6 +59,7 @@ aMap = mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //根据id查询详情 id = intent.getStringExtra("id")!! @@ -120,6 +121,7 @@ } fun initEvent() { + leftBackView.setOnClickListener { this.finish() } eventButton.setChangeAlphaWhenPress(true) eventButton.setOnClickListener { val intent = Intent(this, EventListActivity::class.java) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 8ed4a0c..da4b03e 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -168,6 +168,5 @@ } } } - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 517203f..dddea49 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -132,9 +132,13 @@ .setNegativeButton("取消") .setPositiveButton("保存") .setOnDialogClickListener(object : InputDialog.OnDialogButtonClickListener { - override fun onButtonClick(input: String) { + override fun onConfirmClick(input: String) { SaveKeyValues.putValue(Constant.DEFAULT_SERVER_CONFIG, input) } + + override fun onCancelClick() { + + } }) .build().show() } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 4ef86d3..2db634f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -15,9 +15,9 @@ import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.utils.StatusBarColorUtil import com.casic.birmm.inspect.vm.UserViewModel +import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* @@ -25,6 +25,7 @@ class MainActivity : BaseActivity() { private var clickTime: Long = 0 + private val itemList: List = arrayListOf("巡检记录", "事件记录") override fun initLayoutView(): Int = R.layout.activity_main @@ -53,26 +54,37 @@ override fun initEvent() { //新建巡检 createIssueLayout.setOnClickListener { - + startActivity(Intent(this, MapActivity::class.java)) } //记录查询 logSearchLayout.setOnClickListener { - QMUIBottomSheet.BottomListSheetBuilder(this) + SingleChoiceDialog.Builder() + .setContext(this) .setTitle("选择记录类型") - .addItem("巡检记录") - .addItem("事件记录") - .setGravityCenter(true) - .setOnSheetItemClickListener { dialog, _, position, _ -> - dialog?.dismiss() - when (position) { - 0 -> { - startActivity(Intent(this, InspectionQueryActivity::class.java)) - } - 1 -> { - startActivity(Intent(this, EventQueryActivity::class.java)) + .setChoiceItemButton(itemList) + .setOnDialogClickListener(object : SingleChoiceDialog.OnDialogItemClickListener { + override fun onItemClick(position: Int) { + when (position) { + 0 -> { + startActivity( + Intent( + this@MainActivity, + InspectionQueryActivity::class.java + ) + ) + } + 1 -> { + startActivity( + Intent( + this@MainActivity, + EventQueryActivity::class.java + ) + ) + } } } - }.build().show() + }) + .build().show() } //系统设置 settingsLayout.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt new file mode 100644 index 0000000..207f6c3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -0,0 +1,176 @@ +package com.casic.birmm.inspect.view + +import android.bluetooth.BluetoothAdapter +import android.graphics.Color +import android.os.Bundle +import android.os.Handler +import android.os.Message +import android.util.Log +import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContextCompat +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.model.MyLocationStyle +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.widgets.InputDialog +import com.gyf.immersionbar.ImmersionBar +import com.qmuiteam.qmui.util.QMUIStatusBarHelper +import kotlinx.android.synthetic.main.activity_inspect_route.mapView +import kotlinx.android.synthetic.main.activity_map.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.cancel +import java.lang.ref.WeakReference + + +class MapActivity : AppCompatActivity(), CoroutineScope by MainScope() { + + companion object { + private const val Tag = "MapActivity" + private lateinit var weakReferenceHandler: WeakReferenceHandler + + fun sendEmptyMessage(what: Int) { + weakReferenceHandler.sendEmptyMessage(what) + } + } + + private lateinit var aMap: AMap + private lateinit var locationStyle: MyLocationStyle + + init { + weakReferenceHandler = WeakReferenceHandler(this) + } + + private class WeakReferenceHandler(activity: MapActivity) : Handler() { + private val activity: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + val mainActivity = activity.get() ?: return + when (msg.what) { + Constant.BLUETOOTH_ON -> { + "蓝牙已开启".show(mainActivity) + mainActivity.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + } + Constant.BLUETOOTH_OFF -> { + "蓝牙已关闭".show(mainActivity) + mainActivity.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + } + Constant.DEVICE_CONNECTED -> { + //TODO 设备已连接 + } + Constant.DEVICE_DISCONNECTED -> { + //TODO 设备断开连接 + } + } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_map) + PageNavigationManager.addActivity(this) + setupTopBarLayout() + if (OtherUtils.isNetworkConnected(this)) { + initData(savedInstanceState) + initEvent() + } else { + "糟糕,没有接入任何网络~".show(this) + } + } + + fun setupTopBarLayout() { + QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "巡检" + } + + fun initData(savedInstanceState: Bundle?) { + mapView.onCreate(savedInstanceState) + aMap = mapView.map + val uiSettings = aMap.uiSettings + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 + //显示定位小蓝点 + locationStyle = MyLocationStyle() + locationStyle.showMyLocation(true)//设置是否显示定位小蓝点 + locationStyle.strokeColor(Color.parseColor("#A2DBFA"))//设置定位蓝点精度圆圈的边框颜色 + locationStyle.radiusFillColor(Color.parseColor("#A2DBFA"))//设置定位蓝点精度圆圈的填充颜色 + aMap.myLocationStyle = locationStyle + aMap.isMyLocationEnabled = true + aMap.addOnMyLocationChangeListener { + Log.d(Tag, "[" + it.longitude + "," + it.latitude + "]") + } + } + + fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //需要判断是否是上次未完的巡检 +// selectInspectMode() + + //判断蓝牙的状态 + val blueAdapter = BluetoothAdapter.getDefaultAdapter() + if (blueAdapter == null) { + "该设备不支持蓝牙,无法连接".show(this) + } else { + if (blueAdapter.isEnabled) { + bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + bluetoothButton.setOnClickListener { + //搜索蓝牙 + } + } else { + bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + //打开 + } + } + + newEventButton.setChangeAlphaWhenPress(true) + newEventButton.setOnClickListener { + + } + } + + private fun selectInspectMode() { + InputDialog.Builder().setContext(this) + .setTitle("请输入巡检标签") + .setHintText("如:xxx区间巡检") + .setNegativeButton("放弃") + .setPositiveButton("开始巡检") + .setOnDialogClickListener(object : InputDialog.OnDialogButtonClickListener { + override fun onConfirmClick(input: String) { + + } + + override fun onCancelClick() { + finish() + } + }) + .build().show() + } + + override fun onResume() { + super.onResume() + mapView.onResume() + } + + override fun onPause() { + super.onPause() + mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + cancel() + super.onDestroy() + mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7949d16..6a3f570 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,10 @@ + + + + @@ -48,6 +52,7 @@ android:theme="@style/Theme.BigImageActivity" /> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt new file mode 100644 index 0000000..b6b5281 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt @@ -0,0 +1,31 @@ +package com.casic.birmm.inspect.utils + +import android.bluetooth.BluetoothAdapter +import android.bluetooth.BluetoothDevice +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import com.casic.birmm.inspect.view.MapActivity + +class BluetoothStateBroadcastReceiver : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + when (intent?.action) { + BluetoothAdapter.ACTION_STATE_CHANGED -> { + when (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0)) { + BluetoothAdapter.STATE_OFF -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_OFF) + } + BluetoothAdapter.STATE_ON -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_ON) + } + } + } + BluetoothDevice.ACTION_ACL_CONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_CONNECTED) + } + BluetoothDevice.ACTION_ACL_DISCONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_DISCONNECTED) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 0ae38db..aef675a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -13,6 +13,10 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 15 + const val BLUETOOTH_ON = 20 + const val BLUETOOTH_OFF = 21 + const val DEVICE_CONNECTED = 22 + const val DEVICE_DISCONNECTED = 23 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt index 94d269e..c3b1e6b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -59,6 +59,7 @@ aMap = mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //根据id查询详情 id = intent.getStringExtra("id")!! @@ -120,6 +121,7 @@ } fun initEvent() { + leftBackView.setOnClickListener { this.finish() } eventButton.setChangeAlphaWhenPress(true) eventButton.setOnClickListener { val intent = Intent(this, EventListActivity::class.java) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 8ed4a0c..da4b03e 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -168,6 +168,5 @@ } } } - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 517203f..dddea49 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -132,9 +132,13 @@ .setNegativeButton("取消") .setPositiveButton("保存") .setOnDialogClickListener(object : InputDialog.OnDialogButtonClickListener { - override fun onButtonClick(input: String) { + override fun onConfirmClick(input: String) { SaveKeyValues.putValue(Constant.DEFAULT_SERVER_CONFIG, input) } + + override fun onCancelClick() { + + } }) .build().show() } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 4ef86d3..2db634f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -15,9 +15,9 @@ import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.utils.StatusBarColorUtil import com.casic.birmm.inspect.vm.UserViewModel +import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* @@ -25,6 +25,7 @@ class MainActivity : BaseActivity() { private var clickTime: Long = 0 + private val itemList: List = arrayListOf("巡检记录", "事件记录") override fun initLayoutView(): Int = R.layout.activity_main @@ -53,26 +54,37 @@ override fun initEvent() { //新建巡检 createIssueLayout.setOnClickListener { - + startActivity(Intent(this, MapActivity::class.java)) } //记录查询 logSearchLayout.setOnClickListener { - QMUIBottomSheet.BottomListSheetBuilder(this) + SingleChoiceDialog.Builder() + .setContext(this) .setTitle("选择记录类型") - .addItem("巡检记录") - .addItem("事件记录") - .setGravityCenter(true) - .setOnSheetItemClickListener { dialog, _, position, _ -> - dialog?.dismiss() - when (position) { - 0 -> { - startActivity(Intent(this, InspectionQueryActivity::class.java)) - } - 1 -> { - startActivity(Intent(this, EventQueryActivity::class.java)) + .setChoiceItemButton(itemList) + .setOnDialogClickListener(object : SingleChoiceDialog.OnDialogItemClickListener { + override fun onItemClick(position: Int) { + when (position) { + 0 -> { + startActivity( + Intent( + this@MainActivity, + InspectionQueryActivity::class.java + ) + ) + } + 1 -> { + startActivity( + Intent( + this@MainActivity, + EventQueryActivity::class.java + ) + ) + } } } - }.build().show() + }) + .build().show() } //系统设置 settingsLayout.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt new file mode 100644 index 0000000..207f6c3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -0,0 +1,176 @@ +package com.casic.birmm.inspect.view + +import android.bluetooth.BluetoothAdapter +import android.graphics.Color +import android.os.Bundle +import android.os.Handler +import android.os.Message +import android.util.Log +import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContextCompat +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.model.MyLocationStyle +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.widgets.InputDialog +import com.gyf.immersionbar.ImmersionBar +import com.qmuiteam.qmui.util.QMUIStatusBarHelper +import kotlinx.android.synthetic.main.activity_inspect_route.mapView +import kotlinx.android.synthetic.main.activity_map.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.cancel +import java.lang.ref.WeakReference + + +class MapActivity : AppCompatActivity(), CoroutineScope by MainScope() { + + companion object { + private const val Tag = "MapActivity" + private lateinit var weakReferenceHandler: WeakReferenceHandler + + fun sendEmptyMessage(what: Int) { + weakReferenceHandler.sendEmptyMessage(what) + } + } + + private lateinit var aMap: AMap + private lateinit var locationStyle: MyLocationStyle + + init { + weakReferenceHandler = WeakReferenceHandler(this) + } + + private class WeakReferenceHandler(activity: MapActivity) : Handler() { + private val activity: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + val mainActivity = activity.get() ?: return + when (msg.what) { + Constant.BLUETOOTH_ON -> { + "蓝牙已开启".show(mainActivity) + mainActivity.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + } + Constant.BLUETOOTH_OFF -> { + "蓝牙已关闭".show(mainActivity) + mainActivity.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + } + Constant.DEVICE_CONNECTED -> { + //TODO 设备已连接 + } + Constant.DEVICE_DISCONNECTED -> { + //TODO 设备断开连接 + } + } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_map) + PageNavigationManager.addActivity(this) + setupTopBarLayout() + if (OtherUtils.isNetworkConnected(this)) { + initData(savedInstanceState) + initEvent() + } else { + "糟糕,没有接入任何网络~".show(this) + } + } + + fun setupTopBarLayout() { + QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "巡检" + } + + fun initData(savedInstanceState: Bundle?) { + mapView.onCreate(savedInstanceState) + aMap = mapView.map + val uiSettings = aMap.uiSettings + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 + //显示定位小蓝点 + locationStyle = MyLocationStyle() + locationStyle.showMyLocation(true)//设置是否显示定位小蓝点 + locationStyle.strokeColor(Color.parseColor("#A2DBFA"))//设置定位蓝点精度圆圈的边框颜色 + locationStyle.radiusFillColor(Color.parseColor("#A2DBFA"))//设置定位蓝点精度圆圈的填充颜色 + aMap.myLocationStyle = locationStyle + aMap.isMyLocationEnabled = true + aMap.addOnMyLocationChangeListener { + Log.d(Tag, "[" + it.longitude + "," + it.latitude + "]") + } + } + + fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //需要判断是否是上次未完的巡检 +// selectInspectMode() + + //判断蓝牙的状态 + val blueAdapter = BluetoothAdapter.getDefaultAdapter() + if (blueAdapter == null) { + "该设备不支持蓝牙,无法连接".show(this) + } else { + if (blueAdapter.isEnabled) { + bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + bluetoothButton.setOnClickListener { + //搜索蓝牙 + } + } else { + bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + //打开 + } + } + + newEventButton.setChangeAlphaWhenPress(true) + newEventButton.setOnClickListener { + + } + } + + private fun selectInspectMode() { + InputDialog.Builder().setContext(this) + .setTitle("请输入巡检标签") + .setHintText("如:xxx区间巡检") + .setNegativeButton("放弃") + .setPositiveButton("开始巡检") + .setOnDialogClickListener(object : InputDialog.OnDialogButtonClickListener { + override fun onConfirmClick(input: String) { + + } + + override fun onCancelClick() { + finish() + } + }) + .build().show() + } + + override fun onResume() { + super.onResume() + mapView.onResume() + } + + override fun onPause() { + super.onPause() + mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + cancel() + super.onDestroy() + mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt index cfa32dc..f2db4c9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt @@ -16,6 +16,7 @@ private var ctx: Context? = null private var title: String? = null + private var hint: String? = null private var value: String? = null private var positiveBtn: String? = null private var negativeBtn: String? = null @@ -24,6 +25,7 @@ init { this.ctx = builder.mContext this.title = builder.title + this.hint = builder.hint this.value = builder.value this.positiveBtn = builder.positiveBtn this.negativeBtn = builder.negativeBtn @@ -38,6 +40,7 @@ setCanceledOnTouchOutside(false) dialogTitleView.text = title + dialogInputView.hint = hint!! value.apply { dialogInputView.setText(this) } @@ -46,6 +49,7 @@ dialogCancelButton.setChangeAlphaWhenPress(true) dialogCancelButton.setOnClickListener { this.dismiss() + listener?.onCancelClick() } dialogConfirmButton.text = positiveBtn @@ -56,8 +60,8 @@ "什么都没输入,请重新输入".show(ctx!!) return@setOnClickListener } - listener?.onButtonClick(inputValue) this.dismiss() + listener?.onConfirmClick(inputValue) } } @@ -73,6 +77,7 @@ class Builder { var mContext: Context? = null var title: String? = null + var hint: String? = null var value: String? = null var positiveBtn: String? = null var negativeBtn: String? = null @@ -88,6 +93,11 @@ return this } + fun setHintText(hint: String?): Builder { + this.hint = hint + return this + } + fun setDefaultValue(value: String?): Builder { this.value = value return this @@ -114,6 +124,8 @@ } interface OnDialogButtonClickListener { - fun onButtonClick(input: String) + fun onCancelClick() + + fun onConfirmClick(input: String) } } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7949d16..6a3f570 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,10 @@ + + + + @@ -48,6 +52,7 @@ android:theme="@style/Theme.BigImageActivity" /> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt new file mode 100644 index 0000000..b6b5281 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt @@ -0,0 +1,31 @@ +package com.casic.birmm.inspect.utils + +import android.bluetooth.BluetoothAdapter +import android.bluetooth.BluetoothDevice +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import com.casic.birmm.inspect.view.MapActivity + +class BluetoothStateBroadcastReceiver : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + when (intent?.action) { + BluetoothAdapter.ACTION_STATE_CHANGED -> { + when (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0)) { + BluetoothAdapter.STATE_OFF -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_OFF) + } + BluetoothAdapter.STATE_ON -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_ON) + } + } + } + BluetoothDevice.ACTION_ACL_CONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_CONNECTED) + } + BluetoothDevice.ACTION_ACL_DISCONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_DISCONNECTED) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 0ae38db..aef675a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -13,6 +13,10 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 15 + const val BLUETOOTH_ON = 20 + const val BLUETOOTH_OFF = 21 + const val DEVICE_CONNECTED = 22 + const val DEVICE_DISCONNECTED = 23 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt index 94d269e..c3b1e6b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -59,6 +59,7 @@ aMap = mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //根据id查询详情 id = intent.getStringExtra("id")!! @@ -120,6 +121,7 @@ } fun initEvent() { + leftBackView.setOnClickListener { this.finish() } eventButton.setChangeAlphaWhenPress(true) eventButton.setOnClickListener { val intent = Intent(this, EventListActivity::class.java) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 8ed4a0c..da4b03e 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -168,6 +168,5 @@ } } } - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 517203f..dddea49 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -132,9 +132,13 @@ .setNegativeButton("取消") .setPositiveButton("保存") .setOnDialogClickListener(object : InputDialog.OnDialogButtonClickListener { - override fun onButtonClick(input: String) { + override fun onConfirmClick(input: String) { SaveKeyValues.putValue(Constant.DEFAULT_SERVER_CONFIG, input) } + + override fun onCancelClick() { + + } }) .build().show() } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 4ef86d3..2db634f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -15,9 +15,9 @@ import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.utils.StatusBarColorUtil import com.casic.birmm.inspect.vm.UserViewModel +import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* @@ -25,6 +25,7 @@ class MainActivity : BaseActivity() { private var clickTime: Long = 0 + private val itemList: List = arrayListOf("巡检记录", "事件记录") override fun initLayoutView(): Int = R.layout.activity_main @@ -53,26 +54,37 @@ override fun initEvent() { //新建巡检 createIssueLayout.setOnClickListener { - + startActivity(Intent(this, MapActivity::class.java)) } //记录查询 logSearchLayout.setOnClickListener { - QMUIBottomSheet.BottomListSheetBuilder(this) + SingleChoiceDialog.Builder() + .setContext(this) .setTitle("选择记录类型") - .addItem("巡检记录") - .addItem("事件记录") - .setGravityCenter(true) - .setOnSheetItemClickListener { dialog, _, position, _ -> - dialog?.dismiss() - when (position) { - 0 -> { - startActivity(Intent(this, InspectionQueryActivity::class.java)) - } - 1 -> { - startActivity(Intent(this, EventQueryActivity::class.java)) + .setChoiceItemButton(itemList) + .setOnDialogClickListener(object : SingleChoiceDialog.OnDialogItemClickListener { + override fun onItemClick(position: Int) { + when (position) { + 0 -> { + startActivity( + Intent( + this@MainActivity, + InspectionQueryActivity::class.java + ) + ) + } + 1 -> { + startActivity( + Intent( + this@MainActivity, + EventQueryActivity::class.java + ) + ) + } } } - }.build().show() + }) + .build().show() } //系统设置 settingsLayout.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt new file mode 100644 index 0000000..207f6c3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -0,0 +1,176 @@ +package com.casic.birmm.inspect.view + +import android.bluetooth.BluetoothAdapter +import android.graphics.Color +import android.os.Bundle +import android.os.Handler +import android.os.Message +import android.util.Log +import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContextCompat +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.model.MyLocationStyle +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.widgets.InputDialog +import com.gyf.immersionbar.ImmersionBar +import com.qmuiteam.qmui.util.QMUIStatusBarHelper +import kotlinx.android.synthetic.main.activity_inspect_route.mapView +import kotlinx.android.synthetic.main.activity_map.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.cancel +import java.lang.ref.WeakReference + + +class MapActivity : AppCompatActivity(), CoroutineScope by MainScope() { + + companion object { + private const val Tag = "MapActivity" + private lateinit var weakReferenceHandler: WeakReferenceHandler + + fun sendEmptyMessage(what: Int) { + weakReferenceHandler.sendEmptyMessage(what) + } + } + + private lateinit var aMap: AMap + private lateinit var locationStyle: MyLocationStyle + + init { + weakReferenceHandler = WeakReferenceHandler(this) + } + + private class WeakReferenceHandler(activity: MapActivity) : Handler() { + private val activity: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + val mainActivity = activity.get() ?: return + when (msg.what) { + Constant.BLUETOOTH_ON -> { + "蓝牙已开启".show(mainActivity) + mainActivity.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + } + Constant.BLUETOOTH_OFF -> { + "蓝牙已关闭".show(mainActivity) + mainActivity.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + } + Constant.DEVICE_CONNECTED -> { + //TODO 设备已连接 + } + Constant.DEVICE_DISCONNECTED -> { + //TODO 设备断开连接 + } + } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_map) + PageNavigationManager.addActivity(this) + setupTopBarLayout() + if (OtherUtils.isNetworkConnected(this)) { + initData(savedInstanceState) + initEvent() + } else { + "糟糕,没有接入任何网络~".show(this) + } + } + + fun setupTopBarLayout() { + QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "巡检" + } + + fun initData(savedInstanceState: Bundle?) { + mapView.onCreate(savedInstanceState) + aMap = mapView.map + val uiSettings = aMap.uiSettings + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 + //显示定位小蓝点 + locationStyle = MyLocationStyle() + locationStyle.showMyLocation(true)//设置是否显示定位小蓝点 + locationStyle.strokeColor(Color.parseColor("#A2DBFA"))//设置定位蓝点精度圆圈的边框颜色 + locationStyle.radiusFillColor(Color.parseColor("#A2DBFA"))//设置定位蓝点精度圆圈的填充颜色 + aMap.myLocationStyle = locationStyle + aMap.isMyLocationEnabled = true + aMap.addOnMyLocationChangeListener { + Log.d(Tag, "[" + it.longitude + "," + it.latitude + "]") + } + } + + fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //需要判断是否是上次未完的巡检 +// selectInspectMode() + + //判断蓝牙的状态 + val blueAdapter = BluetoothAdapter.getDefaultAdapter() + if (blueAdapter == null) { + "该设备不支持蓝牙,无法连接".show(this) + } else { + if (blueAdapter.isEnabled) { + bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + bluetoothButton.setOnClickListener { + //搜索蓝牙 + } + } else { + bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + //打开 + } + } + + newEventButton.setChangeAlphaWhenPress(true) + newEventButton.setOnClickListener { + + } + } + + private fun selectInspectMode() { + InputDialog.Builder().setContext(this) + .setTitle("请输入巡检标签") + .setHintText("如:xxx区间巡检") + .setNegativeButton("放弃") + .setPositiveButton("开始巡检") + .setOnDialogClickListener(object : InputDialog.OnDialogButtonClickListener { + override fun onConfirmClick(input: String) { + + } + + override fun onCancelClick() { + finish() + } + }) + .build().show() + } + + override fun onResume() { + super.onResume() + mapView.onResume() + } + + override fun onPause() { + super.onPause() + mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + cancel() + super.onDestroy() + mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt index cfa32dc..f2db4c9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt @@ -16,6 +16,7 @@ private var ctx: Context? = null private var title: String? = null + private var hint: String? = null private var value: String? = null private var positiveBtn: String? = null private var negativeBtn: String? = null @@ -24,6 +25,7 @@ init { this.ctx = builder.mContext this.title = builder.title + this.hint = builder.hint this.value = builder.value this.positiveBtn = builder.positiveBtn this.negativeBtn = builder.negativeBtn @@ -38,6 +40,7 @@ setCanceledOnTouchOutside(false) dialogTitleView.text = title + dialogInputView.hint = hint!! value.apply { dialogInputView.setText(this) } @@ -46,6 +49,7 @@ dialogCancelButton.setChangeAlphaWhenPress(true) dialogCancelButton.setOnClickListener { this.dismiss() + listener?.onCancelClick() } dialogConfirmButton.text = positiveBtn @@ -56,8 +60,8 @@ "什么都没输入,请重新输入".show(ctx!!) return@setOnClickListener } - listener?.onButtonClick(inputValue) this.dismiss() + listener?.onConfirmClick(inputValue) } } @@ -73,6 +77,7 @@ class Builder { var mContext: Context? = null var title: String? = null + var hint: String? = null var value: String? = null var positiveBtn: String? = null var negativeBtn: String? = null @@ -88,6 +93,11 @@ return this } + fun setHintText(hint: String?): Builder { + this.hint = hint + return this + } + fun setDefaultValue(value: String?): Builder { this.value = value return this @@ -114,6 +124,8 @@ } interface OnDialogButtonClickListener { - fun onButtonClick(input: String) + fun onCancelClick() + + fun onConfirmClick(input: String) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt new file mode 100644 index 0000000..216befd --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt @@ -0,0 +1,123 @@ +package com.casic.birmm.inspect.widgets + +import android.app.Dialog +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.WindowManager +import android.widget.BaseAdapter +import com.casic.birmm.inspect.R +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton +import kotlinx.android.synthetic.main.dialog_input.dialogTitleView +import kotlinx.android.synthetic.main.dialog_single_choice.* + + +class SingleChoiceDialog private constructor(builder: Builder) : Dialog(builder.mContext!!) { + + private var ctx: Context? = null + private var title: String? = null + private var items: List? = null + private var listener: OnDialogItemClickListener? = null + + init { + this.ctx = builder.mContext + this.title = builder.title + this.items = builder.items + this.listener = builder.listener + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + configDialogLayout() + setContentView(R.layout.dialog_single_choice) + setCancelable(true) + setCanceledOnTouchOutside(true) + + dialogTitleView.text = title + dialogListView.adapter = ItemChoiceAdapter() + } + + private fun configDialogLayout() { + window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + window?.decorView?.setBackgroundColor(Color.TRANSPARENT) + val params: WindowManager.LayoutParams? = window?.attributes + params?.width = QMUIDisplayHelper.dp2px(ctx, 220) + params?.height = WindowManager.LayoutParams.WRAP_CONTENT + window?.attributes = params + } + + inner class ItemChoiceAdapter : BaseAdapter() { + + private var inflater: LayoutInflater = LayoutInflater.from(ctx!!) + + override fun getCount(): Int = items!!.size + + override fun getItem(position: Int): Any = items!![position] + + override fun getItemId(position: Int): Long = position.toLong() + + override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { + val view: View + val itemViewHolder: ItemViewHolder + if (convertView == null) { + view = inflater.inflate(R.layout.item_dialog_listview, null)!! + itemViewHolder = ItemViewHolder(view) + view.tag = itemViewHolder + } else { + view = convertView + itemViewHolder = view.tag as ItemViewHolder + } + itemViewHolder.itemTagView.text = items!![position] + itemViewHolder.itemTagView.setChangeAlphaWhenPress(true) + itemViewHolder.itemTagView.setOnClickListener { + dismiss() + listener?.onItemClick(position) + } + return view + } + } + + class ItemViewHolder(v: View) { + var itemTagView: QMUIRoundButton = v.findViewById(R.id.itemTagView) + } + + class Builder { + var mContext: Context? = null + var title: String? = null + var items: List? = null + var listener: OnDialogItemClickListener? = null + + fun setContext(context: Context?): Builder { + mContext = context + return this + } + + fun setTitle(title: String?): Builder { + this.title = title + return this + } + + fun setChoiceItemButton(items: List?): Builder { + this.items = items + return this + } + + fun setOnDialogClickListener(listener: OnDialogItemClickListener): Builder { + this.listener = listener + return this + } + + fun build(): SingleChoiceDialog { + return SingleChoiceDialog(this) + } + } + + interface OnDialogItemClickListener { + fun onItemClick(position: Int) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7949d16..6a3f570 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,10 @@ + + + + @@ -48,6 +52,7 @@ android:theme="@style/Theme.BigImageActivity" /> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt new file mode 100644 index 0000000..b6b5281 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt @@ -0,0 +1,31 @@ +package com.casic.birmm.inspect.utils + +import android.bluetooth.BluetoothAdapter +import android.bluetooth.BluetoothDevice +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import com.casic.birmm.inspect.view.MapActivity + +class BluetoothStateBroadcastReceiver : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + when (intent?.action) { + BluetoothAdapter.ACTION_STATE_CHANGED -> { + when (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0)) { + BluetoothAdapter.STATE_OFF -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_OFF) + } + BluetoothAdapter.STATE_ON -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_ON) + } + } + } + BluetoothDevice.ACTION_ACL_CONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_CONNECTED) + } + BluetoothDevice.ACTION_ACL_DISCONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_DISCONNECTED) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 0ae38db..aef675a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -13,6 +13,10 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 15 + const val BLUETOOTH_ON = 20 + const val BLUETOOTH_OFF = 21 + const val DEVICE_CONNECTED = 22 + const val DEVICE_DISCONNECTED = 23 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt index 94d269e..c3b1e6b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -59,6 +59,7 @@ aMap = mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //根据id查询详情 id = intent.getStringExtra("id")!! @@ -120,6 +121,7 @@ } fun initEvent() { + leftBackView.setOnClickListener { this.finish() } eventButton.setChangeAlphaWhenPress(true) eventButton.setOnClickListener { val intent = Intent(this, EventListActivity::class.java) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 8ed4a0c..da4b03e 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -168,6 +168,5 @@ } } } - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 517203f..dddea49 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -132,9 +132,13 @@ .setNegativeButton("取消") .setPositiveButton("保存") .setOnDialogClickListener(object : InputDialog.OnDialogButtonClickListener { - override fun onButtonClick(input: String) { + override fun onConfirmClick(input: String) { SaveKeyValues.putValue(Constant.DEFAULT_SERVER_CONFIG, input) } + + override fun onCancelClick() { + + } }) .build().show() } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 4ef86d3..2db634f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -15,9 +15,9 @@ import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.utils.StatusBarColorUtil import com.casic.birmm.inspect.vm.UserViewModel +import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* @@ -25,6 +25,7 @@ class MainActivity : BaseActivity() { private var clickTime: Long = 0 + private val itemList: List = arrayListOf("巡检记录", "事件记录") override fun initLayoutView(): Int = R.layout.activity_main @@ -53,26 +54,37 @@ override fun initEvent() { //新建巡检 createIssueLayout.setOnClickListener { - + startActivity(Intent(this, MapActivity::class.java)) } //记录查询 logSearchLayout.setOnClickListener { - QMUIBottomSheet.BottomListSheetBuilder(this) + SingleChoiceDialog.Builder() + .setContext(this) .setTitle("选择记录类型") - .addItem("巡检记录") - .addItem("事件记录") - .setGravityCenter(true) - .setOnSheetItemClickListener { dialog, _, position, _ -> - dialog?.dismiss() - when (position) { - 0 -> { - startActivity(Intent(this, InspectionQueryActivity::class.java)) - } - 1 -> { - startActivity(Intent(this, EventQueryActivity::class.java)) + .setChoiceItemButton(itemList) + .setOnDialogClickListener(object : SingleChoiceDialog.OnDialogItemClickListener { + override fun onItemClick(position: Int) { + when (position) { + 0 -> { + startActivity( + Intent( + this@MainActivity, + InspectionQueryActivity::class.java + ) + ) + } + 1 -> { + startActivity( + Intent( + this@MainActivity, + EventQueryActivity::class.java + ) + ) + } } } - }.build().show() + }) + .build().show() } //系统设置 settingsLayout.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt new file mode 100644 index 0000000..207f6c3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -0,0 +1,176 @@ +package com.casic.birmm.inspect.view + +import android.bluetooth.BluetoothAdapter +import android.graphics.Color +import android.os.Bundle +import android.os.Handler +import android.os.Message +import android.util.Log +import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContextCompat +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.model.MyLocationStyle +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.widgets.InputDialog +import com.gyf.immersionbar.ImmersionBar +import com.qmuiteam.qmui.util.QMUIStatusBarHelper +import kotlinx.android.synthetic.main.activity_inspect_route.mapView +import kotlinx.android.synthetic.main.activity_map.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.cancel +import java.lang.ref.WeakReference + + +class MapActivity : AppCompatActivity(), CoroutineScope by MainScope() { + + companion object { + private const val Tag = "MapActivity" + private lateinit var weakReferenceHandler: WeakReferenceHandler + + fun sendEmptyMessage(what: Int) { + weakReferenceHandler.sendEmptyMessage(what) + } + } + + private lateinit var aMap: AMap + private lateinit var locationStyle: MyLocationStyle + + init { + weakReferenceHandler = WeakReferenceHandler(this) + } + + private class WeakReferenceHandler(activity: MapActivity) : Handler() { + private val activity: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + val mainActivity = activity.get() ?: return + when (msg.what) { + Constant.BLUETOOTH_ON -> { + "蓝牙已开启".show(mainActivity) + mainActivity.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + } + Constant.BLUETOOTH_OFF -> { + "蓝牙已关闭".show(mainActivity) + mainActivity.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + } + Constant.DEVICE_CONNECTED -> { + //TODO 设备已连接 + } + Constant.DEVICE_DISCONNECTED -> { + //TODO 设备断开连接 + } + } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_map) + PageNavigationManager.addActivity(this) + setupTopBarLayout() + if (OtherUtils.isNetworkConnected(this)) { + initData(savedInstanceState) + initEvent() + } else { + "糟糕,没有接入任何网络~".show(this) + } + } + + fun setupTopBarLayout() { + QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "巡检" + } + + fun initData(savedInstanceState: Bundle?) { + mapView.onCreate(savedInstanceState) + aMap = mapView.map + val uiSettings = aMap.uiSettings + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 + //显示定位小蓝点 + locationStyle = MyLocationStyle() + locationStyle.showMyLocation(true)//设置是否显示定位小蓝点 + locationStyle.strokeColor(Color.parseColor("#A2DBFA"))//设置定位蓝点精度圆圈的边框颜色 + locationStyle.radiusFillColor(Color.parseColor("#A2DBFA"))//设置定位蓝点精度圆圈的填充颜色 + aMap.myLocationStyle = locationStyle + aMap.isMyLocationEnabled = true + aMap.addOnMyLocationChangeListener { + Log.d(Tag, "[" + it.longitude + "," + it.latitude + "]") + } + } + + fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //需要判断是否是上次未完的巡检 +// selectInspectMode() + + //判断蓝牙的状态 + val blueAdapter = BluetoothAdapter.getDefaultAdapter() + if (blueAdapter == null) { + "该设备不支持蓝牙,无法连接".show(this) + } else { + if (blueAdapter.isEnabled) { + bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + bluetoothButton.setOnClickListener { + //搜索蓝牙 + } + } else { + bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + //打开 + } + } + + newEventButton.setChangeAlphaWhenPress(true) + newEventButton.setOnClickListener { + + } + } + + private fun selectInspectMode() { + InputDialog.Builder().setContext(this) + .setTitle("请输入巡检标签") + .setHintText("如:xxx区间巡检") + .setNegativeButton("放弃") + .setPositiveButton("开始巡检") + .setOnDialogClickListener(object : InputDialog.OnDialogButtonClickListener { + override fun onConfirmClick(input: String) { + + } + + override fun onCancelClick() { + finish() + } + }) + .build().show() + } + + override fun onResume() { + super.onResume() + mapView.onResume() + } + + override fun onPause() { + super.onPause() + mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + cancel() + super.onDestroy() + mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt index cfa32dc..f2db4c9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt @@ -16,6 +16,7 @@ private var ctx: Context? = null private var title: String? = null + private var hint: String? = null private var value: String? = null private var positiveBtn: String? = null private var negativeBtn: String? = null @@ -24,6 +25,7 @@ init { this.ctx = builder.mContext this.title = builder.title + this.hint = builder.hint this.value = builder.value this.positiveBtn = builder.positiveBtn this.negativeBtn = builder.negativeBtn @@ -38,6 +40,7 @@ setCanceledOnTouchOutside(false) dialogTitleView.text = title + dialogInputView.hint = hint!! value.apply { dialogInputView.setText(this) } @@ -46,6 +49,7 @@ dialogCancelButton.setChangeAlphaWhenPress(true) dialogCancelButton.setOnClickListener { this.dismiss() + listener?.onCancelClick() } dialogConfirmButton.text = positiveBtn @@ -56,8 +60,8 @@ "什么都没输入,请重新输入".show(ctx!!) return@setOnClickListener } - listener?.onButtonClick(inputValue) this.dismiss() + listener?.onConfirmClick(inputValue) } } @@ -73,6 +77,7 @@ class Builder { var mContext: Context? = null var title: String? = null + var hint: String? = null var value: String? = null var positiveBtn: String? = null var negativeBtn: String? = null @@ -88,6 +93,11 @@ return this } + fun setHintText(hint: String?): Builder { + this.hint = hint + return this + } + fun setDefaultValue(value: String?): Builder { this.value = value return this @@ -114,6 +124,8 @@ } interface OnDialogButtonClickListener { - fun onButtonClick(input: String) + fun onCancelClick() + + fun onConfirmClick(input: String) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt new file mode 100644 index 0000000..216befd --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt @@ -0,0 +1,123 @@ +package com.casic.birmm.inspect.widgets + +import android.app.Dialog +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.WindowManager +import android.widget.BaseAdapter +import com.casic.birmm.inspect.R +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton +import kotlinx.android.synthetic.main.dialog_input.dialogTitleView +import kotlinx.android.synthetic.main.dialog_single_choice.* + + +class SingleChoiceDialog private constructor(builder: Builder) : Dialog(builder.mContext!!) { + + private var ctx: Context? = null + private var title: String? = null + private var items: List? = null + private var listener: OnDialogItemClickListener? = null + + init { + this.ctx = builder.mContext + this.title = builder.title + this.items = builder.items + this.listener = builder.listener + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + configDialogLayout() + setContentView(R.layout.dialog_single_choice) + setCancelable(true) + setCanceledOnTouchOutside(true) + + dialogTitleView.text = title + dialogListView.adapter = ItemChoiceAdapter() + } + + private fun configDialogLayout() { + window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + window?.decorView?.setBackgroundColor(Color.TRANSPARENT) + val params: WindowManager.LayoutParams? = window?.attributes + params?.width = QMUIDisplayHelper.dp2px(ctx, 220) + params?.height = WindowManager.LayoutParams.WRAP_CONTENT + window?.attributes = params + } + + inner class ItemChoiceAdapter : BaseAdapter() { + + private var inflater: LayoutInflater = LayoutInflater.from(ctx!!) + + override fun getCount(): Int = items!!.size + + override fun getItem(position: Int): Any = items!![position] + + override fun getItemId(position: Int): Long = position.toLong() + + override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { + val view: View + val itemViewHolder: ItemViewHolder + if (convertView == null) { + view = inflater.inflate(R.layout.item_dialog_listview, null)!! + itemViewHolder = ItemViewHolder(view) + view.tag = itemViewHolder + } else { + view = convertView + itemViewHolder = view.tag as ItemViewHolder + } + itemViewHolder.itemTagView.text = items!![position] + itemViewHolder.itemTagView.setChangeAlphaWhenPress(true) + itemViewHolder.itemTagView.setOnClickListener { + dismiss() + listener?.onItemClick(position) + } + return view + } + } + + class ItemViewHolder(v: View) { + var itemTagView: QMUIRoundButton = v.findViewById(R.id.itemTagView) + } + + class Builder { + var mContext: Context? = null + var title: String? = null + var items: List? = null + var listener: OnDialogItemClickListener? = null + + fun setContext(context: Context?): Builder { + mContext = context + return this + } + + fun setTitle(title: String?): Builder { + this.title = title + return this + } + + fun setChoiceItemButton(items: List?): Builder { + this.items = items + return this + } + + fun setOnDialogClickListener(listener: OnDialogItemClickListener): Builder { + this.listener = listener + return this + } + + fun build(): SingleChoiceDialog { + return SingleChoiceDialog(this) + } + } + + interface OnDialogItemClickListener { + fun onItemClick(position: Int) + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_image_button_layout.xml b/app/src/main/res/drawable/bg_image_button_layout.xml new file mode 100644 index 0000000..41a75be --- /dev/null +++ b/app/src/main/res/drawable/bg_image_button_layout.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7949d16..6a3f570 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,10 @@ + + + + @@ -48,6 +52,7 @@ android:theme="@style/Theme.BigImageActivity" /> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt new file mode 100644 index 0000000..b6b5281 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt @@ -0,0 +1,31 @@ +package com.casic.birmm.inspect.utils + +import android.bluetooth.BluetoothAdapter +import android.bluetooth.BluetoothDevice +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import com.casic.birmm.inspect.view.MapActivity + +class BluetoothStateBroadcastReceiver : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + when (intent?.action) { + BluetoothAdapter.ACTION_STATE_CHANGED -> { + when (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0)) { + BluetoothAdapter.STATE_OFF -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_OFF) + } + BluetoothAdapter.STATE_ON -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_ON) + } + } + } + BluetoothDevice.ACTION_ACL_CONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_CONNECTED) + } + BluetoothDevice.ACTION_ACL_DISCONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_DISCONNECTED) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 0ae38db..aef675a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -13,6 +13,10 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 15 + const val BLUETOOTH_ON = 20 + const val BLUETOOTH_OFF = 21 + const val DEVICE_CONNECTED = 22 + const val DEVICE_DISCONNECTED = 23 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt index 94d269e..c3b1e6b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -59,6 +59,7 @@ aMap = mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //根据id查询详情 id = intent.getStringExtra("id")!! @@ -120,6 +121,7 @@ } fun initEvent() { + leftBackView.setOnClickListener { this.finish() } eventButton.setChangeAlphaWhenPress(true) eventButton.setOnClickListener { val intent = Intent(this, EventListActivity::class.java) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 8ed4a0c..da4b03e 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -168,6 +168,5 @@ } } } - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 517203f..dddea49 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -132,9 +132,13 @@ .setNegativeButton("取消") .setPositiveButton("保存") .setOnDialogClickListener(object : InputDialog.OnDialogButtonClickListener { - override fun onButtonClick(input: String) { + override fun onConfirmClick(input: String) { SaveKeyValues.putValue(Constant.DEFAULT_SERVER_CONFIG, input) } + + override fun onCancelClick() { + + } }) .build().show() } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 4ef86d3..2db634f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -15,9 +15,9 @@ import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.utils.StatusBarColorUtil import com.casic.birmm.inspect.vm.UserViewModel +import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* @@ -25,6 +25,7 @@ class MainActivity : BaseActivity() { private var clickTime: Long = 0 + private val itemList: List = arrayListOf("巡检记录", "事件记录") override fun initLayoutView(): Int = R.layout.activity_main @@ -53,26 +54,37 @@ override fun initEvent() { //新建巡检 createIssueLayout.setOnClickListener { - + startActivity(Intent(this, MapActivity::class.java)) } //记录查询 logSearchLayout.setOnClickListener { - QMUIBottomSheet.BottomListSheetBuilder(this) + SingleChoiceDialog.Builder() + .setContext(this) .setTitle("选择记录类型") - .addItem("巡检记录") - .addItem("事件记录") - .setGravityCenter(true) - .setOnSheetItemClickListener { dialog, _, position, _ -> - dialog?.dismiss() - when (position) { - 0 -> { - startActivity(Intent(this, InspectionQueryActivity::class.java)) - } - 1 -> { - startActivity(Intent(this, EventQueryActivity::class.java)) + .setChoiceItemButton(itemList) + .setOnDialogClickListener(object : SingleChoiceDialog.OnDialogItemClickListener { + override fun onItemClick(position: Int) { + when (position) { + 0 -> { + startActivity( + Intent( + this@MainActivity, + InspectionQueryActivity::class.java + ) + ) + } + 1 -> { + startActivity( + Intent( + this@MainActivity, + EventQueryActivity::class.java + ) + ) + } } } - }.build().show() + }) + .build().show() } //系统设置 settingsLayout.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt new file mode 100644 index 0000000..207f6c3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -0,0 +1,176 @@ +package com.casic.birmm.inspect.view + +import android.bluetooth.BluetoothAdapter +import android.graphics.Color +import android.os.Bundle +import android.os.Handler +import android.os.Message +import android.util.Log +import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContextCompat +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.model.MyLocationStyle +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.widgets.InputDialog +import com.gyf.immersionbar.ImmersionBar +import com.qmuiteam.qmui.util.QMUIStatusBarHelper +import kotlinx.android.synthetic.main.activity_inspect_route.mapView +import kotlinx.android.synthetic.main.activity_map.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.cancel +import java.lang.ref.WeakReference + + +class MapActivity : AppCompatActivity(), CoroutineScope by MainScope() { + + companion object { + private const val Tag = "MapActivity" + private lateinit var weakReferenceHandler: WeakReferenceHandler + + fun sendEmptyMessage(what: Int) { + weakReferenceHandler.sendEmptyMessage(what) + } + } + + private lateinit var aMap: AMap + private lateinit var locationStyle: MyLocationStyle + + init { + weakReferenceHandler = WeakReferenceHandler(this) + } + + private class WeakReferenceHandler(activity: MapActivity) : Handler() { + private val activity: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + val mainActivity = activity.get() ?: return + when (msg.what) { + Constant.BLUETOOTH_ON -> { + "蓝牙已开启".show(mainActivity) + mainActivity.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + } + Constant.BLUETOOTH_OFF -> { + "蓝牙已关闭".show(mainActivity) + mainActivity.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + } + Constant.DEVICE_CONNECTED -> { + //TODO 设备已连接 + } + Constant.DEVICE_DISCONNECTED -> { + //TODO 设备断开连接 + } + } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_map) + PageNavigationManager.addActivity(this) + setupTopBarLayout() + if (OtherUtils.isNetworkConnected(this)) { + initData(savedInstanceState) + initEvent() + } else { + "糟糕,没有接入任何网络~".show(this) + } + } + + fun setupTopBarLayout() { + QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "巡检" + } + + fun initData(savedInstanceState: Bundle?) { + mapView.onCreate(savedInstanceState) + aMap = mapView.map + val uiSettings = aMap.uiSettings + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 + //显示定位小蓝点 + locationStyle = MyLocationStyle() + locationStyle.showMyLocation(true)//设置是否显示定位小蓝点 + locationStyle.strokeColor(Color.parseColor("#A2DBFA"))//设置定位蓝点精度圆圈的边框颜色 + locationStyle.radiusFillColor(Color.parseColor("#A2DBFA"))//设置定位蓝点精度圆圈的填充颜色 + aMap.myLocationStyle = locationStyle + aMap.isMyLocationEnabled = true + aMap.addOnMyLocationChangeListener { + Log.d(Tag, "[" + it.longitude + "," + it.latitude + "]") + } + } + + fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //需要判断是否是上次未完的巡检 +// selectInspectMode() + + //判断蓝牙的状态 + val blueAdapter = BluetoothAdapter.getDefaultAdapter() + if (blueAdapter == null) { + "该设备不支持蓝牙,无法连接".show(this) + } else { + if (blueAdapter.isEnabled) { + bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + bluetoothButton.setOnClickListener { + //搜索蓝牙 + } + } else { + bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + //打开 + } + } + + newEventButton.setChangeAlphaWhenPress(true) + newEventButton.setOnClickListener { + + } + } + + private fun selectInspectMode() { + InputDialog.Builder().setContext(this) + .setTitle("请输入巡检标签") + .setHintText("如:xxx区间巡检") + .setNegativeButton("放弃") + .setPositiveButton("开始巡检") + .setOnDialogClickListener(object : InputDialog.OnDialogButtonClickListener { + override fun onConfirmClick(input: String) { + + } + + override fun onCancelClick() { + finish() + } + }) + .build().show() + } + + override fun onResume() { + super.onResume() + mapView.onResume() + } + + override fun onPause() { + super.onPause() + mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + cancel() + super.onDestroy() + mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt index cfa32dc..f2db4c9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt @@ -16,6 +16,7 @@ private var ctx: Context? = null private var title: String? = null + private var hint: String? = null private var value: String? = null private var positiveBtn: String? = null private var negativeBtn: String? = null @@ -24,6 +25,7 @@ init { this.ctx = builder.mContext this.title = builder.title + this.hint = builder.hint this.value = builder.value this.positiveBtn = builder.positiveBtn this.negativeBtn = builder.negativeBtn @@ -38,6 +40,7 @@ setCanceledOnTouchOutside(false) dialogTitleView.text = title + dialogInputView.hint = hint!! value.apply { dialogInputView.setText(this) } @@ -46,6 +49,7 @@ dialogCancelButton.setChangeAlphaWhenPress(true) dialogCancelButton.setOnClickListener { this.dismiss() + listener?.onCancelClick() } dialogConfirmButton.text = positiveBtn @@ -56,8 +60,8 @@ "什么都没输入,请重新输入".show(ctx!!) return@setOnClickListener } - listener?.onButtonClick(inputValue) this.dismiss() + listener?.onConfirmClick(inputValue) } } @@ -73,6 +77,7 @@ class Builder { var mContext: Context? = null var title: String? = null + var hint: String? = null var value: String? = null var positiveBtn: String? = null var negativeBtn: String? = null @@ -88,6 +93,11 @@ return this } + fun setHintText(hint: String?): Builder { + this.hint = hint + return this + } + fun setDefaultValue(value: String?): Builder { this.value = value return this @@ -114,6 +124,8 @@ } interface OnDialogButtonClickListener { - fun onButtonClick(input: String) + fun onCancelClick() + + fun onConfirmClick(input: String) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt new file mode 100644 index 0000000..216befd --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt @@ -0,0 +1,123 @@ +package com.casic.birmm.inspect.widgets + +import android.app.Dialog +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.WindowManager +import android.widget.BaseAdapter +import com.casic.birmm.inspect.R +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton +import kotlinx.android.synthetic.main.dialog_input.dialogTitleView +import kotlinx.android.synthetic.main.dialog_single_choice.* + + +class SingleChoiceDialog private constructor(builder: Builder) : Dialog(builder.mContext!!) { + + private var ctx: Context? = null + private var title: String? = null + private var items: List? = null + private var listener: OnDialogItemClickListener? = null + + init { + this.ctx = builder.mContext + this.title = builder.title + this.items = builder.items + this.listener = builder.listener + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + configDialogLayout() + setContentView(R.layout.dialog_single_choice) + setCancelable(true) + setCanceledOnTouchOutside(true) + + dialogTitleView.text = title + dialogListView.adapter = ItemChoiceAdapter() + } + + private fun configDialogLayout() { + window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + window?.decorView?.setBackgroundColor(Color.TRANSPARENT) + val params: WindowManager.LayoutParams? = window?.attributes + params?.width = QMUIDisplayHelper.dp2px(ctx, 220) + params?.height = WindowManager.LayoutParams.WRAP_CONTENT + window?.attributes = params + } + + inner class ItemChoiceAdapter : BaseAdapter() { + + private var inflater: LayoutInflater = LayoutInflater.from(ctx!!) + + override fun getCount(): Int = items!!.size + + override fun getItem(position: Int): Any = items!![position] + + override fun getItemId(position: Int): Long = position.toLong() + + override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { + val view: View + val itemViewHolder: ItemViewHolder + if (convertView == null) { + view = inflater.inflate(R.layout.item_dialog_listview, null)!! + itemViewHolder = ItemViewHolder(view) + view.tag = itemViewHolder + } else { + view = convertView + itemViewHolder = view.tag as ItemViewHolder + } + itemViewHolder.itemTagView.text = items!![position] + itemViewHolder.itemTagView.setChangeAlphaWhenPress(true) + itemViewHolder.itemTagView.setOnClickListener { + dismiss() + listener?.onItemClick(position) + } + return view + } + } + + class ItemViewHolder(v: View) { + var itemTagView: QMUIRoundButton = v.findViewById(R.id.itemTagView) + } + + class Builder { + var mContext: Context? = null + var title: String? = null + var items: List? = null + var listener: OnDialogItemClickListener? = null + + fun setContext(context: Context?): Builder { + mContext = context + return this + } + + fun setTitle(title: String?): Builder { + this.title = title + return this + } + + fun setChoiceItemButton(items: List?): Builder { + this.items = items + return this + } + + fun setOnDialogClickListener(listener: OnDialogItemClickListener): Builder { + this.listener = listener + return this + } + + fun build(): SingleChoiceDialog { + return SingleChoiceDialog(this) + } + } + + interface OnDialogItemClickListener { + fun onItemClick(position: Int) + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_image_button_layout.xml b/app/src/main/res/drawable/bg_image_button_layout.xml new file mode 100644 index 0000000..41a75be --- /dev/null +++ b/app/src/main/res/drawable/bg_image_button_layout.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_aim.xml b/app/src/main/res/drawable/ic_aim.xml new file mode 100644 index 0000000..88d9e36 --- /dev/null +++ b/app/src/main/res/drawable/ic_aim.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7949d16..6a3f570 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,10 @@ + + + + @@ -48,6 +52,7 @@ android:theme="@style/Theme.BigImageActivity" /> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt new file mode 100644 index 0000000..b6b5281 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt @@ -0,0 +1,31 @@ +package com.casic.birmm.inspect.utils + +import android.bluetooth.BluetoothAdapter +import android.bluetooth.BluetoothDevice +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import com.casic.birmm.inspect.view.MapActivity + +class BluetoothStateBroadcastReceiver : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + when (intent?.action) { + BluetoothAdapter.ACTION_STATE_CHANGED -> { + when (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0)) { + BluetoothAdapter.STATE_OFF -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_OFF) + } + BluetoothAdapter.STATE_ON -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_ON) + } + } + } + BluetoothDevice.ACTION_ACL_CONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_CONNECTED) + } + BluetoothDevice.ACTION_ACL_DISCONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_DISCONNECTED) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 0ae38db..aef675a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -13,6 +13,10 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 15 + const val BLUETOOTH_ON = 20 + const val BLUETOOTH_OFF = 21 + const val DEVICE_CONNECTED = 22 + const val DEVICE_DISCONNECTED = 23 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt index 94d269e..c3b1e6b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -59,6 +59,7 @@ aMap = mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //根据id查询详情 id = intent.getStringExtra("id")!! @@ -120,6 +121,7 @@ } fun initEvent() { + leftBackView.setOnClickListener { this.finish() } eventButton.setChangeAlphaWhenPress(true) eventButton.setOnClickListener { val intent = Intent(this, EventListActivity::class.java) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 8ed4a0c..da4b03e 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -168,6 +168,5 @@ } } } - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 517203f..dddea49 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -132,9 +132,13 @@ .setNegativeButton("取消") .setPositiveButton("保存") .setOnDialogClickListener(object : InputDialog.OnDialogButtonClickListener { - override fun onButtonClick(input: String) { + override fun onConfirmClick(input: String) { SaveKeyValues.putValue(Constant.DEFAULT_SERVER_CONFIG, input) } + + override fun onCancelClick() { + + } }) .build().show() } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 4ef86d3..2db634f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -15,9 +15,9 @@ import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.utils.StatusBarColorUtil import com.casic.birmm.inspect.vm.UserViewModel +import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* @@ -25,6 +25,7 @@ class MainActivity : BaseActivity() { private var clickTime: Long = 0 + private val itemList: List = arrayListOf("巡检记录", "事件记录") override fun initLayoutView(): Int = R.layout.activity_main @@ -53,26 +54,37 @@ override fun initEvent() { //新建巡检 createIssueLayout.setOnClickListener { - + startActivity(Intent(this, MapActivity::class.java)) } //记录查询 logSearchLayout.setOnClickListener { - QMUIBottomSheet.BottomListSheetBuilder(this) + SingleChoiceDialog.Builder() + .setContext(this) .setTitle("选择记录类型") - .addItem("巡检记录") - .addItem("事件记录") - .setGravityCenter(true) - .setOnSheetItemClickListener { dialog, _, position, _ -> - dialog?.dismiss() - when (position) { - 0 -> { - startActivity(Intent(this, InspectionQueryActivity::class.java)) - } - 1 -> { - startActivity(Intent(this, EventQueryActivity::class.java)) + .setChoiceItemButton(itemList) + .setOnDialogClickListener(object : SingleChoiceDialog.OnDialogItemClickListener { + override fun onItemClick(position: Int) { + when (position) { + 0 -> { + startActivity( + Intent( + this@MainActivity, + InspectionQueryActivity::class.java + ) + ) + } + 1 -> { + startActivity( + Intent( + this@MainActivity, + EventQueryActivity::class.java + ) + ) + } } } - }.build().show() + }) + .build().show() } //系统设置 settingsLayout.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt new file mode 100644 index 0000000..207f6c3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -0,0 +1,176 @@ +package com.casic.birmm.inspect.view + +import android.bluetooth.BluetoothAdapter +import android.graphics.Color +import android.os.Bundle +import android.os.Handler +import android.os.Message +import android.util.Log +import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContextCompat +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.model.MyLocationStyle +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.widgets.InputDialog +import com.gyf.immersionbar.ImmersionBar +import com.qmuiteam.qmui.util.QMUIStatusBarHelper +import kotlinx.android.synthetic.main.activity_inspect_route.mapView +import kotlinx.android.synthetic.main.activity_map.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.cancel +import java.lang.ref.WeakReference + + +class MapActivity : AppCompatActivity(), CoroutineScope by MainScope() { + + companion object { + private const val Tag = "MapActivity" + private lateinit var weakReferenceHandler: WeakReferenceHandler + + fun sendEmptyMessage(what: Int) { + weakReferenceHandler.sendEmptyMessage(what) + } + } + + private lateinit var aMap: AMap + private lateinit var locationStyle: MyLocationStyle + + init { + weakReferenceHandler = WeakReferenceHandler(this) + } + + private class WeakReferenceHandler(activity: MapActivity) : Handler() { + private val activity: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + val mainActivity = activity.get() ?: return + when (msg.what) { + Constant.BLUETOOTH_ON -> { + "蓝牙已开启".show(mainActivity) + mainActivity.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + } + Constant.BLUETOOTH_OFF -> { + "蓝牙已关闭".show(mainActivity) + mainActivity.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + } + Constant.DEVICE_CONNECTED -> { + //TODO 设备已连接 + } + Constant.DEVICE_DISCONNECTED -> { + //TODO 设备断开连接 + } + } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_map) + PageNavigationManager.addActivity(this) + setupTopBarLayout() + if (OtherUtils.isNetworkConnected(this)) { + initData(savedInstanceState) + initEvent() + } else { + "糟糕,没有接入任何网络~".show(this) + } + } + + fun setupTopBarLayout() { + QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "巡检" + } + + fun initData(savedInstanceState: Bundle?) { + mapView.onCreate(savedInstanceState) + aMap = mapView.map + val uiSettings = aMap.uiSettings + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 + //显示定位小蓝点 + locationStyle = MyLocationStyle() + locationStyle.showMyLocation(true)//设置是否显示定位小蓝点 + locationStyle.strokeColor(Color.parseColor("#A2DBFA"))//设置定位蓝点精度圆圈的边框颜色 + locationStyle.radiusFillColor(Color.parseColor("#A2DBFA"))//设置定位蓝点精度圆圈的填充颜色 + aMap.myLocationStyle = locationStyle + aMap.isMyLocationEnabled = true + aMap.addOnMyLocationChangeListener { + Log.d(Tag, "[" + it.longitude + "," + it.latitude + "]") + } + } + + fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //需要判断是否是上次未完的巡检 +// selectInspectMode() + + //判断蓝牙的状态 + val blueAdapter = BluetoothAdapter.getDefaultAdapter() + if (blueAdapter == null) { + "该设备不支持蓝牙,无法连接".show(this) + } else { + if (blueAdapter.isEnabled) { + bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + bluetoothButton.setOnClickListener { + //搜索蓝牙 + } + } else { + bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + //打开 + } + } + + newEventButton.setChangeAlphaWhenPress(true) + newEventButton.setOnClickListener { + + } + } + + private fun selectInspectMode() { + InputDialog.Builder().setContext(this) + .setTitle("请输入巡检标签") + .setHintText("如:xxx区间巡检") + .setNegativeButton("放弃") + .setPositiveButton("开始巡检") + .setOnDialogClickListener(object : InputDialog.OnDialogButtonClickListener { + override fun onConfirmClick(input: String) { + + } + + override fun onCancelClick() { + finish() + } + }) + .build().show() + } + + override fun onResume() { + super.onResume() + mapView.onResume() + } + + override fun onPause() { + super.onPause() + mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + cancel() + super.onDestroy() + mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt index cfa32dc..f2db4c9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt @@ -16,6 +16,7 @@ private var ctx: Context? = null private var title: String? = null + private var hint: String? = null private var value: String? = null private var positiveBtn: String? = null private var negativeBtn: String? = null @@ -24,6 +25,7 @@ init { this.ctx = builder.mContext this.title = builder.title + this.hint = builder.hint this.value = builder.value this.positiveBtn = builder.positiveBtn this.negativeBtn = builder.negativeBtn @@ -38,6 +40,7 @@ setCanceledOnTouchOutside(false) dialogTitleView.text = title + dialogInputView.hint = hint!! value.apply { dialogInputView.setText(this) } @@ -46,6 +49,7 @@ dialogCancelButton.setChangeAlphaWhenPress(true) dialogCancelButton.setOnClickListener { this.dismiss() + listener?.onCancelClick() } dialogConfirmButton.text = positiveBtn @@ -56,8 +60,8 @@ "什么都没输入,请重新输入".show(ctx!!) return@setOnClickListener } - listener?.onButtonClick(inputValue) this.dismiss() + listener?.onConfirmClick(inputValue) } } @@ -73,6 +77,7 @@ class Builder { var mContext: Context? = null var title: String? = null + var hint: String? = null var value: String? = null var positiveBtn: String? = null var negativeBtn: String? = null @@ -88,6 +93,11 @@ return this } + fun setHintText(hint: String?): Builder { + this.hint = hint + return this + } + fun setDefaultValue(value: String?): Builder { this.value = value return this @@ -114,6 +124,8 @@ } interface OnDialogButtonClickListener { - fun onButtonClick(input: String) + fun onCancelClick() + + fun onConfirmClick(input: String) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt new file mode 100644 index 0000000..216befd --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt @@ -0,0 +1,123 @@ +package com.casic.birmm.inspect.widgets + +import android.app.Dialog +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.WindowManager +import android.widget.BaseAdapter +import com.casic.birmm.inspect.R +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton +import kotlinx.android.synthetic.main.dialog_input.dialogTitleView +import kotlinx.android.synthetic.main.dialog_single_choice.* + + +class SingleChoiceDialog private constructor(builder: Builder) : Dialog(builder.mContext!!) { + + private var ctx: Context? = null + private var title: String? = null + private var items: List? = null + private var listener: OnDialogItemClickListener? = null + + init { + this.ctx = builder.mContext + this.title = builder.title + this.items = builder.items + this.listener = builder.listener + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + configDialogLayout() + setContentView(R.layout.dialog_single_choice) + setCancelable(true) + setCanceledOnTouchOutside(true) + + dialogTitleView.text = title + dialogListView.adapter = ItemChoiceAdapter() + } + + private fun configDialogLayout() { + window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + window?.decorView?.setBackgroundColor(Color.TRANSPARENT) + val params: WindowManager.LayoutParams? = window?.attributes + params?.width = QMUIDisplayHelper.dp2px(ctx, 220) + params?.height = WindowManager.LayoutParams.WRAP_CONTENT + window?.attributes = params + } + + inner class ItemChoiceAdapter : BaseAdapter() { + + private var inflater: LayoutInflater = LayoutInflater.from(ctx!!) + + override fun getCount(): Int = items!!.size + + override fun getItem(position: Int): Any = items!![position] + + override fun getItemId(position: Int): Long = position.toLong() + + override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { + val view: View + val itemViewHolder: ItemViewHolder + if (convertView == null) { + view = inflater.inflate(R.layout.item_dialog_listview, null)!! + itemViewHolder = ItemViewHolder(view) + view.tag = itemViewHolder + } else { + view = convertView + itemViewHolder = view.tag as ItemViewHolder + } + itemViewHolder.itemTagView.text = items!![position] + itemViewHolder.itemTagView.setChangeAlphaWhenPress(true) + itemViewHolder.itemTagView.setOnClickListener { + dismiss() + listener?.onItemClick(position) + } + return view + } + } + + class ItemViewHolder(v: View) { + var itemTagView: QMUIRoundButton = v.findViewById(R.id.itemTagView) + } + + class Builder { + var mContext: Context? = null + var title: String? = null + var items: List? = null + var listener: OnDialogItemClickListener? = null + + fun setContext(context: Context?): Builder { + mContext = context + return this + } + + fun setTitle(title: String?): Builder { + this.title = title + return this + } + + fun setChoiceItemButton(items: List?): Builder { + this.items = items + return this + } + + fun setOnDialogClickListener(listener: OnDialogItemClickListener): Builder { + this.listener = listener + return this + } + + fun build(): SingleChoiceDialog { + return SingleChoiceDialog(this) + } + } + + interface OnDialogItemClickListener { + fun onItemClick(position: Int) + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_image_button_layout.xml b/app/src/main/res/drawable/bg_image_button_layout.xml new file mode 100644 index 0000000..41a75be --- /dev/null +++ b/app/src/main/res/drawable/bg_image_button_layout.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_aim.xml b/app/src/main/res/drawable/ic_aim.xml new file mode 100644 index 0000000..88d9e36 --- /dev/null +++ b/app/src/main/res/drawable/ic_aim.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_bluetooth_disabled.xml b/app/src/main/res/drawable/ic_bluetooth_disabled.xml new file mode 100644 index 0000000..1a8526e --- /dev/null +++ b/app/src/main/res/drawable/ic_bluetooth_disabled.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7949d16..6a3f570 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,10 @@ + + + + @@ -48,6 +52,7 @@ android:theme="@style/Theme.BigImageActivity" /> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt new file mode 100644 index 0000000..b6b5281 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt @@ -0,0 +1,31 @@ +package com.casic.birmm.inspect.utils + +import android.bluetooth.BluetoothAdapter +import android.bluetooth.BluetoothDevice +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import com.casic.birmm.inspect.view.MapActivity + +class BluetoothStateBroadcastReceiver : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + when (intent?.action) { + BluetoothAdapter.ACTION_STATE_CHANGED -> { + when (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0)) { + BluetoothAdapter.STATE_OFF -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_OFF) + } + BluetoothAdapter.STATE_ON -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_ON) + } + } + } + BluetoothDevice.ACTION_ACL_CONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_CONNECTED) + } + BluetoothDevice.ACTION_ACL_DISCONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_DISCONNECTED) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 0ae38db..aef675a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -13,6 +13,10 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 15 + const val BLUETOOTH_ON = 20 + const val BLUETOOTH_OFF = 21 + const val DEVICE_CONNECTED = 22 + const val DEVICE_DISCONNECTED = 23 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt index 94d269e..c3b1e6b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -59,6 +59,7 @@ aMap = mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //根据id查询详情 id = intent.getStringExtra("id")!! @@ -120,6 +121,7 @@ } fun initEvent() { + leftBackView.setOnClickListener { this.finish() } eventButton.setChangeAlphaWhenPress(true) eventButton.setOnClickListener { val intent = Intent(this, EventListActivity::class.java) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 8ed4a0c..da4b03e 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -168,6 +168,5 @@ } } } - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 517203f..dddea49 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -132,9 +132,13 @@ .setNegativeButton("取消") .setPositiveButton("保存") .setOnDialogClickListener(object : InputDialog.OnDialogButtonClickListener { - override fun onButtonClick(input: String) { + override fun onConfirmClick(input: String) { SaveKeyValues.putValue(Constant.DEFAULT_SERVER_CONFIG, input) } + + override fun onCancelClick() { + + } }) .build().show() } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 4ef86d3..2db634f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -15,9 +15,9 @@ import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.utils.StatusBarColorUtil import com.casic.birmm.inspect.vm.UserViewModel +import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* @@ -25,6 +25,7 @@ class MainActivity : BaseActivity() { private var clickTime: Long = 0 + private val itemList: List = arrayListOf("巡检记录", "事件记录") override fun initLayoutView(): Int = R.layout.activity_main @@ -53,26 +54,37 @@ override fun initEvent() { //新建巡检 createIssueLayout.setOnClickListener { - + startActivity(Intent(this, MapActivity::class.java)) } //记录查询 logSearchLayout.setOnClickListener { - QMUIBottomSheet.BottomListSheetBuilder(this) + SingleChoiceDialog.Builder() + .setContext(this) .setTitle("选择记录类型") - .addItem("巡检记录") - .addItem("事件记录") - .setGravityCenter(true) - .setOnSheetItemClickListener { dialog, _, position, _ -> - dialog?.dismiss() - when (position) { - 0 -> { - startActivity(Intent(this, InspectionQueryActivity::class.java)) - } - 1 -> { - startActivity(Intent(this, EventQueryActivity::class.java)) + .setChoiceItemButton(itemList) + .setOnDialogClickListener(object : SingleChoiceDialog.OnDialogItemClickListener { + override fun onItemClick(position: Int) { + when (position) { + 0 -> { + startActivity( + Intent( + this@MainActivity, + InspectionQueryActivity::class.java + ) + ) + } + 1 -> { + startActivity( + Intent( + this@MainActivity, + EventQueryActivity::class.java + ) + ) + } } } - }.build().show() + }) + .build().show() } //系统设置 settingsLayout.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt new file mode 100644 index 0000000..207f6c3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -0,0 +1,176 @@ +package com.casic.birmm.inspect.view + +import android.bluetooth.BluetoothAdapter +import android.graphics.Color +import android.os.Bundle +import android.os.Handler +import android.os.Message +import android.util.Log +import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContextCompat +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.model.MyLocationStyle +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.widgets.InputDialog +import com.gyf.immersionbar.ImmersionBar +import com.qmuiteam.qmui.util.QMUIStatusBarHelper +import kotlinx.android.synthetic.main.activity_inspect_route.mapView +import kotlinx.android.synthetic.main.activity_map.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.cancel +import java.lang.ref.WeakReference + + +class MapActivity : AppCompatActivity(), CoroutineScope by MainScope() { + + companion object { + private const val Tag = "MapActivity" + private lateinit var weakReferenceHandler: WeakReferenceHandler + + fun sendEmptyMessage(what: Int) { + weakReferenceHandler.sendEmptyMessage(what) + } + } + + private lateinit var aMap: AMap + private lateinit var locationStyle: MyLocationStyle + + init { + weakReferenceHandler = WeakReferenceHandler(this) + } + + private class WeakReferenceHandler(activity: MapActivity) : Handler() { + private val activity: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + val mainActivity = activity.get() ?: return + when (msg.what) { + Constant.BLUETOOTH_ON -> { + "蓝牙已开启".show(mainActivity) + mainActivity.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + } + Constant.BLUETOOTH_OFF -> { + "蓝牙已关闭".show(mainActivity) + mainActivity.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + } + Constant.DEVICE_CONNECTED -> { + //TODO 设备已连接 + } + Constant.DEVICE_DISCONNECTED -> { + //TODO 设备断开连接 + } + } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_map) + PageNavigationManager.addActivity(this) + setupTopBarLayout() + if (OtherUtils.isNetworkConnected(this)) { + initData(savedInstanceState) + initEvent() + } else { + "糟糕,没有接入任何网络~".show(this) + } + } + + fun setupTopBarLayout() { + QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "巡检" + } + + fun initData(savedInstanceState: Bundle?) { + mapView.onCreate(savedInstanceState) + aMap = mapView.map + val uiSettings = aMap.uiSettings + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 + //显示定位小蓝点 + locationStyle = MyLocationStyle() + locationStyle.showMyLocation(true)//设置是否显示定位小蓝点 + locationStyle.strokeColor(Color.parseColor("#A2DBFA"))//设置定位蓝点精度圆圈的边框颜色 + locationStyle.radiusFillColor(Color.parseColor("#A2DBFA"))//设置定位蓝点精度圆圈的填充颜色 + aMap.myLocationStyle = locationStyle + aMap.isMyLocationEnabled = true + aMap.addOnMyLocationChangeListener { + Log.d(Tag, "[" + it.longitude + "," + it.latitude + "]") + } + } + + fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //需要判断是否是上次未完的巡检 +// selectInspectMode() + + //判断蓝牙的状态 + val blueAdapter = BluetoothAdapter.getDefaultAdapter() + if (blueAdapter == null) { + "该设备不支持蓝牙,无法连接".show(this) + } else { + if (blueAdapter.isEnabled) { + bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + bluetoothButton.setOnClickListener { + //搜索蓝牙 + } + } else { + bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + //打开 + } + } + + newEventButton.setChangeAlphaWhenPress(true) + newEventButton.setOnClickListener { + + } + } + + private fun selectInspectMode() { + InputDialog.Builder().setContext(this) + .setTitle("请输入巡检标签") + .setHintText("如:xxx区间巡检") + .setNegativeButton("放弃") + .setPositiveButton("开始巡检") + .setOnDialogClickListener(object : InputDialog.OnDialogButtonClickListener { + override fun onConfirmClick(input: String) { + + } + + override fun onCancelClick() { + finish() + } + }) + .build().show() + } + + override fun onResume() { + super.onResume() + mapView.onResume() + } + + override fun onPause() { + super.onPause() + mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + cancel() + super.onDestroy() + mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt index cfa32dc..f2db4c9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt @@ -16,6 +16,7 @@ private var ctx: Context? = null private var title: String? = null + private var hint: String? = null private var value: String? = null private var positiveBtn: String? = null private var negativeBtn: String? = null @@ -24,6 +25,7 @@ init { this.ctx = builder.mContext this.title = builder.title + this.hint = builder.hint this.value = builder.value this.positiveBtn = builder.positiveBtn this.negativeBtn = builder.negativeBtn @@ -38,6 +40,7 @@ setCanceledOnTouchOutside(false) dialogTitleView.text = title + dialogInputView.hint = hint!! value.apply { dialogInputView.setText(this) } @@ -46,6 +49,7 @@ dialogCancelButton.setChangeAlphaWhenPress(true) dialogCancelButton.setOnClickListener { this.dismiss() + listener?.onCancelClick() } dialogConfirmButton.text = positiveBtn @@ -56,8 +60,8 @@ "什么都没输入,请重新输入".show(ctx!!) return@setOnClickListener } - listener?.onButtonClick(inputValue) this.dismiss() + listener?.onConfirmClick(inputValue) } } @@ -73,6 +77,7 @@ class Builder { var mContext: Context? = null var title: String? = null + var hint: String? = null var value: String? = null var positiveBtn: String? = null var negativeBtn: String? = null @@ -88,6 +93,11 @@ return this } + fun setHintText(hint: String?): Builder { + this.hint = hint + return this + } + fun setDefaultValue(value: String?): Builder { this.value = value return this @@ -114,6 +124,8 @@ } interface OnDialogButtonClickListener { - fun onButtonClick(input: String) + fun onCancelClick() + + fun onConfirmClick(input: String) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt new file mode 100644 index 0000000..216befd --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt @@ -0,0 +1,123 @@ +package com.casic.birmm.inspect.widgets + +import android.app.Dialog +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.WindowManager +import android.widget.BaseAdapter +import com.casic.birmm.inspect.R +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton +import kotlinx.android.synthetic.main.dialog_input.dialogTitleView +import kotlinx.android.synthetic.main.dialog_single_choice.* + + +class SingleChoiceDialog private constructor(builder: Builder) : Dialog(builder.mContext!!) { + + private var ctx: Context? = null + private var title: String? = null + private var items: List? = null + private var listener: OnDialogItemClickListener? = null + + init { + this.ctx = builder.mContext + this.title = builder.title + this.items = builder.items + this.listener = builder.listener + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + configDialogLayout() + setContentView(R.layout.dialog_single_choice) + setCancelable(true) + setCanceledOnTouchOutside(true) + + dialogTitleView.text = title + dialogListView.adapter = ItemChoiceAdapter() + } + + private fun configDialogLayout() { + window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + window?.decorView?.setBackgroundColor(Color.TRANSPARENT) + val params: WindowManager.LayoutParams? = window?.attributes + params?.width = QMUIDisplayHelper.dp2px(ctx, 220) + params?.height = WindowManager.LayoutParams.WRAP_CONTENT + window?.attributes = params + } + + inner class ItemChoiceAdapter : BaseAdapter() { + + private var inflater: LayoutInflater = LayoutInflater.from(ctx!!) + + override fun getCount(): Int = items!!.size + + override fun getItem(position: Int): Any = items!![position] + + override fun getItemId(position: Int): Long = position.toLong() + + override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { + val view: View + val itemViewHolder: ItemViewHolder + if (convertView == null) { + view = inflater.inflate(R.layout.item_dialog_listview, null)!! + itemViewHolder = ItemViewHolder(view) + view.tag = itemViewHolder + } else { + view = convertView + itemViewHolder = view.tag as ItemViewHolder + } + itemViewHolder.itemTagView.text = items!![position] + itemViewHolder.itemTagView.setChangeAlphaWhenPress(true) + itemViewHolder.itemTagView.setOnClickListener { + dismiss() + listener?.onItemClick(position) + } + return view + } + } + + class ItemViewHolder(v: View) { + var itemTagView: QMUIRoundButton = v.findViewById(R.id.itemTagView) + } + + class Builder { + var mContext: Context? = null + var title: String? = null + var items: List? = null + var listener: OnDialogItemClickListener? = null + + fun setContext(context: Context?): Builder { + mContext = context + return this + } + + fun setTitle(title: String?): Builder { + this.title = title + return this + } + + fun setChoiceItemButton(items: List?): Builder { + this.items = items + return this + } + + fun setOnDialogClickListener(listener: OnDialogItemClickListener): Builder { + this.listener = listener + return this + } + + fun build(): SingleChoiceDialog { + return SingleChoiceDialog(this) + } + } + + interface OnDialogItemClickListener { + fun onItemClick(position: Int) + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_image_button_layout.xml b/app/src/main/res/drawable/bg_image_button_layout.xml new file mode 100644 index 0000000..41a75be --- /dev/null +++ b/app/src/main/res/drawable/bg_image_button_layout.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_aim.xml b/app/src/main/res/drawable/ic_aim.xml new file mode 100644 index 0000000..88d9e36 --- /dev/null +++ b/app/src/main/res/drawable/ic_aim.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_bluetooth_disabled.xml b/app/src/main/res/drawable/ic_bluetooth_disabled.xml new file mode 100644 index 0000000..1a8526e --- /dev/null +++ b/app/src/main/res/drawable/ic_bluetooth_disabled.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_bluetooth_empty.xml b/app/src/main/res/drawable/ic_bluetooth_empty.xml new file mode 100644 index 0000000..477d2bb --- /dev/null +++ b/app/src/main/res/drawable/ic_bluetooth_empty.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7949d16..6a3f570 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,10 @@ + + + + @@ -48,6 +52,7 @@ android:theme="@style/Theme.BigImageActivity" /> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt new file mode 100644 index 0000000..b6b5281 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt @@ -0,0 +1,31 @@ +package com.casic.birmm.inspect.utils + +import android.bluetooth.BluetoothAdapter +import android.bluetooth.BluetoothDevice +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import com.casic.birmm.inspect.view.MapActivity + +class BluetoothStateBroadcastReceiver : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + when (intent?.action) { + BluetoothAdapter.ACTION_STATE_CHANGED -> { + when (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0)) { + BluetoothAdapter.STATE_OFF -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_OFF) + } + BluetoothAdapter.STATE_ON -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_ON) + } + } + } + BluetoothDevice.ACTION_ACL_CONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_CONNECTED) + } + BluetoothDevice.ACTION_ACL_DISCONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_DISCONNECTED) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 0ae38db..aef675a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -13,6 +13,10 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 15 + const val BLUETOOTH_ON = 20 + const val BLUETOOTH_OFF = 21 + const val DEVICE_CONNECTED = 22 + const val DEVICE_DISCONNECTED = 23 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt index 94d269e..c3b1e6b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -59,6 +59,7 @@ aMap = mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //根据id查询详情 id = intent.getStringExtra("id")!! @@ -120,6 +121,7 @@ } fun initEvent() { + leftBackView.setOnClickListener { this.finish() } eventButton.setChangeAlphaWhenPress(true) eventButton.setOnClickListener { val intent = Intent(this, EventListActivity::class.java) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 8ed4a0c..da4b03e 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -168,6 +168,5 @@ } } } - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 517203f..dddea49 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -132,9 +132,13 @@ .setNegativeButton("取消") .setPositiveButton("保存") .setOnDialogClickListener(object : InputDialog.OnDialogButtonClickListener { - override fun onButtonClick(input: String) { + override fun onConfirmClick(input: String) { SaveKeyValues.putValue(Constant.DEFAULT_SERVER_CONFIG, input) } + + override fun onCancelClick() { + + } }) .build().show() } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 4ef86d3..2db634f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -15,9 +15,9 @@ import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.utils.StatusBarColorUtil import com.casic.birmm.inspect.vm.UserViewModel +import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* @@ -25,6 +25,7 @@ class MainActivity : BaseActivity() { private var clickTime: Long = 0 + private val itemList: List = arrayListOf("巡检记录", "事件记录") override fun initLayoutView(): Int = R.layout.activity_main @@ -53,26 +54,37 @@ override fun initEvent() { //新建巡检 createIssueLayout.setOnClickListener { - + startActivity(Intent(this, MapActivity::class.java)) } //记录查询 logSearchLayout.setOnClickListener { - QMUIBottomSheet.BottomListSheetBuilder(this) + SingleChoiceDialog.Builder() + .setContext(this) .setTitle("选择记录类型") - .addItem("巡检记录") - .addItem("事件记录") - .setGravityCenter(true) - .setOnSheetItemClickListener { dialog, _, position, _ -> - dialog?.dismiss() - when (position) { - 0 -> { - startActivity(Intent(this, InspectionQueryActivity::class.java)) - } - 1 -> { - startActivity(Intent(this, EventQueryActivity::class.java)) + .setChoiceItemButton(itemList) + .setOnDialogClickListener(object : SingleChoiceDialog.OnDialogItemClickListener { + override fun onItemClick(position: Int) { + when (position) { + 0 -> { + startActivity( + Intent( + this@MainActivity, + InspectionQueryActivity::class.java + ) + ) + } + 1 -> { + startActivity( + Intent( + this@MainActivity, + EventQueryActivity::class.java + ) + ) + } } } - }.build().show() + }) + .build().show() } //系统设置 settingsLayout.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt new file mode 100644 index 0000000..207f6c3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -0,0 +1,176 @@ +package com.casic.birmm.inspect.view + +import android.bluetooth.BluetoothAdapter +import android.graphics.Color +import android.os.Bundle +import android.os.Handler +import android.os.Message +import android.util.Log +import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContextCompat +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.model.MyLocationStyle +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.widgets.InputDialog +import com.gyf.immersionbar.ImmersionBar +import com.qmuiteam.qmui.util.QMUIStatusBarHelper +import kotlinx.android.synthetic.main.activity_inspect_route.mapView +import kotlinx.android.synthetic.main.activity_map.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.cancel +import java.lang.ref.WeakReference + + +class MapActivity : AppCompatActivity(), CoroutineScope by MainScope() { + + companion object { + private const val Tag = "MapActivity" + private lateinit var weakReferenceHandler: WeakReferenceHandler + + fun sendEmptyMessage(what: Int) { + weakReferenceHandler.sendEmptyMessage(what) + } + } + + private lateinit var aMap: AMap + private lateinit var locationStyle: MyLocationStyle + + init { + weakReferenceHandler = WeakReferenceHandler(this) + } + + private class WeakReferenceHandler(activity: MapActivity) : Handler() { + private val activity: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + val mainActivity = activity.get() ?: return + when (msg.what) { + Constant.BLUETOOTH_ON -> { + "蓝牙已开启".show(mainActivity) + mainActivity.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + } + Constant.BLUETOOTH_OFF -> { + "蓝牙已关闭".show(mainActivity) + mainActivity.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + } + Constant.DEVICE_CONNECTED -> { + //TODO 设备已连接 + } + Constant.DEVICE_DISCONNECTED -> { + //TODO 设备断开连接 + } + } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_map) + PageNavigationManager.addActivity(this) + setupTopBarLayout() + if (OtherUtils.isNetworkConnected(this)) { + initData(savedInstanceState) + initEvent() + } else { + "糟糕,没有接入任何网络~".show(this) + } + } + + fun setupTopBarLayout() { + QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "巡检" + } + + fun initData(savedInstanceState: Bundle?) { + mapView.onCreate(savedInstanceState) + aMap = mapView.map + val uiSettings = aMap.uiSettings + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 + //显示定位小蓝点 + locationStyle = MyLocationStyle() + locationStyle.showMyLocation(true)//设置是否显示定位小蓝点 + locationStyle.strokeColor(Color.parseColor("#A2DBFA"))//设置定位蓝点精度圆圈的边框颜色 + locationStyle.radiusFillColor(Color.parseColor("#A2DBFA"))//设置定位蓝点精度圆圈的填充颜色 + aMap.myLocationStyle = locationStyle + aMap.isMyLocationEnabled = true + aMap.addOnMyLocationChangeListener { + Log.d(Tag, "[" + it.longitude + "," + it.latitude + "]") + } + } + + fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //需要判断是否是上次未完的巡检 +// selectInspectMode() + + //判断蓝牙的状态 + val blueAdapter = BluetoothAdapter.getDefaultAdapter() + if (blueAdapter == null) { + "该设备不支持蓝牙,无法连接".show(this) + } else { + if (blueAdapter.isEnabled) { + bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + bluetoothButton.setOnClickListener { + //搜索蓝牙 + } + } else { + bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + //打开 + } + } + + newEventButton.setChangeAlphaWhenPress(true) + newEventButton.setOnClickListener { + + } + } + + private fun selectInspectMode() { + InputDialog.Builder().setContext(this) + .setTitle("请输入巡检标签") + .setHintText("如:xxx区间巡检") + .setNegativeButton("放弃") + .setPositiveButton("开始巡检") + .setOnDialogClickListener(object : InputDialog.OnDialogButtonClickListener { + override fun onConfirmClick(input: String) { + + } + + override fun onCancelClick() { + finish() + } + }) + .build().show() + } + + override fun onResume() { + super.onResume() + mapView.onResume() + } + + override fun onPause() { + super.onPause() + mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + cancel() + super.onDestroy() + mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt index cfa32dc..f2db4c9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt @@ -16,6 +16,7 @@ private var ctx: Context? = null private var title: String? = null + private var hint: String? = null private var value: String? = null private var positiveBtn: String? = null private var negativeBtn: String? = null @@ -24,6 +25,7 @@ init { this.ctx = builder.mContext this.title = builder.title + this.hint = builder.hint this.value = builder.value this.positiveBtn = builder.positiveBtn this.negativeBtn = builder.negativeBtn @@ -38,6 +40,7 @@ setCanceledOnTouchOutside(false) dialogTitleView.text = title + dialogInputView.hint = hint!! value.apply { dialogInputView.setText(this) } @@ -46,6 +49,7 @@ dialogCancelButton.setChangeAlphaWhenPress(true) dialogCancelButton.setOnClickListener { this.dismiss() + listener?.onCancelClick() } dialogConfirmButton.text = positiveBtn @@ -56,8 +60,8 @@ "什么都没输入,请重新输入".show(ctx!!) return@setOnClickListener } - listener?.onButtonClick(inputValue) this.dismiss() + listener?.onConfirmClick(inputValue) } } @@ -73,6 +77,7 @@ class Builder { var mContext: Context? = null var title: String? = null + var hint: String? = null var value: String? = null var positiveBtn: String? = null var negativeBtn: String? = null @@ -88,6 +93,11 @@ return this } + fun setHintText(hint: String?): Builder { + this.hint = hint + return this + } + fun setDefaultValue(value: String?): Builder { this.value = value return this @@ -114,6 +124,8 @@ } interface OnDialogButtonClickListener { - fun onButtonClick(input: String) + fun onCancelClick() + + fun onConfirmClick(input: String) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt new file mode 100644 index 0000000..216befd --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt @@ -0,0 +1,123 @@ +package com.casic.birmm.inspect.widgets + +import android.app.Dialog +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.WindowManager +import android.widget.BaseAdapter +import com.casic.birmm.inspect.R +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton +import kotlinx.android.synthetic.main.dialog_input.dialogTitleView +import kotlinx.android.synthetic.main.dialog_single_choice.* + + +class SingleChoiceDialog private constructor(builder: Builder) : Dialog(builder.mContext!!) { + + private var ctx: Context? = null + private var title: String? = null + private var items: List? = null + private var listener: OnDialogItemClickListener? = null + + init { + this.ctx = builder.mContext + this.title = builder.title + this.items = builder.items + this.listener = builder.listener + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + configDialogLayout() + setContentView(R.layout.dialog_single_choice) + setCancelable(true) + setCanceledOnTouchOutside(true) + + dialogTitleView.text = title + dialogListView.adapter = ItemChoiceAdapter() + } + + private fun configDialogLayout() { + window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + window?.decorView?.setBackgroundColor(Color.TRANSPARENT) + val params: WindowManager.LayoutParams? = window?.attributes + params?.width = QMUIDisplayHelper.dp2px(ctx, 220) + params?.height = WindowManager.LayoutParams.WRAP_CONTENT + window?.attributes = params + } + + inner class ItemChoiceAdapter : BaseAdapter() { + + private var inflater: LayoutInflater = LayoutInflater.from(ctx!!) + + override fun getCount(): Int = items!!.size + + override fun getItem(position: Int): Any = items!![position] + + override fun getItemId(position: Int): Long = position.toLong() + + override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { + val view: View + val itemViewHolder: ItemViewHolder + if (convertView == null) { + view = inflater.inflate(R.layout.item_dialog_listview, null)!! + itemViewHolder = ItemViewHolder(view) + view.tag = itemViewHolder + } else { + view = convertView + itemViewHolder = view.tag as ItemViewHolder + } + itemViewHolder.itemTagView.text = items!![position] + itemViewHolder.itemTagView.setChangeAlphaWhenPress(true) + itemViewHolder.itemTagView.setOnClickListener { + dismiss() + listener?.onItemClick(position) + } + return view + } + } + + class ItemViewHolder(v: View) { + var itemTagView: QMUIRoundButton = v.findViewById(R.id.itemTagView) + } + + class Builder { + var mContext: Context? = null + var title: String? = null + var items: List? = null + var listener: OnDialogItemClickListener? = null + + fun setContext(context: Context?): Builder { + mContext = context + return this + } + + fun setTitle(title: String?): Builder { + this.title = title + return this + } + + fun setChoiceItemButton(items: List?): Builder { + this.items = items + return this + } + + fun setOnDialogClickListener(listener: OnDialogItemClickListener): Builder { + this.listener = listener + return this + } + + fun build(): SingleChoiceDialog { + return SingleChoiceDialog(this) + } + } + + interface OnDialogItemClickListener { + fun onItemClick(position: Int) + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_image_button_layout.xml b/app/src/main/res/drawable/bg_image_button_layout.xml new file mode 100644 index 0000000..41a75be --- /dev/null +++ b/app/src/main/res/drawable/bg_image_button_layout.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_aim.xml b/app/src/main/res/drawable/ic_aim.xml new file mode 100644 index 0000000..88d9e36 --- /dev/null +++ b/app/src/main/res/drawable/ic_aim.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_bluetooth_disabled.xml b/app/src/main/res/drawable/ic_bluetooth_disabled.xml new file mode 100644 index 0000000..1a8526e --- /dev/null +++ b/app/src/main/res/drawable/ic_bluetooth_disabled.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_bluetooth_empty.xml b/app/src/main/res/drawable/ic_bluetooth_empty.xml new file mode 100644 index 0000000..477d2bb --- /dev/null +++ b/app/src/main/res/drawable/ic_bluetooth_empty.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_bluetooth_enable.xml b/app/src/main/res/drawable/ic_bluetooth_enable.xml new file mode 100644 index 0000000..d60b5ae --- /dev/null +++ b/app/src/main/res/drawable/ic_bluetooth_enable.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7949d16..6a3f570 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,10 @@ + + + + @@ -48,6 +52,7 @@ android:theme="@style/Theme.BigImageActivity" /> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt new file mode 100644 index 0000000..b6b5281 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt @@ -0,0 +1,31 @@ +package com.casic.birmm.inspect.utils + +import android.bluetooth.BluetoothAdapter +import android.bluetooth.BluetoothDevice +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import com.casic.birmm.inspect.view.MapActivity + +class BluetoothStateBroadcastReceiver : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + when (intent?.action) { + BluetoothAdapter.ACTION_STATE_CHANGED -> { + when (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0)) { + BluetoothAdapter.STATE_OFF -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_OFF) + } + BluetoothAdapter.STATE_ON -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_ON) + } + } + } + BluetoothDevice.ACTION_ACL_CONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_CONNECTED) + } + BluetoothDevice.ACTION_ACL_DISCONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_DISCONNECTED) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 0ae38db..aef675a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -13,6 +13,10 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 15 + const val BLUETOOTH_ON = 20 + const val BLUETOOTH_OFF = 21 + const val DEVICE_CONNECTED = 22 + const val DEVICE_DISCONNECTED = 23 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt index 94d269e..c3b1e6b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -59,6 +59,7 @@ aMap = mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //根据id查询详情 id = intent.getStringExtra("id")!! @@ -120,6 +121,7 @@ } fun initEvent() { + leftBackView.setOnClickListener { this.finish() } eventButton.setChangeAlphaWhenPress(true) eventButton.setOnClickListener { val intent = Intent(this, EventListActivity::class.java) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 8ed4a0c..da4b03e 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -168,6 +168,5 @@ } } } - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 517203f..dddea49 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -132,9 +132,13 @@ .setNegativeButton("取消") .setPositiveButton("保存") .setOnDialogClickListener(object : InputDialog.OnDialogButtonClickListener { - override fun onButtonClick(input: String) { + override fun onConfirmClick(input: String) { SaveKeyValues.putValue(Constant.DEFAULT_SERVER_CONFIG, input) } + + override fun onCancelClick() { + + } }) .build().show() } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 4ef86d3..2db634f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -15,9 +15,9 @@ import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.utils.StatusBarColorUtil import com.casic.birmm.inspect.vm.UserViewModel +import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* @@ -25,6 +25,7 @@ class MainActivity : BaseActivity() { private var clickTime: Long = 0 + private val itemList: List = arrayListOf("巡检记录", "事件记录") override fun initLayoutView(): Int = R.layout.activity_main @@ -53,26 +54,37 @@ override fun initEvent() { //新建巡检 createIssueLayout.setOnClickListener { - + startActivity(Intent(this, MapActivity::class.java)) } //记录查询 logSearchLayout.setOnClickListener { - QMUIBottomSheet.BottomListSheetBuilder(this) + SingleChoiceDialog.Builder() + .setContext(this) .setTitle("选择记录类型") - .addItem("巡检记录") - .addItem("事件记录") - .setGravityCenter(true) - .setOnSheetItemClickListener { dialog, _, position, _ -> - dialog?.dismiss() - when (position) { - 0 -> { - startActivity(Intent(this, InspectionQueryActivity::class.java)) - } - 1 -> { - startActivity(Intent(this, EventQueryActivity::class.java)) + .setChoiceItemButton(itemList) + .setOnDialogClickListener(object : SingleChoiceDialog.OnDialogItemClickListener { + override fun onItemClick(position: Int) { + when (position) { + 0 -> { + startActivity( + Intent( + this@MainActivity, + InspectionQueryActivity::class.java + ) + ) + } + 1 -> { + startActivity( + Intent( + this@MainActivity, + EventQueryActivity::class.java + ) + ) + } } } - }.build().show() + }) + .build().show() } //系统设置 settingsLayout.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt new file mode 100644 index 0000000..207f6c3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -0,0 +1,176 @@ +package com.casic.birmm.inspect.view + +import android.bluetooth.BluetoothAdapter +import android.graphics.Color +import android.os.Bundle +import android.os.Handler +import android.os.Message +import android.util.Log +import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContextCompat +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.model.MyLocationStyle +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.widgets.InputDialog +import com.gyf.immersionbar.ImmersionBar +import com.qmuiteam.qmui.util.QMUIStatusBarHelper +import kotlinx.android.synthetic.main.activity_inspect_route.mapView +import kotlinx.android.synthetic.main.activity_map.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.cancel +import java.lang.ref.WeakReference + + +class MapActivity : AppCompatActivity(), CoroutineScope by MainScope() { + + companion object { + private const val Tag = "MapActivity" + private lateinit var weakReferenceHandler: WeakReferenceHandler + + fun sendEmptyMessage(what: Int) { + weakReferenceHandler.sendEmptyMessage(what) + } + } + + private lateinit var aMap: AMap + private lateinit var locationStyle: MyLocationStyle + + init { + weakReferenceHandler = WeakReferenceHandler(this) + } + + private class WeakReferenceHandler(activity: MapActivity) : Handler() { + private val activity: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + val mainActivity = activity.get() ?: return + when (msg.what) { + Constant.BLUETOOTH_ON -> { + "蓝牙已开启".show(mainActivity) + mainActivity.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + } + Constant.BLUETOOTH_OFF -> { + "蓝牙已关闭".show(mainActivity) + mainActivity.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + } + Constant.DEVICE_CONNECTED -> { + //TODO 设备已连接 + } + Constant.DEVICE_DISCONNECTED -> { + //TODO 设备断开连接 + } + } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_map) + PageNavigationManager.addActivity(this) + setupTopBarLayout() + if (OtherUtils.isNetworkConnected(this)) { + initData(savedInstanceState) + initEvent() + } else { + "糟糕,没有接入任何网络~".show(this) + } + } + + fun setupTopBarLayout() { + QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "巡检" + } + + fun initData(savedInstanceState: Bundle?) { + mapView.onCreate(savedInstanceState) + aMap = mapView.map + val uiSettings = aMap.uiSettings + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 + //显示定位小蓝点 + locationStyle = MyLocationStyle() + locationStyle.showMyLocation(true)//设置是否显示定位小蓝点 + locationStyle.strokeColor(Color.parseColor("#A2DBFA"))//设置定位蓝点精度圆圈的边框颜色 + locationStyle.radiusFillColor(Color.parseColor("#A2DBFA"))//设置定位蓝点精度圆圈的填充颜色 + aMap.myLocationStyle = locationStyle + aMap.isMyLocationEnabled = true + aMap.addOnMyLocationChangeListener { + Log.d(Tag, "[" + it.longitude + "," + it.latitude + "]") + } + } + + fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //需要判断是否是上次未完的巡检 +// selectInspectMode() + + //判断蓝牙的状态 + val blueAdapter = BluetoothAdapter.getDefaultAdapter() + if (blueAdapter == null) { + "该设备不支持蓝牙,无法连接".show(this) + } else { + if (blueAdapter.isEnabled) { + bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + bluetoothButton.setOnClickListener { + //搜索蓝牙 + } + } else { + bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + //打开 + } + } + + newEventButton.setChangeAlphaWhenPress(true) + newEventButton.setOnClickListener { + + } + } + + private fun selectInspectMode() { + InputDialog.Builder().setContext(this) + .setTitle("请输入巡检标签") + .setHintText("如:xxx区间巡检") + .setNegativeButton("放弃") + .setPositiveButton("开始巡检") + .setOnDialogClickListener(object : InputDialog.OnDialogButtonClickListener { + override fun onConfirmClick(input: String) { + + } + + override fun onCancelClick() { + finish() + } + }) + .build().show() + } + + override fun onResume() { + super.onResume() + mapView.onResume() + } + + override fun onPause() { + super.onPause() + mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + cancel() + super.onDestroy() + mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt index cfa32dc..f2db4c9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt @@ -16,6 +16,7 @@ private var ctx: Context? = null private var title: String? = null + private var hint: String? = null private var value: String? = null private var positiveBtn: String? = null private var negativeBtn: String? = null @@ -24,6 +25,7 @@ init { this.ctx = builder.mContext this.title = builder.title + this.hint = builder.hint this.value = builder.value this.positiveBtn = builder.positiveBtn this.negativeBtn = builder.negativeBtn @@ -38,6 +40,7 @@ setCanceledOnTouchOutside(false) dialogTitleView.text = title + dialogInputView.hint = hint!! value.apply { dialogInputView.setText(this) } @@ -46,6 +49,7 @@ dialogCancelButton.setChangeAlphaWhenPress(true) dialogCancelButton.setOnClickListener { this.dismiss() + listener?.onCancelClick() } dialogConfirmButton.text = positiveBtn @@ -56,8 +60,8 @@ "什么都没输入,请重新输入".show(ctx!!) return@setOnClickListener } - listener?.onButtonClick(inputValue) this.dismiss() + listener?.onConfirmClick(inputValue) } } @@ -73,6 +77,7 @@ class Builder { var mContext: Context? = null var title: String? = null + var hint: String? = null var value: String? = null var positiveBtn: String? = null var negativeBtn: String? = null @@ -88,6 +93,11 @@ return this } + fun setHintText(hint: String?): Builder { + this.hint = hint + return this + } + fun setDefaultValue(value: String?): Builder { this.value = value return this @@ -114,6 +124,8 @@ } interface OnDialogButtonClickListener { - fun onButtonClick(input: String) + fun onCancelClick() + + fun onConfirmClick(input: String) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt new file mode 100644 index 0000000..216befd --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt @@ -0,0 +1,123 @@ +package com.casic.birmm.inspect.widgets + +import android.app.Dialog +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.WindowManager +import android.widget.BaseAdapter +import com.casic.birmm.inspect.R +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton +import kotlinx.android.synthetic.main.dialog_input.dialogTitleView +import kotlinx.android.synthetic.main.dialog_single_choice.* + + +class SingleChoiceDialog private constructor(builder: Builder) : Dialog(builder.mContext!!) { + + private var ctx: Context? = null + private var title: String? = null + private var items: List? = null + private var listener: OnDialogItemClickListener? = null + + init { + this.ctx = builder.mContext + this.title = builder.title + this.items = builder.items + this.listener = builder.listener + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + configDialogLayout() + setContentView(R.layout.dialog_single_choice) + setCancelable(true) + setCanceledOnTouchOutside(true) + + dialogTitleView.text = title + dialogListView.adapter = ItemChoiceAdapter() + } + + private fun configDialogLayout() { + window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + window?.decorView?.setBackgroundColor(Color.TRANSPARENT) + val params: WindowManager.LayoutParams? = window?.attributes + params?.width = QMUIDisplayHelper.dp2px(ctx, 220) + params?.height = WindowManager.LayoutParams.WRAP_CONTENT + window?.attributes = params + } + + inner class ItemChoiceAdapter : BaseAdapter() { + + private var inflater: LayoutInflater = LayoutInflater.from(ctx!!) + + override fun getCount(): Int = items!!.size + + override fun getItem(position: Int): Any = items!![position] + + override fun getItemId(position: Int): Long = position.toLong() + + override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { + val view: View + val itemViewHolder: ItemViewHolder + if (convertView == null) { + view = inflater.inflate(R.layout.item_dialog_listview, null)!! + itemViewHolder = ItemViewHolder(view) + view.tag = itemViewHolder + } else { + view = convertView + itemViewHolder = view.tag as ItemViewHolder + } + itemViewHolder.itemTagView.text = items!![position] + itemViewHolder.itemTagView.setChangeAlphaWhenPress(true) + itemViewHolder.itemTagView.setOnClickListener { + dismiss() + listener?.onItemClick(position) + } + return view + } + } + + class ItemViewHolder(v: View) { + var itemTagView: QMUIRoundButton = v.findViewById(R.id.itemTagView) + } + + class Builder { + var mContext: Context? = null + var title: String? = null + var items: List? = null + var listener: OnDialogItemClickListener? = null + + fun setContext(context: Context?): Builder { + mContext = context + return this + } + + fun setTitle(title: String?): Builder { + this.title = title + return this + } + + fun setChoiceItemButton(items: List?): Builder { + this.items = items + return this + } + + fun setOnDialogClickListener(listener: OnDialogItemClickListener): Builder { + this.listener = listener + return this + } + + fun build(): SingleChoiceDialog { + return SingleChoiceDialog(this) + } + } + + interface OnDialogItemClickListener { + fun onItemClick(position: Int) + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_image_button_layout.xml b/app/src/main/res/drawable/bg_image_button_layout.xml new file mode 100644 index 0000000..41a75be --- /dev/null +++ b/app/src/main/res/drawable/bg_image_button_layout.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_aim.xml b/app/src/main/res/drawable/ic_aim.xml new file mode 100644 index 0000000..88d9e36 --- /dev/null +++ b/app/src/main/res/drawable/ic_aim.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_bluetooth_disabled.xml b/app/src/main/res/drawable/ic_bluetooth_disabled.xml new file mode 100644 index 0000000..1a8526e --- /dev/null +++ b/app/src/main/res/drawable/ic_bluetooth_disabled.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_bluetooth_empty.xml b/app/src/main/res/drawable/ic_bluetooth_empty.xml new file mode 100644 index 0000000..477d2bb --- /dev/null +++ b/app/src/main/res/drawable/ic_bluetooth_empty.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_bluetooth_enable.xml b/app/src/main/res/drawable/ic_bluetooth_enable.xml new file mode 100644 index 0000000..d60b5ae --- /dev/null +++ b/app/src/main/res/drawable/ic_bluetooth_enable.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_off.xml b/app/src/main/res/drawable/ic_off.xml new file mode 100644 index 0000000..4ed867e --- /dev/null +++ b/app/src/main/res/drawable/ic_off.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7949d16..6a3f570 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,10 @@ + + + + @@ -48,6 +52,7 @@ android:theme="@style/Theme.BigImageActivity" /> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt new file mode 100644 index 0000000..b6b5281 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt @@ -0,0 +1,31 @@ +package com.casic.birmm.inspect.utils + +import android.bluetooth.BluetoothAdapter +import android.bluetooth.BluetoothDevice +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import com.casic.birmm.inspect.view.MapActivity + +class BluetoothStateBroadcastReceiver : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + when (intent?.action) { + BluetoothAdapter.ACTION_STATE_CHANGED -> { + when (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0)) { + BluetoothAdapter.STATE_OFF -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_OFF) + } + BluetoothAdapter.STATE_ON -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_ON) + } + } + } + BluetoothDevice.ACTION_ACL_CONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_CONNECTED) + } + BluetoothDevice.ACTION_ACL_DISCONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_DISCONNECTED) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 0ae38db..aef675a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -13,6 +13,10 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 15 + const val BLUETOOTH_ON = 20 + const val BLUETOOTH_OFF = 21 + const val DEVICE_CONNECTED = 22 + const val DEVICE_DISCONNECTED = 23 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt index 94d269e..c3b1e6b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -59,6 +59,7 @@ aMap = mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //根据id查询详情 id = intent.getStringExtra("id")!! @@ -120,6 +121,7 @@ } fun initEvent() { + leftBackView.setOnClickListener { this.finish() } eventButton.setChangeAlphaWhenPress(true) eventButton.setOnClickListener { val intent = Intent(this, EventListActivity::class.java) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 8ed4a0c..da4b03e 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -168,6 +168,5 @@ } } } - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 517203f..dddea49 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -132,9 +132,13 @@ .setNegativeButton("取消") .setPositiveButton("保存") .setOnDialogClickListener(object : InputDialog.OnDialogButtonClickListener { - override fun onButtonClick(input: String) { + override fun onConfirmClick(input: String) { SaveKeyValues.putValue(Constant.DEFAULT_SERVER_CONFIG, input) } + + override fun onCancelClick() { + + } }) .build().show() } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 4ef86d3..2db634f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -15,9 +15,9 @@ import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.utils.StatusBarColorUtil import com.casic.birmm.inspect.vm.UserViewModel +import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* @@ -25,6 +25,7 @@ class MainActivity : BaseActivity() { private var clickTime: Long = 0 + private val itemList: List = arrayListOf("巡检记录", "事件记录") override fun initLayoutView(): Int = R.layout.activity_main @@ -53,26 +54,37 @@ override fun initEvent() { //新建巡检 createIssueLayout.setOnClickListener { - + startActivity(Intent(this, MapActivity::class.java)) } //记录查询 logSearchLayout.setOnClickListener { - QMUIBottomSheet.BottomListSheetBuilder(this) + SingleChoiceDialog.Builder() + .setContext(this) .setTitle("选择记录类型") - .addItem("巡检记录") - .addItem("事件记录") - .setGravityCenter(true) - .setOnSheetItemClickListener { dialog, _, position, _ -> - dialog?.dismiss() - when (position) { - 0 -> { - startActivity(Intent(this, InspectionQueryActivity::class.java)) - } - 1 -> { - startActivity(Intent(this, EventQueryActivity::class.java)) + .setChoiceItemButton(itemList) + .setOnDialogClickListener(object : SingleChoiceDialog.OnDialogItemClickListener { + override fun onItemClick(position: Int) { + when (position) { + 0 -> { + startActivity( + Intent( + this@MainActivity, + InspectionQueryActivity::class.java + ) + ) + } + 1 -> { + startActivity( + Intent( + this@MainActivity, + EventQueryActivity::class.java + ) + ) + } } } - }.build().show() + }) + .build().show() } //系统设置 settingsLayout.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt new file mode 100644 index 0000000..207f6c3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -0,0 +1,176 @@ +package com.casic.birmm.inspect.view + +import android.bluetooth.BluetoothAdapter +import android.graphics.Color +import android.os.Bundle +import android.os.Handler +import android.os.Message +import android.util.Log +import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContextCompat +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.model.MyLocationStyle +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.widgets.InputDialog +import com.gyf.immersionbar.ImmersionBar +import com.qmuiteam.qmui.util.QMUIStatusBarHelper +import kotlinx.android.synthetic.main.activity_inspect_route.mapView +import kotlinx.android.synthetic.main.activity_map.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.cancel +import java.lang.ref.WeakReference + + +class MapActivity : AppCompatActivity(), CoroutineScope by MainScope() { + + companion object { + private const val Tag = "MapActivity" + private lateinit var weakReferenceHandler: WeakReferenceHandler + + fun sendEmptyMessage(what: Int) { + weakReferenceHandler.sendEmptyMessage(what) + } + } + + private lateinit var aMap: AMap + private lateinit var locationStyle: MyLocationStyle + + init { + weakReferenceHandler = WeakReferenceHandler(this) + } + + private class WeakReferenceHandler(activity: MapActivity) : Handler() { + private val activity: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + val mainActivity = activity.get() ?: return + when (msg.what) { + Constant.BLUETOOTH_ON -> { + "蓝牙已开启".show(mainActivity) + mainActivity.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + } + Constant.BLUETOOTH_OFF -> { + "蓝牙已关闭".show(mainActivity) + mainActivity.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + } + Constant.DEVICE_CONNECTED -> { + //TODO 设备已连接 + } + Constant.DEVICE_DISCONNECTED -> { + //TODO 设备断开连接 + } + } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_map) + PageNavigationManager.addActivity(this) + setupTopBarLayout() + if (OtherUtils.isNetworkConnected(this)) { + initData(savedInstanceState) + initEvent() + } else { + "糟糕,没有接入任何网络~".show(this) + } + } + + fun setupTopBarLayout() { + QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "巡检" + } + + fun initData(savedInstanceState: Bundle?) { + mapView.onCreate(savedInstanceState) + aMap = mapView.map + val uiSettings = aMap.uiSettings + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 + //显示定位小蓝点 + locationStyle = MyLocationStyle() + locationStyle.showMyLocation(true)//设置是否显示定位小蓝点 + locationStyle.strokeColor(Color.parseColor("#A2DBFA"))//设置定位蓝点精度圆圈的边框颜色 + locationStyle.radiusFillColor(Color.parseColor("#A2DBFA"))//设置定位蓝点精度圆圈的填充颜色 + aMap.myLocationStyle = locationStyle + aMap.isMyLocationEnabled = true + aMap.addOnMyLocationChangeListener { + Log.d(Tag, "[" + it.longitude + "," + it.latitude + "]") + } + } + + fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //需要判断是否是上次未完的巡检 +// selectInspectMode() + + //判断蓝牙的状态 + val blueAdapter = BluetoothAdapter.getDefaultAdapter() + if (blueAdapter == null) { + "该设备不支持蓝牙,无法连接".show(this) + } else { + if (blueAdapter.isEnabled) { + bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + bluetoothButton.setOnClickListener { + //搜索蓝牙 + } + } else { + bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + //打开 + } + } + + newEventButton.setChangeAlphaWhenPress(true) + newEventButton.setOnClickListener { + + } + } + + private fun selectInspectMode() { + InputDialog.Builder().setContext(this) + .setTitle("请输入巡检标签") + .setHintText("如:xxx区间巡检") + .setNegativeButton("放弃") + .setPositiveButton("开始巡检") + .setOnDialogClickListener(object : InputDialog.OnDialogButtonClickListener { + override fun onConfirmClick(input: String) { + + } + + override fun onCancelClick() { + finish() + } + }) + .build().show() + } + + override fun onResume() { + super.onResume() + mapView.onResume() + } + + override fun onPause() { + super.onPause() + mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + cancel() + super.onDestroy() + mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt index cfa32dc..f2db4c9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt @@ -16,6 +16,7 @@ private var ctx: Context? = null private var title: String? = null + private var hint: String? = null private var value: String? = null private var positiveBtn: String? = null private var negativeBtn: String? = null @@ -24,6 +25,7 @@ init { this.ctx = builder.mContext this.title = builder.title + this.hint = builder.hint this.value = builder.value this.positiveBtn = builder.positiveBtn this.negativeBtn = builder.negativeBtn @@ -38,6 +40,7 @@ setCanceledOnTouchOutside(false) dialogTitleView.text = title + dialogInputView.hint = hint!! value.apply { dialogInputView.setText(this) } @@ -46,6 +49,7 @@ dialogCancelButton.setChangeAlphaWhenPress(true) dialogCancelButton.setOnClickListener { this.dismiss() + listener?.onCancelClick() } dialogConfirmButton.text = positiveBtn @@ -56,8 +60,8 @@ "什么都没输入,请重新输入".show(ctx!!) return@setOnClickListener } - listener?.onButtonClick(inputValue) this.dismiss() + listener?.onConfirmClick(inputValue) } } @@ -73,6 +77,7 @@ class Builder { var mContext: Context? = null var title: String? = null + var hint: String? = null var value: String? = null var positiveBtn: String? = null var negativeBtn: String? = null @@ -88,6 +93,11 @@ return this } + fun setHintText(hint: String?): Builder { + this.hint = hint + return this + } + fun setDefaultValue(value: String?): Builder { this.value = value return this @@ -114,6 +124,8 @@ } interface OnDialogButtonClickListener { - fun onButtonClick(input: String) + fun onCancelClick() + + fun onConfirmClick(input: String) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt new file mode 100644 index 0000000..216befd --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt @@ -0,0 +1,123 @@ +package com.casic.birmm.inspect.widgets + +import android.app.Dialog +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.WindowManager +import android.widget.BaseAdapter +import com.casic.birmm.inspect.R +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton +import kotlinx.android.synthetic.main.dialog_input.dialogTitleView +import kotlinx.android.synthetic.main.dialog_single_choice.* + + +class SingleChoiceDialog private constructor(builder: Builder) : Dialog(builder.mContext!!) { + + private var ctx: Context? = null + private var title: String? = null + private var items: List? = null + private var listener: OnDialogItemClickListener? = null + + init { + this.ctx = builder.mContext + this.title = builder.title + this.items = builder.items + this.listener = builder.listener + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + configDialogLayout() + setContentView(R.layout.dialog_single_choice) + setCancelable(true) + setCanceledOnTouchOutside(true) + + dialogTitleView.text = title + dialogListView.adapter = ItemChoiceAdapter() + } + + private fun configDialogLayout() { + window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + window?.decorView?.setBackgroundColor(Color.TRANSPARENT) + val params: WindowManager.LayoutParams? = window?.attributes + params?.width = QMUIDisplayHelper.dp2px(ctx, 220) + params?.height = WindowManager.LayoutParams.WRAP_CONTENT + window?.attributes = params + } + + inner class ItemChoiceAdapter : BaseAdapter() { + + private var inflater: LayoutInflater = LayoutInflater.from(ctx!!) + + override fun getCount(): Int = items!!.size + + override fun getItem(position: Int): Any = items!![position] + + override fun getItemId(position: Int): Long = position.toLong() + + override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { + val view: View + val itemViewHolder: ItemViewHolder + if (convertView == null) { + view = inflater.inflate(R.layout.item_dialog_listview, null)!! + itemViewHolder = ItemViewHolder(view) + view.tag = itemViewHolder + } else { + view = convertView + itemViewHolder = view.tag as ItemViewHolder + } + itemViewHolder.itemTagView.text = items!![position] + itemViewHolder.itemTagView.setChangeAlphaWhenPress(true) + itemViewHolder.itemTagView.setOnClickListener { + dismiss() + listener?.onItemClick(position) + } + return view + } + } + + class ItemViewHolder(v: View) { + var itemTagView: QMUIRoundButton = v.findViewById(R.id.itemTagView) + } + + class Builder { + var mContext: Context? = null + var title: String? = null + var items: List? = null + var listener: OnDialogItemClickListener? = null + + fun setContext(context: Context?): Builder { + mContext = context + return this + } + + fun setTitle(title: String?): Builder { + this.title = title + return this + } + + fun setChoiceItemButton(items: List?): Builder { + this.items = items + return this + } + + fun setOnDialogClickListener(listener: OnDialogItemClickListener): Builder { + this.listener = listener + return this + } + + fun build(): SingleChoiceDialog { + return SingleChoiceDialog(this) + } + } + + interface OnDialogItemClickListener { + fun onItemClick(position: Int) + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_image_button_layout.xml b/app/src/main/res/drawable/bg_image_button_layout.xml new file mode 100644 index 0000000..41a75be --- /dev/null +++ b/app/src/main/res/drawable/bg_image_button_layout.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_aim.xml b/app/src/main/res/drawable/ic_aim.xml new file mode 100644 index 0000000..88d9e36 --- /dev/null +++ b/app/src/main/res/drawable/ic_aim.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_bluetooth_disabled.xml b/app/src/main/res/drawable/ic_bluetooth_disabled.xml new file mode 100644 index 0000000..1a8526e --- /dev/null +++ b/app/src/main/res/drawable/ic_bluetooth_disabled.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_bluetooth_empty.xml b/app/src/main/res/drawable/ic_bluetooth_empty.xml new file mode 100644 index 0000000..477d2bb --- /dev/null +++ b/app/src/main/res/drawable/ic_bluetooth_empty.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_bluetooth_enable.xml b/app/src/main/res/drawable/ic_bluetooth_enable.xml new file mode 100644 index 0000000..d60b5ae --- /dev/null +++ b/app/src/main/res/drawable/ic_bluetooth_enable.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_off.xml b/app/src/main/res/drawable/ic_off.xml new file mode 100644 index 0000000..4ed867e --- /dev/null +++ b/app/src/main/res/drawable/ic_off.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_pause.xml b/app/src/main/res/drawable/ic_pause.xml new file mode 100644 index 0000000..ab62a60 --- /dev/null +++ b/app/src/main/res/drawable/ic_pause.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7949d16..6a3f570 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,10 @@ + + + + @@ -48,6 +52,7 @@ android:theme="@style/Theme.BigImageActivity" /> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt new file mode 100644 index 0000000..b6b5281 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt @@ -0,0 +1,31 @@ +package com.casic.birmm.inspect.utils + +import android.bluetooth.BluetoothAdapter +import android.bluetooth.BluetoothDevice +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import com.casic.birmm.inspect.view.MapActivity + +class BluetoothStateBroadcastReceiver : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + when (intent?.action) { + BluetoothAdapter.ACTION_STATE_CHANGED -> { + when (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0)) { + BluetoothAdapter.STATE_OFF -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_OFF) + } + BluetoothAdapter.STATE_ON -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_ON) + } + } + } + BluetoothDevice.ACTION_ACL_CONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_CONNECTED) + } + BluetoothDevice.ACTION_ACL_DISCONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_DISCONNECTED) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 0ae38db..aef675a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -13,6 +13,10 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 15 + const val BLUETOOTH_ON = 20 + const val BLUETOOTH_OFF = 21 + const val DEVICE_CONNECTED = 22 + const val DEVICE_DISCONNECTED = 23 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt index 94d269e..c3b1e6b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -59,6 +59,7 @@ aMap = mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //根据id查询详情 id = intent.getStringExtra("id")!! @@ -120,6 +121,7 @@ } fun initEvent() { + leftBackView.setOnClickListener { this.finish() } eventButton.setChangeAlphaWhenPress(true) eventButton.setOnClickListener { val intent = Intent(this, EventListActivity::class.java) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 8ed4a0c..da4b03e 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -168,6 +168,5 @@ } } } - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 517203f..dddea49 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -132,9 +132,13 @@ .setNegativeButton("取消") .setPositiveButton("保存") .setOnDialogClickListener(object : InputDialog.OnDialogButtonClickListener { - override fun onButtonClick(input: String) { + override fun onConfirmClick(input: String) { SaveKeyValues.putValue(Constant.DEFAULT_SERVER_CONFIG, input) } + + override fun onCancelClick() { + + } }) .build().show() } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 4ef86d3..2db634f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -15,9 +15,9 @@ import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.utils.StatusBarColorUtil import com.casic.birmm.inspect.vm.UserViewModel +import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* @@ -25,6 +25,7 @@ class MainActivity : BaseActivity() { private var clickTime: Long = 0 + private val itemList: List = arrayListOf("巡检记录", "事件记录") override fun initLayoutView(): Int = R.layout.activity_main @@ -53,26 +54,37 @@ override fun initEvent() { //新建巡检 createIssueLayout.setOnClickListener { - + startActivity(Intent(this, MapActivity::class.java)) } //记录查询 logSearchLayout.setOnClickListener { - QMUIBottomSheet.BottomListSheetBuilder(this) + SingleChoiceDialog.Builder() + .setContext(this) .setTitle("选择记录类型") - .addItem("巡检记录") - .addItem("事件记录") - .setGravityCenter(true) - .setOnSheetItemClickListener { dialog, _, position, _ -> - dialog?.dismiss() - when (position) { - 0 -> { - startActivity(Intent(this, InspectionQueryActivity::class.java)) - } - 1 -> { - startActivity(Intent(this, EventQueryActivity::class.java)) + .setChoiceItemButton(itemList) + .setOnDialogClickListener(object : SingleChoiceDialog.OnDialogItemClickListener { + override fun onItemClick(position: Int) { + when (position) { + 0 -> { + startActivity( + Intent( + this@MainActivity, + InspectionQueryActivity::class.java + ) + ) + } + 1 -> { + startActivity( + Intent( + this@MainActivity, + EventQueryActivity::class.java + ) + ) + } } } - }.build().show() + }) + .build().show() } //系统设置 settingsLayout.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt new file mode 100644 index 0000000..207f6c3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -0,0 +1,176 @@ +package com.casic.birmm.inspect.view + +import android.bluetooth.BluetoothAdapter +import android.graphics.Color +import android.os.Bundle +import android.os.Handler +import android.os.Message +import android.util.Log +import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContextCompat +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.model.MyLocationStyle +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.widgets.InputDialog +import com.gyf.immersionbar.ImmersionBar +import com.qmuiteam.qmui.util.QMUIStatusBarHelper +import kotlinx.android.synthetic.main.activity_inspect_route.mapView +import kotlinx.android.synthetic.main.activity_map.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.cancel +import java.lang.ref.WeakReference + + +class MapActivity : AppCompatActivity(), CoroutineScope by MainScope() { + + companion object { + private const val Tag = "MapActivity" + private lateinit var weakReferenceHandler: WeakReferenceHandler + + fun sendEmptyMessage(what: Int) { + weakReferenceHandler.sendEmptyMessage(what) + } + } + + private lateinit var aMap: AMap + private lateinit var locationStyle: MyLocationStyle + + init { + weakReferenceHandler = WeakReferenceHandler(this) + } + + private class WeakReferenceHandler(activity: MapActivity) : Handler() { + private val activity: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + val mainActivity = activity.get() ?: return + when (msg.what) { + Constant.BLUETOOTH_ON -> { + "蓝牙已开启".show(mainActivity) + mainActivity.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + } + Constant.BLUETOOTH_OFF -> { + "蓝牙已关闭".show(mainActivity) + mainActivity.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + } + Constant.DEVICE_CONNECTED -> { + //TODO 设备已连接 + } + Constant.DEVICE_DISCONNECTED -> { + //TODO 设备断开连接 + } + } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_map) + PageNavigationManager.addActivity(this) + setupTopBarLayout() + if (OtherUtils.isNetworkConnected(this)) { + initData(savedInstanceState) + initEvent() + } else { + "糟糕,没有接入任何网络~".show(this) + } + } + + fun setupTopBarLayout() { + QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "巡检" + } + + fun initData(savedInstanceState: Bundle?) { + mapView.onCreate(savedInstanceState) + aMap = mapView.map + val uiSettings = aMap.uiSettings + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 + //显示定位小蓝点 + locationStyle = MyLocationStyle() + locationStyle.showMyLocation(true)//设置是否显示定位小蓝点 + locationStyle.strokeColor(Color.parseColor("#A2DBFA"))//设置定位蓝点精度圆圈的边框颜色 + locationStyle.radiusFillColor(Color.parseColor("#A2DBFA"))//设置定位蓝点精度圆圈的填充颜色 + aMap.myLocationStyle = locationStyle + aMap.isMyLocationEnabled = true + aMap.addOnMyLocationChangeListener { + Log.d(Tag, "[" + it.longitude + "," + it.latitude + "]") + } + } + + fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //需要判断是否是上次未完的巡检 +// selectInspectMode() + + //判断蓝牙的状态 + val blueAdapter = BluetoothAdapter.getDefaultAdapter() + if (blueAdapter == null) { + "该设备不支持蓝牙,无法连接".show(this) + } else { + if (blueAdapter.isEnabled) { + bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + bluetoothButton.setOnClickListener { + //搜索蓝牙 + } + } else { + bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + //打开 + } + } + + newEventButton.setChangeAlphaWhenPress(true) + newEventButton.setOnClickListener { + + } + } + + private fun selectInspectMode() { + InputDialog.Builder().setContext(this) + .setTitle("请输入巡检标签") + .setHintText("如:xxx区间巡检") + .setNegativeButton("放弃") + .setPositiveButton("开始巡检") + .setOnDialogClickListener(object : InputDialog.OnDialogButtonClickListener { + override fun onConfirmClick(input: String) { + + } + + override fun onCancelClick() { + finish() + } + }) + .build().show() + } + + override fun onResume() { + super.onResume() + mapView.onResume() + } + + override fun onPause() { + super.onPause() + mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + cancel() + super.onDestroy() + mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt index cfa32dc..f2db4c9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt @@ -16,6 +16,7 @@ private var ctx: Context? = null private var title: String? = null + private var hint: String? = null private var value: String? = null private var positiveBtn: String? = null private var negativeBtn: String? = null @@ -24,6 +25,7 @@ init { this.ctx = builder.mContext this.title = builder.title + this.hint = builder.hint this.value = builder.value this.positiveBtn = builder.positiveBtn this.negativeBtn = builder.negativeBtn @@ -38,6 +40,7 @@ setCanceledOnTouchOutside(false) dialogTitleView.text = title + dialogInputView.hint = hint!! value.apply { dialogInputView.setText(this) } @@ -46,6 +49,7 @@ dialogCancelButton.setChangeAlphaWhenPress(true) dialogCancelButton.setOnClickListener { this.dismiss() + listener?.onCancelClick() } dialogConfirmButton.text = positiveBtn @@ -56,8 +60,8 @@ "什么都没输入,请重新输入".show(ctx!!) return@setOnClickListener } - listener?.onButtonClick(inputValue) this.dismiss() + listener?.onConfirmClick(inputValue) } } @@ -73,6 +77,7 @@ class Builder { var mContext: Context? = null var title: String? = null + var hint: String? = null var value: String? = null var positiveBtn: String? = null var negativeBtn: String? = null @@ -88,6 +93,11 @@ return this } + fun setHintText(hint: String?): Builder { + this.hint = hint + return this + } + fun setDefaultValue(value: String?): Builder { this.value = value return this @@ -114,6 +124,8 @@ } interface OnDialogButtonClickListener { - fun onButtonClick(input: String) + fun onCancelClick() + + fun onConfirmClick(input: String) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt new file mode 100644 index 0000000..216befd --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt @@ -0,0 +1,123 @@ +package com.casic.birmm.inspect.widgets + +import android.app.Dialog +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.WindowManager +import android.widget.BaseAdapter +import com.casic.birmm.inspect.R +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton +import kotlinx.android.synthetic.main.dialog_input.dialogTitleView +import kotlinx.android.synthetic.main.dialog_single_choice.* + + +class SingleChoiceDialog private constructor(builder: Builder) : Dialog(builder.mContext!!) { + + private var ctx: Context? = null + private var title: String? = null + private var items: List? = null + private var listener: OnDialogItemClickListener? = null + + init { + this.ctx = builder.mContext + this.title = builder.title + this.items = builder.items + this.listener = builder.listener + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + configDialogLayout() + setContentView(R.layout.dialog_single_choice) + setCancelable(true) + setCanceledOnTouchOutside(true) + + dialogTitleView.text = title + dialogListView.adapter = ItemChoiceAdapter() + } + + private fun configDialogLayout() { + window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + window?.decorView?.setBackgroundColor(Color.TRANSPARENT) + val params: WindowManager.LayoutParams? = window?.attributes + params?.width = QMUIDisplayHelper.dp2px(ctx, 220) + params?.height = WindowManager.LayoutParams.WRAP_CONTENT + window?.attributes = params + } + + inner class ItemChoiceAdapter : BaseAdapter() { + + private var inflater: LayoutInflater = LayoutInflater.from(ctx!!) + + override fun getCount(): Int = items!!.size + + override fun getItem(position: Int): Any = items!![position] + + override fun getItemId(position: Int): Long = position.toLong() + + override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { + val view: View + val itemViewHolder: ItemViewHolder + if (convertView == null) { + view = inflater.inflate(R.layout.item_dialog_listview, null)!! + itemViewHolder = ItemViewHolder(view) + view.tag = itemViewHolder + } else { + view = convertView + itemViewHolder = view.tag as ItemViewHolder + } + itemViewHolder.itemTagView.text = items!![position] + itemViewHolder.itemTagView.setChangeAlphaWhenPress(true) + itemViewHolder.itemTagView.setOnClickListener { + dismiss() + listener?.onItemClick(position) + } + return view + } + } + + class ItemViewHolder(v: View) { + var itemTagView: QMUIRoundButton = v.findViewById(R.id.itemTagView) + } + + class Builder { + var mContext: Context? = null + var title: String? = null + var items: List? = null + var listener: OnDialogItemClickListener? = null + + fun setContext(context: Context?): Builder { + mContext = context + return this + } + + fun setTitle(title: String?): Builder { + this.title = title + return this + } + + fun setChoiceItemButton(items: List?): Builder { + this.items = items + return this + } + + fun setOnDialogClickListener(listener: OnDialogItemClickListener): Builder { + this.listener = listener + return this + } + + fun build(): SingleChoiceDialog { + return SingleChoiceDialog(this) + } + } + + interface OnDialogItemClickListener { + fun onItemClick(position: Int) + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_image_button_layout.xml b/app/src/main/res/drawable/bg_image_button_layout.xml new file mode 100644 index 0000000..41a75be --- /dev/null +++ b/app/src/main/res/drawable/bg_image_button_layout.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_aim.xml b/app/src/main/res/drawable/ic_aim.xml new file mode 100644 index 0000000..88d9e36 --- /dev/null +++ b/app/src/main/res/drawable/ic_aim.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_bluetooth_disabled.xml b/app/src/main/res/drawable/ic_bluetooth_disabled.xml new file mode 100644 index 0000000..1a8526e --- /dev/null +++ b/app/src/main/res/drawable/ic_bluetooth_disabled.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_bluetooth_empty.xml b/app/src/main/res/drawable/ic_bluetooth_empty.xml new file mode 100644 index 0000000..477d2bb --- /dev/null +++ b/app/src/main/res/drawable/ic_bluetooth_empty.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_bluetooth_enable.xml b/app/src/main/res/drawable/ic_bluetooth_enable.xml new file mode 100644 index 0000000..d60b5ae --- /dev/null +++ b/app/src/main/res/drawable/ic_bluetooth_enable.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_off.xml b/app/src/main/res/drawable/ic_off.xml new file mode 100644 index 0000000..4ed867e --- /dev/null +++ b/app/src/main/res/drawable/ic_off.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_pause.xml b/app/src/main/res/drawable/ic_pause.xml new file mode 100644 index 0000000..ab62a60 --- /dev/null +++ b/app/src/main/res/drawable/ic_pause.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_refresh.xml b/app/src/main/res/drawable/ic_refresh.xml new file mode 100644 index 0000000..1f12913 --- /dev/null +++ b/app/src/main/res/drawable/ic_refresh.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7949d16..6a3f570 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,10 @@ + + + + @@ -48,6 +52,7 @@ android:theme="@style/Theme.BigImageActivity" /> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt new file mode 100644 index 0000000..b6b5281 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt @@ -0,0 +1,31 @@ +package com.casic.birmm.inspect.utils + +import android.bluetooth.BluetoothAdapter +import android.bluetooth.BluetoothDevice +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import com.casic.birmm.inspect.view.MapActivity + +class BluetoothStateBroadcastReceiver : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + when (intent?.action) { + BluetoothAdapter.ACTION_STATE_CHANGED -> { + when (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0)) { + BluetoothAdapter.STATE_OFF -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_OFF) + } + BluetoothAdapter.STATE_ON -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_ON) + } + } + } + BluetoothDevice.ACTION_ACL_CONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_CONNECTED) + } + BluetoothDevice.ACTION_ACL_DISCONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_DISCONNECTED) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 0ae38db..aef675a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -13,6 +13,10 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 15 + const val BLUETOOTH_ON = 20 + const val BLUETOOTH_OFF = 21 + const val DEVICE_CONNECTED = 22 + const val DEVICE_DISCONNECTED = 23 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt index 94d269e..c3b1e6b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -59,6 +59,7 @@ aMap = mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //根据id查询详情 id = intent.getStringExtra("id")!! @@ -120,6 +121,7 @@ } fun initEvent() { + leftBackView.setOnClickListener { this.finish() } eventButton.setChangeAlphaWhenPress(true) eventButton.setOnClickListener { val intent = Intent(this, EventListActivity::class.java) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 8ed4a0c..da4b03e 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -168,6 +168,5 @@ } } } - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 517203f..dddea49 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -132,9 +132,13 @@ .setNegativeButton("取消") .setPositiveButton("保存") .setOnDialogClickListener(object : InputDialog.OnDialogButtonClickListener { - override fun onButtonClick(input: String) { + override fun onConfirmClick(input: String) { SaveKeyValues.putValue(Constant.DEFAULT_SERVER_CONFIG, input) } + + override fun onCancelClick() { + + } }) .build().show() } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 4ef86d3..2db634f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -15,9 +15,9 @@ import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.utils.StatusBarColorUtil import com.casic.birmm.inspect.vm.UserViewModel +import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* @@ -25,6 +25,7 @@ class MainActivity : BaseActivity() { private var clickTime: Long = 0 + private val itemList: List = arrayListOf("巡检记录", "事件记录") override fun initLayoutView(): Int = R.layout.activity_main @@ -53,26 +54,37 @@ override fun initEvent() { //新建巡检 createIssueLayout.setOnClickListener { - + startActivity(Intent(this, MapActivity::class.java)) } //记录查询 logSearchLayout.setOnClickListener { - QMUIBottomSheet.BottomListSheetBuilder(this) + SingleChoiceDialog.Builder() + .setContext(this) .setTitle("选择记录类型") - .addItem("巡检记录") - .addItem("事件记录") - .setGravityCenter(true) - .setOnSheetItemClickListener { dialog, _, position, _ -> - dialog?.dismiss() - when (position) { - 0 -> { - startActivity(Intent(this, InspectionQueryActivity::class.java)) - } - 1 -> { - startActivity(Intent(this, EventQueryActivity::class.java)) + .setChoiceItemButton(itemList) + .setOnDialogClickListener(object : SingleChoiceDialog.OnDialogItemClickListener { + override fun onItemClick(position: Int) { + when (position) { + 0 -> { + startActivity( + Intent( + this@MainActivity, + InspectionQueryActivity::class.java + ) + ) + } + 1 -> { + startActivity( + Intent( + this@MainActivity, + EventQueryActivity::class.java + ) + ) + } } } - }.build().show() + }) + .build().show() } //系统设置 settingsLayout.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt new file mode 100644 index 0000000..207f6c3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -0,0 +1,176 @@ +package com.casic.birmm.inspect.view + +import android.bluetooth.BluetoothAdapter +import android.graphics.Color +import android.os.Bundle +import android.os.Handler +import android.os.Message +import android.util.Log +import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContextCompat +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.model.MyLocationStyle +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.widgets.InputDialog +import com.gyf.immersionbar.ImmersionBar +import com.qmuiteam.qmui.util.QMUIStatusBarHelper +import kotlinx.android.synthetic.main.activity_inspect_route.mapView +import kotlinx.android.synthetic.main.activity_map.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.cancel +import java.lang.ref.WeakReference + + +class MapActivity : AppCompatActivity(), CoroutineScope by MainScope() { + + companion object { + private const val Tag = "MapActivity" + private lateinit var weakReferenceHandler: WeakReferenceHandler + + fun sendEmptyMessage(what: Int) { + weakReferenceHandler.sendEmptyMessage(what) + } + } + + private lateinit var aMap: AMap + private lateinit var locationStyle: MyLocationStyle + + init { + weakReferenceHandler = WeakReferenceHandler(this) + } + + private class WeakReferenceHandler(activity: MapActivity) : Handler() { + private val activity: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + val mainActivity = activity.get() ?: return + when (msg.what) { + Constant.BLUETOOTH_ON -> { + "蓝牙已开启".show(mainActivity) + mainActivity.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + } + Constant.BLUETOOTH_OFF -> { + "蓝牙已关闭".show(mainActivity) + mainActivity.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + } + Constant.DEVICE_CONNECTED -> { + //TODO 设备已连接 + } + Constant.DEVICE_DISCONNECTED -> { + //TODO 设备断开连接 + } + } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_map) + PageNavigationManager.addActivity(this) + setupTopBarLayout() + if (OtherUtils.isNetworkConnected(this)) { + initData(savedInstanceState) + initEvent() + } else { + "糟糕,没有接入任何网络~".show(this) + } + } + + fun setupTopBarLayout() { + QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "巡检" + } + + fun initData(savedInstanceState: Bundle?) { + mapView.onCreate(savedInstanceState) + aMap = mapView.map + val uiSettings = aMap.uiSettings + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 + //显示定位小蓝点 + locationStyle = MyLocationStyle() + locationStyle.showMyLocation(true)//设置是否显示定位小蓝点 + locationStyle.strokeColor(Color.parseColor("#A2DBFA"))//设置定位蓝点精度圆圈的边框颜色 + locationStyle.radiusFillColor(Color.parseColor("#A2DBFA"))//设置定位蓝点精度圆圈的填充颜色 + aMap.myLocationStyle = locationStyle + aMap.isMyLocationEnabled = true + aMap.addOnMyLocationChangeListener { + Log.d(Tag, "[" + it.longitude + "," + it.latitude + "]") + } + } + + fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //需要判断是否是上次未完的巡检 +// selectInspectMode() + + //判断蓝牙的状态 + val blueAdapter = BluetoothAdapter.getDefaultAdapter() + if (blueAdapter == null) { + "该设备不支持蓝牙,无法连接".show(this) + } else { + if (blueAdapter.isEnabled) { + bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + bluetoothButton.setOnClickListener { + //搜索蓝牙 + } + } else { + bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + //打开 + } + } + + newEventButton.setChangeAlphaWhenPress(true) + newEventButton.setOnClickListener { + + } + } + + private fun selectInspectMode() { + InputDialog.Builder().setContext(this) + .setTitle("请输入巡检标签") + .setHintText("如:xxx区间巡检") + .setNegativeButton("放弃") + .setPositiveButton("开始巡检") + .setOnDialogClickListener(object : InputDialog.OnDialogButtonClickListener { + override fun onConfirmClick(input: String) { + + } + + override fun onCancelClick() { + finish() + } + }) + .build().show() + } + + override fun onResume() { + super.onResume() + mapView.onResume() + } + + override fun onPause() { + super.onPause() + mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + cancel() + super.onDestroy() + mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt index cfa32dc..f2db4c9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt @@ -16,6 +16,7 @@ private var ctx: Context? = null private var title: String? = null + private var hint: String? = null private var value: String? = null private var positiveBtn: String? = null private var negativeBtn: String? = null @@ -24,6 +25,7 @@ init { this.ctx = builder.mContext this.title = builder.title + this.hint = builder.hint this.value = builder.value this.positiveBtn = builder.positiveBtn this.negativeBtn = builder.negativeBtn @@ -38,6 +40,7 @@ setCanceledOnTouchOutside(false) dialogTitleView.text = title + dialogInputView.hint = hint!! value.apply { dialogInputView.setText(this) } @@ -46,6 +49,7 @@ dialogCancelButton.setChangeAlphaWhenPress(true) dialogCancelButton.setOnClickListener { this.dismiss() + listener?.onCancelClick() } dialogConfirmButton.text = positiveBtn @@ -56,8 +60,8 @@ "什么都没输入,请重新输入".show(ctx!!) return@setOnClickListener } - listener?.onButtonClick(inputValue) this.dismiss() + listener?.onConfirmClick(inputValue) } } @@ -73,6 +77,7 @@ class Builder { var mContext: Context? = null var title: String? = null + var hint: String? = null var value: String? = null var positiveBtn: String? = null var negativeBtn: String? = null @@ -88,6 +93,11 @@ return this } + fun setHintText(hint: String?): Builder { + this.hint = hint + return this + } + fun setDefaultValue(value: String?): Builder { this.value = value return this @@ -114,6 +124,8 @@ } interface OnDialogButtonClickListener { - fun onButtonClick(input: String) + fun onCancelClick() + + fun onConfirmClick(input: String) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt new file mode 100644 index 0000000..216befd --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt @@ -0,0 +1,123 @@ +package com.casic.birmm.inspect.widgets + +import android.app.Dialog +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.WindowManager +import android.widget.BaseAdapter +import com.casic.birmm.inspect.R +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton +import kotlinx.android.synthetic.main.dialog_input.dialogTitleView +import kotlinx.android.synthetic.main.dialog_single_choice.* + + +class SingleChoiceDialog private constructor(builder: Builder) : Dialog(builder.mContext!!) { + + private var ctx: Context? = null + private var title: String? = null + private var items: List? = null + private var listener: OnDialogItemClickListener? = null + + init { + this.ctx = builder.mContext + this.title = builder.title + this.items = builder.items + this.listener = builder.listener + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + configDialogLayout() + setContentView(R.layout.dialog_single_choice) + setCancelable(true) + setCanceledOnTouchOutside(true) + + dialogTitleView.text = title + dialogListView.adapter = ItemChoiceAdapter() + } + + private fun configDialogLayout() { + window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + window?.decorView?.setBackgroundColor(Color.TRANSPARENT) + val params: WindowManager.LayoutParams? = window?.attributes + params?.width = QMUIDisplayHelper.dp2px(ctx, 220) + params?.height = WindowManager.LayoutParams.WRAP_CONTENT + window?.attributes = params + } + + inner class ItemChoiceAdapter : BaseAdapter() { + + private var inflater: LayoutInflater = LayoutInflater.from(ctx!!) + + override fun getCount(): Int = items!!.size + + override fun getItem(position: Int): Any = items!![position] + + override fun getItemId(position: Int): Long = position.toLong() + + override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { + val view: View + val itemViewHolder: ItemViewHolder + if (convertView == null) { + view = inflater.inflate(R.layout.item_dialog_listview, null)!! + itemViewHolder = ItemViewHolder(view) + view.tag = itemViewHolder + } else { + view = convertView + itemViewHolder = view.tag as ItemViewHolder + } + itemViewHolder.itemTagView.text = items!![position] + itemViewHolder.itemTagView.setChangeAlphaWhenPress(true) + itemViewHolder.itemTagView.setOnClickListener { + dismiss() + listener?.onItemClick(position) + } + return view + } + } + + class ItemViewHolder(v: View) { + var itemTagView: QMUIRoundButton = v.findViewById(R.id.itemTagView) + } + + class Builder { + var mContext: Context? = null + var title: String? = null + var items: List? = null + var listener: OnDialogItemClickListener? = null + + fun setContext(context: Context?): Builder { + mContext = context + return this + } + + fun setTitle(title: String?): Builder { + this.title = title + return this + } + + fun setChoiceItemButton(items: List?): Builder { + this.items = items + return this + } + + fun setOnDialogClickListener(listener: OnDialogItemClickListener): Builder { + this.listener = listener + return this + } + + fun build(): SingleChoiceDialog { + return SingleChoiceDialog(this) + } + } + + interface OnDialogItemClickListener { + fun onItemClick(position: Int) + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_image_button_layout.xml b/app/src/main/res/drawable/bg_image_button_layout.xml new file mode 100644 index 0000000..41a75be --- /dev/null +++ b/app/src/main/res/drawable/bg_image_button_layout.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_aim.xml b/app/src/main/res/drawable/ic_aim.xml new file mode 100644 index 0000000..88d9e36 --- /dev/null +++ b/app/src/main/res/drawable/ic_aim.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_bluetooth_disabled.xml b/app/src/main/res/drawable/ic_bluetooth_disabled.xml new file mode 100644 index 0000000..1a8526e --- /dev/null +++ b/app/src/main/res/drawable/ic_bluetooth_disabled.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_bluetooth_empty.xml b/app/src/main/res/drawable/ic_bluetooth_empty.xml new file mode 100644 index 0000000..477d2bb --- /dev/null +++ b/app/src/main/res/drawable/ic_bluetooth_empty.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_bluetooth_enable.xml b/app/src/main/res/drawable/ic_bluetooth_enable.xml new file mode 100644 index 0000000..d60b5ae --- /dev/null +++ b/app/src/main/res/drawable/ic_bluetooth_enable.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_off.xml b/app/src/main/res/drawable/ic_off.xml new file mode 100644 index 0000000..4ed867e --- /dev/null +++ b/app/src/main/res/drawable/ic_off.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_pause.xml b/app/src/main/res/drawable/ic_pause.xml new file mode 100644 index 0000000..ab62a60 --- /dev/null +++ b/app/src/main/res/drawable/ic_pause.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_refresh.xml b/app/src/main/res/drawable/ic_refresh.xml new file mode 100644 index 0000000..1f12913 --- /dev/null +++ b/app/src/main/res/drawable/ic_refresh.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_inspect_route.xml b/app/src/main/res/layout/activity_inspect_route.xml index 6c11830..38d2421 100644 --- a/app/src/main/res/layout/activity_inspect_route.xml +++ b/app/src/main/res/layout/activity_inspect_route.xml @@ -7,7 +7,7 @@ - @@ -30,10 +30,12 @@ @@ -65,12 +67,14 @@ app:layout_constraintEnd_toEndOf="parent" /> @@ -79,7 +83,7 @@ android:id="@+id/eventButton" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_gravity="bottom" + android:layout_alignParentBottom="true" android:layout_marginHorizontal="30dp" android:layout_marginBottom="20dp" android:paddingVertical="7dp" @@ -89,5 +93,5 @@ app:qmui_backgroundColor="@color/mainThemeColor" app:qmui_borderColor="@color/mainThemeColor" app:qmui_radius="5dp" /> - + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7949d16..6a3f570 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,10 @@ + + + + @@ -48,6 +52,7 @@ android:theme="@style/Theme.BigImageActivity" /> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt new file mode 100644 index 0000000..b6b5281 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt @@ -0,0 +1,31 @@ +package com.casic.birmm.inspect.utils + +import android.bluetooth.BluetoothAdapter +import android.bluetooth.BluetoothDevice +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import com.casic.birmm.inspect.view.MapActivity + +class BluetoothStateBroadcastReceiver : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + when (intent?.action) { + BluetoothAdapter.ACTION_STATE_CHANGED -> { + when (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0)) { + BluetoothAdapter.STATE_OFF -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_OFF) + } + BluetoothAdapter.STATE_ON -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_ON) + } + } + } + BluetoothDevice.ACTION_ACL_CONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_CONNECTED) + } + BluetoothDevice.ACTION_ACL_DISCONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_DISCONNECTED) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 0ae38db..aef675a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -13,6 +13,10 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 15 + const val BLUETOOTH_ON = 20 + const val BLUETOOTH_OFF = 21 + const val DEVICE_CONNECTED = 22 + const val DEVICE_DISCONNECTED = 23 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt index 94d269e..c3b1e6b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -59,6 +59,7 @@ aMap = mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //根据id查询详情 id = intent.getStringExtra("id")!! @@ -120,6 +121,7 @@ } fun initEvent() { + leftBackView.setOnClickListener { this.finish() } eventButton.setChangeAlphaWhenPress(true) eventButton.setOnClickListener { val intent = Intent(this, EventListActivity::class.java) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 8ed4a0c..da4b03e 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -168,6 +168,5 @@ } } } - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 517203f..dddea49 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -132,9 +132,13 @@ .setNegativeButton("取消") .setPositiveButton("保存") .setOnDialogClickListener(object : InputDialog.OnDialogButtonClickListener { - override fun onButtonClick(input: String) { + override fun onConfirmClick(input: String) { SaveKeyValues.putValue(Constant.DEFAULT_SERVER_CONFIG, input) } + + override fun onCancelClick() { + + } }) .build().show() } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 4ef86d3..2db634f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -15,9 +15,9 @@ import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.utils.StatusBarColorUtil import com.casic.birmm.inspect.vm.UserViewModel +import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* @@ -25,6 +25,7 @@ class MainActivity : BaseActivity() { private var clickTime: Long = 0 + private val itemList: List = arrayListOf("巡检记录", "事件记录") override fun initLayoutView(): Int = R.layout.activity_main @@ -53,26 +54,37 @@ override fun initEvent() { //新建巡检 createIssueLayout.setOnClickListener { - + startActivity(Intent(this, MapActivity::class.java)) } //记录查询 logSearchLayout.setOnClickListener { - QMUIBottomSheet.BottomListSheetBuilder(this) + SingleChoiceDialog.Builder() + .setContext(this) .setTitle("选择记录类型") - .addItem("巡检记录") - .addItem("事件记录") - .setGravityCenter(true) - .setOnSheetItemClickListener { dialog, _, position, _ -> - dialog?.dismiss() - when (position) { - 0 -> { - startActivity(Intent(this, InspectionQueryActivity::class.java)) - } - 1 -> { - startActivity(Intent(this, EventQueryActivity::class.java)) + .setChoiceItemButton(itemList) + .setOnDialogClickListener(object : SingleChoiceDialog.OnDialogItemClickListener { + override fun onItemClick(position: Int) { + when (position) { + 0 -> { + startActivity( + Intent( + this@MainActivity, + InspectionQueryActivity::class.java + ) + ) + } + 1 -> { + startActivity( + Intent( + this@MainActivity, + EventQueryActivity::class.java + ) + ) + } } } - }.build().show() + }) + .build().show() } //系统设置 settingsLayout.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt new file mode 100644 index 0000000..207f6c3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -0,0 +1,176 @@ +package com.casic.birmm.inspect.view + +import android.bluetooth.BluetoothAdapter +import android.graphics.Color +import android.os.Bundle +import android.os.Handler +import android.os.Message +import android.util.Log +import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContextCompat +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.model.MyLocationStyle +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.widgets.InputDialog +import com.gyf.immersionbar.ImmersionBar +import com.qmuiteam.qmui.util.QMUIStatusBarHelper +import kotlinx.android.synthetic.main.activity_inspect_route.mapView +import kotlinx.android.synthetic.main.activity_map.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.cancel +import java.lang.ref.WeakReference + + +class MapActivity : AppCompatActivity(), CoroutineScope by MainScope() { + + companion object { + private const val Tag = "MapActivity" + private lateinit var weakReferenceHandler: WeakReferenceHandler + + fun sendEmptyMessage(what: Int) { + weakReferenceHandler.sendEmptyMessage(what) + } + } + + private lateinit var aMap: AMap + private lateinit var locationStyle: MyLocationStyle + + init { + weakReferenceHandler = WeakReferenceHandler(this) + } + + private class WeakReferenceHandler(activity: MapActivity) : Handler() { + private val activity: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + val mainActivity = activity.get() ?: return + when (msg.what) { + Constant.BLUETOOTH_ON -> { + "蓝牙已开启".show(mainActivity) + mainActivity.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + } + Constant.BLUETOOTH_OFF -> { + "蓝牙已关闭".show(mainActivity) + mainActivity.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + } + Constant.DEVICE_CONNECTED -> { + //TODO 设备已连接 + } + Constant.DEVICE_DISCONNECTED -> { + //TODO 设备断开连接 + } + } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_map) + PageNavigationManager.addActivity(this) + setupTopBarLayout() + if (OtherUtils.isNetworkConnected(this)) { + initData(savedInstanceState) + initEvent() + } else { + "糟糕,没有接入任何网络~".show(this) + } + } + + fun setupTopBarLayout() { + QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "巡检" + } + + fun initData(savedInstanceState: Bundle?) { + mapView.onCreate(savedInstanceState) + aMap = mapView.map + val uiSettings = aMap.uiSettings + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 + //显示定位小蓝点 + locationStyle = MyLocationStyle() + locationStyle.showMyLocation(true)//设置是否显示定位小蓝点 + locationStyle.strokeColor(Color.parseColor("#A2DBFA"))//设置定位蓝点精度圆圈的边框颜色 + locationStyle.radiusFillColor(Color.parseColor("#A2DBFA"))//设置定位蓝点精度圆圈的填充颜色 + aMap.myLocationStyle = locationStyle + aMap.isMyLocationEnabled = true + aMap.addOnMyLocationChangeListener { + Log.d(Tag, "[" + it.longitude + "," + it.latitude + "]") + } + } + + fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //需要判断是否是上次未完的巡检 +// selectInspectMode() + + //判断蓝牙的状态 + val blueAdapter = BluetoothAdapter.getDefaultAdapter() + if (blueAdapter == null) { + "该设备不支持蓝牙,无法连接".show(this) + } else { + if (blueAdapter.isEnabled) { + bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + bluetoothButton.setOnClickListener { + //搜索蓝牙 + } + } else { + bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + //打开 + } + } + + newEventButton.setChangeAlphaWhenPress(true) + newEventButton.setOnClickListener { + + } + } + + private fun selectInspectMode() { + InputDialog.Builder().setContext(this) + .setTitle("请输入巡检标签") + .setHintText("如:xxx区间巡检") + .setNegativeButton("放弃") + .setPositiveButton("开始巡检") + .setOnDialogClickListener(object : InputDialog.OnDialogButtonClickListener { + override fun onConfirmClick(input: String) { + + } + + override fun onCancelClick() { + finish() + } + }) + .build().show() + } + + override fun onResume() { + super.onResume() + mapView.onResume() + } + + override fun onPause() { + super.onPause() + mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + cancel() + super.onDestroy() + mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt index cfa32dc..f2db4c9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt @@ -16,6 +16,7 @@ private var ctx: Context? = null private var title: String? = null + private var hint: String? = null private var value: String? = null private var positiveBtn: String? = null private var negativeBtn: String? = null @@ -24,6 +25,7 @@ init { this.ctx = builder.mContext this.title = builder.title + this.hint = builder.hint this.value = builder.value this.positiveBtn = builder.positiveBtn this.negativeBtn = builder.negativeBtn @@ -38,6 +40,7 @@ setCanceledOnTouchOutside(false) dialogTitleView.text = title + dialogInputView.hint = hint!! value.apply { dialogInputView.setText(this) } @@ -46,6 +49,7 @@ dialogCancelButton.setChangeAlphaWhenPress(true) dialogCancelButton.setOnClickListener { this.dismiss() + listener?.onCancelClick() } dialogConfirmButton.text = positiveBtn @@ -56,8 +60,8 @@ "什么都没输入,请重新输入".show(ctx!!) return@setOnClickListener } - listener?.onButtonClick(inputValue) this.dismiss() + listener?.onConfirmClick(inputValue) } } @@ -73,6 +77,7 @@ class Builder { var mContext: Context? = null var title: String? = null + var hint: String? = null var value: String? = null var positiveBtn: String? = null var negativeBtn: String? = null @@ -88,6 +93,11 @@ return this } + fun setHintText(hint: String?): Builder { + this.hint = hint + return this + } + fun setDefaultValue(value: String?): Builder { this.value = value return this @@ -114,6 +124,8 @@ } interface OnDialogButtonClickListener { - fun onButtonClick(input: String) + fun onCancelClick() + + fun onConfirmClick(input: String) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt new file mode 100644 index 0000000..216befd --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt @@ -0,0 +1,123 @@ +package com.casic.birmm.inspect.widgets + +import android.app.Dialog +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.WindowManager +import android.widget.BaseAdapter +import com.casic.birmm.inspect.R +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton +import kotlinx.android.synthetic.main.dialog_input.dialogTitleView +import kotlinx.android.synthetic.main.dialog_single_choice.* + + +class SingleChoiceDialog private constructor(builder: Builder) : Dialog(builder.mContext!!) { + + private var ctx: Context? = null + private var title: String? = null + private var items: List? = null + private var listener: OnDialogItemClickListener? = null + + init { + this.ctx = builder.mContext + this.title = builder.title + this.items = builder.items + this.listener = builder.listener + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + configDialogLayout() + setContentView(R.layout.dialog_single_choice) + setCancelable(true) + setCanceledOnTouchOutside(true) + + dialogTitleView.text = title + dialogListView.adapter = ItemChoiceAdapter() + } + + private fun configDialogLayout() { + window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + window?.decorView?.setBackgroundColor(Color.TRANSPARENT) + val params: WindowManager.LayoutParams? = window?.attributes + params?.width = QMUIDisplayHelper.dp2px(ctx, 220) + params?.height = WindowManager.LayoutParams.WRAP_CONTENT + window?.attributes = params + } + + inner class ItemChoiceAdapter : BaseAdapter() { + + private var inflater: LayoutInflater = LayoutInflater.from(ctx!!) + + override fun getCount(): Int = items!!.size + + override fun getItem(position: Int): Any = items!![position] + + override fun getItemId(position: Int): Long = position.toLong() + + override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { + val view: View + val itemViewHolder: ItemViewHolder + if (convertView == null) { + view = inflater.inflate(R.layout.item_dialog_listview, null)!! + itemViewHolder = ItemViewHolder(view) + view.tag = itemViewHolder + } else { + view = convertView + itemViewHolder = view.tag as ItemViewHolder + } + itemViewHolder.itemTagView.text = items!![position] + itemViewHolder.itemTagView.setChangeAlphaWhenPress(true) + itemViewHolder.itemTagView.setOnClickListener { + dismiss() + listener?.onItemClick(position) + } + return view + } + } + + class ItemViewHolder(v: View) { + var itemTagView: QMUIRoundButton = v.findViewById(R.id.itemTagView) + } + + class Builder { + var mContext: Context? = null + var title: String? = null + var items: List? = null + var listener: OnDialogItemClickListener? = null + + fun setContext(context: Context?): Builder { + mContext = context + return this + } + + fun setTitle(title: String?): Builder { + this.title = title + return this + } + + fun setChoiceItemButton(items: List?): Builder { + this.items = items + return this + } + + fun setOnDialogClickListener(listener: OnDialogItemClickListener): Builder { + this.listener = listener + return this + } + + fun build(): SingleChoiceDialog { + return SingleChoiceDialog(this) + } + } + + interface OnDialogItemClickListener { + fun onItemClick(position: Int) + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_image_button_layout.xml b/app/src/main/res/drawable/bg_image_button_layout.xml new file mode 100644 index 0000000..41a75be --- /dev/null +++ b/app/src/main/res/drawable/bg_image_button_layout.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_aim.xml b/app/src/main/res/drawable/ic_aim.xml new file mode 100644 index 0000000..88d9e36 --- /dev/null +++ b/app/src/main/res/drawable/ic_aim.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_bluetooth_disabled.xml b/app/src/main/res/drawable/ic_bluetooth_disabled.xml new file mode 100644 index 0000000..1a8526e --- /dev/null +++ b/app/src/main/res/drawable/ic_bluetooth_disabled.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_bluetooth_empty.xml b/app/src/main/res/drawable/ic_bluetooth_empty.xml new file mode 100644 index 0000000..477d2bb --- /dev/null +++ b/app/src/main/res/drawable/ic_bluetooth_empty.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_bluetooth_enable.xml b/app/src/main/res/drawable/ic_bluetooth_enable.xml new file mode 100644 index 0000000..d60b5ae --- /dev/null +++ b/app/src/main/res/drawable/ic_bluetooth_enable.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_off.xml b/app/src/main/res/drawable/ic_off.xml new file mode 100644 index 0000000..4ed867e --- /dev/null +++ b/app/src/main/res/drawable/ic_off.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_pause.xml b/app/src/main/res/drawable/ic_pause.xml new file mode 100644 index 0000000..ab62a60 --- /dev/null +++ b/app/src/main/res/drawable/ic_pause.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_refresh.xml b/app/src/main/res/drawable/ic_refresh.xml new file mode 100644 index 0000000..1f12913 --- /dev/null +++ b/app/src/main/res/drawable/ic_refresh.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_inspect_route.xml b/app/src/main/res/layout/activity_inspect_route.xml index 6c11830..38d2421 100644 --- a/app/src/main/res/layout/activity_inspect_route.xml +++ b/app/src/main/res/layout/activity_inspect_route.xml @@ -7,7 +7,7 @@ - @@ -30,10 +30,12 @@ @@ -65,12 +67,14 @@ app:layout_constraintEnd_toEndOf="parent" /> @@ -79,7 +83,7 @@ android:id="@+id/eventButton" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_gravity="bottom" + android:layout_alignParentBottom="true" android:layout_marginHorizontal="30dp" android:layout_marginBottom="20dp" android:paddingVertical="7dp" @@ -89,5 +93,5 @@ app:qmui_backgroundColor="@color/mainThemeColor" app:qmui_borderColor="@color/mainThemeColor" app:qmui_radius="5dp" /> - + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_map.xml b/app/src/main/res/layout/activity_map.xml new file mode 100644 index 0000000..13102d9 --- /dev/null +++ b/app/src/main/res/layout/activity_map.xml @@ -0,0 +1,224 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7949d16..6a3f570 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,10 @@ + + + + @@ -48,6 +52,7 @@ android:theme="@style/Theme.BigImageActivity" /> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt new file mode 100644 index 0000000..b6b5281 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt @@ -0,0 +1,31 @@ +package com.casic.birmm.inspect.utils + +import android.bluetooth.BluetoothAdapter +import android.bluetooth.BluetoothDevice +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import com.casic.birmm.inspect.view.MapActivity + +class BluetoothStateBroadcastReceiver : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + when (intent?.action) { + BluetoothAdapter.ACTION_STATE_CHANGED -> { + when (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0)) { + BluetoothAdapter.STATE_OFF -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_OFF) + } + BluetoothAdapter.STATE_ON -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_ON) + } + } + } + BluetoothDevice.ACTION_ACL_CONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_CONNECTED) + } + BluetoothDevice.ACTION_ACL_DISCONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_DISCONNECTED) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 0ae38db..aef675a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -13,6 +13,10 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 15 + const val BLUETOOTH_ON = 20 + const val BLUETOOTH_OFF = 21 + const val DEVICE_CONNECTED = 22 + const val DEVICE_DISCONNECTED = 23 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt index 94d269e..c3b1e6b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -59,6 +59,7 @@ aMap = mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //根据id查询详情 id = intent.getStringExtra("id")!! @@ -120,6 +121,7 @@ } fun initEvent() { + leftBackView.setOnClickListener { this.finish() } eventButton.setChangeAlphaWhenPress(true) eventButton.setOnClickListener { val intent = Intent(this, EventListActivity::class.java) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 8ed4a0c..da4b03e 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -168,6 +168,5 @@ } } } - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 517203f..dddea49 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -132,9 +132,13 @@ .setNegativeButton("取消") .setPositiveButton("保存") .setOnDialogClickListener(object : InputDialog.OnDialogButtonClickListener { - override fun onButtonClick(input: String) { + override fun onConfirmClick(input: String) { SaveKeyValues.putValue(Constant.DEFAULT_SERVER_CONFIG, input) } + + override fun onCancelClick() { + + } }) .build().show() } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 4ef86d3..2db634f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -15,9 +15,9 @@ import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.utils.StatusBarColorUtil import com.casic.birmm.inspect.vm.UserViewModel +import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* @@ -25,6 +25,7 @@ class MainActivity : BaseActivity() { private var clickTime: Long = 0 + private val itemList: List = arrayListOf("巡检记录", "事件记录") override fun initLayoutView(): Int = R.layout.activity_main @@ -53,26 +54,37 @@ override fun initEvent() { //新建巡检 createIssueLayout.setOnClickListener { - + startActivity(Intent(this, MapActivity::class.java)) } //记录查询 logSearchLayout.setOnClickListener { - QMUIBottomSheet.BottomListSheetBuilder(this) + SingleChoiceDialog.Builder() + .setContext(this) .setTitle("选择记录类型") - .addItem("巡检记录") - .addItem("事件记录") - .setGravityCenter(true) - .setOnSheetItemClickListener { dialog, _, position, _ -> - dialog?.dismiss() - when (position) { - 0 -> { - startActivity(Intent(this, InspectionQueryActivity::class.java)) - } - 1 -> { - startActivity(Intent(this, EventQueryActivity::class.java)) + .setChoiceItemButton(itemList) + .setOnDialogClickListener(object : SingleChoiceDialog.OnDialogItemClickListener { + override fun onItemClick(position: Int) { + when (position) { + 0 -> { + startActivity( + Intent( + this@MainActivity, + InspectionQueryActivity::class.java + ) + ) + } + 1 -> { + startActivity( + Intent( + this@MainActivity, + EventQueryActivity::class.java + ) + ) + } } } - }.build().show() + }) + .build().show() } //系统设置 settingsLayout.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt new file mode 100644 index 0000000..207f6c3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -0,0 +1,176 @@ +package com.casic.birmm.inspect.view + +import android.bluetooth.BluetoothAdapter +import android.graphics.Color +import android.os.Bundle +import android.os.Handler +import android.os.Message +import android.util.Log +import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContextCompat +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.model.MyLocationStyle +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.widgets.InputDialog +import com.gyf.immersionbar.ImmersionBar +import com.qmuiteam.qmui.util.QMUIStatusBarHelper +import kotlinx.android.synthetic.main.activity_inspect_route.mapView +import kotlinx.android.synthetic.main.activity_map.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.cancel +import java.lang.ref.WeakReference + + +class MapActivity : AppCompatActivity(), CoroutineScope by MainScope() { + + companion object { + private const val Tag = "MapActivity" + private lateinit var weakReferenceHandler: WeakReferenceHandler + + fun sendEmptyMessage(what: Int) { + weakReferenceHandler.sendEmptyMessage(what) + } + } + + private lateinit var aMap: AMap + private lateinit var locationStyle: MyLocationStyle + + init { + weakReferenceHandler = WeakReferenceHandler(this) + } + + private class WeakReferenceHandler(activity: MapActivity) : Handler() { + private val activity: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + val mainActivity = activity.get() ?: return + when (msg.what) { + Constant.BLUETOOTH_ON -> { + "蓝牙已开启".show(mainActivity) + mainActivity.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + } + Constant.BLUETOOTH_OFF -> { + "蓝牙已关闭".show(mainActivity) + mainActivity.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + } + Constant.DEVICE_CONNECTED -> { + //TODO 设备已连接 + } + Constant.DEVICE_DISCONNECTED -> { + //TODO 设备断开连接 + } + } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_map) + PageNavigationManager.addActivity(this) + setupTopBarLayout() + if (OtherUtils.isNetworkConnected(this)) { + initData(savedInstanceState) + initEvent() + } else { + "糟糕,没有接入任何网络~".show(this) + } + } + + fun setupTopBarLayout() { + QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "巡检" + } + + fun initData(savedInstanceState: Bundle?) { + mapView.onCreate(savedInstanceState) + aMap = mapView.map + val uiSettings = aMap.uiSettings + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 + //显示定位小蓝点 + locationStyle = MyLocationStyle() + locationStyle.showMyLocation(true)//设置是否显示定位小蓝点 + locationStyle.strokeColor(Color.parseColor("#A2DBFA"))//设置定位蓝点精度圆圈的边框颜色 + locationStyle.radiusFillColor(Color.parseColor("#A2DBFA"))//设置定位蓝点精度圆圈的填充颜色 + aMap.myLocationStyle = locationStyle + aMap.isMyLocationEnabled = true + aMap.addOnMyLocationChangeListener { + Log.d(Tag, "[" + it.longitude + "," + it.latitude + "]") + } + } + + fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //需要判断是否是上次未完的巡检 +// selectInspectMode() + + //判断蓝牙的状态 + val blueAdapter = BluetoothAdapter.getDefaultAdapter() + if (blueAdapter == null) { + "该设备不支持蓝牙,无法连接".show(this) + } else { + if (blueAdapter.isEnabled) { + bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + bluetoothButton.setOnClickListener { + //搜索蓝牙 + } + } else { + bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + //打开 + } + } + + newEventButton.setChangeAlphaWhenPress(true) + newEventButton.setOnClickListener { + + } + } + + private fun selectInspectMode() { + InputDialog.Builder().setContext(this) + .setTitle("请输入巡检标签") + .setHintText("如:xxx区间巡检") + .setNegativeButton("放弃") + .setPositiveButton("开始巡检") + .setOnDialogClickListener(object : InputDialog.OnDialogButtonClickListener { + override fun onConfirmClick(input: String) { + + } + + override fun onCancelClick() { + finish() + } + }) + .build().show() + } + + override fun onResume() { + super.onResume() + mapView.onResume() + } + + override fun onPause() { + super.onPause() + mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + cancel() + super.onDestroy() + mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt index cfa32dc..f2db4c9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt @@ -16,6 +16,7 @@ private var ctx: Context? = null private var title: String? = null + private var hint: String? = null private var value: String? = null private var positiveBtn: String? = null private var negativeBtn: String? = null @@ -24,6 +25,7 @@ init { this.ctx = builder.mContext this.title = builder.title + this.hint = builder.hint this.value = builder.value this.positiveBtn = builder.positiveBtn this.negativeBtn = builder.negativeBtn @@ -38,6 +40,7 @@ setCanceledOnTouchOutside(false) dialogTitleView.text = title + dialogInputView.hint = hint!! value.apply { dialogInputView.setText(this) } @@ -46,6 +49,7 @@ dialogCancelButton.setChangeAlphaWhenPress(true) dialogCancelButton.setOnClickListener { this.dismiss() + listener?.onCancelClick() } dialogConfirmButton.text = positiveBtn @@ -56,8 +60,8 @@ "什么都没输入,请重新输入".show(ctx!!) return@setOnClickListener } - listener?.onButtonClick(inputValue) this.dismiss() + listener?.onConfirmClick(inputValue) } } @@ -73,6 +77,7 @@ class Builder { var mContext: Context? = null var title: String? = null + var hint: String? = null var value: String? = null var positiveBtn: String? = null var negativeBtn: String? = null @@ -88,6 +93,11 @@ return this } + fun setHintText(hint: String?): Builder { + this.hint = hint + return this + } + fun setDefaultValue(value: String?): Builder { this.value = value return this @@ -114,6 +124,8 @@ } interface OnDialogButtonClickListener { - fun onButtonClick(input: String) + fun onCancelClick() + + fun onConfirmClick(input: String) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt new file mode 100644 index 0000000..216befd --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt @@ -0,0 +1,123 @@ +package com.casic.birmm.inspect.widgets + +import android.app.Dialog +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.WindowManager +import android.widget.BaseAdapter +import com.casic.birmm.inspect.R +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton +import kotlinx.android.synthetic.main.dialog_input.dialogTitleView +import kotlinx.android.synthetic.main.dialog_single_choice.* + + +class SingleChoiceDialog private constructor(builder: Builder) : Dialog(builder.mContext!!) { + + private var ctx: Context? = null + private var title: String? = null + private var items: List? = null + private var listener: OnDialogItemClickListener? = null + + init { + this.ctx = builder.mContext + this.title = builder.title + this.items = builder.items + this.listener = builder.listener + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + configDialogLayout() + setContentView(R.layout.dialog_single_choice) + setCancelable(true) + setCanceledOnTouchOutside(true) + + dialogTitleView.text = title + dialogListView.adapter = ItemChoiceAdapter() + } + + private fun configDialogLayout() { + window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + window?.decorView?.setBackgroundColor(Color.TRANSPARENT) + val params: WindowManager.LayoutParams? = window?.attributes + params?.width = QMUIDisplayHelper.dp2px(ctx, 220) + params?.height = WindowManager.LayoutParams.WRAP_CONTENT + window?.attributes = params + } + + inner class ItemChoiceAdapter : BaseAdapter() { + + private var inflater: LayoutInflater = LayoutInflater.from(ctx!!) + + override fun getCount(): Int = items!!.size + + override fun getItem(position: Int): Any = items!![position] + + override fun getItemId(position: Int): Long = position.toLong() + + override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { + val view: View + val itemViewHolder: ItemViewHolder + if (convertView == null) { + view = inflater.inflate(R.layout.item_dialog_listview, null)!! + itemViewHolder = ItemViewHolder(view) + view.tag = itemViewHolder + } else { + view = convertView + itemViewHolder = view.tag as ItemViewHolder + } + itemViewHolder.itemTagView.text = items!![position] + itemViewHolder.itemTagView.setChangeAlphaWhenPress(true) + itemViewHolder.itemTagView.setOnClickListener { + dismiss() + listener?.onItemClick(position) + } + return view + } + } + + class ItemViewHolder(v: View) { + var itemTagView: QMUIRoundButton = v.findViewById(R.id.itemTagView) + } + + class Builder { + var mContext: Context? = null + var title: String? = null + var items: List? = null + var listener: OnDialogItemClickListener? = null + + fun setContext(context: Context?): Builder { + mContext = context + return this + } + + fun setTitle(title: String?): Builder { + this.title = title + return this + } + + fun setChoiceItemButton(items: List?): Builder { + this.items = items + return this + } + + fun setOnDialogClickListener(listener: OnDialogItemClickListener): Builder { + this.listener = listener + return this + } + + fun build(): SingleChoiceDialog { + return SingleChoiceDialog(this) + } + } + + interface OnDialogItemClickListener { + fun onItemClick(position: Int) + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_image_button_layout.xml b/app/src/main/res/drawable/bg_image_button_layout.xml new file mode 100644 index 0000000..41a75be --- /dev/null +++ b/app/src/main/res/drawable/bg_image_button_layout.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_aim.xml b/app/src/main/res/drawable/ic_aim.xml new file mode 100644 index 0000000..88d9e36 --- /dev/null +++ b/app/src/main/res/drawable/ic_aim.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_bluetooth_disabled.xml b/app/src/main/res/drawable/ic_bluetooth_disabled.xml new file mode 100644 index 0000000..1a8526e --- /dev/null +++ b/app/src/main/res/drawable/ic_bluetooth_disabled.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_bluetooth_empty.xml b/app/src/main/res/drawable/ic_bluetooth_empty.xml new file mode 100644 index 0000000..477d2bb --- /dev/null +++ b/app/src/main/res/drawable/ic_bluetooth_empty.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_bluetooth_enable.xml b/app/src/main/res/drawable/ic_bluetooth_enable.xml new file mode 100644 index 0000000..d60b5ae --- /dev/null +++ b/app/src/main/res/drawable/ic_bluetooth_enable.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_off.xml b/app/src/main/res/drawable/ic_off.xml new file mode 100644 index 0000000..4ed867e --- /dev/null +++ b/app/src/main/res/drawable/ic_off.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_pause.xml b/app/src/main/res/drawable/ic_pause.xml new file mode 100644 index 0000000..ab62a60 --- /dev/null +++ b/app/src/main/res/drawable/ic_pause.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_refresh.xml b/app/src/main/res/drawable/ic_refresh.xml new file mode 100644 index 0000000..1f12913 --- /dev/null +++ b/app/src/main/res/drawable/ic_refresh.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_inspect_route.xml b/app/src/main/res/layout/activity_inspect_route.xml index 6c11830..38d2421 100644 --- a/app/src/main/res/layout/activity_inspect_route.xml +++ b/app/src/main/res/layout/activity_inspect_route.xml @@ -7,7 +7,7 @@ - @@ -30,10 +30,12 @@ @@ -65,12 +67,14 @@ app:layout_constraintEnd_toEndOf="parent" /> @@ -79,7 +83,7 @@ android:id="@+id/eventButton" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_gravity="bottom" + android:layout_alignParentBottom="true" android:layout_marginHorizontal="30dp" android:layout_marginBottom="20dp" android:paddingVertical="7dp" @@ -89,5 +93,5 @@ app:qmui_backgroundColor="@color/mainThemeColor" app:qmui_borderColor="@color/mainThemeColor" app:qmui_radius="5dp" /> - + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_map.xml b/app/src/main/res/layout/activity_map.xml new file mode 100644 index 0000000..13102d9 --- /dev/null +++ b/app/src/main/res/layout/activity_map.xml @@ -0,0 +1,224 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_input.xml b/app/src/main/res/layout/dialog_input.xml index f5a8bc6..3bb7f3c 100644 --- a/app/src/main/res/layout/dialog_input.xml +++ b/app/src/main/res/layout/dialog_input.xml @@ -16,7 +16,7 @@ android:id="@+id/dialogTitleView" android:layout_width="match_parent" android:layout_height="wrap_content" - android:fontFamily="sans-serif-black" + android:fontFamily="sans-serif-medium" android:gravity="center_horizontal" android:paddingVertical="15dp" android:text="@string/app_name" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7949d16..6a3f570 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,10 @@ + + + + @@ -48,6 +52,7 @@ android:theme="@style/Theme.BigImageActivity" /> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt new file mode 100644 index 0000000..b6b5281 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt @@ -0,0 +1,31 @@ +package com.casic.birmm.inspect.utils + +import android.bluetooth.BluetoothAdapter +import android.bluetooth.BluetoothDevice +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import com.casic.birmm.inspect.view.MapActivity + +class BluetoothStateBroadcastReceiver : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + when (intent?.action) { + BluetoothAdapter.ACTION_STATE_CHANGED -> { + when (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0)) { + BluetoothAdapter.STATE_OFF -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_OFF) + } + BluetoothAdapter.STATE_ON -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_ON) + } + } + } + BluetoothDevice.ACTION_ACL_CONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_CONNECTED) + } + BluetoothDevice.ACTION_ACL_DISCONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_DISCONNECTED) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 0ae38db..aef675a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -13,6 +13,10 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 15 + const val BLUETOOTH_ON = 20 + const val BLUETOOTH_OFF = 21 + const val DEVICE_CONNECTED = 22 + const val DEVICE_DISCONNECTED = 23 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt index 94d269e..c3b1e6b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -59,6 +59,7 @@ aMap = mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //根据id查询详情 id = intent.getStringExtra("id")!! @@ -120,6 +121,7 @@ } fun initEvent() { + leftBackView.setOnClickListener { this.finish() } eventButton.setChangeAlphaWhenPress(true) eventButton.setOnClickListener { val intent = Intent(this, EventListActivity::class.java) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 8ed4a0c..da4b03e 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -168,6 +168,5 @@ } } } - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 517203f..dddea49 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -132,9 +132,13 @@ .setNegativeButton("取消") .setPositiveButton("保存") .setOnDialogClickListener(object : InputDialog.OnDialogButtonClickListener { - override fun onButtonClick(input: String) { + override fun onConfirmClick(input: String) { SaveKeyValues.putValue(Constant.DEFAULT_SERVER_CONFIG, input) } + + override fun onCancelClick() { + + } }) .build().show() } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 4ef86d3..2db634f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -15,9 +15,9 @@ import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.utils.StatusBarColorUtil import com.casic.birmm.inspect.vm.UserViewModel +import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* @@ -25,6 +25,7 @@ class MainActivity : BaseActivity() { private var clickTime: Long = 0 + private val itemList: List = arrayListOf("巡检记录", "事件记录") override fun initLayoutView(): Int = R.layout.activity_main @@ -53,26 +54,37 @@ override fun initEvent() { //新建巡检 createIssueLayout.setOnClickListener { - + startActivity(Intent(this, MapActivity::class.java)) } //记录查询 logSearchLayout.setOnClickListener { - QMUIBottomSheet.BottomListSheetBuilder(this) + SingleChoiceDialog.Builder() + .setContext(this) .setTitle("选择记录类型") - .addItem("巡检记录") - .addItem("事件记录") - .setGravityCenter(true) - .setOnSheetItemClickListener { dialog, _, position, _ -> - dialog?.dismiss() - when (position) { - 0 -> { - startActivity(Intent(this, InspectionQueryActivity::class.java)) - } - 1 -> { - startActivity(Intent(this, EventQueryActivity::class.java)) + .setChoiceItemButton(itemList) + .setOnDialogClickListener(object : SingleChoiceDialog.OnDialogItemClickListener { + override fun onItemClick(position: Int) { + when (position) { + 0 -> { + startActivity( + Intent( + this@MainActivity, + InspectionQueryActivity::class.java + ) + ) + } + 1 -> { + startActivity( + Intent( + this@MainActivity, + EventQueryActivity::class.java + ) + ) + } } } - }.build().show() + }) + .build().show() } //系统设置 settingsLayout.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt new file mode 100644 index 0000000..207f6c3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -0,0 +1,176 @@ +package com.casic.birmm.inspect.view + +import android.bluetooth.BluetoothAdapter +import android.graphics.Color +import android.os.Bundle +import android.os.Handler +import android.os.Message +import android.util.Log +import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContextCompat +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.model.MyLocationStyle +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.widgets.InputDialog +import com.gyf.immersionbar.ImmersionBar +import com.qmuiteam.qmui.util.QMUIStatusBarHelper +import kotlinx.android.synthetic.main.activity_inspect_route.mapView +import kotlinx.android.synthetic.main.activity_map.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.cancel +import java.lang.ref.WeakReference + + +class MapActivity : AppCompatActivity(), CoroutineScope by MainScope() { + + companion object { + private const val Tag = "MapActivity" + private lateinit var weakReferenceHandler: WeakReferenceHandler + + fun sendEmptyMessage(what: Int) { + weakReferenceHandler.sendEmptyMessage(what) + } + } + + private lateinit var aMap: AMap + private lateinit var locationStyle: MyLocationStyle + + init { + weakReferenceHandler = WeakReferenceHandler(this) + } + + private class WeakReferenceHandler(activity: MapActivity) : Handler() { + private val activity: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + val mainActivity = activity.get() ?: return + when (msg.what) { + Constant.BLUETOOTH_ON -> { + "蓝牙已开启".show(mainActivity) + mainActivity.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + } + Constant.BLUETOOTH_OFF -> { + "蓝牙已关闭".show(mainActivity) + mainActivity.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + } + Constant.DEVICE_CONNECTED -> { + //TODO 设备已连接 + } + Constant.DEVICE_DISCONNECTED -> { + //TODO 设备断开连接 + } + } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_map) + PageNavigationManager.addActivity(this) + setupTopBarLayout() + if (OtherUtils.isNetworkConnected(this)) { + initData(savedInstanceState) + initEvent() + } else { + "糟糕,没有接入任何网络~".show(this) + } + } + + fun setupTopBarLayout() { + QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "巡检" + } + + fun initData(savedInstanceState: Bundle?) { + mapView.onCreate(savedInstanceState) + aMap = mapView.map + val uiSettings = aMap.uiSettings + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 + //显示定位小蓝点 + locationStyle = MyLocationStyle() + locationStyle.showMyLocation(true)//设置是否显示定位小蓝点 + locationStyle.strokeColor(Color.parseColor("#A2DBFA"))//设置定位蓝点精度圆圈的边框颜色 + locationStyle.radiusFillColor(Color.parseColor("#A2DBFA"))//设置定位蓝点精度圆圈的填充颜色 + aMap.myLocationStyle = locationStyle + aMap.isMyLocationEnabled = true + aMap.addOnMyLocationChangeListener { + Log.d(Tag, "[" + it.longitude + "," + it.latitude + "]") + } + } + + fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //需要判断是否是上次未完的巡检 +// selectInspectMode() + + //判断蓝牙的状态 + val blueAdapter = BluetoothAdapter.getDefaultAdapter() + if (blueAdapter == null) { + "该设备不支持蓝牙,无法连接".show(this) + } else { + if (blueAdapter.isEnabled) { + bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + bluetoothButton.setOnClickListener { + //搜索蓝牙 + } + } else { + bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + //打开 + } + } + + newEventButton.setChangeAlphaWhenPress(true) + newEventButton.setOnClickListener { + + } + } + + private fun selectInspectMode() { + InputDialog.Builder().setContext(this) + .setTitle("请输入巡检标签") + .setHintText("如:xxx区间巡检") + .setNegativeButton("放弃") + .setPositiveButton("开始巡检") + .setOnDialogClickListener(object : InputDialog.OnDialogButtonClickListener { + override fun onConfirmClick(input: String) { + + } + + override fun onCancelClick() { + finish() + } + }) + .build().show() + } + + override fun onResume() { + super.onResume() + mapView.onResume() + } + + override fun onPause() { + super.onPause() + mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + cancel() + super.onDestroy() + mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt index cfa32dc..f2db4c9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt @@ -16,6 +16,7 @@ private var ctx: Context? = null private var title: String? = null + private var hint: String? = null private var value: String? = null private var positiveBtn: String? = null private var negativeBtn: String? = null @@ -24,6 +25,7 @@ init { this.ctx = builder.mContext this.title = builder.title + this.hint = builder.hint this.value = builder.value this.positiveBtn = builder.positiveBtn this.negativeBtn = builder.negativeBtn @@ -38,6 +40,7 @@ setCanceledOnTouchOutside(false) dialogTitleView.text = title + dialogInputView.hint = hint!! value.apply { dialogInputView.setText(this) } @@ -46,6 +49,7 @@ dialogCancelButton.setChangeAlphaWhenPress(true) dialogCancelButton.setOnClickListener { this.dismiss() + listener?.onCancelClick() } dialogConfirmButton.text = positiveBtn @@ -56,8 +60,8 @@ "什么都没输入,请重新输入".show(ctx!!) return@setOnClickListener } - listener?.onButtonClick(inputValue) this.dismiss() + listener?.onConfirmClick(inputValue) } } @@ -73,6 +77,7 @@ class Builder { var mContext: Context? = null var title: String? = null + var hint: String? = null var value: String? = null var positiveBtn: String? = null var negativeBtn: String? = null @@ -88,6 +93,11 @@ return this } + fun setHintText(hint: String?): Builder { + this.hint = hint + return this + } + fun setDefaultValue(value: String?): Builder { this.value = value return this @@ -114,6 +124,8 @@ } interface OnDialogButtonClickListener { - fun onButtonClick(input: String) + fun onCancelClick() + + fun onConfirmClick(input: String) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt new file mode 100644 index 0000000..216befd --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt @@ -0,0 +1,123 @@ +package com.casic.birmm.inspect.widgets + +import android.app.Dialog +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.WindowManager +import android.widget.BaseAdapter +import com.casic.birmm.inspect.R +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton +import kotlinx.android.synthetic.main.dialog_input.dialogTitleView +import kotlinx.android.synthetic.main.dialog_single_choice.* + + +class SingleChoiceDialog private constructor(builder: Builder) : Dialog(builder.mContext!!) { + + private var ctx: Context? = null + private var title: String? = null + private var items: List? = null + private var listener: OnDialogItemClickListener? = null + + init { + this.ctx = builder.mContext + this.title = builder.title + this.items = builder.items + this.listener = builder.listener + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + configDialogLayout() + setContentView(R.layout.dialog_single_choice) + setCancelable(true) + setCanceledOnTouchOutside(true) + + dialogTitleView.text = title + dialogListView.adapter = ItemChoiceAdapter() + } + + private fun configDialogLayout() { + window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + window?.decorView?.setBackgroundColor(Color.TRANSPARENT) + val params: WindowManager.LayoutParams? = window?.attributes + params?.width = QMUIDisplayHelper.dp2px(ctx, 220) + params?.height = WindowManager.LayoutParams.WRAP_CONTENT + window?.attributes = params + } + + inner class ItemChoiceAdapter : BaseAdapter() { + + private var inflater: LayoutInflater = LayoutInflater.from(ctx!!) + + override fun getCount(): Int = items!!.size + + override fun getItem(position: Int): Any = items!![position] + + override fun getItemId(position: Int): Long = position.toLong() + + override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { + val view: View + val itemViewHolder: ItemViewHolder + if (convertView == null) { + view = inflater.inflate(R.layout.item_dialog_listview, null)!! + itemViewHolder = ItemViewHolder(view) + view.tag = itemViewHolder + } else { + view = convertView + itemViewHolder = view.tag as ItemViewHolder + } + itemViewHolder.itemTagView.text = items!![position] + itemViewHolder.itemTagView.setChangeAlphaWhenPress(true) + itemViewHolder.itemTagView.setOnClickListener { + dismiss() + listener?.onItemClick(position) + } + return view + } + } + + class ItemViewHolder(v: View) { + var itemTagView: QMUIRoundButton = v.findViewById(R.id.itemTagView) + } + + class Builder { + var mContext: Context? = null + var title: String? = null + var items: List? = null + var listener: OnDialogItemClickListener? = null + + fun setContext(context: Context?): Builder { + mContext = context + return this + } + + fun setTitle(title: String?): Builder { + this.title = title + return this + } + + fun setChoiceItemButton(items: List?): Builder { + this.items = items + return this + } + + fun setOnDialogClickListener(listener: OnDialogItemClickListener): Builder { + this.listener = listener + return this + } + + fun build(): SingleChoiceDialog { + return SingleChoiceDialog(this) + } + } + + interface OnDialogItemClickListener { + fun onItemClick(position: Int) + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_image_button_layout.xml b/app/src/main/res/drawable/bg_image_button_layout.xml new file mode 100644 index 0000000..41a75be --- /dev/null +++ b/app/src/main/res/drawable/bg_image_button_layout.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_aim.xml b/app/src/main/res/drawable/ic_aim.xml new file mode 100644 index 0000000..88d9e36 --- /dev/null +++ b/app/src/main/res/drawable/ic_aim.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_bluetooth_disabled.xml b/app/src/main/res/drawable/ic_bluetooth_disabled.xml new file mode 100644 index 0000000..1a8526e --- /dev/null +++ b/app/src/main/res/drawable/ic_bluetooth_disabled.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_bluetooth_empty.xml b/app/src/main/res/drawable/ic_bluetooth_empty.xml new file mode 100644 index 0000000..477d2bb --- /dev/null +++ b/app/src/main/res/drawable/ic_bluetooth_empty.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_bluetooth_enable.xml b/app/src/main/res/drawable/ic_bluetooth_enable.xml new file mode 100644 index 0000000..d60b5ae --- /dev/null +++ b/app/src/main/res/drawable/ic_bluetooth_enable.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_off.xml b/app/src/main/res/drawable/ic_off.xml new file mode 100644 index 0000000..4ed867e --- /dev/null +++ b/app/src/main/res/drawable/ic_off.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_pause.xml b/app/src/main/res/drawable/ic_pause.xml new file mode 100644 index 0000000..ab62a60 --- /dev/null +++ b/app/src/main/res/drawable/ic_pause.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_refresh.xml b/app/src/main/res/drawable/ic_refresh.xml new file mode 100644 index 0000000..1f12913 --- /dev/null +++ b/app/src/main/res/drawable/ic_refresh.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_inspect_route.xml b/app/src/main/res/layout/activity_inspect_route.xml index 6c11830..38d2421 100644 --- a/app/src/main/res/layout/activity_inspect_route.xml +++ b/app/src/main/res/layout/activity_inspect_route.xml @@ -7,7 +7,7 @@ - @@ -30,10 +30,12 @@ @@ -65,12 +67,14 @@ app:layout_constraintEnd_toEndOf="parent" /> @@ -79,7 +83,7 @@ android:id="@+id/eventButton" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_gravity="bottom" + android:layout_alignParentBottom="true" android:layout_marginHorizontal="30dp" android:layout_marginBottom="20dp" android:paddingVertical="7dp" @@ -89,5 +93,5 @@ app:qmui_backgroundColor="@color/mainThemeColor" app:qmui_borderColor="@color/mainThemeColor" app:qmui_radius="5dp" /> - + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_map.xml b/app/src/main/res/layout/activity_map.xml new file mode 100644 index 0000000..13102d9 --- /dev/null +++ b/app/src/main/res/layout/activity_map.xml @@ -0,0 +1,224 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_input.xml b/app/src/main/res/layout/dialog_input.xml index f5a8bc6..3bb7f3c 100644 --- a/app/src/main/res/layout/dialog_input.xml +++ b/app/src/main/res/layout/dialog_input.xml @@ -16,7 +16,7 @@ android:id="@+id/dialogTitleView" android:layout_width="match_parent" android:layout_height="wrap_content" - android:fontFamily="sans-serif-black" + android:fontFamily="sans-serif-medium" android:gravity="center_horizontal" android:paddingVertical="15dp" android:text="@string/app_name" diff --git a/app/src/main/res/layout/dialog_single_choice.xml b/app/src/main/res/layout/dialog_single_choice.xml new file mode 100644 index 0000000..671463f --- /dev/null +++ b/app/src/main/res/layout/dialog_single_choice.xml @@ -0,0 +1,36 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7949d16..6a3f570 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,10 @@ + + + + @@ -48,6 +52,7 @@ android:theme="@style/Theme.BigImageActivity" /> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt new file mode 100644 index 0000000..b6b5281 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt @@ -0,0 +1,31 @@ +package com.casic.birmm.inspect.utils + +import android.bluetooth.BluetoothAdapter +import android.bluetooth.BluetoothDevice +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import com.casic.birmm.inspect.view.MapActivity + +class BluetoothStateBroadcastReceiver : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + when (intent?.action) { + BluetoothAdapter.ACTION_STATE_CHANGED -> { + when (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0)) { + BluetoothAdapter.STATE_OFF -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_OFF) + } + BluetoothAdapter.STATE_ON -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_ON) + } + } + } + BluetoothDevice.ACTION_ACL_CONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_CONNECTED) + } + BluetoothDevice.ACTION_ACL_DISCONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_DISCONNECTED) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 0ae38db..aef675a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -13,6 +13,10 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 15 + const val BLUETOOTH_ON = 20 + const val BLUETOOTH_OFF = 21 + const val DEVICE_CONNECTED = 22 + const val DEVICE_DISCONNECTED = 23 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt index 94d269e..c3b1e6b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -59,6 +59,7 @@ aMap = mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //根据id查询详情 id = intent.getStringExtra("id")!! @@ -120,6 +121,7 @@ } fun initEvent() { + leftBackView.setOnClickListener { this.finish() } eventButton.setChangeAlphaWhenPress(true) eventButton.setOnClickListener { val intent = Intent(this, EventListActivity::class.java) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 8ed4a0c..da4b03e 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -168,6 +168,5 @@ } } } - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 517203f..dddea49 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -132,9 +132,13 @@ .setNegativeButton("取消") .setPositiveButton("保存") .setOnDialogClickListener(object : InputDialog.OnDialogButtonClickListener { - override fun onButtonClick(input: String) { + override fun onConfirmClick(input: String) { SaveKeyValues.putValue(Constant.DEFAULT_SERVER_CONFIG, input) } + + override fun onCancelClick() { + + } }) .build().show() } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 4ef86d3..2db634f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -15,9 +15,9 @@ import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.utils.StatusBarColorUtil import com.casic.birmm.inspect.vm.UserViewModel +import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* @@ -25,6 +25,7 @@ class MainActivity : BaseActivity() { private var clickTime: Long = 0 + private val itemList: List = arrayListOf("巡检记录", "事件记录") override fun initLayoutView(): Int = R.layout.activity_main @@ -53,26 +54,37 @@ override fun initEvent() { //新建巡检 createIssueLayout.setOnClickListener { - + startActivity(Intent(this, MapActivity::class.java)) } //记录查询 logSearchLayout.setOnClickListener { - QMUIBottomSheet.BottomListSheetBuilder(this) + SingleChoiceDialog.Builder() + .setContext(this) .setTitle("选择记录类型") - .addItem("巡检记录") - .addItem("事件记录") - .setGravityCenter(true) - .setOnSheetItemClickListener { dialog, _, position, _ -> - dialog?.dismiss() - when (position) { - 0 -> { - startActivity(Intent(this, InspectionQueryActivity::class.java)) - } - 1 -> { - startActivity(Intent(this, EventQueryActivity::class.java)) + .setChoiceItemButton(itemList) + .setOnDialogClickListener(object : SingleChoiceDialog.OnDialogItemClickListener { + override fun onItemClick(position: Int) { + when (position) { + 0 -> { + startActivity( + Intent( + this@MainActivity, + InspectionQueryActivity::class.java + ) + ) + } + 1 -> { + startActivity( + Intent( + this@MainActivity, + EventQueryActivity::class.java + ) + ) + } } } - }.build().show() + }) + .build().show() } //系统设置 settingsLayout.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt new file mode 100644 index 0000000..207f6c3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -0,0 +1,176 @@ +package com.casic.birmm.inspect.view + +import android.bluetooth.BluetoothAdapter +import android.graphics.Color +import android.os.Bundle +import android.os.Handler +import android.os.Message +import android.util.Log +import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContextCompat +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.model.MyLocationStyle +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.widgets.InputDialog +import com.gyf.immersionbar.ImmersionBar +import com.qmuiteam.qmui.util.QMUIStatusBarHelper +import kotlinx.android.synthetic.main.activity_inspect_route.mapView +import kotlinx.android.synthetic.main.activity_map.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.cancel +import java.lang.ref.WeakReference + + +class MapActivity : AppCompatActivity(), CoroutineScope by MainScope() { + + companion object { + private const val Tag = "MapActivity" + private lateinit var weakReferenceHandler: WeakReferenceHandler + + fun sendEmptyMessage(what: Int) { + weakReferenceHandler.sendEmptyMessage(what) + } + } + + private lateinit var aMap: AMap + private lateinit var locationStyle: MyLocationStyle + + init { + weakReferenceHandler = WeakReferenceHandler(this) + } + + private class WeakReferenceHandler(activity: MapActivity) : Handler() { + private val activity: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + val mainActivity = activity.get() ?: return + when (msg.what) { + Constant.BLUETOOTH_ON -> { + "蓝牙已开启".show(mainActivity) + mainActivity.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + } + Constant.BLUETOOTH_OFF -> { + "蓝牙已关闭".show(mainActivity) + mainActivity.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + } + Constant.DEVICE_CONNECTED -> { + //TODO 设备已连接 + } + Constant.DEVICE_DISCONNECTED -> { + //TODO 设备断开连接 + } + } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_map) + PageNavigationManager.addActivity(this) + setupTopBarLayout() + if (OtherUtils.isNetworkConnected(this)) { + initData(savedInstanceState) + initEvent() + } else { + "糟糕,没有接入任何网络~".show(this) + } + } + + fun setupTopBarLayout() { + QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "巡检" + } + + fun initData(savedInstanceState: Bundle?) { + mapView.onCreate(savedInstanceState) + aMap = mapView.map + val uiSettings = aMap.uiSettings + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 + //显示定位小蓝点 + locationStyle = MyLocationStyle() + locationStyle.showMyLocation(true)//设置是否显示定位小蓝点 + locationStyle.strokeColor(Color.parseColor("#A2DBFA"))//设置定位蓝点精度圆圈的边框颜色 + locationStyle.radiusFillColor(Color.parseColor("#A2DBFA"))//设置定位蓝点精度圆圈的填充颜色 + aMap.myLocationStyle = locationStyle + aMap.isMyLocationEnabled = true + aMap.addOnMyLocationChangeListener { + Log.d(Tag, "[" + it.longitude + "," + it.latitude + "]") + } + } + + fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //需要判断是否是上次未完的巡检 +// selectInspectMode() + + //判断蓝牙的状态 + val blueAdapter = BluetoothAdapter.getDefaultAdapter() + if (blueAdapter == null) { + "该设备不支持蓝牙,无法连接".show(this) + } else { + if (blueAdapter.isEnabled) { + bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + bluetoothButton.setOnClickListener { + //搜索蓝牙 + } + } else { + bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + //打开 + } + } + + newEventButton.setChangeAlphaWhenPress(true) + newEventButton.setOnClickListener { + + } + } + + private fun selectInspectMode() { + InputDialog.Builder().setContext(this) + .setTitle("请输入巡检标签") + .setHintText("如:xxx区间巡检") + .setNegativeButton("放弃") + .setPositiveButton("开始巡检") + .setOnDialogClickListener(object : InputDialog.OnDialogButtonClickListener { + override fun onConfirmClick(input: String) { + + } + + override fun onCancelClick() { + finish() + } + }) + .build().show() + } + + override fun onResume() { + super.onResume() + mapView.onResume() + } + + override fun onPause() { + super.onPause() + mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + cancel() + super.onDestroy() + mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt index cfa32dc..f2db4c9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt @@ -16,6 +16,7 @@ private var ctx: Context? = null private var title: String? = null + private var hint: String? = null private var value: String? = null private var positiveBtn: String? = null private var negativeBtn: String? = null @@ -24,6 +25,7 @@ init { this.ctx = builder.mContext this.title = builder.title + this.hint = builder.hint this.value = builder.value this.positiveBtn = builder.positiveBtn this.negativeBtn = builder.negativeBtn @@ -38,6 +40,7 @@ setCanceledOnTouchOutside(false) dialogTitleView.text = title + dialogInputView.hint = hint!! value.apply { dialogInputView.setText(this) } @@ -46,6 +49,7 @@ dialogCancelButton.setChangeAlphaWhenPress(true) dialogCancelButton.setOnClickListener { this.dismiss() + listener?.onCancelClick() } dialogConfirmButton.text = positiveBtn @@ -56,8 +60,8 @@ "什么都没输入,请重新输入".show(ctx!!) return@setOnClickListener } - listener?.onButtonClick(inputValue) this.dismiss() + listener?.onConfirmClick(inputValue) } } @@ -73,6 +77,7 @@ class Builder { var mContext: Context? = null var title: String? = null + var hint: String? = null var value: String? = null var positiveBtn: String? = null var negativeBtn: String? = null @@ -88,6 +93,11 @@ return this } + fun setHintText(hint: String?): Builder { + this.hint = hint + return this + } + fun setDefaultValue(value: String?): Builder { this.value = value return this @@ -114,6 +124,8 @@ } interface OnDialogButtonClickListener { - fun onButtonClick(input: String) + fun onCancelClick() + + fun onConfirmClick(input: String) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt new file mode 100644 index 0000000..216befd --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt @@ -0,0 +1,123 @@ +package com.casic.birmm.inspect.widgets + +import android.app.Dialog +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.WindowManager +import android.widget.BaseAdapter +import com.casic.birmm.inspect.R +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton +import kotlinx.android.synthetic.main.dialog_input.dialogTitleView +import kotlinx.android.synthetic.main.dialog_single_choice.* + + +class SingleChoiceDialog private constructor(builder: Builder) : Dialog(builder.mContext!!) { + + private var ctx: Context? = null + private var title: String? = null + private var items: List? = null + private var listener: OnDialogItemClickListener? = null + + init { + this.ctx = builder.mContext + this.title = builder.title + this.items = builder.items + this.listener = builder.listener + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + configDialogLayout() + setContentView(R.layout.dialog_single_choice) + setCancelable(true) + setCanceledOnTouchOutside(true) + + dialogTitleView.text = title + dialogListView.adapter = ItemChoiceAdapter() + } + + private fun configDialogLayout() { + window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + window?.decorView?.setBackgroundColor(Color.TRANSPARENT) + val params: WindowManager.LayoutParams? = window?.attributes + params?.width = QMUIDisplayHelper.dp2px(ctx, 220) + params?.height = WindowManager.LayoutParams.WRAP_CONTENT + window?.attributes = params + } + + inner class ItemChoiceAdapter : BaseAdapter() { + + private var inflater: LayoutInflater = LayoutInflater.from(ctx!!) + + override fun getCount(): Int = items!!.size + + override fun getItem(position: Int): Any = items!![position] + + override fun getItemId(position: Int): Long = position.toLong() + + override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { + val view: View + val itemViewHolder: ItemViewHolder + if (convertView == null) { + view = inflater.inflate(R.layout.item_dialog_listview, null)!! + itemViewHolder = ItemViewHolder(view) + view.tag = itemViewHolder + } else { + view = convertView + itemViewHolder = view.tag as ItemViewHolder + } + itemViewHolder.itemTagView.text = items!![position] + itemViewHolder.itemTagView.setChangeAlphaWhenPress(true) + itemViewHolder.itemTagView.setOnClickListener { + dismiss() + listener?.onItemClick(position) + } + return view + } + } + + class ItemViewHolder(v: View) { + var itemTagView: QMUIRoundButton = v.findViewById(R.id.itemTagView) + } + + class Builder { + var mContext: Context? = null + var title: String? = null + var items: List? = null + var listener: OnDialogItemClickListener? = null + + fun setContext(context: Context?): Builder { + mContext = context + return this + } + + fun setTitle(title: String?): Builder { + this.title = title + return this + } + + fun setChoiceItemButton(items: List?): Builder { + this.items = items + return this + } + + fun setOnDialogClickListener(listener: OnDialogItemClickListener): Builder { + this.listener = listener + return this + } + + fun build(): SingleChoiceDialog { + return SingleChoiceDialog(this) + } + } + + interface OnDialogItemClickListener { + fun onItemClick(position: Int) + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_image_button_layout.xml b/app/src/main/res/drawable/bg_image_button_layout.xml new file mode 100644 index 0000000..41a75be --- /dev/null +++ b/app/src/main/res/drawable/bg_image_button_layout.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_aim.xml b/app/src/main/res/drawable/ic_aim.xml new file mode 100644 index 0000000..88d9e36 --- /dev/null +++ b/app/src/main/res/drawable/ic_aim.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_bluetooth_disabled.xml b/app/src/main/res/drawable/ic_bluetooth_disabled.xml new file mode 100644 index 0000000..1a8526e --- /dev/null +++ b/app/src/main/res/drawable/ic_bluetooth_disabled.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_bluetooth_empty.xml b/app/src/main/res/drawable/ic_bluetooth_empty.xml new file mode 100644 index 0000000..477d2bb --- /dev/null +++ b/app/src/main/res/drawable/ic_bluetooth_empty.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_bluetooth_enable.xml b/app/src/main/res/drawable/ic_bluetooth_enable.xml new file mode 100644 index 0000000..d60b5ae --- /dev/null +++ b/app/src/main/res/drawable/ic_bluetooth_enable.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_off.xml b/app/src/main/res/drawable/ic_off.xml new file mode 100644 index 0000000..4ed867e --- /dev/null +++ b/app/src/main/res/drawable/ic_off.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_pause.xml b/app/src/main/res/drawable/ic_pause.xml new file mode 100644 index 0000000..ab62a60 --- /dev/null +++ b/app/src/main/res/drawable/ic_pause.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_refresh.xml b/app/src/main/res/drawable/ic_refresh.xml new file mode 100644 index 0000000..1f12913 --- /dev/null +++ b/app/src/main/res/drawable/ic_refresh.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_inspect_route.xml b/app/src/main/res/layout/activity_inspect_route.xml index 6c11830..38d2421 100644 --- a/app/src/main/res/layout/activity_inspect_route.xml +++ b/app/src/main/res/layout/activity_inspect_route.xml @@ -7,7 +7,7 @@ - @@ -30,10 +30,12 @@ @@ -65,12 +67,14 @@ app:layout_constraintEnd_toEndOf="parent" /> @@ -79,7 +83,7 @@ android:id="@+id/eventButton" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_gravity="bottom" + android:layout_alignParentBottom="true" android:layout_marginHorizontal="30dp" android:layout_marginBottom="20dp" android:paddingVertical="7dp" @@ -89,5 +93,5 @@ app:qmui_backgroundColor="@color/mainThemeColor" app:qmui_borderColor="@color/mainThemeColor" app:qmui_radius="5dp" /> - + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_map.xml b/app/src/main/res/layout/activity_map.xml new file mode 100644 index 0000000..13102d9 --- /dev/null +++ b/app/src/main/res/layout/activity_map.xml @@ -0,0 +1,224 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_input.xml b/app/src/main/res/layout/dialog_input.xml index f5a8bc6..3bb7f3c 100644 --- a/app/src/main/res/layout/dialog_input.xml +++ b/app/src/main/res/layout/dialog_input.xml @@ -16,7 +16,7 @@ android:id="@+id/dialogTitleView" android:layout_width="match_parent" android:layout_height="wrap_content" - android:fontFamily="sans-serif-black" + android:fontFamily="sans-serif-medium" android:gravity="center_horizontal" android:paddingVertical="15dp" android:text="@string/app_name" diff --git a/app/src/main/res/layout/dialog_single_choice.xml b/app/src/main/res/layout/dialog_single_choice.xml new file mode 100644 index 0000000..671463f --- /dev/null +++ b/app/src/main/res/layout/dialog_single_choice.xml @@ -0,0 +1,36 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_dialog_listview.xml b/app/src/main/res/layout/item_dialog_listview.xml new file mode 100644 index 0000000..00dadf7 --- /dev/null +++ b/app/src/main/res/layout/item_dialog_listview.xml @@ -0,0 +1,13 @@ + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7949d16..6a3f570 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,10 @@ + + + + @@ -48,6 +52,7 @@ android:theme="@style/Theme.BigImageActivity" /> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt new file mode 100644 index 0000000..b6b5281 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/utils/BluetoothStateBroadcastReceiver.kt @@ -0,0 +1,31 @@ +package com.casic.birmm.inspect.utils + +import android.bluetooth.BluetoothAdapter +import android.bluetooth.BluetoothDevice +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import com.casic.birmm.inspect.view.MapActivity + +class BluetoothStateBroadcastReceiver : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + when (intent?.action) { + BluetoothAdapter.ACTION_STATE_CHANGED -> { + when (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0)) { + BluetoothAdapter.STATE_OFF -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_OFF) + } + BluetoothAdapter.STATE_ON -> { + MapActivity.sendEmptyMessage(Constant.BLUETOOTH_ON) + } + } + } + BluetoothDevice.ACTION_ACL_CONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_CONNECTED) + } + BluetoothDevice.ACTION_ACL_DISCONNECTED -> { + MapActivity.sendEmptyMessage(Constant.DEVICE_DISCONNECTED) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt index 0ae38db..aef675a 100644 --- a/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt +++ b/app/src/main/java/com/casic/birmm/inspect/utils/Constant.kt @@ -13,6 +13,10 @@ const val PERMISSIONS_CODE = 999 const val PAGE_LIMIT = 15 + const val BLUETOOTH_ON = 20 + const val BLUETOOTH_OFF = 21 + const val DEVICE_CONNECTED = 22 + const val DEVICE_DISCONNECTED = 23 const val FIVE_YEARS = 5L * 365 * 60 * 60 * 24 * 1000L diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt index 94d269e..c3b1e6b 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectRouteActivity.kt @@ -59,6 +59,7 @@ aMap = mapView.map val uiSettings = aMap.uiSettings uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 //根据id查询详情 id = intent.getStringExtra("id")!! @@ -120,6 +121,7 @@ } fun initEvent() { + leftBackView.setOnClickListener { this.finish() } eventButton.setChangeAlphaWhenPress(true) eventButton.setOnClickListener { val intent = Intent(this, EventListActivity::class.java) diff --git a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt index 8ed4a0c..da4b03e 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/InspectionQueryActivity.kt @@ -168,6 +168,5 @@ } } } - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt index 517203f..dddea49 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/LoginActivity.kt @@ -132,9 +132,13 @@ .setNegativeButton("取消") .setPositiveButton("保存") .setOnDialogClickListener(object : InputDialog.OnDialogButtonClickListener { - override fun onButtonClick(input: String) { + override fun onConfirmClick(input: String) { SaveKeyValues.putValue(Constant.DEFAULT_SERVER_CONFIG, input) } + + override fun onCancelClick() { + + } }) .build().show() } diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt index 4ef86d3..2db634f 100644 --- a/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt +++ b/app/src/main/java/com/casic/birmm/inspect/view/MainActivity.kt @@ -15,9 +15,9 @@ import com.casic.birmm.inspect.utils.SaveKeyValues import com.casic.birmm.inspect.utils.StatusBarColorUtil import com.casic.birmm.inspect.vm.UserViewModel +import com.casic.birmm.inspect.widgets.SingleChoiceDialog import com.google.gson.Gson import com.gyf.immersionbar.ImmersionBar -import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.include_base_title.* @@ -25,6 +25,7 @@ class MainActivity : BaseActivity() { private var clickTime: Long = 0 + private val itemList: List = arrayListOf("巡检记录", "事件记录") override fun initLayoutView(): Int = R.layout.activity_main @@ -53,26 +54,37 @@ override fun initEvent() { //新建巡检 createIssueLayout.setOnClickListener { - + startActivity(Intent(this, MapActivity::class.java)) } //记录查询 logSearchLayout.setOnClickListener { - QMUIBottomSheet.BottomListSheetBuilder(this) + SingleChoiceDialog.Builder() + .setContext(this) .setTitle("选择记录类型") - .addItem("巡检记录") - .addItem("事件记录") - .setGravityCenter(true) - .setOnSheetItemClickListener { dialog, _, position, _ -> - dialog?.dismiss() - when (position) { - 0 -> { - startActivity(Intent(this, InspectionQueryActivity::class.java)) - } - 1 -> { - startActivity(Intent(this, EventQueryActivity::class.java)) + .setChoiceItemButton(itemList) + .setOnDialogClickListener(object : SingleChoiceDialog.OnDialogItemClickListener { + override fun onItemClick(position: Int) { + when (position) { + 0 -> { + startActivity( + Intent( + this@MainActivity, + InspectionQueryActivity::class.java + ) + ) + } + 1 -> { + startActivity( + Intent( + this@MainActivity, + EventQueryActivity::class.java + ) + ) + } } } - }.build().show() + }) + .build().show() } //系统设置 settingsLayout.setOnClickListener { diff --git a/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt new file mode 100644 index 0000000..207f6c3 --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/view/MapActivity.kt @@ -0,0 +1,176 @@ +package com.casic.birmm.inspect.view + +import android.bluetooth.BluetoothAdapter +import android.graphics.Color +import android.os.Bundle +import android.os.Handler +import android.os.Message +import android.util.Log +import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContextCompat +import com.amap.api.maps.AMap +import com.amap.api.maps.AMapOptions +import com.amap.api.maps.model.MyLocationStyle +import com.casic.birmm.inspect.R +import com.casic.birmm.inspect.extensions.show +import com.casic.birmm.inspect.utils.Constant +import com.casic.birmm.inspect.utils.OtherUtils +import com.casic.birmm.inspect.utils.PageNavigationManager +import com.casic.birmm.inspect.utils.StatusBarColorUtil +import com.casic.birmm.inspect.widgets.InputDialog +import com.gyf.immersionbar.ImmersionBar +import com.qmuiteam.qmui.util.QMUIStatusBarHelper +import kotlinx.android.synthetic.main.activity_inspect_route.mapView +import kotlinx.android.synthetic.main.activity_map.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.cancel +import java.lang.ref.WeakReference + + +class MapActivity : AppCompatActivity(), CoroutineScope by MainScope() { + + companion object { + private const val Tag = "MapActivity" + private lateinit var weakReferenceHandler: WeakReferenceHandler + + fun sendEmptyMessage(what: Int) { + weakReferenceHandler.sendEmptyMessage(what) + } + } + + private lateinit var aMap: AMap + private lateinit var locationStyle: MyLocationStyle + + init { + weakReferenceHandler = WeakReferenceHandler(this) + } + + private class WeakReferenceHandler(activity: MapActivity) : Handler() { + private val activity: WeakReference = WeakReference(activity) + override fun handleMessage(msg: Message) { + val mainActivity = activity.get() ?: return + when (msg.what) { + Constant.BLUETOOTH_ON -> { + "蓝牙已开启".show(mainActivity) + mainActivity.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + } + Constant.BLUETOOTH_OFF -> { + "蓝牙已关闭".show(mainActivity) + mainActivity.bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + } + Constant.DEVICE_CONNECTED -> { + //TODO 设备已连接 + } + Constant.DEVICE_DISCONNECTED -> { + //TODO 设备断开连接 + } + } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_map) + PageNavigationManager.addActivity(this) + setupTopBarLayout() + if (OtherUtils.isNetworkConnected(this)) { + initData(savedInstanceState) + initEvent() + } else { + "糟糕,没有接入任何网络~".show(this) + } + } + + fun setupTopBarLayout() { + QMUIStatusBarHelper.translucent(this) //沉浸式状态栏 + StatusBarColorUtil.setColor(this, ContextCompat.getColor(this, R.color.mainThemeColor)) + ImmersionBar.with(this).statusBarDarkFont(false).init() + titleView.text = "巡检" + } + + fun initData(savedInstanceState: Bundle?) { + mapView.onCreate(savedInstanceState) + aMap = mapView.map + val uiSettings = aMap.uiSettings + uiSettings.zoomPosition = AMapOptions.ZOOM_POSITION_RIGHT_CENTER + uiSettings.isRotateGesturesEnabled = false//不许地图随手势旋转角度 + //显示定位小蓝点 + locationStyle = MyLocationStyle() + locationStyle.showMyLocation(true)//设置是否显示定位小蓝点 + locationStyle.strokeColor(Color.parseColor("#A2DBFA"))//设置定位蓝点精度圆圈的边框颜色 + locationStyle.radiusFillColor(Color.parseColor("#A2DBFA"))//设置定位蓝点精度圆圈的填充颜色 + aMap.myLocationStyle = locationStyle + aMap.isMyLocationEnabled = true + aMap.addOnMyLocationChangeListener { + Log.d(Tag, "[" + it.longitude + "," + it.latitude + "]") + } + } + + fun initEvent() { + leftBackView.setOnClickListener { this.finish() } + //需要判断是否是上次未完的巡检 +// selectInspectMode() + + //判断蓝牙的状态 + val blueAdapter = BluetoothAdapter.getDefaultAdapter() + if (blueAdapter == null) { + "该设备不支持蓝牙,无法连接".show(this) + } else { + if (blueAdapter.isEnabled) { + bluetoothButton.setImageResource(R.drawable.ic_bluetooth_enable) + bluetoothButton.setOnClickListener { + //搜索蓝牙 + } + } else { + bluetoothButton.setImageResource(R.drawable.ic_bluetooth_disabled) + //打开 + } + } + + newEventButton.setChangeAlphaWhenPress(true) + newEventButton.setOnClickListener { + + } + } + + private fun selectInspectMode() { + InputDialog.Builder().setContext(this) + .setTitle("请输入巡检标签") + .setHintText("如:xxx区间巡检") + .setNegativeButton("放弃") + .setPositiveButton("开始巡检") + .setOnDialogClickListener(object : InputDialog.OnDialogButtonClickListener { + override fun onConfirmClick(input: String) { + + } + + override fun onCancelClick() { + finish() + } + }) + .build().show() + } + + override fun onResume() { + super.onResume() + mapView.onResume() + } + + override fun onPause() { + super.onPause() + mapView.onPause() + } + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mapView.onSaveInstanceState(outState) + } + + override fun onDestroy() { + cancel() + super.onDestroy() + mapView.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt index cfa32dc..f2db4c9 100644 --- a/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/InputDialog.kt @@ -16,6 +16,7 @@ private var ctx: Context? = null private var title: String? = null + private var hint: String? = null private var value: String? = null private var positiveBtn: String? = null private var negativeBtn: String? = null @@ -24,6 +25,7 @@ init { this.ctx = builder.mContext this.title = builder.title + this.hint = builder.hint this.value = builder.value this.positiveBtn = builder.positiveBtn this.negativeBtn = builder.negativeBtn @@ -38,6 +40,7 @@ setCanceledOnTouchOutside(false) dialogTitleView.text = title + dialogInputView.hint = hint!! value.apply { dialogInputView.setText(this) } @@ -46,6 +49,7 @@ dialogCancelButton.setChangeAlphaWhenPress(true) dialogCancelButton.setOnClickListener { this.dismiss() + listener?.onCancelClick() } dialogConfirmButton.text = positiveBtn @@ -56,8 +60,8 @@ "什么都没输入,请重新输入".show(ctx!!) return@setOnClickListener } - listener?.onButtonClick(inputValue) this.dismiss() + listener?.onConfirmClick(inputValue) } } @@ -73,6 +77,7 @@ class Builder { var mContext: Context? = null var title: String? = null + var hint: String? = null var value: String? = null var positiveBtn: String? = null var negativeBtn: String? = null @@ -88,6 +93,11 @@ return this } + fun setHintText(hint: String?): Builder { + this.hint = hint + return this + } + fun setDefaultValue(value: String?): Builder { this.value = value return this @@ -114,6 +124,8 @@ } interface OnDialogButtonClickListener { - fun onButtonClick(input: String) + fun onCancelClick() + + fun onConfirmClick(input: String) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt b/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt new file mode 100644 index 0000000..216befd --- /dev/null +++ b/app/src/main/java/com/casic/birmm/inspect/widgets/SingleChoiceDialog.kt @@ -0,0 +1,123 @@ +package com.casic.birmm.inspect.widgets + +import android.app.Dialog +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.WindowManager +import android.widget.BaseAdapter +import com.casic.birmm.inspect.R +import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton +import kotlinx.android.synthetic.main.dialog_input.dialogTitleView +import kotlinx.android.synthetic.main.dialog_single_choice.* + + +class SingleChoiceDialog private constructor(builder: Builder) : Dialog(builder.mContext!!) { + + private var ctx: Context? = null + private var title: String? = null + private var items: List? = null + private var listener: OnDialogItemClickListener? = null + + init { + this.ctx = builder.mContext + this.title = builder.title + this.items = builder.items + this.listener = builder.listener + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + configDialogLayout() + setContentView(R.layout.dialog_single_choice) + setCancelable(true) + setCanceledOnTouchOutside(true) + + dialogTitleView.text = title + dialogListView.adapter = ItemChoiceAdapter() + } + + private fun configDialogLayout() { + window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + window?.decorView?.setBackgroundColor(Color.TRANSPARENT) + val params: WindowManager.LayoutParams? = window?.attributes + params?.width = QMUIDisplayHelper.dp2px(ctx, 220) + params?.height = WindowManager.LayoutParams.WRAP_CONTENT + window?.attributes = params + } + + inner class ItemChoiceAdapter : BaseAdapter() { + + private var inflater: LayoutInflater = LayoutInflater.from(ctx!!) + + override fun getCount(): Int = items!!.size + + override fun getItem(position: Int): Any = items!![position] + + override fun getItemId(position: Int): Long = position.toLong() + + override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { + val view: View + val itemViewHolder: ItemViewHolder + if (convertView == null) { + view = inflater.inflate(R.layout.item_dialog_listview, null)!! + itemViewHolder = ItemViewHolder(view) + view.tag = itemViewHolder + } else { + view = convertView + itemViewHolder = view.tag as ItemViewHolder + } + itemViewHolder.itemTagView.text = items!![position] + itemViewHolder.itemTagView.setChangeAlphaWhenPress(true) + itemViewHolder.itemTagView.setOnClickListener { + dismiss() + listener?.onItemClick(position) + } + return view + } + } + + class ItemViewHolder(v: View) { + var itemTagView: QMUIRoundButton = v.findViewById(R.id.itemTagView) + } + + class Builder { + var mContext: Context? = null + var title: String? = null + var items: List? = null + var listener: OnDialogItemClickListener? = null + + fun setContext(context: Context?): Builder { + mContext = context + return this + } + + fun setTitle(title: String?): Builder { + this.title = title + return this + } + + fun setChoiceItemButton(items: List?): Builder { + this.items = items + return this + } + + fun setOnDialogClickListener(listener: OnDialogItemClickListener): Builder { + this.listener = listener + return this + } + + fun build(): SingleChoiceDialog { + return SingleChoiceDialog(this) + } + } + + interface OnDialogItemClickListener { + fun onItemClick(position: Int) + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_image_button_layout.xml b/app/src/main/res/drawable/bg_image_button_layout.xml new file mode 100644 index 0000000..41a75be --- /dev/null +++ b/app/src/main/res/drawable/bg_image_button_layout.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_aim.xml b/app/src/main/res/drawable/ic_aim.xml new file mode 100644 index 0000000..88d9e36 --- /dev/null +++ b/app/src/main/res/drawable/ic_aim.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_bluetooth_disabled.xml b/app/src/main/res/drawable/ic_bluetooth_disabled.xml new file mode 100644 index 0000000..1a8526e --- /dev/null +++ b/app/src/main/res/drawable/ic_bluetooth_disabled.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_bluetooth_empty.xml b/app/src/main/res/drawable/ic_bluetooth_empty.xml new file mode 100644 index 0000000..477d2bb --- /dev/null +++ b/app/src/main/res/drawable/ic_bluetooth_empty.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_bluetooth_enable.xml b/app/src/main/res/drawable/ic_bluetooth_enable.xml new file mode 100644 index 0000000..d60b5ae --- /dev/null +++ b/app/src/main/res/drawable/ic_bluetooth_enable.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_off.xml b/app/src/main/res/drawable/ic_off.xml new file mode 100644 index 0000000..4ed867e --- /dev/null +++ b/app/src/main/res/drawable/ic_off.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_pause.xml b/app/src/main/res/drawable/ic_pause.xml new file mode 100644 index 0000000..ab62a60 --- /dev/null +++ b/app/src/main/res/drawable/ic_pause.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_refresh.xml b/app/src/main/res/drawable/ic_refresh.xml new file mode 100644 index 0000000..1f12913 --- /dev/null +++ b/app/src/main/res/drawable/ic_refresh.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_inspect_route.xml b/app/src/main/res/layout/activity_inspect_route.xml index 6c11830..38d2421 100644 --- a/app/src/main/res/layout/activity_inspect_route.xml +++ b/app/src/main/res/layout/activity_inspect_route.xml @@ -7,7 +7,7 @@ - @@ -30,10 +30,12 @@ @@ -65,12 +67,14 @@ app:layout_constraintEnd_toEndOf="parent" /> @@ -79,7 +83,7 @@ android:id="@+id/eventButton" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_gravity="bottom" + android:layout_alignParentBottom="true" android:layout_marginHorizontal="30dp" android:layout_marginBottom="20dp" android:paddingVertical="7dp" @@ -89,5 +93,5 @@ app:qmui_backgroundColor="@color/mainThemeColor" app:qmui_borderColor="@color/mainThemeColor" app:qmui_radius="5dp" /> - + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_map.xml b/app/src/main/res/layout/activity_map.xml new file mode 100644 index 0000000..13102d9 --- /dev/null +++ b/app/src/main/res/layout/activity_map.xml @@ -0,0 +1,224 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_input.xml b/app/src/main/res/layout/dialog_input.xml index f5a8bc6..3bb7f3c 100644 --- a/app/src/main/res/layout/dialog_input.xml +++ b/app/src/main/res/layout/dialog_input.xml @@ -16,7 +16,7 @@ android:id="@+id/dialogTitleView" android:layout_width="match_parent" android:layout_height="wrap_content" - android:fontFamily="sans-serif-black" + android:fontFamily="sans-serif-medium" android:gravity="center_horizontal" android:paddingVertical="15dp" android:text="@string/app_name" diff --git a/app/src/main/res/layout/dialog_single_choice.xml b/app/src/main/res/layout/dialog_single_choice.xml new file mode 100644 index 0000000..671463f --- /dev/null +++ b/app/src/main/res/layout/dialog_single_choice.xml @@ -0,0 +1,36 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_dialog_listview.xml b/app/src/main/res/layout/item_dialog_listview.xml new file mode 100644 index 0000000..00dadf7 --- /dev/null +++ b/app/src/main/res/layout/item_dialog_listview.xml @@ -0,0 +1,13 @@ + + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 176b516..b8cd701 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -8,6 +8,15 @@ @color/colorAccent + +