diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3afcc05..df6e1a2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -54,7 +54,7 @@ - + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3afcc05..df6e1a2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -54,7 +54,7 @@ - + diff --git a/app/src/main/java/com/casic/br/view/AddressActivity.kt b/app/src/main/java/com/casic/br/view/AddressActivity.kt index 5c47a8f..3c1c44e 100644 --- a/app/src/main/java/com/casic/br/view/AddressActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressActivity.kt @@ -1,5 +1,6 @@ package com.casic.br.view +import android.graphics.Color import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.utils.DeserializeModel @@ -69,7 +70,7 @@ val layout = addressPicker.wheelLayout layout.setTextSize(14f.sp2px(this).toFloat()) layout.setSelectedTextSize(16f.sp2px(this).toFloat()) - layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextColor(Color.BLUE) layout.setSelectedTextBold(true) layout.setOnLinkageSelectedListener { first, second, third -> addressPicker.titleView.text = String.format( @@ -78,7 +79,7 @@ addressPicker.secondWheelView.formatItem(second), addressPicker.thirdWheelView.formatItem(third) ) - addressPicker.titleView.setTextColor(R.color.mainThemeColor.convertColor(this)) + addressPicker.titleView.setTextColor(Color.BLUE) } addressPicker.show() } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3afcc05..df6e1a2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -54,7 +54,7 @@ - + diff --git a/app/src/main/java/com/casic/br/view/AddressActivity.kt b/app/src/main/java/com/casic/br/view/AddressActivity.kt index 5c47a8f..3c1c44e 100644 --- a/app/src/main/java/com/casic/br/view/AddressActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressActivity.kt @@ -1,5 +1,6 @@ package com.casic.br.view +import android.graphics.Color import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.utils.DeserializeModel @@ -69,7 +70,7 @@ val layout = addressPicker.wheelLayout layout.setTextSize(14f.sp2px(this).toFloat()) layout.setSelectedTextSize(16f.sp2px(this).toFloat()) - layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextColor(Color.BLUE) layout.setSelectedTextBold(true) layout.setOnLinkageSelectedListener { first, second, third -> addressPicker.titleView.text = String.format( @@ -78,7 +79,7 @@ addressPicker.secondWheelView.formatItem(second), addressPicker.thirdWheelView.formatItem(third) ) - addressPicker.titleView.setTextColor(R.color.mainThemeColor.convertColor(this)) + addressPicker.titleView.setTextColor(Color.BLUE) } addressPicker.show() } diff --git a/app/src/main/java/com/casic/br/view/EditUserActivity.kt b/app/src/main/java/com/casic/br/view/EditUserActivity.kt index 6cd793e..a64fdde 100644 --- a/app/src/main/java/com/casic/br/view/EditUserActivity.kt +++ b/app/src/main/java/com/casic/br/view/EditUserActivity.kt @@ -222,7 +222,7 @@ val birthdayPicker = BirthdayPicker(this) birthdayPicker.setDefaultValue(1991, 8, 3) birthdayPicker.setOnDatePickedListener { year, month, day -> - val birthdayDate = String.format("%s年%s月%s日", year, month, day) + val birthdayDate = String.format("%s-%s-%s", year, month, day) //更新生日 currentUser.birthday = birthdayDate userViewModel.updateUserInfo(currentUser) @@ -232,7 +232,7 @@ val layout = birthdayPicker.wheelLayout layout.setTextSize(14f.sp2px(context).toFloat()) layout.setSelectedTextSize(16f.sp2px(context).toFloat()) - layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextColor(Color.BLUE) layout.setSelectedTextBold(true) layout.setResetWhenLinkage(false) birthdayPicker.show() diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3afcc05..df6e1a2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -54,7 +54,7 @@ - + diff --git a/app/src/main/java/com/casic/br/view/AddressActivity.kt b/app/src/main/java/com/casic/br/view/AddressActivity.kt index 5c47a8f..3c1c44e 100644 --- a/app/src/main/java/com/casic/br/view/AddressActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressActivity.kt @@ -1,5 +1,6 @@ package com.casic.br.view +import android.graphics.Color import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.utils.DeserializeModel @@ -69,7 +70,7 @@ val layout = addressPicker.wheelLayout layout.setTextSize(14f.sp2px(this).toFloat()) layout.setSelectedTextSize(16f.sp2px(this).toFloat()) - layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextColor(Color.BLUE) layout.setSelectedTextBold(true) layout.setOnLinkageSelectedListener { first, second, third -> addressPicker.titleView.text = String.format( @@ -78,7 +79,7 @@ addressPicker.secondWheelView.formatItem(second), addressPicker.thirdWheelView.formatItem(third) ) - addressPicker.titleView.setTextColor(R.color.mainThemeColor.convertColor(this)) + addressPicker.titleView.setTextColor(Color.BLUE) } addressPicker.show() } diff --git a/app/src/main/java/com/casic/br/view/EditUserActivity.kt b/app/src/main/java/com/casic/br/view/EditUserActivity.kt index 6cd793e..a64fdde 100644 --- a/app/src/main/java/com/casic/br/view/EditUserActivity.kt +++ b/app/src/main/java/com/casic/br/view/EditUserActivity.kt @@ -222,7 +222,7 @@ val birthdayPicker = BirthdayPicker(this) birthdayPicker.setDefaultValue(1991, 8, 3) birthdayPicker.setOnDatePickedListener { year, month, day -> - val birthdayDate = String.format("%s年%s月%s日", year, month, day) + val birthdayDate = String.format("%s-%s-%s", year, month, day) //更新生日 currentUser.birthday = birthdayDate userViewModel.updateUserInfo(currentUser) @@ -232,7 +232,7 @@ val layout = birthdayPicker.wheelLayout layout.setTextSize(14f.sp2px(context).toFloat()) layout.setSelectedTextSize(16f.sp2px(context).toFloat()) - layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextColor(Color.BLUE) layout.setSelectedTextBold(true) layout.setResetWhenLinkage(false) birthdayPicker.show() diff --git a/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt b/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt new file mode 100644 index 0000000..b5f86e8 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt @@ -0,0 +1,202 @@ +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_scan_bluetooth.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.util.* +import java.util.concurrent.ExecutorService +import java.util.concurrent.Executors + + +class ScanBluetoothActivity : KotlinBaseActivity() { + + private val kTag = "ScanBluetoothActivity" + private val context = this@ScanBluetoothActivity + 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 initLayoutView(): Int = R.layout.activity_scan_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 3afcc05..df6e1a2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -54,7 +54,7 @@ - + diff --git a/app/src/main/java/com/casic/br/view/AddressActivity.kt b/app/src/main/java/com/casic/br/view/AddressActivity.kt index 5c47a8f..3c1c44e 100644 --- a/app/src/main/java/com/casic/br/view/AddressActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressActivity.kt @@ -1,5 +1,6 @@ package com.casic.br.view +import android.graphics.Color import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.utils.DeserializeModel @@ -69,7 +70,7 @@ val layout = addressPicker.wheelLayout layout.setTextSize(14f.sp2px(this).toFloat()) layout.setSelectedTextSize(16f.sp2px(this).toFloat()) - layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextColor(Color.BLUE) layout.setSelectedTextBold(true) layout.setOnLinkageSelectedListener { first, second, third -> addressPicker.titleView.text = String.format( @@ -78,7 +79,7 @@ addressPicker.secondWheelView.formatItem(second), addressPicker.thirdWheelView.formatItem(third) ) - addressPicker.titleView.setTextColor(R.color.mainThemeColor.convertColor(this)) + addressPicker.titleView.setTextColor(Color.BLUE) } addressPicker.show() } diff --git a/app/src/main/java/com/casic/br/view/EditUserActivity.kt b/app/src/main/java/com/casic/br/view/EditUserActivity.kt index 6cd793e..a64fdde 100644 --- a/app/src/main/java/com/casic/br/view/EditUserActivity.kt +++ b/app/src/main/java/com/casic/br/view/EditUserActivity.kt @@ -222,7 +222,7 @@ val birthdayPicker = BirthdayPicker(this) birthdayPicker.setDefaultValue(1991, 8, 3) birthdayPicker.setOnDatePickedListener { year, month, day -> - val birthdayDate = String.format("%s年%s月%s日", year, month, day) + val birthdayDate = String.format("%s-%s-%s", year, month, day) //更新生日 currentUser.birthday = birthdayDate userViewModel.updateUserInfo(currentUser) @@ -232,7 +232,7 @@ val layout = birthdayPicker.wheelLayout layout.setTextSize(14f.sp2px(context).toFloat()) layout.setSelectedTextSize(16f.sp2px(context).toFloat()) - layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextColor(Color.BLUE) layout.setSelectedTextBold(true) layout.setResetWhenLinkage(false) birthdayPicker.show() diff --git a/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt b/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt new file mode 100644 index 0000000..b5f86e8 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt @@ -0,0 +1,202 @@ +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_scan_bluetooth.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.util.* +import java.util.concurrent.ExecutorService +import java.util.concurrent.Executors + + +class ScanBluetoothActivity : KotlinBaseActivity() { + + private val kTag = "ScanBluetoothActivity" + private val context = this@ScanBluetoothActivity + 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 initLayoutView(): Int = R.layout.activity_scan_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/SelectBluetoothActivity.kt b/app/src/main/java/com/casic/br/view/SelectBluetoothActivity.kt deleted file mode 100644 index 6014293..0000000 --- a/app/src/main/java/com/casic/br/view/SelectBluetoothActivity.kt +++ /dev/null @@ -1,205 +0,0 @@ -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() { - - 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 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 3afcc05..df6e1a2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -54,7 +54,7 @@ - + diff --git a/app/src/main/java/com/casic/br/view/AddressActivity.kt b/app/src/main/java/com/casic/br/view/AddressActivity.kt index 5c47a8f..3c1c44e 100644 --- a/app/src/main/java/com/casic/br/view/AddressActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressActivity.kt @@ -1,5 +1,6 @@ package com.casic.br.view +import android.graphics.Color import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.utils.DeserializeModel @@ -69,7 +70,7 @@ val layout = addressPicker.wheelLayout layout.setTextSize(14f.sp2px(this).toFloat()) layout.setSelectedTextSize(16f.sp2px(this).toFloat()) - layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextColor(Color.BLUE) layout.setSelectedTextBold(true) layout.setOnLinkageSelectedListener { first, second, third -> addressPicker.titleView.text = String.format( @@ -78,7 +79,7 @@ addressPicker.secondWheelView.formatItem(second), addressPicker.thirdWheelView.formatItem(third) ) - addressPicker.titleView.setTextColor(R.color.mainThemeColor.convertColor(this)) + addressPicker.titleView.setTextColor(Color.BLUE) } addressPicker.show() } diff --git a/app/src/main/java/com/casic/br/view/EditUserActivity.kt b/app/src/main/java/com/casic/br/view/EditUserActivity.kt index 6cd793e..a64fdde 100644 --- a/app/src/main/java/com/casic/br/view/EditUserActivity.kt +++ b/app/src/main/java/com/casic/br/view/EditUserActivity.kt @@ -222,7 +222,7 @@ val birthdayPicker = BirthdayPicker(this) birthdayPicker.setDefaultValue(1991, 8, 3) birthdayPicker.setOnDatePickedListener { year, month, day -> - val birthdayDate = String.format("%s年%s月%s日", year, month, day) + val birthdayDate = String.format("%s-%s-%s", year, month, day) //更新生日 currentUser.birthday = birthdayDate userViewModel.updateUserInfo(currentUser) @@ -232,7 +232,7 @@ val layout = birthdayPicker.wheelLayout layout.setTextSize(14f.sp2px(context).toFloat()) layout.setSelectedTextSize(16f.sp2px(context).toFloat()) - layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextColor(Color.BLUE) layout.setSelectedTextBold(true) layout.setResetWhenLinkage(false) birthdayPicker.show() diff --git a/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt b/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt new file mode 100644 index 0000000..b5f86e8 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt @@ -0,0 +1,202 @@ +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_scan_bluetooth.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.util.* +import java.util.concurrent.ExecutorService +import java.util.concurrent.Executors + + +class ScanBluetoothActivity : KotlinBaseActivity() { + + private val kTag = "ScanBluetoothActivity" + private val context = this@ScanBluetoothActivity + 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 initLayoutView(): Int = R.layout.activity_scan_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/SelectBluetoothActivity.kt b/app/src/main/java/com/casic/br/view/SelectBluetoothActivity.kt deleted file mode 100644 index 6014293..0000000 --- a/app/src/main/java/com/casic/br/view/SelectBluetoothActivity.kt +++ /dev/null @@ -1,205 +0,0 @@ -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() { - - 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 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 0cde6b9..c9e732d 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -71,7 +71,7 @@ override fun onActionItemClick(position: Int) { when (position) { 0 -> navigatePageTo(wifiConfig) - 1 -> navigatePageTo(wifiConfig) + 1 -> navigatePageTo(wifiConfig) } } }) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3afcc05..df6e1a2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -54,7 +54,7 @@ - + diff --git a/app/src/main/java/com/casic/br/view/AddressActivity.kt b/app/src/main/java/com/casic/br/view/AddressActivity.kt index 5c47a8f..3c1c44e 100644 --- a/app/src/main/java/com/casic/br/view/AddressActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressActivity.kt @@ -1,5 +1,6 @@ package com.casic.br.view +import android.graphics.Color import androidx.lifecycle.ViewModelProvider import com.casic.br.R import com.casic.br.utils.DeserializeModel @@ -69,7 +70,7 @@ val layout = addressPicker.wheelLayout layout.setTextSize(14f.sp2px(this).toFloat()) layout.setSelectedTextSize(16f.sp2px(this).toFloat()) - layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextColor(Color.BLUE) layout.setSelectedTextBold(true) layout.setOnLinkageSelectedListener { first, second, third -> addressPicker.titleView.text = String.format( @@ -78,7 +79,7 @@ addressPicker.secondWheelView.formatItem(second), addressPicker.thirdWheelView.formatItem(third) ) - addressPicker.titleView.setTextColor(R.color.mainThemeColor.convertColor(this)) + addressPicker.titleView.setTextColor(Color.BLUE) } addressPicker.show() } diff --git a/app/src/main/java/com/casic/br/view/EditUserActivity.kt b/app/src/main/java/com/casic/br/view/EditUserActivity.kt index 6cd793e..a64fdde 100644 --- a/app/src/main/java/com/casic/br/view/EditUserActivity.kt +++ b/app/src/main/java/com/casic/br/view/EditUserActivity.kt @@ -222,7 +222,7 @@ val birthdayPicker = BirthdayPicker(this) birthdayPicker.setDefaultValue(1991, 8, 3) birthdayPicker.setOnDatePickedListener { year, month, day -> - val birthdayDate = String.format("%s年%s月%s日", year, month, day) + val birthdayDate = String.format("%s-%s-%s", year, month, day) //更新生日 currentUser.birthday = birthdayDate userViewModel.updateUserInfo(currentUser) @@ -232,7 +232,7 @@ val layout = birthdayPicker.wheelLayout layout.setTextSize(14f.sp2px(context).toFloat()) layout.setSelectedTextSize(16f.sp2px(context).toFloat()) - layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextColor(Color.BLUE) layout.setSelectedTextBold(true) layout.setResetWhenLinkage(false) birthdayPicker.show() diff --git a/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt b/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt new file mode 100644 index 0000000..b5f86e8 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/ScanBluetoothActivity.kt @@ -0,0 +1,202 @@ +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_scan_bluetooth.* +import kotlinx.android.synthetic.main.include_base_title.* +import java.util.* +import java.util.concurrent.ExecutorService +import java.util.concurrent.Executors + + +class ScanBluetoothActivity : KotlinBaseActivity() { + + private val kTag = "ScanBluetoothActivity" + private val context = this@ScanBluetoothActivity + 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 initLayoutView(): Int = R.layout.activity_scan_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/SelectBluetoothActivity.kt b/app/src/main/java/com/casic/br/view/SelectBluetoothActivity.kt deleted file mode 100644 index 6014293..0000000 --- a/app/src/main/java/com/casic/br/view/SelectBluetoothActivity.kt +++ /dev/null @@ -1,205 +0,0 @@ -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() { - - 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 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 0cde6b9..c9e732d 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -71,7 +71,7 @@ override fun onActionItemClick(position: Int) { when (position) { 0 -> navigatePageTo(wifiConfig) - 1 -> navigatePageTo(wifiConfig) + 1 -> navigatePageTo(wifiConfig) } } }) diff --git a/app/src/main/res/layout/activity_scan_bluetooth.xml b/app/src/main/res/layout/activity_scan_bluetooth.xml new file mode 100644 index 0000000..8a2e3b3 --- /dev/null +++ b/app/src/main/res/layout/activity_scan_bluetooth.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + +