diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ecbed59..d60335b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -51,7 +51,7 @@ - + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ecbed59..d60335b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -51,7 +51,7 @@ - + diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 16b4e19..510bca0 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -101,4 +101,13 @@ @Multipart @POST("/file/uploadFile") suspend fun uploadImage(@Part file: MultipartBody.Part): String + + /** + * Banner + */ + @POST("/deviceInfo/add") + suspend fun addDevice( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ecbed59..d60335b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -51,7 +51,7 @@ - + diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 16b4e19..510bca0 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -101,4 +101,13 @@ @Multipart @POST("/file/uploadFile") suspend fun uploadImage(@Part file: MultipartBody.Part): String + + /** + * Banner + */ + @POST("/deviceInfo/add") + suspend fun addDevice( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file 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 a31d9c3..7dff2a3 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 @@ -3,8 +3,10 @@ import com.casic.br.model.UserDetailModel import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.utils.RetrofitFactory.createRetrofit import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.sdk.bean.DeviceBean import okhttp3.MediaType.Companion.toMediaType import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.MultipartBody @@ -207,4 +209,44 @@ val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) return api.uploadImage(imagePart) } + + /** + * 添加设备到自己服务器 + */ + 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("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) + paramObject.put("userBindDate", System.currentTimeMillis().timestampToCompleteDate()) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.addDevice(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ecbed59..d60335b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -51,7 +51,7 @@ - + diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 16b4e19..510bca0 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -101,4 +101,13 @@ @Multipart @POST("/file/uploadFile") suspend fun uploadImage(@Part file: MultipartBody.Part): String + + /** + * Banner + */ + @POST("/deviceInfo/add") + suspend fun addDevice( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file 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 a31d9c3..7dff2a3 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 @@ -3,8 +3,10 @@ import com.casic.br.model.UserDetailModel import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.utils.RetrofitFactory.createRetrofit import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.sdk.bean.DeviceBean import okhttp3.MediaType.Companion.toMediaType import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.MultipartBody @@ -207,4 +209,44 @@ val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) return api.uploadImage(imagePart) } + + /** + * 添加设备到自己服务器 + */ + 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("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) + paramObject.put("userBindDate", System.currentTimeMillis().timestampToCompleteDate()) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.addDevice(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt new file mode 100644 index 0000000..c3b861d --- /dev/null +++ b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt @@ -0,0 +1,111 @@ +package com.casic.br.view + +import android.util.Log +import android.view.View +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.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.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.builder.ActivatorBuilder +import com.tuya.smart.sdk.api.ITuyaActivatorGetToken +import com.tuya.smart.sdk.api.ITuyaSmartActivatorListener +import com.tuya.smart.sdk.bean.DeviceBean +import com.tuya.smart.sdk.enums.ActivatorModelEnum +import kotlinx.android.synthetic.main.activity_connect_device.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import java.util.* + +class ConnectDeviceActivity : KotlinBaseActivity() { + + private val kTag = "ResetDeviceActivity" + private lateinit var params: ArrayList + private lateinit var deviceViewModel: DeviceViewModel + + override fun initLayoutView(): Int = R.layout.activity_connect_device + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.visibility = View.GONE + } + + override fun initData() { + params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + } + + override fun initEvent() { + nextStepButton.setOnClickListener { + if (!confirmCheckBox.isChecked) { + "请确认设备指示灯是否闪烁".show(this) + return@setOnClickListener + } + LoadingDialogHub.show(this, "设备配网中,请稍后") + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + val userModel = DeserializeModel.getUserModel()!! + TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeId.toLong(), + object : ITuyaActivatorGetToken { + override fun onSuccess(token: String) { + //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 + val builder = ActivatorBuilder().apply { + this.ssid = params[0] + this.context = this@ConnectDeviceActivity + this.password = params[1] + this.activatorModel = ActivatorModelEnum.TY_EZ + this.timeOut = 100 + this.token = token + this.listener = object : ITuyaSmartActivatorListener { + override fun onError(errorCode: String?, errorMsg: String?) { + Log.d(kTag, "errorMsg: $errorMsg") + "添加设备超时".show(this@ConnectDeviceActivity) + LoadingDialogHub.dismiss() + } + + override fun onActiveSuccess(devResp: DeviceBean?) { + //将绑定的设备存入自己的数据库 + deviceViewModel.addDevice(devResp!!,userModel) + } + + override fun onStep(step: String?, data: Any?) { + LoadingDialogHub.dismiss() + } + } + } + TuyaHomeSdk.getActivatorInstance().newMultiActivator(builder).start() + } + + override fun onFailure(s: String, s1: String) { + Log.e(kTag, "onFailure: $s") + LoadingDialogHub.dismiss() + } + }) + } + } + + override fun observeRequestState() { + deviceViewModel.loadState.observe(this, { + when (it) { + LoadState.Success -> { + LoadingDialogHub.dismiss() + navigatePageTo() + } + else -> { + "添加失败,请重置设备重新绑定".show(this) + LoadingDialogHub.dismiss() + } + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ecbed59..d60335b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -51,7 +51,7 @@ - + diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 16b4e19..510bca0 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -101,4 +101,13 @@ @Multipart @POST("/file/uploadFile") suspend fun uploadImage(@Part file: MultipartBody.Part): String + + /** + * Banner + */ + @POST("/deviceInfo/add") + suspend fun addDevice( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file 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 a31d9c3..7dff2a3 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 @@ -3,8 +3,10 @@ import com.casic.br.model.UserDetailModel import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.utils.RetrofitFactory.createRetrofit import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.sdk.bean.DeviceBean import okhttp3.MediaType.Companion.toMediaType import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.MultipartBody @@ -207,4 +209,44 @@ val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) return api.uploadImage(imagePart) } + + /** + * 添加设备到自己服务器 + */ + 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("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) + paramObject.put("userBindDate", System.currentTimeMillis().timestampToCompleteDate()) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.addDevice(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt new file mode 100644 index 0000000..c3b861d --- /dev/null +++ b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt @@ -0,0 +1,111 @@ +package com.casic.br.view + +import android.util.Log +import android.view.View +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.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.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.builder.ActivatorBuilder +import com.tuya.smart.sdk.api.ITuyaActivatorGetToken +import com.tuya.smart.sdk.api.ITuyaSmartActivatorListener +import com.tuya.smart.sdk.bean.DeviceBean +import com.tuya.smart.sdk.enums.ActivatorModelEnum +import kotlinx.android.synthetic.main.activity_connect_device.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import java.util.* + +class ConnectDeviceActivity : KotlinBaseActivity() { + + private val kTag = "ResetDeviceActivity" + private lateinit var params: ArrayList + private lateinit var deviceViewModel: DeviceViewModel + + override fun initLayoutView(): Int = R.layout.activity_connect_device + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.visibility = View.GONE + } + + override fun initData() { + params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + } + + override fun initEvent() { + nextStepButton.setOnClickListener { + if (!confirmCheckBox.isChecked) { + "请确认设备指示灯是否闪烁".show(this) + return@setOnClickListener + } + LoadingDialogHub.show(this, "设备配网中,请稍后") + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + val userModel = DeserializeModel.getUserModel()!! + TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeId.toLong(), + object : ITuyaActivatorGetToken { + override fun onSuccess(token: String) { + //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 + val builder = ActivatorBuilder().apply { + this.ssid = params[0] + this.context = this@ConnectDeviceActivity + this.password = params[1] + this.activatorModel = ActivatorModelEnum.TY_EZ + this.timeOut = 100 + this.token = token + this.listener = object : ITuyaSmartActivatorListener { + override fun onError(errorCode: String?, errorMsg: String?) { + Log.d(kTag, "errorMsg: $errorMsg") + "添加设备超时".show(this@ConnectDeviceActivity) + LoadingDialogHub.dismiss() + } + + override fun onActiveSuccess(devResp: DeviceBean?) { + //将绑定的设备存入自己的数据库 + deviceViewModel.addDevice(devResp!!,userModel) + } + + override fun onStep(step: String?, data: Any?) { + LoadingDialogHub.dismiss() + } + } + } + TuyaHomeSdk.getActivatorInstance().newMultiActivator(builder).start() + } + + override fun onFailure(s: String, s1: String) { + Log.e(kTag, "onFailure: $s") + LoadingDialogHub.dismiss() + } + }) + } + } + + override fun observeRequestState() { + deviceViewModel.loadState.observe(this, { + when (it) { + LoadState.Success -> { + LoadingDialogHub.dismiss() + navigatePageTo() + } + else -> { + "添加失败,请重置设备重新绑定".show(this) + LoadingDialogHub.dismiss() + } + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/ResetDeviceActivity.kt b/app/src/main/java/com/casic/br/view/ResetDeviceActivity.kt deleted file mode 100644 index 11c40dc..0000000 --- a/app/src/main/java/com/casic/br/view/ResetDeviceActivity.kt +++ /dev/null @@ -1,95 +0,0 @@ -package com.casic.br.view - -import android.util.Log -import android.view.View -import com.casic.br.R -import com.casic.br.extensions.initLayoutImmersionBar -import com.casic.br.utils.LoadingDialogHub -import com.casic.br.utils.LocaleConstant -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.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.home.sdk.builder.ActivatorBuilder -import com.tuya.smart.sdk.api.ITuyaActivatorGetToken -import com.tuya.smart.sdk.api.ITuyaSmartActivatorListener -import com.tuya.smart.sdk.bean.DeviceBean -import com.tuya.smart.sdk.enums.ActivatorModelEnum -import kotlinx.android.synthetic.main.activity_reset_device.* -import kotlinx.android.synthetic.main.include_left_back_title.* -import java.util.* - -class ResetDeviceActivity : KotlinBaseActivity() { - - private val kTag = "ResetDeviceActivity" - private lateinit var params: ArrayList - - override fun initLayoutView(): Int = R.layout.activity_reset_device - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(true).init() - initLayoutImmersionBar(rootView) - leftBackView.setOnClickListener { finish() } - titleView.visibility = View.GONE - } - - override fun initData() { - params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! - } - - override fun initEvent() { - nextStepButton.setOnClickListener { - if (!confirmCheckBox.isChecked) { - "请确认设备指示灯是否闪烁".show(this) - return@setOnClickListener - } - LoadingDialogHub.show(this, "设备配网中,请稍后") - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String - TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeId.toLong(), - object : ITuyaActivatorGetToken { - override fun onSuccess(token: String) { - Log.d(kTag, "token: $token") - //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 - val builder = ActivatorBuilder().apply { - this.ssid = params[0] - this.context = this@ResetDeviceActivity - this.password = params[1] - this.activatorModel = ActivatorModelEnum.TY_EZ - this.timeOut = 100 - this.token = token - this.listener = object : ITuyaSmartActivatorListener { - override fun onError(errorCode: String?, errorMsg: String?) { - Log.d(kTag, "errorMsg: $errorMsg") - "添加设备超时".show(this@ResetDeviceActivity) - LoadingDialogHub.dismiss() - } - - override fun onActiveSuccess(devResp: DeviceBean?) { - LoadingDialogHub.dismiss() - navigatePageTo() - } - - override fun onStep(step: String?, data: Any?) { - Log.d(kTag, "onStep: $step") - LoadingDialogHub.dismiss() - } - } - } - TuyaHomeSdk.getActivatorInstance().newMultiActivator(builder).start() - } - - override fun onFailure(s: String, s1: String) { - Log.e(kTag, "onFailure: $s") - LoadingDialogHub.dismiss() - } - }) - } - } -} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ecbed59..d60335b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -51,7 +51,7 @@ - + diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 16b4e19..510bca0 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -101,4 +101,13 @@ @Multipart @POST("/file/uploadFile") suspend fun uploadImage(@Part file: MultipartBody.Part): String + + /** + * Banner + */ + @POST("/deviceInfo/add") + suspend fun addDevice( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file 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 a31d9c3..7dff2a3 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 @@ -3,8 +3,10 @@ import com.casic.br.model.UserDetailModel import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.utils.RetrofitFactory.createRetrofit import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.sdk.bean.DeviceBean import okhttp3.MediaType.Companion.toMediaType import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.MultipartBody @@ -207,4 +209,44 @@ val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) return api.uploadImage(imagePart) } + + /** + * 添加设备到自己服务器 + */ + 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("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) + paramObject.put("userBindDate", System.currentTimeMillis().timestampToCompleteDate()) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.addDevice(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt new file mode 100644 index 0000000..c3b861d --- /dev/null +++ b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt @@ -0,0 +1,111 @@ +package com.casic.br.view + +import android.util.Log +import android.view.View +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.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.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.builder.ActivatorBuilder +import com.tuya.smart.sdk.api.ITuyaActivatorGetToken +import com.tuya.smart.sdk.api.ITuyaSmartActivatorListener +import com.tuya.smart.sdk.bean.DeviceBean +import com.tuya.smart.sdk.enums.ActivatorModelEnum +import kotlinx.android.synthetic.main.activity_connect_device.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import java.util.* + +class ConnectDeviceActivity : KotlinBaseActivity() { + + private val kTag = "ResetDeviceActivity" + private lateinit var params: ArrayList + private lateinit var deviceViewModel: DeviceViewModel + + override fun initLayoutView(): Int = R.layout.activity_connect_device + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.visibility = View.GONE + } + + override fun initData() { + params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + } + + override fun initEvent() { + nextStepButton.setOnClickListener { + if (!confirmCheckBox.isChecked) { + "请确认设备指示灯是否闪烁".show(this) + return@setOnClickListener + } + LoadingDialogHub.show(this, "设备配网中,请稍后") + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + val userModel = DeserializeModel.getUserModel()!! + TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeId.toLong(), + object : ITuyaActivatorGetToken { + override fun onSuccess(token: String) { + //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 + val builder = ActivatorBuilder().apply { + this.ssid = params[0] + this.context = this@ConnectDeviceActivity + this.password = params[1] + this.activatorModel = ActivatorModelEnum.TY_EZ + this.timeOut = 100 + this.token = token + this.listener = object : ITuyaSmartActivatorListener { + override fun onError(errorCode: String?, errorMsg: String?) { + Log.d(kTag, "errorMsg: $errorMsg") + "添加设备超时".show(this@ConnectDeviceActivity) + LoadingDialogHub.dismiss() + } + + override fun onActiveSuccess(devResp: DeviceBean?) { + //将绑定的设备存入自己的数据库 + deviceViewModel.addDevice(devResp!!,userModel) + } + + override fun onStep(step: String?, data: Any?) { + LoadingDialogHub.dismiss() + } + } + } + TuyaHomeSdk.getActivatorInstance().newMultiActivator(builder).start() + } + + override fun onFailure(s: String, s1: String) { + Log.e(kTag, "onFailure: $s") + LoadingDialogHub.dismiss() + } + }) + } + } + + override fun observeRequestState() { + deviceViewModel.loadState.observe(this, { + when (it) { + LoadState.Success -> { + LoadingDialogHub.dismiss() + navigatePageTo() + } + else -> { + "添加失败,请重置设备重新绑定".show(this) + LoadingDialogHub.dismiss() + } + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/ResetDeviceActivity.kt b/app/src/main/java/com/casic/br/view/ResetDeviceActivity.kt deleted file mode 100644 index 11c40dc..0000000 --- a/app/src/main/java/com/casic/br/view/ResetDeviceActivity.kt +++ /dev/null @@ -1,95 +0,0 @@ -package com.casic.br.view - -import android.util.Log -import android.view.View -import com.casic.br.R -import com.casic.br.extensions.initLayoutImmersionBar -import com.casic.br.utils.LoadingDialogHub -import com.casic.br.utils.LocaleConstant -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.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.home.sdk.builder.ActivatorBuilder -import com.tuya.smart.sdk.api.ITuyaActivatorGetToken -import com.tuya.smart.sdk.api.ITuyaSmartActivatorListener -import com.tuya.smart.sdk.bean.DeviceBean -import com.tuya.smart.sdk.enums.ActivatorModelEnum -import kotlinx.android.synthetic.main.activity_reset_device.* -import kotlinx.android.synthetic.main.include_left_back_title.* -import java.util.* - -class ResetDeviceActivity : KotlinBaseActivity() { - - private val kTag = "ResetDeviceActivity" - private lateinit var params: ArrayList - - override fun initLayoutView(): Int = R.layout.activity_reset_device - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(true).init() - initLayoutImmersionBar(rootView) - leftBackView.setOnClickListener { finish() } - titleView.visibility = View.GONE - } - - override fun initData() { - params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! - } - - override fun initEvent() { - nextStepButton.setOnClickListener { - if (!confirmCheckBox.isChecked) { - "请确认设备指示灯是否闪烁".show(this) - return@setOnClickListener - } - LoadingDialogHub.show(this, "设备配网中,请稍后") - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String - TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeId.toLong(), - object : ITuyaActivatorGetToken { - override fun onSuccess(token: String) { - Log.d(kTag, "token: $token") - //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 - val builder = ActivatorBuilder().apply { - this.ssid = params[0] - this.context = this@ResetDeviceActivity - this.password = params[1] - this.activatorModel = ActivatorModelEnum.TY_EZ - this.timeOut = 100 - this.token = token - this.listener = object : ITuyaSmartActivatorListener { - override fun onError(errorCode: String?, errorMsg: String?) { - Log.d(kTag, "errorMsg: $errorMsg") - "添加设备超时".show(this@ResetDeviceActivity) - LoadingDialogHub.dismiss() - } - - override fun onActiveSuccess(devResp: DeviceBean?) { - LoadingDialogHub.dismiss() - navigatePageTo() - } - - override fun onStep(step: String?, data: Any?) { - Log.d(kTag, "onStep: $step") - LoadingDialogHub.dismiss() - } - } - } - TuyaHomeSdk.getActivatorInstance().newMultiActivator(builder).start() - } - - override fun onFailure(s: String, s1: String) { - Log.e(kTag, "onFailure: $s") - LoadingDialogHub.dismiss() - } - }) - } - } -} \ 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 a432adc..c81015b 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -58,7 +58,7 @@ "请输入WiFi密码".show(this) return@setOnClickListener } - navigatePageTo(arrayListOf(wifiName, wifiKey)) + navigatePageTo(arrayListOf(wifiName, wifiKey)) } } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ecbed59..d60335b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -51,7 +51,7 @@ - + diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 16b4e19..510bca0 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -101,4 +101,13 @@ @Multipart @POST("/file/uploadFile") suspend fun uploadImage(@Part file: MultipartBody.Part): String + + /** + * Banner + */ + @POST("/deviceInfo/add") + suspend fun addDevice( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file 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 a31d9c3..7dff2a3 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 @@ -3,8 +3,10 @@ import com.casic.br.model.UserDetailModel import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.utils.RetrofitFactory.createRetrofit import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.sdk.bean.DeviceBean import okhttp3.MediaType.Companion.toMediaType import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.MultipartBody @@ -207,4 +209,44 @@ val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) return api.uploadImage(imagePart) } + + /** + * 添加设备到自己服务器 + */ + 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("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) + paramObject.put("userBindDate", System.currentTimeMillis().timestampToCompleteDate()) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.addDevice(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt new file mode 100644 index 0000000..c3b861d --- /dev/null +++ b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt @@ -0,0 +1,111 @@ +package com.casic.br.view + +import android.util.Log +import android.view.View +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.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.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.builder.ActivatorBuilder +import com.tuya.smart.sdk.api.ITuyaActivatorGetToken +import com.tuya.smart.sdk.api.ITuyaSmartActivatorListener +import com.tuya.smart.sdk.bean.DeviceBean +import com.tuya.smart.sdk.enums.ActivatorModelEnum +import kotlinx.android.synthetic.main.activity_connect_device.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import java.util.* + +class ConnectDeviceActivity : KotlinBaseActivity() { + + private val kTag = "ResetDeviceActivity" + private lateinit var params: ArrayList + private lateinit var deviceViewModel: DeviceViewModel + + override fun initLayoutView(): Int = R.layout.activity_connect_device + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.visibility = View.GONE + } + + override fun initData() { + params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + } + + override fun initEvent() { + nextStepButton.setOnClickListener { + if (!confirmCheckBox.isChecked) { + "请确认设备指示灯是否闪烁".show(this) + return@setOnClickListener + } + LoadingDialogHub.show(this, "设备配网中,请稍后") + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + val userModel = DeserializeModel.getUserModel()!! + TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeId.toLong(), + object : ITuyaActivatorGetToken { + override fun onSuccess(token: String) { + //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 + val builder = ActivatorBuilder().apply { + this.ssid = params[0] + this.context = this@ConnectDeviceActivity + this.password = params[1] + this.activatorModel = ActivatorModelEnum.TY_EZ + this.timeOut = 100 + this.token = token + this.listener = object : ITuyaSmartActivatorListener { + override fun onError(errorCode: String?, errorMsg: String?) { + Log.d(kTag, "errorMsg: $errorMsg") + "添加设备超时".show(this@ConnectDeviceActivity) + LoadingDialogHub.dismiss() + } + + override fun onActiveSuccess(devResp: DeviceBean?) { + //将绑定的设备存入自己的数据库 + deviceViewModel.addDevice(devResp!!,userModel) + } + + override fun onStep(step: String?, data: Any?) { + LoadingDialogHub.dismiss() + } + } + } + TuyaHomeSdk.getActivatorInstance().newMultiActivator(builder).start() + } + + override fun onFailure(s: String, s1: String) { + Log.e(kTag, "onFailure: $s") + LoadingDialogHub.dismiss() + } + }) + } + } + + override fun observeRequestState() { + deviceViewModel.loadState.observe(this, { + when (it) { + LoadState.Success -> { + LoadingDialogHub.dismiss() + navigatePageTo() + } + else -> { + "添加失败,请重置设备重新绑定".show(this) + LoadingDialogHub.dismiss() + } + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/ResetDeviceActivity.kt b/app/src/main/java/com/casic/br/view/ResetDeviceActivity.kt deleted file mode 100644 index 11c40dc..0000000 --- a/app/src/main/java/com/casic/br/view/ResetDeviceActivity.kt +++ /dev/null @@ -1,95 +0,0 @@ -package com.casic.br.view - -import android.util.Log -import android.view.View -import com.casic.br.R -import com.casic.br.extensions.initLayoutImmersionBar -import com.casic.br.utils.LoadingDialogHub -import com.casic.br.utils.LocaleConstant -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.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.home.sdk.builder.ActivatorBuilder -import com.tuya.smart.sdk.api.ITuyaActivatorGetToken -import com.tuya.smart.sdk.api.ITuyaSmartActivatorListener -import com.tuya.smart.sdk.bean.DeviceBean -import com.tuya.smart.sdk.enums.ActivatorModelEnum -import kotlinx.android.synthetic.main.activity_reset_device.* -import kotlinx.android.synthetic.main.include_left_back_title.* -import java.util.* - -class ResetDeviceActivity : KotlinBaseActivity() { - - private val kTag = "ResetDeviceActivity" - private lateinit var params: ArrayList - - override fun initLayoutView(): Int = R.layout.activity_reset_device - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(true).init() - initLayoutImmersionBar(rootView) - leftBackView.setOnClickListener { finish() } - titleView.visibility = View.GONE - } - - override fun initData() { - params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! - } - - override fun initEvent() { - nextStepButton.setOnClickListener { - if (!confirmCheckBox.isChecked) { - "请确认设备指示灯是否闪烁".show(this) - return@setOnClickListener - } - LoadingDialogHub.show(this, "设备配网中,请稍后") - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String - TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeId.toLong(), - object : ITuyaActivatorGetToken { - override fun onSuccess(token: String) { - Log.d(kTag, "token: $token") - //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 - val builder = ActivatorBuilder().apply { - this.ssid = params[0] - this.context = this@ResetDeviceActivity - this.password = params[1] - this.activatorModel = ActivatorModelEnum.TY_EZ - this.timeOut = 100 - this.token = token - this.listener = object : ITuyaSmartActivatorListener { - override fun onError(errorCode: String?, errorMsg: String?) { - Log.d(kTag, "errorMsg: $errorMsg") - "添加设备超时".show(this@ResetDeviceActivity) - LoadingDialogHub.dismiss() - } - - override fun onActiveSuccess(devResp: DeviceBean?) { - LoadingDialogHub.dismiss() - navigatePageTo() - } - - override fun onStep(step: String?, data: Any?) { - Log.d(kTag, "onStep: $step") - LoadingDialogHub.dismiss() - } - } - } - TuyaHomeSdk.getActivatorInstance().newMultiActivator(builder).start() - } - - override fun onFailure(s: String, s1: String) { - Log.e(kTag, "onFailure: $s") - LoadingDialogHub.dismiss() - } - }) - } - } -} \ 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 a432adc..c81015b 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -58,7 +58,7 @@ "请输入WiFi密码".show(this) return@setOnClickListener } - navigatePageTo(arrayListOf(wifiName, wifiKey)) + navigatePageTo(arrayListOf(wifiName, wifiKey)) } } diff --git a/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt new file mode 100644 index 0000000..55ecbb5 --- /dev/null +++ b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt @@ -0,0 +1,28 @@ +package com.casic.br.vm + +import com.casic.br.base.BaseApplication +import com.casic.br.extensions.separateResponseCode +import com.casic.br.extensions.toErrorMessage +import com.casic.br.model.UserDetailModel +import com.casic.br.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState +import com.tuya.smart.sdk.bean.DeviceBean + +class DeviceViewModel : BaseViewModel() { + fun addDevice(devResp: DeviceBean, userModel: UserDetailModel.DataModel) = launch({ + val response = RetrofitServiceManager.addDevice(devResp, userModel) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ecbed59..d60335b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -51,7 +51,7 @@ - + diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 16b4e19..510bca0 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -101,4 +101,13 @@ @Multipart @POST("/file/uploadFile") suspend fun uploadImage(@Part file: MultipartBody.Part): String + + /** + * Banner + */ + @POST("/deviceInfo/add") + suspend fun addDevice( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file 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 a31d9c3..7dff2a3 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 @@ -3,8 +3,10 @@ import com.casic.br.model.UserDetailModel import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant +import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.utils.RetrofitFactory.createRetrofit import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.sdk.bean.DeviceBean import okhttp3.MediaType.Companion.toMediaType import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.MultipartBody @@ -207,4 +209,44 @@ val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) return api.uploadImage(imagePart) } + + /** + * 添加设备到自己服务器 + */ + 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("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) + paramObject.put("userBindDate", System.currentTimeMillis().timestampToCompleteDate()) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.addDevice(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt new file mode 100644 index 0000000..c3b861d --- /dev/null +++ b/app/src/main/java/com/casic/br/view/ConnectDeviceActivity.kt @@ -0,0 +1,111 @@ +package com.casic.br.view + +import android.util.Log +import android.view.View +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.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.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.builder.ActivatorBuilder +import com.tuya.smart.sdk.api.ITuyaActivatorGetToken +import com.tuya.smart.sdk.api.ITuyaSmartActivatorListener +import com.tuya.smart.sdk.bean.DeviceBean +import com.tuya.smart.sdk.enums.ActivatorModelEnum +import kotlinx.android.synthetic.main.activity_connect_device.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import java.util.* + +class ConnectDeviceActivity : KotlinBaseActivity() { + + private val kTag = "ResetDeviceActivity" + private lateinit var params: ArrayList + private lateinit var deviceViewModel: DeviceViewModel + + override fun initLayoutView(): Int = R.layout.activity_connect_device + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.visibility = View.GONE + } + + override fun initData() { + params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! + deviceViewModel = ViewModelProvider(this)[DeviceViewModel::class.java] + } + + override fun initEvent() { + nextStepButton.setOnClickListener { + if (!confirmCheckBox.isChecked) { + "请确认设备指示灯是否闪烁".show(this) + return@setOnClickListener + } + LoadingDialogHub.show(this, "设备配网中,请稍后") + val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String + val userModel = DeserializeModel.getUserModel()!! + TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeId.toLong(), + object : ITuyaActivatorGetToken { + override fun onSuccess(token: String) { + //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 + val builder = ActivatorBuilder().apply { + this.ssid = params[0] + this.context = this@ConnectDeviceActivity + this.password = params[1] + this.activatorModel = ActivatorModelEnum.TY_EZ + this.timeOut = 100 + this.token = token + this.listener = object : ITuyaSmartActivatorListener { + override fun onError(errorCode: String?, errorMsg: String?) { + Log.d(kTag, "errorMsg: $errorMsg") + "添加设备超时".show(this@ConnectDeviceActivity) + LoadingDialogHub.dismiss() + } + + override fun onActiveSuccess(devResp: DeviceBean?) { + //将绑定的设备存入自己的数据库 + deviceViewModel.addDevice(devResp!!,userModel) + } + + override fun onStep(step: String?, data: Any?) { + LoadingDialogHub.dismiss() + } + } + } + TuyaHomeSdk.getActivatorInstance().newMultiActivator(builder).start() + } + + override fun onFailure(s: String, s1: String) { + Log.e(kTag, "onFailure: $s") + LoadingDialogHub.dismiss() + } + }) + } + } + + override fun observeRequestState() { + deviceViewModel.loadState.observe(this, { + when (it) { + LoadState.Success -> { + LoadingDialogHub.dismiss() + navigatePageTo() + } + else -> { + "添加失败,请重置设备重新绑定".show(this) + LoadingDialogHub.dismiss() + } + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/ResetDeviceActivity.kt b/app/src/main/java/com/casic/br/view/ResetDeviceActivity.kt deleted file mode 100644 index 11c40dc..0000000 --- a/app/src/main/java/com/casic/br/view/ResetDeviceActivity.kt +++ /dev/null @@ -1,95 +0,0 @@ -package com.casic.br.view - -import android.util.Log -import android.view.View -import com.casic.br.R -import com.casic.br.extensions.initLayoutImmersionBar -import com.casic.br.utils.LoadingDialogHub -import com.casic.br.utils.LocaleConstant -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.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.home.sdk.builder.ActivatorBuilder -import com.tuya.smart.sdk.api.ITuyaActivatorGetToken -import com.tuya.smart.sdk.api.ITuyaSmartActivatorListener -import com.tuya.smart.sdk.bean.DeviceBean -import com.tuya.smart.sdk.enums.ActivatorModelEnum -import kotlinx.android.synthetic.main.activity_reset_device.* -import kotlinx.android.synthetic.main.include_left_back_title.* -import java.util.* - -class ResetDeviceActivity : KotlinBaseActivity() { - - private val kTag = "ResetDeviceActivity" - private lateinit var params: ArrayList - - override fun initLayoutView(): Int = R.layout.activity_reset_device - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(true).init() - initLayoutImmersionBar(rootView) - leftBackView.setOnClickListener { finish() } - titleView.visibility = View.GONE - } - - override fun initData() { - params = intent.getStringArrayListExtra(Constant.INTENT_PARAM)!! - } - - override fun initEvent() { - nextStepButton.setOnClickListener { - if (!confirmCheckBox.isChecked) { - "请确认设备指示灯是否闪烁".show(this) - return@setOnClickListener - } - LoadingDialogHub.show(this, "设备配网中,请稍后") - val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String - TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeId.toLong(), - object : ITuyaActivatorGetToken { - override fun onSuccess(token: String) { - Log.d(kTag, "token: $token") - //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 - val builder = ActivatorBuilder().apply { - this.ssid = params[0] - this.context = this@ResetDeviceActivity - this.password = params[1] - this.activatorModel = ActivatorModelEnum.TY_EZ - this.timeOut = 100 - this.token = token - this.listener = object : ITuyaSmartActivatorListener { - override fun onError(errorCode: String?, errorMsg: String?) { - Log.d(kTag, "errorMsg: $errorMsg") - "添加设备超时".show(this@ResetDeviceActivity) - LoadingDialogHub.dismiss() - } - - override fun onActiveSuccess(devResp: DeviceBean?) { - LoadingDialogHub.dismiss() - navigatePageTo() - } - - override fun onStep(step: String?, data: Any?) { - Log.d(kTag, "onStep: $step") - LoadingDialogHub.dismiss() - } - } - } - TuyaHomeSdk.getActivatorInstance().newMultiActivator(builder).start() - } - - override fun onFailure(s: String, s1: String) { - Log.e(kTag, "onFailure: $s") - LoadingDialogHub.dismiss() - } - }) - } - } -} \ 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 a432adc..c81015b 100644 --- a/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -58,7 +58,7 @@ "请输入WiFi密码".show(this) return@setOnClickListener } - navigatePageTo(arrayListOf(wifiName, wifiKey)) + navigatePageTo(arrayListOf(wifiName, wifiKey)) } } diff --git a/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt new file mode 100644 index 0000000..55ecbb5 --- /dev/null +++ b/app/src/main/java/com/casic/br/vm/DeviceViewModel.kt @@ -0,0 +1,28 @@ +package com.casic.br.vm + +import com.casic.br.base.BaseApplication +import com.casic.br.extensions.separateResponseCode +import com.casic.br.extensions.toErrorMessage +import com.casic.br.model.UserDetailModel +import com.casic.br.utils.retrofit.RetrofitServiceManager +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState +import com.tuya.smart.sdk.bean.DeviceBean + +class DeviceViewModel : BaseViewModel() { + fun addDevice(devResp: DeviceBean, userModel: UserDetailModel.DataModel) = launch({ + val response = RetrofitServiceManager.addDevice(devResp, userModel) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_connect_device.xml b/app/src/main/res/layout/activity_connect_device.xml new file mode 100644 index 0000000..0091651 --- /dev/null +++ b/app/src/main/res/layout/activity_connect_device.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + +