diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d60335b..3afcc05 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,8 @@ + + + + () + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - val deviceModel = dataBeans[position] - when { - deviceModel.deviceName.contains("热水器") -> { - requireContext().navigatePageTo(deviceModel.deviceId) + if (DeserializeModel.isLogin()) { + val deviceModel = dataBeans[position] + when { + deviceModel.deviceName.contains("热水器") -> { + requireContext().navigatePageTo(deviceModel.deviceId) + } + deviceModel.deviceName.contains("油烟机") -> { + requireContext().navigatePageTo(deviceModel.deviceId) + } + deviceModel.deviceName.contains("壁挂炉") -> { + requireContext().navigatePageTo(deviceModel.deviceId) + } + deviceModel.deviceName.contains("燃气灶") -> { + requireContext().navigatePageTo(deviceModel.deviceId) + } } - deviceModel.deviceName.contains("油烟机") -> { - requireContext().navigatePageTo(deviceModel.deviceId) - } - deviceModel.deviceName.contains("壁挂炉") -> { - requireContext().navigatePageTo(deviceModel.deviceId) - } - deviceModel.deviceName.contains("燃气灶") -> { - requireContext().navigatePageTo(deviceModel.deviceId) - } + } else { + requireContext().navigatePageTo() } } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d60335b..3afcc05 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,8 @@ + + () + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - val deviceModel = dataBeans[position] - when { - deviceModel.deviceName.contains("热水器") -> { - requireContext().navigatePageTo(deviceModel.deviceId) + if (DeserializeModel.isLogin()) { + val deviceModel = dataBeans[position] + when { + deviceModel.deviceName.contains("热水器") -> { + requireContext().navigatePageTo(deviceModel.deviceId) + } + deviceModel.deviceName.contains("油烟机") -> { + requireContext().navigatePageTo(deviceModel.deviceId) + } + deviceModel.deviceName.contains("壁挂炉") -> { + requireContext().navigatePageTo(deviceModel.deviceId) + } + deviceModel.deviceName.contains("燃气灶") -> { + requireContext().navigatePageTo(deviceModel.deviceId) + } } - deviceModel.deviceName.contains("油烟机") -> { - requireContext().navigatePageTo(deviceModel.deviceId) - } - deviceModel.deviceName.contains("壁挂炉") -> { - requireContext().navigatePageTo(deviceModel.deviceId) - } - deviceModel.deviceName.contains("燃气灶") -> { - requireContext().navigatePageTo(deviceModel.deviceId) - } + } else { + requireContext().navigatePageTo() } } diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index c495da7..ed28b03 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -14,7 +14,8 @@ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, + Manifest.permission.BLUETOOTH_ADMIN ) val SHOP_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher, R.mipmap.ic_launcher) val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d60335b..3afcc05 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,8 @@ + + () + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - val deviceModel = dataBeans[position] - when { - deviceModel.deviceName.contains("热水器") -> { - requireContext().navigatePageTo(deviceModel.deviceId) + if (DeserializeModel.isLogin()) { + val deviceModel = dataBeans[position] + when { + deviceModel.deviceName.contains("热水器") -> { + requireContext().navigatePageTo(deviceModel.deviceId) + } + deviceModel.deviceName.contains("油烟机") -> { + requireContext().navigatePageTo(deviceModel.deviceId) + } + deviceModel.deviceName.contains("壁挂炉") -> { + requireContext().navigatePageTo(deviceModel.deviceId) + } + deviceModel.deviceName.contains("燃气灶") -> { + requireContext().navigatePageTo(deviceModel.deviceId) + } } - deviceModel.deviceName.contains("油烟机") -> { - requireContext().navigatePageTo(deviceModel.deviceId) - } - deviceModel.deviceName.contains("壁挂炉") -> { - requireContext().navigatePageTo(deviceModel.deviceId) - } - deviceModel.deviceName.contains("燃气灶") -> { - requireContext().navigatePageTo(deviceModel.deviceId) - } + } else { + requireContext().navigatePageTo() } } diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index c495da7..ed28b03 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -14,7 +14,8 @@ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, + Manifest.permission.BLUETOOTH_ADMIN ) val SHOP_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher, R.mipmap.ic_launcher) val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 789ff25..7c6591f 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -225,31 +225,19 @@ */ suspend fun addDevice(devResp: DeviceBean, userModel: UserDetailModel.DataModel): String { val paramObject = JSONObject() - paramObject.put("snCode", "") paramObject.put("deviceId", devResp.devId) - paramObject.put("brandCode", "") - paramObject.put("brandName", "") paramObject.put("productCode", devResp.productId) - paramObject.put("productName", "") - paramObject.put("produceDate", "") paramObject.put("deviceStatus", 1) paramObject.put("deviceActive", 1) - paramObject.put("deviceActiveTime", devResp.time) + paramObject.put("deviceActiveTime", (devResp.time * 1000L).timestampToCompleteDate()) paramObject.put("deviceBindUser", 1) paramObject.put("deviceName", devResp.name) paramObject.put("deviceHardwareVersion", devResp.bv) paramObject.put("deviceSoftwareVersion", devResp.pv) - paramObject.put("deviceCoreParts", "") paramObject.put("deviceMac", devResp.mac) paramObject.put("deviceIp", devResp.ip) paramObject.put("productCategory", devResp.category) - paramObject.put("internationalCode", "") - paramObject.put("productSize", "") - paramObject.put("productWeight", "") - paramObject.put("productStatus", "") paramObject.put("productVersion", devResp.productBean.productVer) - paramObject.put("productQuality", "") - paramObject.put("productColor", devResp.productBean) paramObject.put("userAccount", userModel.account) paramObject.put("userName", userModel.name) paramObject.put("userPhone", userModel.phone) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d60335b..3afcc05 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,8 @@ + + () + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - val deviceModel = dataBeans[position] - when { - deviceModel.deviceName.contains("热水器") -> { - requireContext().navigatePageTo(deviceModel.deviceId) + if (DeserializeModel.isLogin()) { + val deviceModel = dataBeans[position] + when { + deviceModel.deviceName.contains("热水器") -> { + requireContext().navigatePageTo(deviceModel.deviceId) + } + deviceModel.deviceName.contains("油烟机") -> { + requireContext().navigatePageTo(deviceModel.deviceId) + } + deviceModel.deviceName.contains("壁挂炉") -> { + requireContext().navigatePageTo(deviceModel.deviceId) + } + deviceModel.deviceName.contains("燃气灶") -> { + requireContext().navigatePageTo(deviceModel.deviceId) + } } - deviceModel.deviceName.contains("油烟机") -> { - requireContext().navigatePageTo(deviceModel.deviceId) - } - deviceModel.deviceName.contains("壁挂炉") -> { - requireContext().navigatePageTo(deviceModel.deviceId) - } - deviceModel.deviceName.contains("燃气灶") -> { - requireContext().navigatePageTo(deviceModel.deviceId) - } + } else { + requireContext().navigatePageTo() } } diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index c495da7..ed28b03 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -14,7 +14,8 @@ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, + Manifest.permission.BLUETOOTH_ADMIN ) val SHOP_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher, R.mipmap.ic_launcher) val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 789ff25..7c6591f 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -225,31 +225,19 @@ */ suspend fun addDevice(devResp: DeviceBean, userModel: UserDetailModel.DataModel): String { val paramObject = JSONObject() - paramObject.put("snCode", "") paramObject.put("deviceId", devResp.devId) - paramObject.put("brandCode", "") - paramObject.put("brandName", "") paramObject.put("productCode", devResp.productId) - paramObject.put("productName", "") - paramObject.put("produceDate", "") paramObject.put("deviceStatus", 1) paramObject.put("deviceActive", 1) - paramObject.put("deviceActiveTime", devResp.time) + paramObject.put("deviceActiveTime", (devResp.time * 1000L).timestampToCompleteDate()) paramObject.put("deviceBindUser", 1) paramObject.put("deviceName", devResp.name) paramObject.put("deviceHardwareVersion", devResp.bv) paramObject.put("deviceSoftwareVersion", devResp.pv) - paramObject.put("deviceCoreParts", "") paramObject.put("deviceMac", devResp.mac) paramObject.put("deviceIp", devResp.ip) paramObject.put("productCategory", devResp.category) - paramObject.put("internationalCode", "") - paramObject.put("productSize", "") - paramObject.put("productWeight", "") - paramObject.put("productStatus", "") paramObject.put("productVersion", devResp.productBean.productVer) - paramObject.put("productQuality", "") - paramObject.put("productColor", devResp.productBean) paramObject.put("userAccount", userModel.account) paramObject.put("userName", userModel.name) paramObject.put("userPhone", userModel.phone) diff --git a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt index c3b861d..a796171 100644 --- a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt @@ -28,7 +28,7 @@ class ConnectDeviceActivity : KotlinBaseActivity() { - private val kTag = "ResetDeviceActivity" + private val kTag = "ConnectDeviceActivity" private lateinit var params: ArrayList private lateinit var deviceViewModel: DeviceViewModel diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d60335b..3afcc05 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,8 @@ + + () + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - val deviceModel = dataBeans[position] - when { - deviceModel.deviceName.contains("热水器") -> { - requireContext().navigatePageTo(deviceModel.deviceId) + if (DeserializeModel.isLogin()) { + val deviceModel = dataBeans[position] + when { + deviceModel.deviceName.contains("热水器") -> { + requireContext().navigatePageTo(deviceModel.deviceId) + } + deviceModel.deviceName.contains("油烟机") -> { + requireContext().navigatePageTo(deviceModel.deviceId) + } + deviceModel.deviceName.contains("壁挂炉") -> { + requireContext().navigatePageTo(deviceModel.deviceId) + } + deviceModel.deviceName.contains("燃气灶") -> { + requireContext().navigatePageTo(deviceModel.deviceId) + } } - deviceModel.deviceName.contains("油烟机") -> { - requireContext().navigatePageTo(deviceModel.deviceId) - } - deviceModel.deviceName.contains("壁挂炉") -> { - requireContext().navigatePageTo(deviceModel.deviceId) - } - deviceModel.deviceName.contains("燃气灶") -> { - requireContext().navigatePageTo(deviceModel.deviceId) - } + } else { + requireContext().navigatePageTo() } } diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index c495da7..ed28b03 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -14,7 +14,8 @@ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, + Manifest.permission.BLUETOOTH_ADMIN ) val SHOP_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher, R.mipmap.ic_launcher) val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 789ff25..7c6591f 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -225,31 +225,19 @@ */ suspend fun addDevice(devResp: DeviceBean, userModel: UserDetailModel.DataModel): String { val paramObject = JSONObject() - paramObject.put("snCode", "") paramObject.put("deviceId", devResp.devId) - paramObject.put("brandCode", "") - paramObject.put("brandName", "") paramObject.put("productCode", devResp.productId) - paramObject.put("productName", "") - paramObject.put("produceDate", "") paramObject.put("deviceStatus", 1) paramObject.put("deviceActive", 1) - paramObject.put("deviceActiveTime", devResp.time) + paramObject.put("deviceActiveTime", (devResp.time * 1000L).timestampToCompleteDate()) paramObject.put("deviceBindUser", 1) paramObject.put("deviceName", devResp.name) paramObject.put("deviceHardwareVersion", devResp.bv) paramObject.put("deviceSoftwareVersion", devResp.pv) - paramObject.put("deviceCoreParts", "") paramObject.put("deviceMac", devResp.mac) paramObject.put("deviceIp", devResp.ip) paramObject.put("productCategory", devResp.category) - paramObject.put("internationalCode", "") - paramObject.put("productSize", "") - paramObject.put("productWeight", "") - paramObject.put("productStatus", "") paramObject.put("productVersion", devResp.productBean.productVer) - paramObject.put("productQuality", "") - paramObject.put("productColor", devResp.productBean) paramObject.put("userAccount", userModel.account) paramObject.put("userName", userModel.name) paramObject.put("userPhone", userModel.phone) diff --git a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt index c3b861d..a796171 100644 --- a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt @@ -28,7 +28,7 @@ class ConnectDeviceActivity : KotlinBaseActivity() { - private val kTag = "ResetDeviceActivity" + private val kTag = "ConnectDeviceActivity" private lateinit var params: ArrayList private lateinit var deviceViewModel: DeviceViewModel diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 6f4088a..0d4c255 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -95,12 +95,12 @@ userViewModel.enter(keyModel.data!!.sid!!, userPhone, dataByPublicKey) userViewModel.loginResult.observe(this, { if (it.code == 200) { + AuthenticationHelper.saveToken(it.data!!.token!!) userViewModel.obtainUserDetail(userPhone) userViewModel.userDetailResult.observe(this, { user -> if (user.code == 200) { SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, true) SaveKeyValues.putValue(LocaleConstant.USER_MODEL, user.toJson()) - AuthenticationHelper.saveToken(it.data!!.token!!) LoadingDialogHub.dismiss() PageNavigationManager.finishAllActivity() navigatePageTo() diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d60335b..3afcc05 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,8 @@ + + () + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - val deviceModel = dataBeans[position] - when { - deviceModel.deviceName.contains("热水器") -> { - requireContext().navigatePageTo(deviceModel.deviceId) + if (DeserializeModel.isLogin()) { + val deviceModel = dataBeans[position] + when { + deviceModel.deviceName.contains("热水器") -> { + requireContext().navigatePageTo(deviceModel.deviceId) + } + deviceModel.deviceName.contains("油烟机") -> { + requireContext().navigatePageTo(deviceModel.deviceId) + } + deviceModel.deviceName.contains("壁挂炉") -> { + requireContext().navigatePageTo(deviceModel.deviceId) + } + deviceModel.deviceName.contains("燃气灶") -> { + requireContext().navigatePageTo(deviceModel.deviceId) + } } - deviceModel.deviceName.contains("油烟机") -> { - requireContext().navigatePageTo(deviceModel.deviceId) - } - deviceModel.deviceName.contains("壁挂炉") -> { - requireContext().navigatePageTo(deviceModel.deviceId) - } - deviceModel.deviceName.contains("燃气灶") -> { - requireContext().navigatePageTo(deviceModel.deviceId) - } + } else { + requireContext().navigatePageTo() } } diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index c495da7..ed28b03 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -14,7 +14,8 @@ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, + Manifest.permission.BLUETOOTH_ADMIN ) val SHOP_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher, R.mipmap.ic_launcher) val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 789ff25..7c6591f 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -225,31 +225,19 @@ */ suspend fun addDevice(devResp: DeviceBean, userModel: UserDetailModel.DataModel): String { val paramObject = JSONObject() - paramObject.put("snCode", "") paramObject.put("deviceId", devResp.devId) - paramObject.put("brandCode", "") - paramObject.put("brandName", "") paramObject.put("productCode", devResp.productId) - paramObject.put("productName", "") - paramObject.put("produceDate", "") paramObject.put("deviceStatus", 1) paramObject.put("deviceActive", 1) - paramObject.put("deviceActiveTime", devResp.time) + paramObject.put("deviceActiveTime", (devResp.time * 1000L).timestampToCompleteDate()) paramObject.put("deviceBindUser", 1) paramObject.put("deviceName", devResp.name) paramObject.put("deviceHardwareVersion", devResp.bv) paramObject.put("deviceSoftwareVersion", devResp.pv) - paramObject.put("deviceCoreParts", "") paramObject.put("deviceMac", devResp.mac) paramObject.put("deviceIp", devResp.ip) paramObject.put("productCategory", devResp.category) - paramObject.put("internationalCode", "") - paramObject.put("productSize", "") - paramObject.put("productWeight", "") - paramObject.put("productStatus", "") paramObject.put("productVersion", devResp.productBean.productVer) - paramObject.put("productQuality", "") - paramObject.put("productColor", devResp.productBean) paramObject.put("userAccount", userModel.account) paramObject.put("userName", userModel.name) paramObject.put("userPhone", userModel.phone) diff --git a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt index c3b861d..a796171 100644 --- a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt @@ -28,7 +28,7 @@ class ConnectDeviceActivity : KotlinBaseActivity() { - private val kTag = "ResetDeviceActivity" + private val kTag = "ConnectDeviceActivity" private lateinit var params: ArrayList private lateinit var deviceViewModel: DeviceViewModel diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 6f4088a..0d4c255 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -95,12 +95,12 @@ userViewModel.enter(keyModel.data!!.sid!!, userPhone, dataByPublicKey) userViewModel.loginResult.observe(this, { if (it.code == 200) { + AuthenticationHelper.saveToken(it.data!!.token!!) userViewModel.obtainUserDetail(userPhone) userViewModel.userDetailResult.observe(this, { user -> if (user.code == 200) { SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, true) SaveKeyValues.putValue(LocaleConstant.USER_MODEL, user.toJson()) - AuthenticationHelper.saveToken(it.data!!.token!!) LoadingDialogHub.dismiss() PageNavigationManager.finishAllActivity() navigatePageTo() diff --git a/app/src/main/java/com/casic/br/view/SelectBluetoothActivity.kt b/app/src/main/java/com/casic/br/view/SelectBluetoothActivity.kt index 4375725..6014293 100644 --- a/app/src/main/java/com/casic/br/view/SelectBluetoothActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectBluetoothActivity.kt @@ -1,25 +1,205 @@ package com.casic.br.view +import android.util.Log +import android.view.KeyEvent +import androidx.lifecycle.ViewModelProvider import com.casic.br.R +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.DeserializeModel +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.utils.LocaleConstant +import com.casic.br.vm.DeviceViewModel +import com.casic.br.widgets.WaterRippleView +import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState +import com.tuya.smart.android.ble.api.LeScanSetting +import com.tuya.smart.android.ble.api.ScanDeviceBean +import com.tuya.smart.android.ble.api.ScanType +import com.tuya.smart.android.ble.api.TyBleScanResponse +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.ConfigProductInfoBean +import com.tuya.smart.sdk.api.IMultiModeActivatorListener +import com.tuya.smart.sdk.api.ITuyaActivatorGetToken +import com.tuya.smart.sdk.api.ITuyaDataCallback +import com.tuya.smart.sdk.bean.DeviceBean +import com.tuya.smart.sdk.bean.MultiModeActivatorBean +import kotlinx.android.synthetic.main.activity_select_bluetooth.* +import kotlinx.android.synthetic.main.activity_select_wifi.rootView +import kotlinx.android.synthetic.main.fragment_add_device_nearby.* +import kotlinx.android.synthetic.main.fragment_add_device_nearby.waterRippleView +import kotlinx.android.synthetic.main.include_base_title.* +import java.util.* +import java.util.concurrent.ExecutorService +import java.util.concurrent.Executors + class SelectBluetoothActivity : KotlinBaseActivity() { - override fun initLayoutView(): Int = R.layout.activity_select_wifi + private val kTag = "SelectBluetoothActivity" + private val context = this@SelectBluetoothActivity + private var isRunning = true + private lateinit var singleThreadExecutor: ExecutorService + private lateinit var params: ArrayList + private lateinit var deviceViewModel: DeviceViewModel + private var deviceBean: ScanDeviceBean? = null - override fun observeRequestState() { - - } + override fun initLayoutView(): Int = R.layout.activity_select_bluetooth override fun setupTopBarLayout() { - + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.text = "搜索蓝牙设备" } override fun initData() { + //只有一个核心线程,当被占用时,其他的任务需要进入队列等待 + singleThreadExecutor = Executors.newSingleThreadExecutor() + waterRippleView.setOnAnimationStartListener(object : + WaterRippleView.OnAnimationStartListener { + override fun onStart(view: WaterRippleView?) { + view?.start() + //开启线程搜索设备 + Log.d(kTag, "onStart: 开始线程") + singleThreadExecutor.execute(searchRunnable) + isRunning = true + } + }) + params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + + val scanSetting = LeScanSetting.Builder().apply { + setTimeout(60000) + addScanType(ScanType.SINGLE) + }.build() + TuyaHomeSdk.getBleOperator().startLeScan(scanSetting, object : TyBleScanResponse { + override fun onResult(bean: ScanDeviceBean?) { + if (bean == null) { + Log.e(kTag, "onResult: 无法扫描到涂鸦蓝牙模组") + return + } + deviceBean = bean + TuyaHomeSdk.getActivatorInstance().getActivatorDeviceInfo( + deviceBean!!.productId, deviceBean!!.uuid, deviceBean!!.mac, + object : ITuyaDataCallback { + override fun onSuccess(result: ConfigProductInfoBean?) { + if (result == null) { + Log.e(kTag, "onResult: 无法获取涂鸦设备信息") + return + } + tipsView.text = "已搜索到蓝牙设备,基本信息如下" + deviceAddressView.text = String.format("设备地址:${deviceBean!!.address}") + deviceNameView.text = String.format("产品名称:${result.name}") + } + + override fun onError(errorCode: String?, errorMessage: String?) { + + } + }) + } + }) + } + + private val searchRunnable = Runnable { + while (true) { + try { + if (!isRunning) { + Log.d(kTag, "run: 设备搜索线程休眠中...") + Thread.sleep(Long.MAX_VALUE) + } + } catch (e: Exception) { + e.printStackTrace() + } + Log.d(kTag, "run: 设备搜索线程运行中...") + try { + //搜索设备 + Thread.sleep(1000) + } catch (e: InterruptedException) { + e.printStackTrace() + } + } + } + + override fun onPause() { + super.onPause() + isRunning = false + waterRippleView.stop() + TuyaHomeSdk.getBleOperator().stopLeScan() } override fun initEvent() { + nextStepButton.setOnClickListener { + LoadingDialogHub.show(this, "设备配网中,请稍后") + val userModel = DeserializeModel.getUserModel()!! + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeId.toLong(), object : + ITuyaActivatorGetToken { + override fun onSuccess(token: String?) { + val multiModeActivatorBean = MultiModeActivatorBean() + multiModeActivatorBean.homeId = homeId.toLong() + multiModeActivatorBean.deviceType = deviceBean!!.deviceType + multiModeActivatorBean.uuid = deviceBean!!.uuid + multiModeActivatorBean.address = deviceBean!!.address + multiModeActivatorBean.mac = deviceBean!!.mac + multiModeActivatorBean.ssid = params[0] + multiModeActivatorBean.pwd = params[1] + multiModeActivatorBean.token = token + multiModeActivatorBean.timeout = 120000 + + // 开始配网 + TuyaHomeSdk.getActivator().newMultiModeActivator().startActivator( + multiModeActivatorBean, + object : IMultiModeActivatorListener { + override fun onSuccess(deviceBean: DeviceBean?) { + //将绑定的设备存入自己的数据库 + deviceViewModel.addDevice(deviceBean!!, userModel) + } + + override fun onFailure(code: Int, msg: String?, handle: Any?) { + Log.d(kTag, "errorMsg: $msg") + "添加设备失败".show(context) + LoadingDialogHub.dismiss() + } + }) + } + + override fun onFailure(errorCode: String?, errorMsg: String?) { + "获取设备配网Token失败,无法配网".show(context) + LoadingDialogHub.dismiss() + } + }) + } + } + + override fun observeRequestState() { + deviceViewModel.loadState.observe(this, { + when (it) { + LoadState.Success -> { + LoadingDialogHub.dismiss() + navigatePageTo() + } + else -> { + "添加失败,请重新绑定".show(this) + LoadingDialogHub.dismiss() + } + } + }) + } + + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + if (keyCode == KeyEvent.KEYCODE_BACK) { + if (deviceBean == null) { + return super.onKeyDown(keyCode, event) + } + TuyaHomeSdk.getActivator().newMultiModeActivator().stopActivator(deviceBean!!.uuid) + } + return super.onKeyDown(keyCode, event) } } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d60335b..3afcc05 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,8 @@ + + () + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - val deviceModel = dataBeans[position] - when { - deviceModel.deviceName.contains("热水器") -> { - requireContext().navigatePageTo(deviceModel.deviceId) + if (DeserializeModel.isLogin()) { + val deviceModel = dataBeans[position] + when { + deviceModel.deviceName.contains("热水器") -> { + requireContext().navigatePageTo(deviceModel.deviceId) + } + deviceModel.deviceName.contains("油烟机") -> { + requireContext().navigatePageTo(deviceModel.deviceId) + } + deviceModel.deviceName.contains("壁挂炉") -> { + requireContext().navigatePageTo(deviceModel.deviceId) + } + deviceModel.deviceName.contains("燃气灶") -> { + requireContext().navigatePageTo(deviceModel.deviceId) + } } - deviceModel.deviceName.contains("油烟机") -> { - requireContext().navigatePageTo(deviceModel.deviceId) - } - deviceModel.deviceName.contains("壁挂炉") -> { - requireContext().navigatePageTo(deviceModel.deviceId) - } - deviceModel.deviceName.contains("燃气灶") -> { - requireContext().navigatePageTo(deviceModel.deviceId) - } + } else { + requireContext().navigatePageTo() } } diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index c495da7..ed28b03 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -14,7 +14,8 @@ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, + Manifest.permission.BLUETOOTH_ADMIN ) val SHOP_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher, R.mipmap.ic_launcher) val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 789ff25..7c6591f 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -225,31 +225,19 @@ */ suspend fun addDevice(devResp: DeviceBean, userModel: UserDetailModel.DataModel): String { val paramObject = JSONObject() - paramObject.put("snCode", "") paramObject.put("deviceId", devResp.devId) - paramObject.put("brandCode", "") - paramObject.put("brandName", "") paramObject.put("productCode", devResp.productId) - paramObject.put("productName", "") - paramObject.put("produceDate", "") paramObject.put("deviceStatus", 1) paramObject.put("deviceActive", 1) - paramObject.put("deviceActiveTime", devResp.time) + paramObject.put("deviceActiveTime", (devResp.time * 1000L).timestampToCompleteDate()) paramObject.put("deviceBindUser", 1) paramObject.put("deviceName", devResp.name) paramObject.put("deviceHardwareVersion", devResp.bv) paramObject.put("deviceSoftwareVersion", devResp.pv) - paramObject.put("deviceCoreParts", "") paramObject.put("deviceMac", devResp.mac) paramObject.put("deviceIp", devResp.ip) paramObject.put("productCategory", devResp.category) - paramObject.put("internationalCode", "") - paramObject.put("productSize", "") - paramObject.put("productWeight", "") - paramObject.put("productStatus", "") paramObject.put("productVersion", devResp.productBean.productVer) - paramObject.put("productQuality", "") - paramObject.put("productColor", devResp.productBean) paramObject.put("userAccount", userModel.account) paramObject.put("userName", userModel.name) paramObject.put("userPhone", userModel.phone) diff --git a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt index c3b861d..a796171 100644 --- a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt @@ -28,7 +28,7 @@ class ConnectDeviceActivity : KotlinBaseActivity() { - private val kTag = "ResetDeviceActivity" + private val kTag = "ConnectDeviceActivity" private lateinit var params: ArrayList private lateinit var deviceViewModel: DeviceViewModel diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 6f4088a..0d4c255 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -95,12 +95,12 @@ userViewModel.enter(keyModel.data!!.sid!!, userPhone, dataByPublicKey) userViewModel.loginResult.observe(this, { if (it.code == 200) { + AuthenticationHelper.saveToken(it.data!!.token!!) userViewModel.obtainUserDetail(userPhone) userViewModel.userDetailResult.observe(this, { user -> if (user.code == 200) { SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, true) SaveKeyValues.putValue(LocaleConstant.USER_MODEL, user.toJson()) - AuthenticationHelper.saveToken(it.data!!.token!!) LoadingDialogHub.dismiss() PageNavigationManager.finishAllActivity() navigatePageTo() diff --git a/app/src/main/java/com/casic/br/view/SelectBluetoothActivity.kt b/app/src/main/java/com/casic/br/view/SelectBluetoothActivity.kt index 4375725..6014293 100644 --- a/app/src/main/java/com/casic/br/view/SelectBluetoothActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectBluetoothActivity.kt @@ -1,25 +1,205 @@ package com.casic.br.view +import android.util.Log +import android.view.KeyEvent +import androidx.lifecycle.ViewModelProvider import com.casic.br.R +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.DeserializeModel +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.utils.LocaleConstant +import com.casic.br.vm.DeviceViewModel +import com.casic.br.widgets.WaterRippleView +import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState +import com.tuya.smart.android.ble.api.LeScanSetting +import com.tuya.smart.android.ble.api.ScanDeviceBean +import com.tuya.smart.android.ble.api.ScanType +import com.tuya.smart.android.ble.api.TyBleScanResponse +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.ConfigProductInfoBean +import com.tuya.smart.sdk.api.IMultiModeActivatorListener +import com.tuya.smart.sdk.api.ITuyaActivatorGetToken +import com.tuya.smart.sdk.api.ITuyaDataCallback +import com.tuya.smart.sdk.bean.DeviceBean +import com.tuya.smart.sdk.bean.MultiModeActivatorBean +import kotlinx.android.synthetic.main.activity_select_bluetooth.* +import kotlinx.android.synthetic.main.activity_select_wifi.rootView +import kotlinx.android.synthetic.main.fragment_add_device_nearby.* +import kotlinx.android.synthetic.main.fragment_add_device_nearby.waterRippleView +import kotlinx.android.synthetic.main.include_base_title.* +import java.util.* +import java.util.concurrent.ExecutorService +import java.util.concurrent.Executors + class SelectBluetoothActivity : KotlinBaseActivity() { - override fun initLayoutView(): Int = R.layout.activity_select_wifi + private val kTag = "SelectBluetoothActivity" + private val context = this@SelectBluetoothActivity + private var isRunning = true + private lateinit var singleThreadExecutor: ExecutorService + private lateinit var params: ArrayList + private lateinit var deviceViewModel: DeviceViewModel + private var deviceBean: ScanDeviceBean? = null - override fun observeRequestState() { - - } + override fun initLayoutView(): Int = R.layout.activity_select_bluetooth override fun setupTopBarLayout() { - + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.text = "搜索蓝牙设备" } override fun initData() { + //只有一个核心线程,当被占用时,其他的任务需要进入队列等待 + singleThreadExecutor = Executors.newSingleThreadExecutor() + waterRippleView.setOnAnimationStartListener(object : + WaterRippleView.OnAnimationStartListener { + override fun onStart(view: WaterRippleView?) { + view?.start() + //开启线程搜索设备 + Log.d(kTag, "onStart: 开始线程") + singleThreadExecutor.execute(searchRunnable) + isRunning = true + } + }) + params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + + val scanSetting = LeScanSetting.Builder().apply { + setTimeout(60000) + addScanType(ScanType.SINGLE) + }.build() + TuyaHomeSdk.getBleOperator().startLeScan(scanSetting, object : TyBleScanResponse { + override fun onResult(bean: ScanDeviceBean?) { + if (bean == null) { + Log.e(kTag, "onResult: 无法扫描到涂鸦蓝牙模组") + return + } + deviceBean = bean + TuyaHomeSdk.getActivatorInstance().getActivatorDeviceInfo( + deviceBean!!.productId, deviceBean!!.uuid, deviceBean!!.mac, + object : ITuyaDataCallback { + override fun onSuccess(result: ConfigProductInfoBean?) { + if (result == null) { + Log.e(kTag, "onResult: 无法获取涂鸦设备信息") + return + } + tipsView.text = "已搜索到蓝牙设备,基本信息如下" + deviceAddressView.text = String.format("设备地址:${deviceBean!!.address}") + deviceNameView.text = String.format("产品名称:${result.name}") + } + + override fun onError(errorCode: String?, errorMessage: String?) { + + } + }) + } + }) + } + + private val searchRunnable = Runnable { + while (true) { + try { + if (!isRunning) { + Log.d(kTag, "run: 设备搜索线程休眠中...") + Thread.sleep(Long.MAX_VALUE) + } + } catch (e: Exception) { + e.printStackTrace() + } + Log.d(kTag, "run: 设备搜索线程运行中...") + try { + //搜索设备 + Thread.sleep(1000) + } catch (e: InterruptedException) { + e.printStackTrace() + } + } + } + + override fun onPause() { + super.onPause() + isRunning = false + waterRippleView.stop() + TuyaHomeSdk.getBleOperator().stopLeScan() } override fun initEvent() { + nextStepButton.setOnClickListener { + LoadingDialogHub.show(this, "设备配网中,请稍后") + val userModel = DeserializeModel.getUserModel()!! + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeId.toLong(), object : + ITuyaActivatorGetToken { + override fun onSuccess(token: String?) { + val multiModeActivatorBean = MultiModeActivatorBean() + multiModeActivatorBean.homeId = homeId.toLong() + multiModeActivatorBean.deviceType = deviceBean!!.deviceType + multiModeActivatorBean.uuid = deviceBean!!.uuid + multiModeActivatorBean.address = deviceBean!!.address + multiModeActivatorBean.mac = deviceBean!!.mac + multiModeActivatorBean.ssid = params[0] + multiModeActivatorBean.pwd = params[1] + multiModeActivatorBean.token = token + multiModeActivatorBean.timeout = 120000 + + // 开始配网 + TuyaHomeSdk.getActivator().newMultiModeActivator().startActivator( + multiModeActivatorBean, + object : IMultiModeActivatorListener { + override fun onSuccess(deviceBean: DeviceBean?) { + //将绑定的设备存入自己的数据库 + deviceViewModel.addDevice(deviceBean!!, userModel) + } + + override fun onFailure(code: Int, msg: String?, handle: Any?) { + Log.d(kTag, "errorMsg: $msg") + "添加设备失败".show(context) + LoadingDialogHub.dismiss() + } + }) + } + + override fun onFailure(errorCode: String?, errorMsg: String?) { + "获取设备配网Token失败,无法配网".show(context) + LoadingDialogHub.dismiss() + } + }) + } + } + + override fun observeRequestState() { + deviceViewModel.loadState.observe(this, { + when (it) { + LoadState.Success -> { + LoadingDialogHub.dismiss() + navigatePageTo() + } + else -> { + "添加失败,请重新绑定".show(this) + LoadingDialogHub.dismiss() + } + } + }) + } + + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + if (keyCode == KeyEvent.KEYCODE_BACK) { + if (deviceBean == null) { + return super.onKeyDown(keyCode, event) + } + TuyaHomeSdk.getActivator().newMultiModeActivator().stopActivator(deviceBean!!.uuid) + } + return super.onKeyDown(keyCode, event) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt index 98778ea..0cde6b9 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -2,6 +2,7 @@ import android.content.Context import android.content.Intent +import android.graphics.Color import android.net.wifi.WifiManager import android.provider.Settings import android.view.View @@ -13,6 +14,7 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_login.* import kotlinx.android.synthetic.main.activity_select_wifi.* import kotlinx.android.synthetic.main.include_base_title.* @@ -23,8 +25,6 @@ class SelectWiFiActivity : KotlinBaseActivity() { - private val context: Context = this@SelectWiFiActivity - private val kTag = "SelectWifiActivity" private val wifi by lazy { applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager } override fun initLayoutView(): Int = R.layout.activity_select_wifi @@ -62,7 +62,20 @@ } //保存Wi-Fi密码 SaveKeyValues.putValue(LocaleConstant.WIFI_PASSWORD, wifiKey) - navigatePageTo(arrayListOf(wifiName, wifiKey)) + val wifiConfig = arrayListOf(wifiName, wifiKey) + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("Wi-Fi连接模式", "蓝牙连接模式")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> navigatePageTo(wifiConfig) + 1 -> navigatePageTo(wifiConfig) + } + } + }) + .build().show() } } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d60335b..3afcc05 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,8 @@ + + () + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - val deviceModel = dataBeans[position] - when { - deviceModel.deviceName.contains("热水器") -> { - requireContext().navigatePageTo(deviceModel.deviceId) + if (DeserializeModel.isLogin()) { + val deviceModel = dataBeans[position] + when { + deviceModel.deviceName.contains("热水器") -> { + requireContext().navigatePageTo(deviceModel.deviceId) + } + deviceModel.deviceName.contains("油烟机") -> { + requireContext().navigatePageTo(deviceModel.deviceId) + } + deviceModel.deviceName.contains("壁挂炉") -> { + requireContext().navigatePageTo(deviceModel.deviceId) + } + deviceModel.deviceName.contains("燃气灶") -> { + requireContext().navigatePageTo(deviceModel.deviceId) + } } - deviceModel.deviceName.contains("油烟机") -> { - requireContext().navigatePageTo(deviceModel.deviceId) - } - deviceModel.deviceName.contains("壁挂炉") -> { - requireContext().navigatePageTo(deviceModel.deviceId) - } - deviceModel.deviceName.contains("燃气灶") -> { - requireContext().navigatePageTo(deviceModel.deviceId) - } + } else { + requireContext().navigatePageTo() } } diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index c495da7..ed28b03 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -14,7 +14,8 @@ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, + Manifest.permission.BLUETOOTH_ADMIN ) val SHOP_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher, R.mipmap.ic_launcher) val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 789ff25..7c6591f 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -225,31 +225,19 @@ */ suspend fun addDevice(devResp: DeviceBean, userModel: UserDetailModel.DataModel): String { val paramObject = JSONObject() - paramObject.put("snCode", "") paramObject.put("deviceId", devResp.devId) - paramObject.put("brandCode", "") - paramObject.put("brandName", "") paramObject.put("productCode", devResp.productId) - paramObject.put("productName", "") - paramObject.put("produceDate", "") paramObject.put("deviceStatus", 1) paramObject.put("deviceActive", 1) - paramObject.put("deviceActiveTime", devResp.time) + paramObject.put("deviceActiveTime", (devResp.time * 1000L).timestampToCompleteDate()) paramObject.put("deviceBindUser", 1) paramObject.put("deviceName", devResp.name) paramObject.put("deviceHardwareVersion", devResp.bv) paramObject.put("deviceSoftwareVersion", devResp.pv) - paramObject.put("deviceCoreParts", "") paramObject.put("deviceMac", devResp.mac) paramObject.put("deviceIp", devResp.ip) paramObject.put("productCategory", devResp.category) - paramObject.put("internationalCode", "") - paramObject.put("productSize", "") - paramObject.put("productWeight", "") - paramObject.put("productStatus", "") paramObject.put("productVersion", devResp.productBean.productVer) - paramObject.put("productQuality", "") - paramObject.put("productColor", devResp.productBean) paramObject.put("userAccount", userModel.account) paramObject.put("userName", userModel.name) paramObject.put("userPhone", userModel.phone) diff --git a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt index c3b861d..a796171 100644 --- a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt @@ -28,7 +28,7 @@ class ConnectDeviceActivity : KotlinBaseActivity() { - private val kTag = "ResetDeviceActivity" + private val kTag = "ConnectDeviceActivity" private lateinit var params: ArrayList private lateinit var deviceViewModel: DeviceViewModel diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 6f4088a..0d4c255 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -95,12 +95,12 @@ userViewModel.enter(keyModel.data!!.sid!!, userPhone, dataByPublicKey) userViewModel.loginResult.observe(this, { if (it.code == 200) { + AuthenticationHelper.saveToken(it.data!!.token!!) userViewModel.obtainUserDetail(userPhone) userViewModel.userDetailResult.observe(this, { user -> if (user.code == 200) { SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, true) SaveKeyValues.putValue(LocaleConstant.USER_MODEL, user.toJson()) - AuthenticationHelper.saveToken(it.data!!.token!!) LoadingDialogHub.dismiss() PageNavigationManager.finishAllActivity() navigatePageTo() diff --git a/app/src/main/java/com/casic/br/view/SelectBluetoothActivity.kt b/app/src/main/java/com/casic/br/view/SelectBluetoothActivity.kt index 4375725..6014293 100644 --- a/app/src/main/java/com/casic/br/view/SelectBluetoothActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectBluetoothActivity.kt @@ -1,25 +1,205 @@ package com.casic.br.view +import android.util.Log +import android.view.KeyEvent +import androidx.lifecycle.ViewModelProvider import com.casic.br.R +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.DeserializeModel +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.utils.LocaleConstant +import com.casic.br.vm.DeviceViewModel +import com.casic.br.widgets.WaterRippleView +import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState +import com.tuya.smart.android.ble.api.LeScanSetting +import com.tuya.smart.android.ble.api.ScanDeviceBean +import com.tuya.smart.android.ble.api.ScanType +import com.tuya.smart.android.ble.api.TyBleScanResponse +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.ConfigProductInfoBean +import com.tuya.smart.sdk.api.IMultiModeActivatorListener +import com.tuya.smart.sdk.api.ITuyaActivatorGetToken +import com.tuya.smart.sdk.api.ITuyaDataCallback +import com.tuya.smart.sdk.bean.DeviceBean +import com.tuya.smart.sdk.bean.MultiModeActivatorBean +import kotlinx.android.synthetic.main.activity_select_bluetooth.* +import kotlinx.android.synthetic.main.activity_select_wifi.rootView +import kotlinx.android.synthetic.main.fragment_add_device_nearby.* +import kotlinx.android.synthetic.main.fragment_add_device_nearby.waterRippleView +import kotlinx.android.synthetic.main.include_base_title.* +import java.util.* +import java.util.concurrent.ExecutorService +import java.util.concurrent.Executors + class SelectBluetoothActivity : KotlinBaseActivity() { - override fun initLayoutView(): Int = R.layout.activity_select_wifi + private val kTag = "SelectBluetoothActivity" + private val context = this@SelectBluetoothActivity + private var isRunning = true + private lateinit var singleThreadExecutor: ExecutorService + private lateinit var params: ArrayList + private lateinit var deviceViewModel: DeviceViewModel + private var deviceBean: ScanDeviceBean? = null - override fun observeRequestState() { - - } + override fun initLayoutView(): Int = R.layout.activity_select_bluetooth override fun setupTopBarLayout() { - + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.text = "搜索蓝牙设备" } override fun initData() { + //只有一个核心线程,当被占用时,其他的任务需要进入队列等待 + singleThreadExecutor = Executors.newSingleThreadExecutor() + waterRippleView.setOnAnimationStartListener(object : + WaterRippleView.OnAnimationStartListener { + override fun onStart(view: WaterRippleView?) { + view?.start() + //开启线程搜索设备 + Log.d(kTag, "onStart: 开始线程") + singleThreadExecutor.execute(searchRunnable) + isRunning = true + } + }) + params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + + val scanSetting = LeScanSetting.Builder().apply { + setTimeout(60000) + addScanType(ScanType.SINGLE) + }.build() + TuyaHomeSdk.getBleOperator().startLeScan(scanSetting, object : TyBleScanResponse { + override fun onResult(bean: ScanDeviceBean?) { + if (bean == null) { + Log.e(kTag, "onResult: 无法扫描到涂鸦蓝牙模组") + return + } + deviceBean = bean + TuyaHomeSdk.getActivatorInstance().getActivatorDeviceInfo( + deviceBean!!.productId, deviceBean!!.uuid, deviceBean!!.mac, + object : ITuyaDataCallback { + override fun onSuccess(result: ConfigProductInfoBean?) { + if (result == null) { + Log.e(kTag, "onResult: 无法获取涂鸦设备信息") + return + } + tipsView.text = "已搜索到蓝牙设备,基本信息如下" + deviceAddressView.text = String.format("设备地址:${deviceBean!!.address}") + deviceNameView.text = String.format("产品名称:${result.name}") + } + + override fun onError(errorCode: String?, errorMessage: String?) { + + } + }) + } + }) + } + + private val searchRunnable = Runnable { + while (true) { + try { + if (!isRunning) { + Log.d(kTag, "run: 设备搜索线程休眠中...") + Thread.sleep(Long.MAX_VALUE) + } + } catch (e: Exception) { + e.printStackTrace() + } + Log.d(kTag, "run: 设备搜索线程运行中...") + try { + //搜索设备 + Thread.sleep(1000) + } catch (e: InterruptedException) { + e.printStackTrace() + } + } + } + + override fun onPause() { + super.onPause() + isRunning = false + waterRippleView.stop() + TuyaHomeSdk.getBleOperator().stopLeScan() } override fun initEvent() { + nextStepButton.setOnClickListener { + LoadingDialogHub.show(this, "设备配网中,请稍后") + val userModel = DeserializeModel.getUserModel()!! + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeId.toLong(), object : + ITuyaActivatorGetToken { + override fun onSuccess(token: String?) { + val multiModeActivatorBean = MultiModeActivatorBean() + multiModeActivatorBean.homeId = homeId.toLong() + multiModeActivatorBean.deviceType = deviceBean!!.deviceType + multiModeActivatorBean.uuid = deviceBean!!.uuid + multiModeActivatorBean.address = deviceBean!!.address + multiModeActivatorBean.mac = deviceBean!!.mac + multiModeActivatorBean.ssid = params[0] + multiModeActivatorBean.pwd = params[1] + multiModeActivatorBean.token = token + multiModeActivatorBean.timeout = 120000 + + // 开始配网 + TuyaHomeSdk.getActivator().newMultiModeActivator().startActivator( + multiModeActivatorBean, + object : IMultiModeActivatorListener { + override fun onSuccess(deviceBean: DeviceBean?) { + //将绑定的设备存入自己的数据库 + deviceViewModel.addDevice(deviceBean!!, userModel) + } + + override fun onFailure(code: Int, msg: String?, handle: Any?) { + Log.d(kTag, "errorMsg: $msg") + "添加设备失败".show(context) + LoadingDialogHub.dismiss() + } + }) + } + + override fun onFailure(errorCode: String?, errorMsg: String?) { + "获取设备配网Token失败,无法配网".show(context) + LoadingDialogHub.dismiss() + } + }) + } + } + + override fun observeRequestState() { + deviceViewModel.loadState.observe(this, { + when (it) { + LoadState.Success -> { + LoadingDialogHub.dismiss() + navigatePageTo() + } + else -> { + "添加失败,请重新绑定".show(this) + LoadingDialogHub.dismiss() + } + } + }) + } + + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + if (keyCode == KeyEvent.KEYCODE_BACK) { + if (deviceBean == null) { + return super.onKeyDown(keyCode, event) + } + TuyaHomeSdk.getActivator().newMultiModeActivator().stopActivator(deviceBean!!.uuid) + } + return super.onKeyDown(keyCode, event) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt index 98778ea..0cde6b9 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -2,6 +2,7 @@ import android.content.Context import android.content.Intent +import android.graphics.Color import android.net.wifi.WifiManager import android.provider.Settings import android.view.View @@ -13,6 +14,7 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_login.* import kotlinx.android.synthetic.main.activity_select_wifi.* import kotlinx.android.synthetic.main.include_base_title.* @@ -23,8 +25,6 @@ class SelectWiFiActivity : KotlinBaseActivity() { - private val context: Context = this@SelectWiFiActivity - private val kTag = "SelectWifiActivity" private val wifi by lazy { applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager } override fun initLayoutView(): Int = R.layout.activity_select_wifi @@ -62,7 +62,20 @@ } //保存Wi-Fi密码 SaveKeyValues.putValue(LocaleConstant.WIFI_PASSWORD, wifiKey) - navigatePageTo(arrayListOf(wifiName, wifiKey)) + val wifiConfig = arrayListOf(wifiName, wifiKey) + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("Wi-Fi连接模式", "蓝牙连接模式")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> navigatePageTo(wifiConfig) + 1 -> navigatePageTo(wifiConfig) + } + } + }) + .build().show() } } diff --git a/app/src/main/java/com/casic/br/vm/MessageViewModel.kt b/app/src/main/java/com/casic/br/vm/MessageViewModel.kt index 05fe059..c81e688 100644 --- a/app/src/main/java/com/casic/br/vm/MessageViewModel.kt +++ b/app/src/main/java/com/casic/br/vm/MessageViewModel.kt @@ -31,8 +31,6 @@ listModel.value = gson.fromJson( response, object : TypeToken() {}.type ) - } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) } }, { it.printStackTrace() diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d60335b..3afcc05 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,8 @@ + + () + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } } override fun onItemClick(position: Int) { // 需要根据设备类型显示不同的页面 - val deviceModel = dataBeans[position] - when { - deviceModel.deviceName.contains("热水器") -> { - requireContext().navigatePageTo(deviceModel.deviceId) + if (DeserializeModel.isLogin()) { + val deviceModel = dataBeans[position] + when { + deviceModel.deviceName.contains("热水器") -> { + requireContext().navigatePageTo(deviceModel.deviceId) + } + deviceModel.deviceName.contains("油烟机") -> { + requireContext().navigatePageTo(deviceModel.deviceId) + } + deviceModel.deviceName.contains("壁挂炉") -> { + requireContext().navigatePageTo(deviceModel.deviceId) + } + deviceModel.deviceName.contains("燃气灶") -> { + requireContext().navigatePageTo(deviceModel.deviceId) + } } - deviceModel.deviceName.contains("油烟机") -> { - requireContext().navigatePageTo(deviceModel.deviceId) - } - deviceModel.deviceName.contains("壁挂炉") -> { - requireContext().navigatePageTo(deviceModel.deviceId) - } - deviceModel.deviceName.contains("燃气灶") -> { - requireContext().navigatePageTo(deviceModel.deviceId) - } + } else { + requireContext().navigatePageTo() } } diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index c495da7..ed28b03 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -14,7 +14,8 @@ Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.READ_PHONE_STATE + Manifest.permission.READ_PHONE_STATE, Manifest.permission.BLUETOOTH, + Manifest.permission.BLUETOOTH_ADMIN ) val SHOP_IMAGE = intArrayOf(R.mipmap.ic_launcher, R.mipmap.ic_launcher, R.mipmap.ic_launcher) val SHOP_OPERATE = arrayOf("购物车", "我的订单", "故障售后") diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 789ff25..7c6591f 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -225,31 +225,19 @@ */ suspend fun addDevice(devResp: DeviceBean, userModel: UserDetailModel.DataModel): String { val paramObject = JSONObject() - paramObject.put("snCode", "") paramObject.put("deviceId", devResp.devId) - paramObject.put("brandCode", "") - paramObject.put("brandName", "") paramObject.put("productCode", devResp.productId) - paramObject.put("productName", "") - paramObject.put("produceDate", "") paramObject.put("deviceStatus", 1) paramObject.put("deviceActive", 1) - paramObject.put("deviceActiveTime", devResp.time) + paramObject.put("deviceActiveTime", (devResp.time * 1000L).timestampToCompleteDate()) paramObject.put("deviceBindUser", 1) paramObject.put("deviceName", devResp.name) paramObject.put("deviceHardwareVersion", devResp.bv) paramObject.put("deviceSoftwareVersion", devResp.pv) - paramObject.put("deviceCoreParts", "") paramObject.put("deviceMac", devResp.mac) paramObject.put("deviceIp", devResp.ip) paramObject.put("productCategory", devResp.category) - paramObject.put("internationalCode", "") - paramObject.put("productSize", "") - paramObject.put("productWeight", "") - paramObject.put("productStatus", "") paramObject.put("productVersion", devResp.productBean.productVer) - paramObject.put("productQuality", "") - paramObject.put("productColor", devResp.productBean) paramObject.put("userAccount", userModel.account) paramObject.put("userName", userModel.name) paramObject.put("userPhone", userModel.phone) diff --git a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt index c3b861d..a796171 100644 --- a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt @@ -28,7 +28,7 @@ class ConnectDeviceActivity : KotlinBaseActivity() { - private val kTag = "ResetDeviceActivity" + private val kTag = "ConnectDeviceActivity" private lateinit var params: ArrayList private lateinit var deviceViewModel: DeviceViewModel diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 6f4088a..0d4c255 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -95,12 +95,12 @@ userViewModel.enter(keyModel.data!!.sid!!, userPhone, dataByPublicKey) userViewModel.loginResult.observe(this, { if (it.code == 200) { + AuthenticationHelper.saveToken(it.data!!.token!!) userViewModel.obtainUserDetail(userPhone) userViewModel.userDetailResult.observe(this, { user -> if (user.code == 200) { SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, true) SaveKeyValues.putValue(LocaleConstant.USER_MODEL, user.toJson()) - AuthenticationHelper.saveToken(it.data!!.token!!) LoadingDialogHub.dismiss() PageNavigationManager.finishAllActivity() navigatePageTo() diff --git a/app/src/main/java/com/casic/br/view/SelectBluetoothActivity.kt b/app/src/main/java/com/casic/br/view/SelectBluetoothActivity.kt index 4375725..6014293 100644 --- a/app/src/main/java/com/casic/br/view/SelectBluetoothActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectBluetoothActivity.kt @@ -1,25 +1,205 @@ package com.casic.br.view +import android.util.Log +import android.view.KeyEvent +import androidx.lifecycle.ViewModelProvider import com.casic.br.R +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.DeserializeModel +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.utils.LocaleConstant +import com.casic.br.vm.DeviceViewModel +import com.casic.br.widgets.WaterRippleView +import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState +import com.tuya.smart.android.ble.api.LeScanSetting +import com.tuya.smart.android.ble.api.ScanDeviceBean +import com.tuya.smart.android.ble.api.ScanType +import com.tuya.smart.android.ble.api.TyBleScanResponse +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.ConfigProductInfoBean +import com.tuya.smart.sdk.api.IMultiModeActivatorListener +import com.tuya.smart.sdk.api.ITuyaActivatorGetToken +import com.tuya.smart.sdk.api.ITuyaDataCallback +import com.tuya.smart.sdk.bean.DeviceBean +import com.tuya.smart.sdk.bean.MultiModeActivatorBean +import kotlinx.android.synthetic.main.activity_select_bluetooth.* +import kotlinx.android.synthetic.main.activity_select_wifi.rootView +import kotlinx.android.synthetic.main.fragment_add_device_nearby.* +import kotlinx.android.synthetic.main.fragment_add_device_nearby.waterRippleView +import kotlinx.android.synthetic.main.include_base_title.* +import java.util.* +import java.util.concurrent.ExecutorService +import java.util.concurrent.Executors + class SelectBluetoothActivity : KotlinBaseActivity() { - override fun initLayoutView(): Int = R.layout.activity_select_wifi + private val kTag = "SelectBluetoothActivity" + private val context = this@SelectBluetoothActivity + private var isRunning = true + private lateinit var singleThreadExecutor: ExecutorService + private lateinit var params: ArrayList + private lateinit var deviceViewModel: DeviceViewModel + private var deviceBean: ScanDeviceBean? = null - override fun observeRequestState() { - - } + override fun initLayoutView(): Int = R.layout.activity_select_bluetooth override fun setupTopBarLayout() { - + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.text = "搜索蓝牙设备" } override fun initData() { + //只有一个核心线程,当被占用时,其他的任务需要进入队列等待 + singleThreadExecutor = Executors.newSingleThreadExecutor() + waterRippleView.setOnAnimationStartListener(object : + WaterRippleView.OnAnimationStartListener { + override fun onStart(view: WaterRippleView?) { + view?.start() + //开启线程搜索设备 + Log.d(kTag, "onStart: 开始线程") + singleThreadExecutor.execute(searchRunnable) + isRunning = true + } + }) + params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + + val scanSetting = LeScanSetting.Builder().apply { + setTimeout(60000) + addScanType(ScanType.SINGLE) + }.build() + TuyaHomeSdk.getBleOperator().startLeScan(scanSetting, object : TyBleScanResponse { + override fun onResult(bean: ScanDeviceBean?) { + if (bean == null) { + Log.e(kTag, "onResult: 无法扫描到涂鸦蓝牙模组") + return + } + deviceBean = bean + TuyaHomeSdk.getActivatorInstance().getActivatorDeviceInfo( + deviceBean!!.productId, deviceBean!!.uuid, deviceBean!!.mac, + object : ITuyaDataCallback { + override fun onSuccess(result: ConfigProductInfoBean?) { + if (result == null) { + Log.e(kTag, "onResult: 无法获取涂鸦设备信息") + return + } + tipsView.text = "已搜索到蓝牙设备,基本信息如下" + deviceAddressView.text = String.format("设备地址:${deviceBean!!.address}") + deviceNameView.text = String.format("产品名称:${result.name}") + } + + override fun onError(errorCode: String?, errorMessage: String?) { + + } + }) + } + }) + } + + private val searchRunnable = Runnable { + while (true) { + try { + if (!isRunning) { + Log.d(kTag, "run: 设备搜索线程休眠中...") + Thread.sleep(Long.MAX_VALUE) + } + } catch (e: Exception) { + e.printStackTrace() + } + Log.d(kTag, "run: 设备搜索线程运行中...") + try { + //搜索设备 + Thread.sleep(1000) + } catch (e: InterruptedException) { + e.printStackTrace() + } + } + } + + override fun onPause() { + super.onPause() + isRunning = false + waterRippleView.stop() + TuyaHomeSdk.getBleOperator().stopLeScan() } override fun initEvent() { + nextStepButton.setOnClickListener { + LoadingDialogHub.show(this, "设备配网中,请稍后") + val userModel = DeserializeModel.getUserModel()!! + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeId.toLong(), object : + ITuyaActivatorGetToken { + override fun onSuccess(token: String?) { + val multiModeActivatorBean = MultiModeActivatorBean() + multiModeActivatorBean.homeId = homeId.toLong() + multiModeActivatorBean.deviceType = deviceBean!!.deviceType + multiModeActivatorBean.uuid = deviceBean!!.uuid + multiModeActivatorBean.address = deviceBean!!.address + multiModeActivatorBean.mac = deviceBean!!.mac + multiModeActivatorBean.ssid = params[0] + multiModeActivatorBean.pwd = params[1] + multiModeActivatorBean.token = token + multiModeActivatorBean.timeout = 120000 + + // 开始配网 + TuyaHomeSdk.getActivator().newMultiModeActivator().startActivator( + multiModeActivatorBean, + object : IMultiModeActivatorListener { + override fun onSuccess(deviceBean: DeviceBean?) { + //将绑定的设备存入自己的数据库 + deviceViewModel.addDevice(deviceBean!!, userModel) + } + + override fun onFailure(code: Int, msg: String?, handle: Any?) { + Log.d(kTag, "errorMsg: $msg") + "添加设备失败".show(context) + LoadingDialogHub.dismiss() + } + }) + } + + override fun onFailure(errorCode: String?, errorMsg: String?) { + "获取设备配网Token失败,无法配网".show(context) + LoadingDialogHub.dismiss() + } + }) + } + } + + override fun observeRequestState() { + deviceViewModel.loadState.observe(this, { + when (it) { + LoadState.Success -> { + LoadingDialogHub.dismiss() + navigatePageTo() + } + else -> { + "添加失败,请重新绑定".show(this) + LoadingDialogHub.dismiss() + } + } + }) + } + + override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { + if (keyCode == KeyEvent.KEYCODE_BACK) { + if (deviceBean == null) { + return super.onKeyDown(keyCode, event) + } + TuyaHomeSdk.getActivator().newMultiModeActivator().stopActivator(deviceBean!!.uuid) + } + return super.onKeyDown(keyCode, event) } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt index 98778ea..0cde6b9 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -2,6 +2,7 @@ import android.content.Context import android.content.Intent +import android.graphics.Color import android.net.wifi.WifiManager import android.provider.Settings import android.view.View @@ -13,6 +14,7 @@ import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_login.* import kotlinx.android.synthetic.main.activity_select_wifi.* import kotlinx.android.synthetic.main.include_base_title.* @@ -23,8 +25,6 @@ class SelectWiFiActivity : KotlinBaseActivity() { - private val context: Context = this@SelectWiFiActivity - private val kTag = "SelectWifiActivity" private val wifi by lazy { applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager } override fun initLayoutView(): Int = R.layout.activity_select_wifi @@ -62,7 +62,20 @@ } //保存Wi-Fi密码 SaveKeyValues.putValue(LocaleConstant.WIFI_PASSWORD, wifiKey) - navigatePageTo(arrayListOf(wifiName, wifiKey)) + val wifiConfig = arrayListOf(wifiName, wifiKey) + BottomActionSheet.Builder() + .setContext(this) + .setActionItemTitle(arrayListOf("Wi-Fi连接模式", "蓝牙连接模式")) + .setItemTextColor(Color.BLUE) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> navigatePageTo(wifiConfig) + 1 -> navigatePageTo(wifiConfig) + } + } + }) + .build().show() } } diff --git a/app/src/main/java/com/casic/br/vm/MessageViewModel.kt b/app/src/main/java/com/casic/br/vm/MessageViewModel.kt index 05fe059..c81e688 100644 --- a/app/src/main/java/com/casic/br/vm/MessageViewModel.kt +++ b/app/src/main/java/com/casic/br/vm/MessageViewModel.kt @@ -31,8 +31,6 @@ listModel.value = gson.fromJson( response, object : TypeToken() {}.type ) - } else { - response.toErrorMessage().show(BaseApplication.obtainInstance()) } }, { it.printStackTrace() diff --git a/app/src/main/res/layout/activity_select_bluetooth.xml b/app/src/main/res/layout/activity_select_bluetooth.xml new file mode 100644 index 0000000..8a2e3b3 --- /dev/null +++ b/app/src/main/res/layout/activity_select_bluetooth.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + +