diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3ea0e96..ba3523a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,15 +41,16 @@ + + - - + + - diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3ea0e96..ba3523a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,15 +41,16 @@ + + - - + + - diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt index bf8285c..c90a197 100644 --- a/app/src/main/java/com/casic/br/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt @@ -1,16 +1,10 @@ package com.casic.br.base import android.app.Application -import android.util.Log import com.casic.br.greendao.DaoMaster import com.casic.br.greendao.DaoSession -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues -import com.tuya.smart.android.user.api.ILoginCallback -import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.home.sdk.bean.HomeBean -import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlin.properties.Delegates @@ -30,46 +24,13 @@ super.onCreate() instance = this SaveKeyValues.initSharedPreferences(this) - initTuya() + TuyaHomeSdk.init(this) + TuyaHomeSdk.setDebugMode(true) val devOpenHelper = DaoMaster.DevOpenHelper(this, "SmartKitchen.db", null) val daoMaster = DaoMaster(devOpenHelper.writableDatabase) daoSession = daoMaster.newSession() } - private fun initTuya() { - TuyaHomeSdk.init(this) - TuyaHomeSdk.setDebugMode(true) - /** - * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 - * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 - * 用户账号下创建任意多个家庭。 - * */ - //TODO 必须登录 - TuyaHomeSdk.getUserInstance() - .loginWithPhonePassword("86", "18310581916", "123456", object : ILoginCallback { - override fun onSuccess(user: User?) { - Log.d(kTag, "Login success:" + user!!.username) - } - - override fun onError(code: String, error: String) { - Log.e(kTag, "code: " + code + "error:" + error) - } - }) - - - TuyaHomeSdk.getHomeManagerInstance() - .createHome("北燃生活体验馆", 116.486394, 39.885734, "北燃生活体验馆", arrayListOf(), object : - ITuyaHomeResultCallback { - override fun onSuccess(bean: HomeBean?) { - Log.d(kTag, bean!!.toJson()) - } - - override fun onError(errorCode: String?, errorMsg: String?) { - Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") - } - }) - } - fun obtainDaoSession(): DaoSession { return daoSession } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3ea0e96..ba3523a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,15 +41,16 @@ + + - - + + - diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt index bf8285c..c90a197 100644 --- a/app/src/main/java/com/casic/br/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt @@ -1,16 +1,10 @@ package com.casic.br.base import android.app.Application -import android.util.Log import com.casic.br.greendao.DaoMaster import com.casic.br.greendao.DaoSession -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues -import com.tuya.smart.android.user.api.ILoginCallback -import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.home.sdk.bean.HomeBean -import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlin.properties.Delegates @@ -30,46 +24,13 @@ super.onCreate() instance = this SaveKeyValues.initSharedPreferences(this) - initTuya() + TuyaHomeSdk.init(this) + TuyaHomeSdk.setDebugMode(true) val devOpenHelper = DaoMaster.DevOpenHelper(this, "SmartKitchen.db", null) val daoMaster = DaoMaster(devOpenHelper.writableDatabase) daoSession = daoMaster.newSession() } - private fun initTuya() { - TuyaHomeSdk.init(this) - TuyaHomeSdk.setDebugMode(true) - /** - * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 - * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 - * 用户账号下创建任意多个家庭。 - * */ - //TODO 必须登录 - TuyaHomeSdk.getUserInstance() - .loginWithPhonePassword("86", "18310581916", "123456", object : ILoginCallback { - override fun onSuccess(user: User?) { - Log.d(kTag, "Login success:" + user!!.username) - } - - override fun onError(code: String, error: String) { - Log.e(kTag, "code: " + code + "error:" + error) - } - }) - - - TuyaHomeSdk.getHomeManagerInstance() - .createHome("北燃生活体验馆", 116.486394, 39.885734, "北燃生活体验馆", arrayListOf(), object : - ITuyaHomeResultCallback { - override fun onSuccess(bean: HomeBean?) { - Log.d(kTag, bean!!.toJson()) - } - - override fun onError(errorCode: String?, errorMsg: String?) { - Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") - } - }) - } - fun obtainDaoSession(): DaoSession { return daoSession } diff --git a/app/src/main/java/com/casic/br/extensions/Context.kt b/app/src/main/java/com/casic/br/extensions/Context.kt index 5866614..5726394 100644 --- a/app/src/main/java/com/casic/br/extensions/Context.kt +++ b/app/src/main/java/com/casic/br/extensions/Context.kt @@ -2,11 +2,16 @@ import android.content.Context import android.view.ViewGroup +import com.casic.br.base.BaseApplication +import com.pengxh.kt.lite.extensions.dp2px import com.qmuiteam.qmui.util.QMUIDisplayHelper fun Context.initLayoutImmersionBar(rootView: ViewGroup) { //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + if (statusBarHeight == 0) { + statusBarHeight = 44f.dp2px(BaseApplication.obtainInstance()) + } rootView.setPadding(0, statusBarHeight, 0, 0) rootView.requestLayout() } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3ea0e96..ba3523a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,15 +41,16 @@ + + - - + + - diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt index bf8285c..c90a197 100644 --- a/app/src/main/java/com/casic/br/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt @@ -1,16 +1,10 @@ package com.casic.br.base import android.app.Application -import android.util.Log import com.casic.br.greendao.DaoMaster import com.casic.br.greendao.DaoSession -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues -import com.tuya.smart.android.user.api.ILoginCallback -import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.home.sdk.bean.HomeBean -import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlin.properties.Delegates @@ -30,46 +24,13 @@ super.onCreate() instance = this SaveKeyValues.initSharedPreferences(this) - initTuya() + TuyaHomeSdk.init(this) + TuyaHomeSdk.setDebugMode(true) val devOpenHelper = DaoMaster.DevOpenHelper(this, "SmartKitchen.db", null) val daoMaster = DaoMaster(devOpenHelper.writableDatabase) daoSession = daoMaster.newSession() } - private fun initTuya() { - TuyaHomeSdk.init(this) - TuyaHomeSdk.setDebugMode(true) - /** - * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 - * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 - * 用户账号下创建任意多个家庭。 - * */ - //TODO 必须登录 - TuyaHomeSdk.getUserInstance() - .loginWithPhonePassword("86", "18310581916", "123456", object : ILoginCallback { - override fun onSuccess(user: User?) { - Log.d(kTag, "Login success:" + user!!.username) - } - - override fun onError(code: String, error: String) { - Log.e(kTag, "code: " + code + "error:" + error) - } - }) - - - TuyaHomeSdk.getHomeManagerInstance() - .createHome("北燃生活体验馆", 116.486394, 39.885734, "北燃生活体验馆", arrayListOf(), object : - ITuyaHomeResultCallback { - override fun onSuccess(bean: HomeBean?) { - Log.d(kTag, bean!!.toJson()) - } - - override fun onError(errorCode: String?, errorMsg: String?) { - Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") - } - }) - } - fun obtainDaoSession(): DaoSession { return daoSession } diff --git a/app/src/main/java/com/casic/br/extensions/Context.kt b/app/src/main/java/com/casic/br/extensions/Context.kt index 5866614..5726394 100644 --- a/app/src/main/java/com/casic/br/extensions/Context.kt +++ b/app/src/main/java/com/casic/br/extensions/Context.kt @@ -2,11 +2,16 @@ import android.content.Context import android.view.ViewGroup +import com.casic.br.base.BaseApplication +import com.pengxh.kt.lite.extensions.dp2px import com.qmuiteam.qmui.util.QMUIDisplayHelper fun Context.initLayoutImmersionBar(rootView: ViewGroup) { //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + if (statusBarHeight == 0) { + statusBarHeight = 44f.dp2px(BaseApplication.obtainInstance()) + } rootView.setPadding(0, statusBarHeight, 0, 0) rootView.requestLayout() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index cc20c54..4ef912b 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -1,25 +1,40 @@ package com.casic.br.fragment import android.graphics.Typeface +import android.util.Log import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.model.AddedDeviceModel +import com.casic.br.model.HomeModel import com.casic.br.model.RecommendModel +import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddDeviceActivity import com.casic.br.view.AllDeviceActivity import com.casic.br.view.device.FireplaceActivity import com.casic.br.view.device.RangeHoodActivity import com.casic.br.view.device.WaterHeaterActivity +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.fragment_device.* import kotlinx.android.synthetic.main.include_main_title.* import java.util.* + class DevicePageFragment : KotlinBaseFragment() { + private val kTag = "DevicePageFragment" + private val gson by lazy { Gson() } + override fun initLayoutView(): Int = R.layout.fragment_device override fun setupTopBarLayout() { @@ -37,16 +52,6 @@ model1.deviceModel = "D40-DM1" model1.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" deviceModels.add(model1) - val model2 = AddedDeviceModel() - model2.deviceName = "万家乐油烟机" - model2.deviceModel = "CXW-320-W7" - model2.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model2) - val model3 = AddedDeviceModel() - model3.deviceName = "万家乐壁挂炉" - model3.deviceModel = "26-13A3L" - model3.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model3) val addedDeviceAdapter = AddedDeviceAdapter(requireContext()) addedDeviceAdapter.setupDevice(deviceModels) @@ -102,8 +107,28 @@ } override fun initEvent() { - showAllDeviceLayout.setOnClickListener { + showAllDeviceButton.setOnClickListener { requireContext().navigatePageTo() } } + + override fun onResume() { + super.onResume() + val s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + if (s == "") { + return + } + val homeModel = gson.fromJson(s, object : TypeToken() {}.type) + TuyaHomeSdk.newHomeInstance(homeModel.homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + Log.d(kTag, deviceList.toJson()) + } + + override fun onError(errorCode: String, errorMsg: String) { + // do something + } + }) + } } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3ea0e96..ba3523a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,15 +41,16 @@ + + - - + + - diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt index bf8285c..c90a197 100644 --- a/app/src/main/java/com/casic/br/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt @@ -1,16 +1,10 @@ package com.casic.br.base import android.app.Application -import android.util.Log import com.casic.br.greendao.DaoMaster import com.casic.br.greendao.DaoSession -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues -import com.tuya.smart.android.user.api.ILoginCallback -import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.home.sdk.bean.HomeBean -import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlin.properties.Delegates @@ -30,46 +24,13 @@ super.onCreate() instance = this SaveKeyValues.initSharedPreferences(this) - initTuya() + TuyaHomeSdk.init(this) + TuyaHomeSdk.setDebugMode(true) val devOpenHelper = DaoMaster.DevOpenHelper(this, "SmartKitchen.db", null) val daoMaster = DaoMaster(devOpenHelper.writableDatabase) daoSession = daoMaster.newSession() } - private fun initTuya() { - TuyaHomeSdk.init(this) - TuyaHomeSdk.setDebugMode(true) - /** - * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 - * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 - * 用户账号下创建任意多个家庭。 - * */ - //TODO 必须登录 - TuyaHomeSdk.getUserInstance() - .loginWithPhonePassword("86", "18310581916", "123456", object : ILoginCallback { - override fun onSuccess(user: User?) { - Log.d(kTag, "Login success:" + user!!.username) - } - - override fun onError(code: String, error: String) { - Log.e(kTag, "code: " + code + "error:" + error) - } - }) - - - TuyaHomeSdk.getHomeManagerInstance() - .createHome("北燃生活体验馆", 116.486394, 39.885734, "北燃生活体验馆", arrayListOf(), object : - ITuyaHomeResultCallback { - override fun onSuccess(bean: HomeBean?) { - Log.d(kTag, bean!!.toJson()) - } - - override fun onError(errorCode: String?, errorMsg: String?) { - Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") - } - }) - } - fun obtainDaoSession(): DaoSession { return daoSession } diff --git a/app/src/main/java/com/casic/br/extensions/Context.kt b/app/src/main/java/com/casic/br/extensions/Context.kt index 5866614..5726394 100644 --- a/app/src/main/java/com/casic/br/extensions/Context.kt +++ b/app/src/main/java/com/casic/br/extensions/Context.kt @@ -2,11 +2,16 @@ import android.content.Context import android.view.ViewGroup +import com.casic.br.base.BaseApplication +import com.pengxh.kt.lite.extensions.dp2px import com.qmuiteam.qmui.util.QMUIDisplayHelper fun Context.initLayoutImmersionBar(rootView: ViewGroup) { //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + if (statusBarHeight == 0) { + statusBarHeight = 44f.dp2px(BaseApplication.obtainInstance()) + } rootView.setPadding(0, statusBarHeight, 0, 0) rootView.requestLayout() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index cc20c54..4ef912b 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -1,25 +1,40 @@ package com.casic.br.fragment import android.graphics.Typeface +import android.util.Log import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.model.AddedDeviceModel +import com.casic.br.model.HomeModel import com.casic.br.model.RecommendModel +import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddDeviceActivity import com.casic.br.view.AllDeviceActivity import com.casic.br.view.device.FireplaceActivity import com.casic.br.view.device.RangeHoodActivity import com.casic.br.view.device.WaterHeaterActivity +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.fragment_device.* import kotlinx.android.synthetic.main.include_main_title.* import java.util.* + class DevicePageFragment : KotlinBaseFragment() { + private val kTag = "DevicePageFragment" + private val gson by lazy { Gson() } + override fun initLayoutView(): Int = R.layout.fragment_device override fun setupTopBarLayout() { @@ -37,16 +52,6 @@ model1.deviceModel = "D40-DM1" model1.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" deviceModels.add(model1) - val model2 = AddedDeviceModel() - model2.deviceName = "万家乐油烟机" - model2.deviceModel = "CXW-320-W7" - model2.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model2) - val model3 = AddedDeviceModel() - model3.deviceName = "万家乐壁挂炉" - model3.deviceModel = "26-13A3L" - model3.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model3) val addedDeviceAdapter = AddedDeviceAdapter(requireContext()) addedDeviceAdapter.setupDevice(deviceModels) @@ -102,8 +107,28 @@ } override fun initEvent() { - showAllDeviceLayout.setOnClickListener { + showAllDeviceButton.setOnClickListener { requireContext().navigatePageTo() } } + + override fun onResume() { + super.onResume() + val s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + if (s == "") { + return + } + val homeModel = gson.fromJson(s, object : TypeToken() {}.type) + TuyaHomeSdk.newHomeInstance(homeModel.homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + Log.d(kTag, deviceList.toJson()) + } + + override fun onError(errorCode: String, errorMsg: String) { + // do something + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 8aba9b2..84e947c 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -9,9 +9,13 @@ import com.casic.br.utils.GridItemDecoration import com.casic.br.utils.LocaleConstant import com.casic.br.view.LoginActivity +import com.casic.br.view.MainActivity import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.youth.banner.Banner import com.youth.banner.adapter.BannerImageAdapter import com.youth.banner.holder.BannerImageHolder @@ -90,7 +94,39 @@ override fun initEvent() { rightOperateView.setOnClickListener { - requireContext().navigatePageTo() + if (rightOperateView.text == "退出") { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出确认") + .setMessage("退出当前账号,将不能同步数据") + .setNegativeButton("取消") + .setPositiveButton("确认退出") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, false) + requireContext().navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) + .build().show() + } else { + requireContext().navigatePageTo() + } } } + + override fun onResume() { + val isLogin = SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + if (isLogin) { + rightOperateView.text = "退出" + } else { + rightOperateView.text = "登录" + } + super.onResume() + } } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3ea0e96..ba3523a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,15 +41,16 @@ + + - - + + - diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt index bf8285c..c90a197 100644 --- a/app/src/main/java/com/casic/br/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt @@ -1,16 +1,10 @@ package com.casic.br.base import android.app.Application -import android.util.Log import com.casic.br.greendao.DaoMaster import com.casic.br.greendao.DaoSession -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues -import com.tuya.smart.android.user.api.ILoginCallback -import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.home.sdk.bean.HomeBean -import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlin.properties.Delegates @@ -30,46 +24,13 @@ super.onCreate() instance = this SaveKeyValues.initSharedPreferences(this) - initTuya() + TuyaHomeSdk.init(this) + TuyaHomeSdk.setDebugMode(true) val devOpenHelper = DaoMaster.DevOpenHelper(this, "SmartKitchen.db", null) val daoMaster = DaoMaster(devOpenHelper.writableDatabase) daoSession = daoMaster.newSession() } - private fun initTuya() { - TuyaHomeSdk.init(this) - TuyaHomeSdk.setDebugMode(true) - /** - * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 - * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 - * 用户账号下创建任意多个家庭。 - * */ - //TODO 必须登录 - TuyaHomeSdk.getUserInstance() - .loginWithPhonePassword("86", "18310581916", "123456", object : ILoginCallback { - override fun onSuccess(user: User?) { - Log.d(kTag, "Login success:" + user!!.username) - } - - override fun onError(code: String, error: String) { - Log.e(kTag, "code: " + code + "error:" + error) - } - }) - - - TuyaHomeSdk.getHomeManagerInstance() - .createHome("北燃生活体验馆", 116.486394, 39.885734, "北燃生活体验馆", arrayListOf(), object : - ITuyaHomeResultCallback { - override fun onSuccess(bean: HomeBean?) { - Log.d(kTag, bean!!.toJson()) - } - - override fun onError(errorCode: String?, errorMsg: String?) { - Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") - } - }) - } - fun obtainDaoSession(): DaoSession { return daoSession } diff --git a/app/src/main/java/com/casic/br/extensions/Context.kt b/app/src/main/java/com/casic/br/extensions/Context.kt index 5866614..5726394 100644 --- a/app/src/main/java/com/casic/br/extensions/Context.kt +++ b/app/src/main/java/com/casic/br/extensions/Context.kt @@ -2,11 +2,16 @@ import android.content.Context import android.view.ViewGroup +import com.casic.br.base.BaseApplication +import com.pengxh.kt.lite.extensions.dp2px import com.qmuiteam.qmui.util.QMUIDisplayHelper fun Context.initLayoutImmersionBar(rootView: ViewGroup) { //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + if (statusBarHeight == 0) { + statusBarHeight = 44f.dp2px(BaseApplication.obtainInstance()) + } rootView.setPadding(0, statusBarHeight, 0, 0) rootView.requestLayout() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index cc20c54..4ef912b 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -1,25 +1,40 @@ package com.casic.br.fragment import android.graphics.Typeface +import android.util.Log import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.model.AddedDeviceModel +import com.casic.br.model.HomeModel import com.casic.br.model.RecommendModel +import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddDeviceActivity import com.casic.br.view.AllDeviceActivity import com.casic.br.view.device.FireplaceActivity import com.casic.br.view.device.RangeHoodActivity import com.casic.br.view.device.WaterHeaterActivity +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.fragment_device.* import kotlinx.android.synthetic.main.include_main_title.* import java.util.* + class DevicePageFragment : KotlinBaseFragment() { + private val kTag = "DevicePageFragment" + private val gson by lazy { Gson() } + override fun initLayoutView(): Int = R.layout.fragment_device override fun setupTopBarLayout() { @@ -37,16 +52,6 @@ model1.deviceModel = "D40-DM1" model1.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" deviceModels.add(model1) - val model2 = AddedDeviceModel() - model2.deviceName = "万家乐油烟机" - model2.deviceModel = "CXW-320-W7" - model2.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model2) - val model3 = AddedDeviceModel() - model3.deviceName = "万家乐壁挂炉" - model3.deviceModel = "26-13A3L" - model3.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model3) val addedDeviceAdapter = AddedDeviceAdapter(requireContext()) addedDeviceAdapter.setupDevice(deviceModels) @@ -102,8 +107,28 @@ } override fun initEvent() { - showAllDeviceLayout.setOnClickListener { + showAllDeviceButton.setOnClickListener { requireContext().navigatePageTo() } } + + override fun onResume() { + super.onResume() + val s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + if (s == "") { + return + } + val homeModel = gson.fromJson(s, object : TypeToken() {}.type) + TuyaHomeSdk.newHomeInstance(homeModel.homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + Log.d(kTag, deviceList.toJson()) + } + + override fun onError(errorCode: String, errorMsg: String) { + // do something + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 8aba9b2..84e947c 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -9,9 +9,13 @@ import com.casic.br.utils.GridItemDecoration import com.casic.br.utils.LocaleConstant import com.casic.br.view.LoginActivity +import com.casic.br.view.MainActivity import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.youth.banner.Banner import com.youth.banner.adapter.BannerImageAdapter import com.youth.banner.holder.BannerImageHolder @@ -90,7 +94,39 @@ override fun initEvent() { rightOperateView.setOnClickListener { - requireContext().navigatePageTo() + if (rightOperateView.text == "退出") { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出确认") + .setMessage("退出当前账号,将不能同步数据") + .setNegativeButton("取消") + .setPositiveButton("确认退出") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, false) + requireContext().navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) + .build().show() + } else { + requireContext().navigatePageTo() + } } } + + override fun onResume() { + val isLogin = SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + if (isLogin) { + rightOperateView.text = "退出" + } else { + rightOperateView.text = "登录" + } + super.onResume() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/model/HomeModel.java b/app/src/main/java/com/casic/br/model/HomeModel.java new file mode 100644 index 0000000..638d420 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/HomeModel.java @@ -0,0 +1,127 @@ +package com.casic.br.model; + +import java.util.List; + +public class HomeModel { + + private boolean admin; + private String geoName; + private int homeId; + private int homeStatus; + private double lat; + private double lon; + private String name; + private int role; + private List rooms; + + public boolean isAdmin() { + return admin; + } + + public void setAdmin(boolean admin) { + this.admin = admin; + } + + public String getGeoName() { + return geoName; + } + + public void setGeoName(String geoName) { + this.geoName = geoName; + } + + public int getHomeId() { + return homeId; + } + + public void setHomeId(int homeId) { + this.homeId = homeId; + } + + public int getHomeStatus() { + return homeStatus; + } + + public void setHomeStatus(int homeStatus) { + this.homeStatus = homeStatus; + } + + public double getLat() { + return lat; + } + + public void setLat(double lat) { + this.lat = lat; + } + + public double getLon() { + return lon; + } + + public void setLon(double lon) { + this.lon = lon; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRole() { + return role; + } + + public void setRole(int role) { + this.role = role; + } + + public List getRooms() { + return rooms; + } + + public void setRooms(List rooms) { + this.rooms = rooms; + } + + public static class RoomsModel { + private int displayOrder; + private String name; + private int roomId; + private boolean sel; + + public int getDisplayOrder() { + return displayOrder; + } + + public void setDisplayOrder(int displayOrder) { + this.displayOrder = displayOrder; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRoomId() { + return roomId; + } + + public void setRoomId(int roomId) { + this.roomId = roomId; + } + + public boolean isSel() { + return sel; + } + + public void setSel(boolean sel) { + this.sel = sel; + } + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3ea0e96..ba3523a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,15 +41,16 @@ + + - - + + - diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt index bf8285c..c90a197 100644 --- a/app/src/main/java/com/casic/br/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt @@ -1,16 +1,10 @@ package com.casic.br.base import android.app.Application -import android.util.Log import com.casic.br.greendao.DaoMaster import com.casic.br.greendao.DaoSession -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues -import com.tuya.smart.android.user.api.ILoginCallback -import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.home.sdk.bean.HomeBean -import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlin.properties.Delegates @@ -30,46 +24,13 @@ super.onCreate() instance = this SaveKeyValues.initSharedPreferences(this) - initTuya() + TuyaHomeSdk.init(this) + TuyaHomeSdk.setDebugMode(true) val devOpenHelper = DaoMaster.DevOpenHelper(this, "SmartKitchen.db", null) val daoMaster = DaoMaster(devOpenHelper.writableDatabase) daoSession = daoMaster.newSession() } - private fun initTuya() { - TuyaHomeSdk.init(this) - TuyaHomeSdk.setDebugMode(true) - /** - * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 - * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 - * 用户账号下创建任意多个家庭。 - * */ - //TODO 必须登录 - TuyaHomeSdk.getUserInstance() - .loginWithPhonePassword("86", "18310581916", "123456", object : ILoginCallback { - override fun onSuccess(user: User?) { - Log.d(kTag, "Login success:" + user!!.username) - } - - override fun onError(code: String, error: String) { - Log.e(kTag, "code: " + code + "error:" + error) - } - }) - - - TuyaHomeSdk.getHomeManagerInstance() - .createHome("北燃生活体验馆", 116.486394, 39.885734, "北燃生活体验馆", arrayListOf(), object : - ITuyaHomeResultCallback { - override fun onSuccess(bean: HomeBean?) { - Log.d(kTag, bean!!.toJson()) - } - - override fun onError(errorCode: String?, errorMsg: String?) { - Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") - } - }) - } - fun obtainDaoSession(): DaoSession { return daoSession } diff --git a/app/src/main/java/com/casic/br/extensions/Context.kt b/app/src/main/java/com/casic/br/extensions/Context.kt index 5866614..5726394 100644 --- a/app/src/main/java/com/casic/br/extensions/Context.kt +++ b/app/src/main/java/com/casic/br/extensions/Context.kt @@ -2,11 +2,16 @@ import android.content.Context import android.view.ViewGroup +import com.casic.br.base.BaseApplication +import com.pengxh.kt.lite.extensions.dp2px import com.qmuiteam.qmui.util.QMUIDisplayHelper fun Context.initLayoutImmersionBar(rootView: ViewGroup) { //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + if (statusBarHeight == 0) { + statusBarHeight = 44f.dp2px(BaseApplication.obtainInstance()) + } rootView.setPadding(0, statusBarHeight, 0, 0) rootView.requestLayout() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index cc20c54..4ef912b 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -1,25 +1,40 @@ package com.casic.br.fragment import android.graphics.Typeface +import android.util.Log import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.model.AddedDeviceModel +import com.casic.br.model.HomeModel import com.casic.br.model.RecommendModel +import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddDeviceActivity import com.casic.br.view.AllDeviceActivity import com.casic.br.view.device.FireplaceActivity import com.casic.br.view.device.RangeHoodActivity import com.casic.br.view.device.WaterHeaterActivity +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.fragment_device.* import kotlinx.android.synthetic.main.include_main_title.* import java.util.* + class DevicePageFragment : KotlinBaseFragment() { + private val kTag = "DevicePageFragment" + private val gson by lazy { Gson() } + override fun initLayoutView(): Int = R.layout.fragment_device override fun setupTopBarLayout() { @@ -37,16 +52,6 @@ model1.deviceModel = "D40-DM1" model1.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" deviceModels.add(model1) - val model2 = AddedDeviceModel() - model2.deviceName = "万家乐油烟机" - model2.deviceModel = "CXW-320-W7" - model2.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model2) - val model3 = AddedDeviceModel() - model3.deviceName = "万家乐壁挂炉" - model3.deviceModel = "26-13A3L" - model3.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model3) val addedDeviceAdapter = AddedDeviceAdapter(requireContext()) addedDeviceAdapter.setupDevice(deviceModels) @@ -102,8 +107,28 @@ } override fun initEvent() { - showAllDeviceLayout.setOnClickListener { + showAllDeviceButton.setOnClickListener { requireContext().navigatePageTo() } } + + override fun onResume() { + super.onResume() + val s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + if (s == "") { + return + } + val homeModel = gson.fromJson(s, object : TypeToken() {}.type) + TuyaHomeSdk.newHomeInstance(homeModel.homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + Log.d(kTag, deviceList.toJson()) + } + + override fun onError(errorCode: String, errorMsg: String) { + // do something + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 8aba9b2..84e947c 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -9,9 +9,13 @@ import com.casic.br.utils.GridItemDecoration import com.casic.br.utils.LocaleConstant import com.casic.br.view.LoginActivity +import com.casic.br.view.MainActivity import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.youth.banner.Banner import com.youth.banner.adapter.BannerImageAdapter import com.youth.banner.holder.BannerImageHolder @@ -90,7 +94,39 @@ override fun initEvent() { rightOperateView.setOnClickListener { - requireContext().navigatePageTo() + if (rightOperateView.text == "退出") { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出确认") + .setMessage("退出当前账号,将不能同步数据") + .setNegativeButton("取消") + .setPositiveButton("确认退出") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, false) + requireContext().navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) + .build().show() + } else { + requireContext().navigatePageTo() + } } } + + override fun onResume() { + val isLogin = SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + if (isLogin) { + rightOperateView.text = "退出" + } else { + rightOperateView.text = "登录" + } + super.onResume() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/model/HomeModel.java b/app/src/main/java/com/casic/br/model/HomeModel.java new file mode 100644 index 0000000..638d420 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/HomeModel.java @@ -0,0 +1,127 @@ +package com.casic.br.model; + +import java.util.List; + +public class HomeModel { + + private boolean admin; + private String geoName; + private int homeId; + private int homeStatus; + private double lat; + private double lon; + private String name; + private int role; + private List rooms; + + public boolean isAdmin() { + return admin; + } + + public void setAdmin(boolean admin) { + this.admin = admin; + } + + public String getGeoName() { + return geoName; + } + + public void setGeoName(String geoName) { + this.geoName = geoName; + } + + public int getHomeId() { + return homeId; + } + + public void setHomeId(int homeId) { + this.homeId = homeId; + } + + public int getHomeStatus() { + return homeStatus; + } + + public void setHomeStatus(int homeStatus) { + this.homeStatus = homeStatus; + } + + public double getLat() { + return lat; + } + + public void setLat(double lat) { + this.lat = lat; + } + + public double getLon() { + return lon; + } + + public void setLon(double lon) { + this.lon = lon; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRole() { + return role; + } + + public void setRole(int role) { + this.role = role; + } + + public List getRooms() { + return rooms; + } + + public void setRooms(List rooms) { + this.rooms = rooms; + } + + public static class RoomsModel { + private int displayOrder; + private String name; + private int roomId; + private boolean sel; + + public int getDisplayOrder() { + return displayOrder; + } + + public void setDisplayOrder(int displayOrder) { + this.displayOrder = displayOrder; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRoomId() { + return roomId; + } + + public void setRoomId(int roomId) { + this.roomId = roomId; + } + + public boolean isSel() { + return sel; + } + + public void setSel(boolean sel) { + this.sel = sel; + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/DialogManager.kt b/app/src/main/java/com/casic/br/utils/DialogManager.kt deleted file mode 100644 index da62e63..0000000 --- a/app/src/main/java/com/casic/br/utils/DialogManager.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.casic.br.utils; - -import android.app.Activity -import android.view.WindowManager -import com.pengxh.kt.lite.base.BaseSingleton -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog - -class DialogManager private constructor(private val activity: Activity) { - - private lateinit var loadingDialog: QMUITipDialog - - companion object : BaseSingleton() { - override val creator: (Activity) -> DialogManager - get() = ::DialogManager - } - - fun showLoadingDialog(message: String) { - loadingDialog = QMUITipDialog - .Builder(activity) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord(message) - .create() - if (!activity.isDestroyed) { - try { - loadingDialog.show() - } catch (e: WindowManager.BadTokenException) { - e.printStackTrace() - } - } - } - - fun dismissLoadingDialog() { - if (loadingDialog.isShowing) { - loadingDialog.dismiss() - } - } -} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3ea0e96..ba3523a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,15 +41,16 @@ + + - - + + - diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt index bf8285c..c90a197 100644 --- a/app/src/main/java/com/casic/br/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt @@ -1,16 +1,10 @@ package com.casic.br.base import android.app.Application -import android.util.Log import com.casic.br.greendao.DaoMaster import com.casic.br.greendao.DaoSession -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues -import com.tuya.smart.android.user.api.ILoginCallback -import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.home.sdk.bean.HomeBean -import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlin.properties.Delegates @@ -30,46 +24,13 @@ super.onCreate() instance = this SaveKeyValues.initSharedPreferences(this) - initTuya() + TuyaHomeSdk.init(this) + TuyaHomeSdk.setDebugMode(true) val devOpenHelper = DaoMaster.DevOpenHelper(this, "SmartKitchen.db", null) val daoMaster = DaoMaster(devOpenHelper.writableDatabase) daoSession = daoMaster.newSession() } - private fun initTuya() { - TuyaHomeSdk.init(this) - TuyaHomeSdk.setDebugMode(true) - /** - * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 - * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 - * 用户账号下创建任意多个家庭。 - * */ - //TODO 必须登录 - TuyaHomeSdk.getUserInstance() - .loginWithPhonePassword("86", "18310581916", "123456", object : ILoginCallback { - override fun onSuccess(user: User?) { - Log.d(kTag, "Login success:" + user!!.username) - } - - override fun onError(code: String, error: String) { - Log.e(kTag, "code: " + code + "error:" + error) - } - }) - - - TuyaHomeSdk.getHomeManagerInstance() - .createHome("北燃生活体验馆", 116.486394, 39.885734, "北燃生活体验馆", arrayListOf(), object : - ITuyaHomeResultCallback { - override fun onSuccess(bean: HomeBean?) { - Log.d(kTag, bean!!.toJson()) - } - - override fun onError(errorCode: String?, errorMsg: String?) { - Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") - } - }) - } - fun obtainDaoSession(): DaoSession { return daoSession } diff --git a/app/src/main/java/com/casic/br/extensions/Context.kt b/app/src/main/java/com/casic/br/extensions/Context.kt index 5866614..5726394 100644 --- a/app/src/main/java/com/casic/br/extensions/Context.kt +++ b/app/src/main/java/com/casic/br/extensions/Context.kt @@ -2,11 +2,16 @@ import android.content.Context import android.view.ViewGroup +import com.casic.br.base.BaseApplication +import com.pengxh.kt.lite.extensions.dp2px import com.qmuiteam.qmui.util.QMUIDisplayHelper fun Context.initLayoutImmersionBar(rootView: ViewGroup) { //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + if (statusBarHeight == 0) { + statusBarHeight = 44f.dp2px(BaseApplication.obtainInstance()) + } rootView.setPadding(0, statusBarHeight, 0, 0) rootView.requestLayout() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index cc20c54..4ef912b 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -1,25 +1,40 @@ package com.casic.br.fragment import android.graphics.Typeface +import android.util.Log import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.model.AddedDeviceModel +import com.casic.br.model.HomeModel import com.casic.br.model.RecommendModel +import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddDeviceActivity import com.casic.br.view.AllDeviceActivity import com.casic.br.view.device.FireplaceActivity import com.casic.br.view.device.RangeHoodActivity import com.casic.br.view.device.WaterHeaterActivity +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.fragment_device.* import kotlinx.android.synthetic.main.include_main_title.* import java.util.* + class DevicePageFragment : KotlinBaseFragment() { + private val kTag = "DevicePageFragment" + private val gson by lazy { Gson() } + override fun initLayoutView(): Int = R.layout.fragment_device override fun setupTopBarLayout() { @@ -37,16 +52,6 @@ model1.deviceModel = "D40-DM1" model1.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" deviceModels.add(model1) - val model2 = AddedDeviceModel() - model2.deviceName = "万家乐油烟机" - model2.deviceModel = "CXW-320-W7" - model2.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model2) - val model3 = AddedDeviceModel() - model3.deviceName = "万家乐壁挂炉" - model3.deviceModel = "26-13A3L" - model3.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model3) val addedDeviceAdapter = AddedDeviceAdapter(requireContext()) addedDeviceAdapter.setupDevice(deviceModels) @@ -102,8 +107,28 @@ } override fun initEvent() { - showAllDeviceLayout.setOnClickListener { + showAllDeviceButton.setOnClickListener { requireContext().navigatePageTo() } } + + override fun onResume() { + super.onResume() + val s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + if (s == "") { + return + } + val homeModel = gson.fromJson(s, object : TypeToken() {}.type) + TuyaHomeSdk.newHomeInstance(homeModel.homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + Log.d(kTag, deviceList.toJson()) + } + + override fun onError(errorCode: String, errorMsg: String) { + // do something + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 8aba9b2..84e947c 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -9,9 +9,13 @@ import com.casic.br.utils.GridItemDecoration import com.casic.br.utils.LocaleConstant import com.casic.br.view.LoginActivity +import com.casic.br.view.MainActivity import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.youth.banner.Banner import com.youth.banner.adapter.BannerImageAdapter import com.youth.banner.holder.BannerImageHolder @@ -90,7 +94,39 @@ override fun initEvent() { rightOperateView.setOnClickListener { - requireContext().navigatePageTo() + if (rightOperateView.text == "退出") { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出确认") + .setMessage("退出当前账号,将不能同步数据") + .setNegativeButton("取消") + .setPositiveButton("确认退出") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, false) + requireContext().navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) + .build().show() + } else { + requireContext().navigatePageTo() + } } } + + override fun onResume() { + val isLogin = SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + if (isLogin) { + rightOperateView.text = "退出" + } else { + rightOperateView.text = "登录" + } + super.onResume() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/model/HomeModel.java b/app/src/main/java/com/casic/br/model/HomeModel.java new file mode 100644 index 0000000..638d420 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/HomeModel.java @@ -0,0 +1,127 @@ +package com.casic.br.model; + +import java.util.List; + +public class HomeModel { + + private boolean admin; + private String geoName; + private int homeId; + private int homeStatus; + private double lat; + private double lon; + private String name; + private int role; + private List rooms; + + public boolean isAdmin() { + return admin; + } + + public void setAdmin(boolean admin) { + this.admin = admin; + } + + public String getGeoName() { + return geoName; + } + + public void setGeoName(String geoName) { + this.geoName = geoName; + } + + public int getHomeId() { + return homeId; + } + + public void setHomeId(int homeId) { + this.homeId = homeId; + } + + public int getHomeStatus() { + return homeStatus; + } + + public void setHomeStatus(int homeStatus) { + this.homeStatus = homeStatus; + } + + public double getLat() { + return lat; + } + + public void setLat(double lat) { + this.lat = lat; + } + + public double getLon() { + return lon; + } + + public void setLon(double lon) { + this.lon = lon; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRole() { + return role; + } + + public void setRole(int role) { + this.role = role; + } + + public List getRooms() { + return rooms; + } + + public void setRooms(List rooms) { + this.rooms = rooms; + } + + public static class RoomsModel { + private int displayOrder; + private String name; + private int roomId; + private boolean sel; + + public int getDisplayOrder() { + return displayOrder; + } + + public void setDisplayOrder(int displayOrder) { + this.displayOrder = displayOrder; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRoomId() { + return roomId; + } + + public void setRoomId(int roomId) { + this.roomId = roomId; + } + + public boolean isSel() { + return sel; + } + + public void setSel(boolean sel) { + this.sel = sel; + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/DialogManager.kt b/app/src/main/java/com/casic/br/utils/DialogManager.kt deleted file mode 100644 index da62e63..0000000 --- a/app/src/main/java/com/casic/br/utils/DialogManager.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.casic.br.utils; - -import android.app.Activity -import android.view.WindowManager -import com.pengxh.kt.lite.base.BaseSingleton -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog - -class DialogManager private constructor(private val activity: Activity) { - - private lateinit var loadingDialog: QMUITipDialog - - companion object : BaseSingleton() { - override val creator: (Activity) -> DialogManager - get() = ::DialogManager - } - - fun showLoadingDialog(message: String) { - loadingDialog = QMUITipDialog - .Builder(activity) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord(message) - .create() - if (!activity.isDestroyed) { - try { - loadingDialog.show() - } catch (e: WindowManager.BadTokenException) { - e.printStackTrace() - } - } - } - - fun dismissLoadingDialog() { - if (loadingDialog.isShowing) { - loadingDialog.dismiss() - } - } -} diff --git a/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt b/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt new file mode 100644 index 0000000..e04e327 --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt @@ -0,0 +1,31 @@ +package com.casic.br.utils + +import android.app.Activity +import android.view.WindowManager +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + +object LoadingDialogHub { + + private lateinit var loadingDialog: QMUITipDialog + + fun show(activity: Activity, message: String) { + loadingDialog = QMUITipDialog + .Builder(activity) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord(message) + .create() + if (!activity.isDestroyed) { + try { + loadingDialog.show() + } catch (e: WindowManager.BadTokenException) { + e.printStackTrace() + } + } + } + + fun dismiss() { + if (loadingDialog.isShowing) { + loadingDialog.dismiss() + } + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3ea0e96..ba3523a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,15 +41,16 @@ + + - - + + - diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt index bf8285c..c90a197 100644 --- a/app/src/main/java/com/casic/br/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt @@ -1,16 +1,10 @@ package com.casic.br.base import android.app.Application -import android.util.Log import com.casic.br.greendao.DaoMaster import com.casic.br.greendao.DaoSession -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues -import com.tuya.smart.android.user.api.ILoginCallback -import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.home.sdk.bean.HomeBean -import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlin.properties.Delegates @@ -30,46 +24,13 @@ super.onCreate() instance = this SaveKeyValues.initSharedPreferences(this) - initTuya() + TuyaHomeSdk.init(this) + TuyaHomeSdk.setDebugMode(true) val devOpenHelper = DaoMaster.DevOpenHelper(this, "SmartKitchen.db", null) val daoMaster = DaoMaster(devOpenHelper.writableDatabase) daoSession = daoMaster.newSession() } - private fun initTuya() { - TuyaHomeSdk.init(this) - TuyaHomeSdk.setDebugMode(true) - /** - * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 - * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 - * 用户账号下创建任意多个家庭。 - * */ - //TODO 必须登录 - TuyaHomeSdk.getUserInstance() - .loginWithPhonePassword("86", "18310581916", "123456", object : ILoginCallback { - override fun onSuccess(user: User?) { - Log.d(kTag, "Login success:" + user!!.username) - } - - override fun onError(code: String, error: String) { - Log.e(kTag, "code: " + code + "error:" + error) - } - }) - - - TuyaHomeSdk.getHomeManagerInstance() - .createHome("北燃生活体验馆", 116.486394, 39.885734, "北燃生活体验馆", arrayListOf(), object : - ITuyaHomeResultCallback { - override fun onSuccess(bean: HomeBean?) { - Log.d(kTag, bean!!.toJson()) - } - - override fun onError(errorCode: String?, errorMsg: String?) { - Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") - } - }) - } - fun obtainDaoSession(): DaoSession { return daoSession } diff --git a/app/src/main/java/com/casic/br/extensions/Context.kt b/app/src/main/java/com/casic/br/extensions/Context.kt index 5866614..5726394 100644 --- a/app/src/main/java/com/casic/br/extensions/Context.kt +++ b/app/src/main/java/com/casic/br/extensions/Context.kt @@ -2,11 +2,16 @@ import android.content.Context import android.view.ViewGroup +import com.casic.br.base.BaseApplication +import com.pengxh.kt.lite.extensions.dp2px import com.qmuiteam.qmui.util.QMUIDisplayHelper fun Context.initLayoutImmersionBar(rootView: ViewGroup) { //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + if (statusBarHeight == 0) { + statusBarHeight = 44f.dp2px(BaseApplication.obtainInstance()) + } rootView.setPadding(0, statusBarHeight, 0, 0) rootView.requestLayout() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index cc20c54..4ef912b 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -1,25 +1,40 @@ package com.casic.br.fragment import android.graphics.Typeface +import android.util.Log import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.model.AddedDeviceModel +import com.casic.br.model.HomeModel import com.casic.br.model.RecommendModel +import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddDeviceActivity import com.casic.br.view.AllDeviceActivity import com.casic.br.view.device.FireplaceActivity import com.casic.br.view.device.RangeHoodActivity import com.casic.br.view.device.WaterHeaterActivity +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.fragment_device.* import kotlinx.android.synthetic.main.include_main_title.* import java.util.* + class DevicePageFragment : KotlinBaseFragment() { + private val kTag = "DevicePageFragment" + private val gson by lazy { Gson() } + override fun initLayoutView(): Int = R.layout.fragment_device override fun setupTopBarLayout() { @@ -37,16 +52,6 @@ model1.deviceModel = "D40-DM1" model1.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" deviceModels.add(model1) - val model2 = AddedDeviceModel() - model2.deviceName = "万家乐油烟机" - model2.deviceModel = "CXW-320-W7" - model2.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model2) - val model3 = AddedDeviceModel() - model3.deviceName = "万家乐壁挂炉" - model3.deviceModel = "26-13A3L" - model3.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model3) val addedDeviceAdapter = AddedDeviceAdapter(requireContext()) addedDeviceAdapter.setupDevice(deviceModels) @@ -102,8 +107,28 @@ } override fun initEvent() { - showAllDeviceLayout.setOnClickListener { + showAllDeviceButton.setOnClickListener { requireContext().navigatePageTo() } } + + override fun onResume() { + super.onResume() + val s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + if (s == "") { + return + } + val homeModel = gson.fromJson(s, object : TypeToken() {}.type) + TuyaHomeSdk.newHomeInstance(homeModel.homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + Log.d(kTag, deviceList.toJson()) + } + + override fun onError(errorCode: String, errorMsg: String) { + // do something + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 8aba9b2..84e947c 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -9,9 +9,13 @@ import com.casic.br.utils.GridItemDecoration import com.casic.br.utils.LocaleConstant import com.casic.br.view.LoginActivity +import com.casic.br.view.MainActivity import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.youth.banner.Banner import com.youth.banner.adapter.BannerImageAdapter import com.youth.banner.holder.BannerImageHolder @@ -90,7 +94,39 @@ override fun initEvent() { rightOperateView.setOnClickListener { - requireContext().navigatePageTo() + if (rightOperateView.text == "退出") { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出确认") + .setMessage("退出当前账号,将不能同步数据") + .setNegativeButton("取消") + .setPositiveButton("确认退出") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, false) + requireContext().navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) + .build().show() + } else { + requireContext().navigatePageTo() + } } } + + override fun onResume() { + val isLogin = SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + if (isLogin) { + rightOperateView.text = "退出" + } else { + rightOperateView.text = "登录" + } + super.onResume() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/model/HomeModel.java b/app/src/main/java/com/casic/br/model/HomeModel.java new file mode 100644 index 0000000..638d420 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/HomeModel.java @@ -0,0 +1,127 @@ +package com.casic.br.model; + +import java.util.List; + +public class HomeModel { + + private boolean admin; + private String geoName; + private int homeId; + private int homeStatus; + private double lat; + private double lon; + private String name; + private int role; + private List rooms; + + public boolean isAdmin() { + return admin; + } + + public void setAdmin(boolean admin) { + this.admin = admin; + } + + public String getGeoName() { + return geoName; + } + + public void setGeoName(String geoName) { + this.geoName = geoName; + } + + public int getHomeId() { + return homeId; + } + + public void setHomeId(int homeId) { + this.homeId = homeId; + } + + public int getHomeStatus() { + return homeStatus; + } + + public void setHomeStatus(int homeStatus) { + this.homeStatus = homeStatus; + } + + public double getLat() { + return lat; + } + + public void setLat(double lat) { + this.lat = lat; + } + + public double getLon() { + return lon; + } + + public void setLon(double lon) { + this.lon = lon; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRole() { + return role; + } + + public void setRole(int role) { + this.role = role; + } + + public List getRooms() { + return rooms; + } + + public void setRooms(List rooms) { + this.rooms = rooms; + } + + public static class RoomsModel { + private int displayOrder; + private String name; + private int roomId; + private boolean sel; + + public int getDisplayOrder() { + return displayOrder; + } + + public void setDisplayOrder(int displayOrder) { + this.displayOrder = displayOrder; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRoomId() { + return roomId; + } + + public void setRoomId(int roomId) { + this.roomId = roomId; + } + + public boolean isSel() { + return sel; + } + + public void setSel(boolean sel) { + this.sel = sel; + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/DialogManager.kt b/app/src/main/java/com/casic/br/utils/DialogManager.kt deleted file mode 100644 index da62e63..0000000 --- a/app/src/main/java/com/casic/br/utils/DialogManager.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.casic.br.utils; - -import android.app.Activity -import android.view.WindowManager -import com.pengxh.kt.lite.base.BaseSingleton -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog - -class DialogManager private constructor(private val activity: Activity) { - - private lateinit var loadingDialog: QMUITipDialog - - companion object : BaseSingleton() { - override val creator: (Activity) -> DialogManager - get() = ::DialogManager - } - - fun showLoadingDialog(message: String) { - loadingDialog = QMUITipDialog - .Builder(activity) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord(message) - .create() - if (!activity.isDestroyed) { - try { - loadingDialog.show() - } catch (e: WindowManager.BadTokenException) { - e.printStackTrace() - } - } - } - - fun dismissLoadingDialog() { - if (loadingDialog.isShowing) { - loadingDialog.dismiss() - } - } -} diff --git a/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt b/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt new file mode 100644 index 0000000..e04e327 --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt @@ -0,0 +1,31 @@ +package com.casic.br.utils + +import android.app.Activity +import android.view.WindowManager +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + +object LoadingDialogHub { + + private lateinit var loadingDialog: QMUITipDialog + + fun show(activity: Activity, message: String) { + loadingDialog = QMUITipDialog + .Builder(activity) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord(message) + .create() + if (!activity.isDestroyed) { + try { + loadingDialog.show() + } catch (e: WindowManager.BadTokenException) { + e.printStackTrace() + } + } + } + + fun dismiss() { + if (loadingDialog.isShowing) { + loadingDialog.dismiss() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 197a466..dd365ad 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -53,7 +53,8 @@ * String * ============================================================================================= * */ - const val USER_DETAIL_MODEL = "userDetailModel" + const val USER_IS_LOGIN = "isLogin" + const val HOME_DETAIL_MODEL = "homeDetailModel" const val SERVER_BASE_URL = "http://111.198.10.15:11304" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val ACCOUNT = "account" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3ea0e96..ba3523a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,15 +41,16 @@ + + - - + + - diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt index bf8285c..c90a197 100644 --- a/app/src/main/java/com/casic/br/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt @@ -1,16 +1,10 @@ package com.casic.br.base import android.app.Application -import android.util.Log import com.casic.br.greendao.DaoMaster import com.casic.br.greendao.DaoSession -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues -import com.tuya.smart.android.user.api.ILoginCallback -import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.home.sdk.bean.HomeBean -import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlin.properties.Delegates @@ -30,46 +24,13 @@ super.onCreate() instance = this SaveKeyValues.initSharedPreferences(this) - initTuya() + TuyaHomeSdk.init(this) + TuyaHomeSdk.setDebugMode(true) val devOpenHelper = DaoMaster.DevOpenHelper(this, "SmartKitchen.db", null) val daoMaster = DaoMaster(devOpenHelper.writableDatabase) daoSession = daoMaster.newSession() } - private fun initTuya() { - TuyaHomeSdk.init(this) - TuyaHomeSdk.setDebugMode(true) - /** - * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 - * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 - * 用户账号下创建任意多个家庭。 - * */ - //TODO 必须登录 - TuyaHomeSdk.getUserInstance() - .loginWithPhonePassword("86", "18310581916", "123456", object : ILoginCallback { - override fun onSuccess(user: User?) { - Log.d(kTag, "Login success:" + user!!.username) - } - - override fun onError(code: String, error: String) { - Log.e(kTag, "code: " + code + "error:" + error) - } - }) - - - TuyaHomeSdk.getHomeManagerInstance() - .createHome("北燃生活体验馆", 116.486394, 39.885734, "北燃生活体验馆", arrayListOf(), object : - ITuyaHomeResultCallback { - override fun onSuccess(bean: HomeBean?) { - Log.d(kTag, bean!!.toJson()) - } - - override fun onError(errorCode: String?, errorMsg: String?) { - Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") - } - }) - } - fun obtainDaoSession(): DaoSession { return daoSession } diff --git a/app/src/main/java/com/casic/br/extensions/Context.kt b/app/src/main/java/com/casic/br/extensions/Context.kt index 5866614..5726394 100644 --- a/app/src/main/java/com/casic/br/extensions/Context.kt +++ b/app/src/main/java/com/casic/br/extensions/Context.kt @@ -2,11 +2,16 @@ import android.content.Context import android.view.ViewGroup +import com.casic.br.base.BaseApplication +import com.pengxh.kt.lite.extensions.dp2px import com.qmuiteam.qmui.util.QMUIDisplayHelper fun Context.initLayoutImmersionBar(rootView: ViewGroup) { //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + if (statusBarHeight == 0) { + statusBarHeight = 44f.dp2px(BaseApplication.obtainInstance()) + } rootView.setPadding(0, statusBarHeight, 0, 0) rootView.requestLayout() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index cc20c54..4ef912b 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -1,25 +1,40 @@ package com.casic.br.fragment import android.graphics.Typeface +import android.util.Log import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.model.AddedDeviceModel +import com.casic.br.model.HomeModel import com.casic.br.model.RecommendModel +import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddDeviceActivity import com.casic.br.view.AllDeviceActivity import com.casic.br.view.device.FireplaceActivity import com.casic.br.view.device.RangeHoodActivity import com.casic.br.view.device.WaterHeaterActivity +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.fragment_device.* import kotlinx.android.synthetic.main.include_main_title.* import java.util.* + class DevicePageFragment : KotlinBaseFragment() { + private val kTag = "DevicePageFragment" + private val gson by lazy { Gson() } + override fun initLayoutView(): Int = R.layout.fragment_device override fun setupTopBarLayout() { @@ -37,16 +52,6 @@ model1.deviceModel = "D40-DM1" model1.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" deviceModels.add(model1) - val model2 = AddedDeviceModel() - model2.deviceName = "万家乐油烟机" - model2.deviceModel = "CXW-320-W7" - model2.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model2) - val model3 = AddedDeviceModel() - model3.deviceName = "万家乐壁挂炉" - model3.deviceModel = "26-13A3L" - model3.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model3) val addedDeviceAdapter = AddedDeviceAdapter(requireContext()) addedDeviceAdapter.setupDevice(deviceModels) @@ -102,8 +107,28 @@ } override fun initEvent() { - showAllDeviceLayout.setOnClickListener { + showAllDeviceButton.setOnClickListener { requireContext().navigatePageTo() } } + + override fun onResume() { + super.onResume() + val s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + if (s == "") { + return + } + val homeModel = gson.fromJson(s, object : TypeToken() {}.type) + TuyaHomeSdk.newHomeInstance(homeModel.homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + Log.d(kTag, deviceList.toJson()) + } + + override fun onError(errorCode: String, errorMsg: String) { + // do something + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 8aba9b2..84e947c 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -9,9 +9,13 @@ import com.casic.br.utils.GridItemDecoration import com.casic.br.utils.LocaleConstant import com.casic.br.view.LoginActivity +import com.casic.br.view.MainActivity import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.youth.banner.Banner import com.youth.banner.adapter.BannerImageAdapter import com.youth.banner.holder.BannerImageHolder @@ -90,7 +94,39 @@ override fun initEvent() { rightOperateView.setOnClickListener { - requireContext().navigatePageTo() + if (rightOperateView.text == "退出") { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出确认") + .setMessage("退出当前账号,将不能同步数据") + .setNegativeButton("取消") + .setPositiveButton("确认退出") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, false) + requireContext().navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) + .build().show() + } else { + requireContext().navigatePageTo() + } } } + + override fun onResume() { + val isLogin = SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + if (isLogin) { + rightOperateView.text = "退出" + } else { + rightOperateView.text = "登录" + } + super.onResume() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/model/HomeModel.java b/app/src/main/java/com/casic/br/model/HomeModel.java new file mode 100644 index 0000000..638d420 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/HomeModel.java @@ -0,0 +1,127 @@ +package com.casic.br.model; + +import java.util.List; + +public class HomeModel { + + private boolean admin; + private String geoName; + private int homeId; + private int homeStatus; + private double lat; + private double lon; + private String name; + private int role; + private List rooms; + + public boolean isAdmin() { + return admin; + } + + public void setAdmin(boolean admin) { + this.admin = admin; + } + + public String getGeoName() { + return geoName; + } + + public void setGeoName(String geoName) { + this.geoName = geoName; + } + + public int getHomeId() { + return homeId; + } + + public void setHomeId(int homeId) { + this.homeId = homeId; + } + + public int getHomeStatus() { + return homeStatus; + } + + public void setHomeStatus(int homeStatus) { + this.homeStatus = homeStatus; + } + + public double getLat() { + return lat; + } + + public void setLat(double lat) { + this.lat = lat; + } + + public double getLon() { + return lon; + } + + public void setLon(double lon) { + this.lon = lon; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRole() { + return role; + } + + public void setRole(int role) { + this.role = role; + } + + public List getRooms() { + return rooms; + } + + public void setRooms(List rooms) { + this.rooms = rooms; + } + + public static class RoomsModel { + private int displayOrder; + private String name; + private int roomId; + private boolean sel; + + public int getDisplayOrder() { + return displayOrder; + } + + public void setDisplayOrder(int displayOrder) { + this.displayOrder = displayOrder; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRoomId() { + return roomId; + } + + public void setRoomId(int roomId) { + this.roomId = roomId; + } + + public boolean isSel() { + return sel; + } + + public void setSel(boolean sel) { + this.sel = sel; + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/DialogManager.kt b/app/src/main/java/com/casic/br/utils/DialogManager.kt deleted file mode 100644 index da62e63..0000000 --- a/app/src/main/java/com/casic/br/utils/DialogManager.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.casic.br.utils; - -import android.app.Activity -import android.view.WindowManager -import com.pengxh.kt.lite.base.BaseSingleton -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog - -class DialogManager private constructor(private val activity: Activity) { - - private lateinit var loadingDialog: QMUITipDialog - - companion object : BaseSingleton() { - override val creator: (Activity) -> DialogManager - get() = ::DialogManager - } - - fun showLoadingDialog(message: String) { - loadingDialog = QMUITipDialog - .Builder(activity) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord(message) - .create() - if (!activity.isDestroyed) { - try { - loadingDialog.show() - } catch (e: WindowManager.BadTokenException) { - e.printStackTrace() - } - } - } - - fun dismissLoadingDialog() { - if (loadingDialog.isShowing) { - loadingDialog.dismiss() - } - } -} diff --git a/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt b/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt new file mode 100644 index 0000000..e04e327 --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt @@ -0,0 +1,31 @@ +package com.casic.br.utils + +import android.app.Activity +import android.view.WindowManager +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + +object LoadingDialogHub { + + private lateinit var loadingDialog: QMUITipDialog + + fun show(activity: Activity, message: String) { + loadingDialog = QMUITipDialog + .Builder(activity) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord(message) + .create() + if (!activity.isDestroyed) { + try { + loadingDialog.show() + } catch (e: WindowManager.BadTokenException) { + e.printStackTrace() + } + } + } + + fun dismiss() { + if (loadingDialog.isShowing) { + loadingDialog.dismiss() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 197a466..dd365ad 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -53,7 +53,8 @@ * String * ============================================================================================= * */ - const val USER_DETAIL_MODEL = "userDetailModel" + const val USER_IS_LOGIN = "isLogin" + const val HOME_DETAIL_MODEL = "homeDetailModel" const val SERVER_BASE_URL = "http://111.198.10.15:11304" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val ACCOUNT = "account" diff --git a/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt index ce8f99e..210a258 100644 --- a/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt @@ -30,13 +30,12 @@ override fun initEvent() { iotDevice.setOnClickListener { - navigatePageTo() - finish() + //IoT设备首先需要先配置网络 + navigatePageTo() } notIotDevice.setOnClickListener { navigatePageTo() - finish() } } } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3ea0e96..ba3523a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,15 +41,16 @@ + + - - + + - diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt index bf8285c..c90a197 100644 --- a/app/src/main/java/com/casic/br/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt @@ -1,16 +1,10 @@ package com.casic.br.base import android.app.Application -import android.util.Log import com.casic.br.greendao.DaoMaster import com.casic.br.greendao.DaoSession -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues -import com.tuya.smart.android.user.api.ILoginCallback -import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.home.sdk.bean.HomeBean -import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlin.properties.Delegates @@ -30,46 +24,13 @@ super.onCreate() instance = this SaveKeyValues.initSharedPreferences(this) - initTuya() + TuyaHomeSdk.init(this) + TuyaHomeSdk.setDebugMode(true) val devOpenHelper = DaoMaster.DevOpenHelper(this, "SmartKitchen.db", null) val daoMaster = DaoMaster(devOpenHelper.writableDatabase) daoSession = daoMaster.newSession() } - private fun initTuya() { - TuyaHomeSdk.init(this) - TuyaHomeSdk.setDebugMode(true) - /** - * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 - * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 - * 用户账号下创建任意多个家庭。 - * */ - //TODO 必须登录 - TuyaHomeSdk.getUserInstance() - .loginWithPhonePassword("86", "18310581916", "123456", object : ILoginCallback { - override fun onSuccess(user: User?) { - Log.d(kTag, "Login success:" + user!!.username) - } - - override fun onError(code: String, error: String) { - Log.e(kTag, "code: " + code + "error:" + error) - } - }) - - - TuyaHomeSdk.getHomeManagerInstance() - .createHome("北燃生活体验馆", 116.486394, 39.885734, "北燃生活体验馆", arrayListOf(), object : - ITuyaHomeResultCallback { - override fun onSuccess(bean: HomeBean?) { - Log.d(kTag, bean!!.toJson()) - } - - override fun onError(errorCode: String?, errorMsg: String?) { - Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") - } - }) - } - fun obtainDaoSession(): DaoSession { return daoSession } diff --git a/app/src/main/java/com/casic/br/extensions/Context.kt b/app/src/main/java/com/casic/br/extensions/Context.kt index 5866614..5726394 100644 --- a/app/src/main/java/com/casic/br/extensions/Context.kt +++ b/app/src/main/java/com/casic/br/extensions/Context.kt @@ -2,11 +2,16 @@ import android.content.Context import android.view.ViewGroup +import com.casic.br.base.BaseApplication +import com.pengxh.kt.lite.extensions.dp2px import com.qmuiteam.qmui.util.QMUIDisplayHelper fun Context.initLayoutImmersionBar(rootView: ViewGroup) { //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + if (statusBarHeight == 0) { + statusBarHeight = 44f.dp2px(BaseApplication.obtainInstance()) + } rootView.setPadding(0, statusBarHeight, 0, 0) rootView.requestLayout() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index cc20c54..4ef912b 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -1,25 +1,40 @@ package com.casic.br.fragment import android.graphics.Typeface +import android.util.Log import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.model.AddedDeviceModel +import com.casic.br.model.HomeModel import com.casic.br.model.RecommendModel +import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddDeviceActivity import com.casic.br.view.AllDeviceActivity import com.casic.br.view.device.FireplaceActivity import com.casic.br.view.device.RangeHoodActivity import com.casic.br.view.device.WaterHeaterActivity +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.fragment_device.* import kotlinx.android.synthetic.main.include_main_title.* import java.util.* + class DevicePageFragment : KotlinBaseFragment() { + private val kTag = "DevicePageFragment" + private val gson by lazy { Gson() } + override fun initLayoutView(): Int = R.layout.fragment_device override fun setupTopBarLayout() { @@ -37,16 +52,6 @@ model1.deviceModel = "D40-DM1" model1.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" deviceModels.add(model1) - val model2 = AddedDeviceModel() - model2.deviceName = "万家乐油烟机" - model2.deviceModel = "CXW-320-W7" - model2.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model2) - val model3 = AddedDeviceModel() - model3.deviceName = "万家乐壁挂炉" - model3.deviceModel = "26-13A3L" - model3.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model3) val addedDeviceAdapter = AddedDeviceAdapter(requireContext()) addedDeviceAdapter.setupDevice(deviceModels) @@ -102,8 +107,28 @@ } override fun initEvent() { - showAllDeviceLayout.setOnClickListener { + showAllDeviceButton.setOnClickListener { requireContext().navigatePageTo() } } + + override fun onResume() { + super.onResume() + val s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + if (s == "") { + return + } + val homeModel = gson.fromJson(s, object : TypeToken() {}.type) + TuyaHomeSdk.newHomeInstance(homeModel.homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + Log.d(kTag, deviceList.toJson()) + } + + override fun onError(errorCode: String, errorMsg: String) { + // do something + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 8aba9b2..84e947c 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -9,9 +9,13 @@ import com.casic.br.utils.GridItemDecoration import com.casic.br.utils.LocaleConstant import com.casic.br.view.LoginActivity +import com.casic.br.view.MainActivity import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.youth.banner.Banner import com.youth.banner.adapter.BannerImageAdapter import com.youth.banner.holder.BannerImageHolder @@ -90,7 +94,39 @@ override fun initEvent() { rightOperateView.setOnClickListener { - requireContext().navigatePageTo() + if (rightOperateView.text == "退出") { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出确认") + .setMessage("退出当前账号,将不能同步数据") + .setNegativeButton("取消") + .setPositiveButton("确认退出") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, false) + requireContext().navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) + .build().show() + } else { + requireContext().navigatePageTo() + } } } + + override fun onResume() { + val isLogin = SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + if (isLogin) { + rightOperateView.text = "退出" + } else { + rightOperateView.text = "登录" + } + super.onResume() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/model/HomeModel.java b/app/src/main/java/com/casic/br/model/HomeModel.java new file mode 100644 index 0000000..638d420 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/HomeModel.java @@ -0,0 +1,127 @@ +package com.casic.br.model; + +import java.util.List; + +public class HomeModel { + + private boolean admin; + private String geoName; + private int homeId; + private int homeStatus; + private double lat; + private double lon; + private String name; + private int role; + private List rooms; + + public boolean isAdmin() { + return admin; + } + + public void setAdmin(boolean admin) { + this.admin = admin; + } + + public String getGeoName() { + return geoName; + } + + public void setGeoName(String geoName) { + this.geoName = geoName; + } + + public int getHomeId() { + return homeId; + } + + public void setHomeId(int homeId) { + this.homeId = homeId; + } + + public int getHomeStatus() { + return homeStatus; + } + + public void setHomeStatus(int homeStatus) { + this.homeStatus = homeStatus; + } + + public double getLat() { + return lat; + } + + public void setLat(double lat) { + this.lat = lat; + } + + public double getLon() { + return lon; + } + + public void setLon(double lon) { + this.lon = lon; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRole() { + return role; + } + + public void setRole(int role) { + this.role = role; + } + + public List getRooms() { + return rooms; + } + + public void setRooms(List rooms) { + this.rooms = rooms; + } + + public static class RoomsModel { + private int displayOrder; + private String name; + private int roomId; + private boolean sel; + + public int getDisplayOrder() { + return displayOrder; + } + + public void setDisplayOrder(int displayOrder) { + this.displayOrder = displayOrder; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRoomId() { + return roomId; + } + + public void setRoomId(int roomId) { + this.roomId = roomId; + } + + public boolean isSel() { + return sel; + } + + public void setSel(boolean sel) { + this.sel = sel; + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/DialogManager.kt b/app/src/main/java/com/casic/br/utils/DialogManager.kt deleted file mode 100644 index da62e63..0000000 --- a/app/src/main/java/com/casic/br/utils/DialogManager.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.casic.br.utils; - -import android.app.Activity -import android.view.WindowManager -import com.pengxh.kt.lite.base.BaseSingleton -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog - -class DialogManager private constructor(private val activity: Activity) { - - private lateinit var loadingDialog: QMUITipDialog - - companion object : BaseSingleton() { - override val creator: (Activity) -> DialogManager - get() = ::DialogManager - } - - fun showLoadingDialog(message: String) { - loadingDialog = QMUITipDialog - .Builder(activity) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord(message) - .create() - if (!activity.isDestroyed) { - try { - loadingDialog.show() - } catch (e: WindowManager.BadTokenException) { - e.printStackTrace() - } - } - } - - fun dismissLoadingDialog() { - if (loadingDialog.isShowing) { - loadingDialog.dismiss() - } - } -} diff --git a/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt b/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt new file mode 100644 index 0000000..e04e327 --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt @@ -0,0 +1,31 @@ +package com.casic.br.utils + +import android.app.Activity +import android.view.WindowManager +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + +object LoadingDialogHub { + + private lateinit var loadingDialog: QMUITipDialog + + fun show(activity: Activity, message: String) { + loadingDialog = QMUITipDialog + .Builder(activity) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord(message) + .create() + if (!activity.isDestroyed) { + try { + loadingDialog.show() + } catch (e: WindowManager.BadTokenException) { + e.printStackTrace() + } + } + } + + fun dismiss() { + if (loadingDialog.isShowing) { + loadingDialog.dismiss() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 197a466..dd365ad 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -53,7 +53,8 @@ * String * ============================================================================================= * */ - const val USER_DETAIL_MODEL = "userDetailModel" + const val USER_IS_LOGIN = "isLogin" + const val HOME_DETAIL_MODEL = "homeDetailModel" const val SERVER_BASE_URL = "http://111.198.10.15:11304" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val ACCOUNT = "account" diff --git a/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt index ce8f99e..210a258 100644 --- a/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt @@ -30,13 +30,12 @@ override fun initEvent() { iotDevice.setOnClickListener { - navigatePageTo() - finish() + //IoT设备首先需要先配置网络 + navigatePageTo() } notIotDevice.setOnClickListener { navigatePageTo() - finish() } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt b/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt index d58aebd..ec99e90 100644 --- a/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt @@ -4,6 +4,8 @@ import com.casic.br.extensions.initLayoutImmersionBar import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_add_device_result.* class AddDeviceResultActivity : KotlinBaseActivity() { @@ -26,7 +28,8 @@ override fun initEvent() { completeButton.setOnClickListener { - finish() + navigatePageTo() + PageNavigationManager.finishAllActivity() } } } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3ea0e96..ba3523a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,15 +41,16 @@ + + - - + + - diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt index bf8285c..c90a197 100644 --- a/app/src/main/java/com/casic/br/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt @@ -1,16 +1,10 @@ package com.casic.br.base import android.app.Application -import android.util.Log import com.casic.br.greendao.DaoMaster import com.casic.br.greendao.DaoSession -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues -import com.tuya.smart.android.user.api.ILoginCallback -import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.home.sdk.bean.HomeBean -import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlin.properties.Delegates @@ -30,46 +24,13 @@ super.onCreate() instance = this SaveKeyValues.initSharedPreferences(this) - initTuya() + TuyaHomeSdk.init(this) + TuyaHomeSdk.setDebugMode(true) val devOpenHelper = DaoMaster.DevOpenHelper(this, "SmartKitchen.db", null) val daoMaster = DaoMaster(devOpenHelper.writableDatabase) daoSession = daoMaster.newSession() } - private fun initTuya() { - TuyaHomeSdk.init(this) - TuyaHomeSdk.setDebugMode(true) - /** - * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 - * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 - * 用户账号下创建任意多个家庭。 - * */ - //TODO 必须登录 - TuyaHomeSdk.getUserInstance() - .loginWithPhonePassword("86", "18310581916", "123456", object : ILoginCallback { - override fun onSuccess(user: User?) { - Log.d(kTag, "Login success:" + user!!.username) - } - - override fun onError(code: String, error: String) { - Log.e(kTag, "code: " + code + "error:" + error) - } - }) - - - TuyaHomeSdk.getHomeManagerInstance() - .createHome("北燃生活体验馆", 116.486394, 39.885734, "北燃生活体验馆", arrayListOf(), object : - ITuyaHomeResultCallback { - override fun onSuccess(bean: HomeBean?) { - Log.d(kTag, bean!!.toJson()) - } - - override fun onError(errorCode: String?, errorMsg: String?) { - Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") - } - }) - } - fun obtainDaoSession(): DaoSession { return daoSession } diff --git a/app/src/main/java/com/casic/br/extensions/Context.kt b/app/src/main/java/com/casic/br/extensions/Context.kt index 5866614..5726394 100644 --- a/app/src/main/java/com/casic/br/extensions/Context.kt +++ b/app/src/main/java/com/casic/br/extensions/Context.kt @@ -2,11 +2,16 @@ import android.content.Context import android.view.ViewGroup +import com.casic.br.base.BaseApplication +import com.pengxh.kt.lite.extensions.dp2px import com.qmuiteam.qmui.util.QMUIDisplayHelper fun Context.initLayoutImmersionBar(rootView: ViewGroup) { //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + if (statusBarHeight == 0) { + statusBarHeight = 44f.dp2px(BaseApplication.obtainInstance()) + } rootView.setPadding(0, statusBarHeight, 0, 0) rootView.requestLayout() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index cc20c54..4ef912b 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -1,25 +1,40 @@ package com.casic.br.fragment import android.graphics.Typeface +import android.util.Log import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.model.AddedDeviceModel +import com.casic.br.model.HomeModel import com.casic.br.model.RecommendModel +import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddDeviceActivity import com.casic.br.view.AllDeviceActivity import com.casic.br.view.device.FireplaceActivity import com.casic.br.view.device.RangeHoodActivity import com.casic.br.view.device.WaterHeaterActivity +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.fragment_device.* import kotlinx.android.synthetic.main.include_main_title.* import java.util.* + class DevicePageFragment : KotlinBaseFragment() { + private val kTag = "DevicePageFragment" + private val gson by lazy { Gson() } + override fun initLayoutView(): Int = R.layout.fragment_device override fun setupTopBarLayout() { @@ -37,16 +52,6 @@ model1.deviceModel = "D40-DM1" model1.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" deviceModels.add(model1) - val model2 = AddedDeviceModel() - model2.deviceName = "万家乐油烟机" - model2.deviceModel = "CXW-320-W7" - model2.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model2) - val model3 = AddedDeviceModel() - model3.deviceName = "万家乐壁挂炉" - model3.deviceModel = "26-13A3L" - model3.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model3) val addedDeviceAdapter = AddedDeviceAdapter(requireContext()) addedDeviceAdapter.setupDevice(deviceModels) @@ -102,8 +107,28 @@ } override fun initEvent() { - showAllDeviceLayout.setOnClickListener { + showAllDeviceButton.setOnClickListener { requireContext().navigatePageTo() } } + + override fun onResume() { + super.onResume() + val s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + if (s == "") { + return + } + val homeModel = gson.fromJson(s, object : TypeToken() {}.type) + TuyaHomeSdk.newHomeInstance(homeModel.homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + Log.d(kTag, deviceList.toJson()) + } + + override fun onError(errorCode: String, errorMsg: String) { + // do something + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 8aba9b2..84e947c 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -9,9 +9,13 @@ import com.casic.br.utils.GridItemDecoration import com.casic.br.utils.LocaleConstant import com.casic.br.view.LoginActivity +import com.casic.br.view.MainActivity import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.youth.banner.Banner import com.youth.banner.adapter.BannerImageAdapter import com.youth.banner.holder.BannerImageHolder @@ -90,7 +94,39 @@ override fun initEvent() { rightOperateView.setOnClickListener { - requireContext().navigatePageTo() + if (rightOperateView.text == "退出") { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出确认") + .setMessage("退出当前账号,将不能同步数据") + .setNegativeButton("取消") + .setPositiveButton("确认退出") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, false) + requireContext().navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) + .build().show() + } else { + requireContext().navigatePageTo() + } } } + + override fun onResume() { + val isLogin = SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + if (isLogin) { + rightOperateView.text = "退出" + } else { + rightOperateView.text = "登录" + } + super.onResume() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/model/HomeModel.java b/app/src/main/java/com/casic/br/model/HomeModel.java new file mode 100644 index 0000000..638d420 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/HomeModel.java @@ -0,0 +1,127 @@ +package com.casic.br.model; + +import java.util.List; + +public class HomeModel { + + private boolean admin; + private String geoName; + private int homeId; + private int homeStatus; + private double lat; + private double lon; + private String name; + private int role; + private List rooms; + + public boolean isAdmin() { + return admin; + } + + public void setAdmin(boolean admin) { + this.admin = admin; + } + + public String getGeoName() { + return geoName; + } + + public void setGeoName(String geoName) { + this.geoName = geoName; + } + + public int getHomeId() { + return homeId; + } + + public void setHomeId(int homeId) { + this.homeId = homeId; + } + + public int getHomeStatus() { + return homeStatus; + } + + public void setHomeStatus(int homeStatus) { + this.homeStatus = homeStatus; + } + + public double getLat() { + return lat; + } + + public void setLat(double lat) { + this.lat = lat; + } + + public double getLon() { + return lon; + } + + public void setLon(double lon) { + this.lon = lon; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRole() { + return role; + } + + public void setRole(int role) { + this.role = role; + } + + public List getRooms() { + return rooms; + } + + public void setRooms(List rooms) { + this.rooms = rooms; + } + + public static class RoomsModel { + private int displayOrder; + private String name; + private int roomId; + private boolean sel; + + public int getDisplayOrder() { + return displayOrder; + } + + public void setDisplayOrder(int displayOrder) { + this.displayOrder = displayOrder; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRoomId() { + return roomId; + } + + public void setRoomId(int roomId) { + this.roomId = roomId; + } + + public boolean isSel() { + return sel; + } + + public void setSel(boolean sel) { + this.sel = sel; + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/DialogManager.kt b/app/src/main/java/com/casic/br/utils/DialogManager.kt deleted file mode 100644 index da62e63..0000000 --- a/app/src/main/java/com/casic/br/utils/DialogManager.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.casic.br.utils; - -import android.app.Activity -import android.view.WindowManager -import com.pengxh.kt.lite.base.BaseSingleton -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog - -class DialogManager private constructor(private val activity: Activity) { - - private lateinit var loadingDialog: QMUITipDialog - - companion object : BaseSingleton() { - override val creator: (Activity) -> DialogManager - get() = ::DialogManager - } - - fun showLoadingDialog(message: String) { - loadingDialog = QMUITipDialog - .Builder(activity) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord(message) - .create() - if (!activity.isDestroyed) { - try { - loadingDialog.show() - } catch (e: WindowManager.BadTokenException) { - e.printStackTrace() - } - } - } - - fun dismissLoadingDialog() { - if (loadingDialog.isShowing) { - loadingDialog.dismiss() - } - } -} diff --git a/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt b/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt new file mode 100644 index 0000000..e04e327 --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt @@ -0,0 +1,31 @@ +package com.casic.br.utils + +import android.app.Activity +import android.view.WindowManager +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + +object LoadingDialogHub { + + private lateinit var loadingDialog: QMUITipDialog + + fun show(activity: Activity, message: String) { + loadingDialog = QMUITipDialog + .Builder(activity) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord(message) + .create() + if (!activity.isDestroyed) { + try { + loadingDialog.show() + } catch (e: WindowManager.BadTokenException) { + e.printStackTrace() + } + } + } + + fun dismiss() { + if (loadingDialog.isShowing) { + loadingDialog.dismiss() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 197a466..dd365ad 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -53,7 +53,8 @@ * String * ============================================================================================= * */ - const val USER_DETAIL_MODEL = "userDetailModel" + const val USER_IS_LOGIN = "isLogin" + const val HOME_DETAIL_MODEL = "homeDetailModel" const val SERVER_BASE_URL = "http://111.198.10.15:11304" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val ACCOUNT = "account" diff --git a/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt index ce8f99e..210a258 100644 --- a/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt @@ -30,13 +30,12 @@ override fun initEvent() { iotDevice.setOnClickListener { - navigatePageTo() - finish() + //IoT设备首先需要先配置网络 + navigatePageTo() } notIotDevice.setOnClickListener { navigatePageTo() - finish() } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt b/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt index d58aebd..ec99e90 100644 --- a/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt @@ -4,6 +4,8 @@ import com.casic.br.extensions.initLayoutImmersionBar import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_add_device_result.* class AddDeviceResultActivity : KotlinBaseActivity() { @@ -26,7 +28,8 @@ override fun initEvent() { completeButton.setOnClickListener { - finish() + navigatePageTo() + PageNavigationManager.finishAllActivity() } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt deleted file mode 100644 index 25ce475..0000000 --- a/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt +++ /dev/null @@ -1,56 +0,0 @@ -package com.casic.br.view - -import android.view.View -import android.widget.AdapterView -import com.casic.br.R -import com.casic.br.extensions.initLayoutImmersionBar -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo -import kotlinx.android.synthetic.main.activity_add_device_iot.* - -/** - * 添加IoT设备 - * */ -class AddIoTDeviceActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_add_device_iot - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(true).init() - initLayoutImmersionBar(rootView) - leftBackView.setOnClickListener { finish() } - } - - override fun initData() { - //默认选择WIFI快连 - connectTypeSpinner.setSelection(0) - } - - override fun initEvent() { - connectTypeSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>?, view: View?, position: Int, id: Long - ) { - - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - - } - } - - nextStepButton.setOnClickListener { - if (connectTypeSpinner.selectedItemPosition == 0) { - navigatePageTo() - } else { - navigatePageTo() - } - finish() - } - } -} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3ea0e96..ba3523a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,15 +41,16 @@ + + - - + + - diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt index bf8285c..c90a197 100644 --- a/app/src/main/java/com/casic/br/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt @@ -1,16 +1,10 @@ package com.casic.br.base import android.app.Application -import android.util.Log import com.casic.br.greendao.DaoMaster import com.casic.br.greendao.DaoSession -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues -import com.tuya.smart.android.user.api.ILoginCallback -import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.home.sdk.bean.HomeBean -import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlin.properties.Delegates @@ -30,46 +24,13 @@ super.onCreate() instance = this SaveKeyValues.initSharedPreferences(this) - initTuya() + TuyaHomeSdk.init(this) + TuyaHomeSdk.setDebugMode(true) val devOpenHelper = DaoMaster.DevOpenHelper(this, "SmartKitchen.db", null) val daoMaster = DaoMaster(devOpenHelper.writableDatabase) daoSession = daoMaster.newSession() } - private fun initTuya() { - TuyaHomeSdk.init(this) - TuyaHomeSdk.setDebugMode(true) - /** - * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 - * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 - * 用户账号下创建任意多个家庭。 - * */ - //TODO 必须登录 - TuyaHomeSdk.getUserInstance() - .loginWithPhonePassword("86", "18310581916", "123456", object : ILoginCallback { - override fun onSuccess(user: User?) { - Log.d(kTag, "Login success:" + user!!.username) - } - - override fun onError(code: String, error: String) { - Log.e(kTag, "code: " + code + "error:" + error) - } - }) - - - TuyaHomeSdk.getHomeManagerInstance() - .createHome("北燃生活体验馆", 116.486394, 39.885734, "北燃生活体验馆", arrayListOf(), object : - ITuyaHomeResultCallback { - override fun onSuccess(bean: HomeBean?) { - Log.d(kTag, bean!!.toJson()) - } - - override fun onError(errorCode: String?, errorMsg: String?) { - Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") - } - }) - } - fun obtainDaoSession(): DaoSession { return daoSession } diff --git a/app/src/main/java/com/casic/br/extensions/Context.kt b/app/src/main/java/com/casic/br/extensions/Context.kt index 5866614..5726394 100644 --- a/app/src/main/java/com/casic/br/extensions/Context.kt +++ b/app/src/main/java/com/casic/br/extensions/Context.kt @@ -2,11 +2,16 @@ import android.content.Context import android.view.ViewGroup +import com.casic.br.base.BaseApplication +import com.pengxh.kt.lite.extensions.dp2px import com.qmuiteam.qmui.util.QMUIDisplayHelper fun Context.initLayoutImmersionBar(rootView: ViewGroup) { //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + if (statusBarHeight == 0) { + statusBarHeight = 44f.dp2px(BaseApplication.obtainInstance()) + } rootView.setPadding(0, statusBarHeight, 0, 0) rootView.requestLayout() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index cc20c54..4ef912b 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -1,25 +1,40 @@ package com.casic.br.fragment import android.graphics.Typeface +import android.util.Log import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.model.AddedDeviceModel +import com.casic.br.model.HomeModel import com.casic.br.model.RecommendModel +import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddDeviceActivity import com.casic.br.view.AllDeviceActivity import com.casic.br.view.device.FireplaceActivity import com.casic.br.view.device.RangeHoodActivity import com.casic.br.view.device.WaterHeaterActivity +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.fragment_device.* import kotlinx.android.synthetic.main.include_main_title.* import java.util.* + class DevicePageFragment : KotlinBaseFragment() { + private val kTag = "DevicePageFragment" + private val gson by lazy { Gson() } + override fun initLayoutView(): Int = R.layout.fragment_device override fun setupTopBarLayout() { @@ -37,16 +52,6 @@ model1.deviceModel = "D40-DM1" model1.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" deviceModels.add(model1) - val model2 = AddedDeviceModel() - model2.deviceName = "万家乐油烟机" - model2.deviceModel = "CXW-320-W7" - model2.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model2) - val model3 = AddedDeviceModel() - model3.deviceName = "万家乐壁挂炉" - model3.deviceModel = "26-13A3L" - model3.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model3) val addedDeviceAdapter = AddedDeviceAdapter(requireContext()) addedDeviceAdapter.setupDevice(deviceModels) @@ -102,8 +107,28 @@ } override fun initEvent() { - showAllDeviceLayout.setOnClickListener { + showAllDeviceButton.setOnClickListener { requireContext().navigatePageTo() } } + + override fun onResume() { + super.onResume() + val s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + if (s == "") { + return + } + val homeModel = gson.fromJson(s, object : TypeToken() {}.type) + TuyaHomeSdk.newHomeInstance(homeModel.homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + Log.d(kTag, deviceList.toJson()) + } + + override fun onError(errorCode: String, errorMsg: String) { + // do something + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 8aba9b2..84e947c 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -9,9 +9,13 @@ import com.casic.br.utils.GridItemDecoration import com.casic.br.utils.LocaleConstant import com.casic.br.view.LoginActivity +import com.casic.br.view.MainActivity import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.youth.banner.Banner import com.youth.banner.adapter.BannerImageAdapter import com.youth.banner.holder.BannerImageHolder @@ -90,7 +94,39 @@ override fun initEvent() { rightOperateView.setOnClickListener { - requireContext().navigatePageTo() + if (rightOperateView.text == "退出") { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出确认") + .setMessage("退出当前账号,将不能同步数据") + .setNegativeButton("取消") + .setPositiveButton("确认退出") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, false) + requireContext().navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) + .build().show() + } else { + requireContext().navigatePageTo() + } } } + + override fun onResume() { + val isLogin = SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + if (isLogin) { + rightOperateView.text = "退出" + } else { + rightOperateView.text = "登录" + } + super.onResume() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/model/HomeModel.java b/app/src/main/java/com/casic/br/model/HomeModel.java new file mode 100644 index 0000000..638d420 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/HomeModel.java @@ -0,0 +1,127 @@ +package com.casic.br.model; + +import java.util.List; + +public class HomeModel { + + private boolean admin; + private String geoName; + private int homeId; + private int homeStatus; + private double lat; + private double lon; + private String name; + private int role; + private List rooms; + + public boolean isAdmin() { + return admin; + } + + public void setAdmin(boolean admin) { + this.admin = admin; + } + + public String getGeoName() { + return geoName; + } + + public void setGeoName(String geoName) { + this.geoName = geoName; + } + + public int getHomeId() { + return homeId; + } + + public void setHomeId(int homeId) { + this.homeId = homeId; + } + + public int getHomeStatus() { + return homeStatus; + } + + public void setHomeStatus(int homeStatus) { + this.homeStatus = homeStatus; + } + + public double getLat() { + return lat; + } + + public void setLat(double lat) { + this.lat = lat; + } + + public double getLon() { + return lon; + } + + public void setLon(double lon) { + this.lon = lon; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRole() { + return role; + } + + public void setRole(int role) { + this.role = role; + } + + public List getRooms() { + return rooms; + } + + public void setRooms(List rooms) { + this.rooms = rooms; + } + + public static class RoomsModel { + private int displayOrder; + private String name; + private int roomId; + private boolean sel; + + public int getDisplayOrder() { + return displayOrder; + } + + public void setDisplayOrder(int displayOrder) { + this.displayOrder = displayOrder; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRoomId() { + return roomId; + } + + public void setRoomId(int roomId) { + this.roomId = roomId; + } + + public boolean isSel() { + return sel; + } + + public void setSel(boolean sel) { + this.sel = sel; + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/DialogManager.kt b/app/src/main/java/com/casic/br/utils/DialogManager.kt deleted file mode 100644 index da62e63..0000000 --- a/app/src/main/java/com/casic/br/utils/DialogManager.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.casic.br.utils; - -import android.app.Activity -import android.view.WindowManager -import com.pengxh.kt.lite.base.BaseSingleton -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog - -class DialogManager private constructor(private val activity: Activity) { - - private lateinit var loadingDialog: QMUITipDialog - - companion object : BaseSingleton() { - override val creator: (Activity) -> DialogManager - get() = ::DialogManager - } - - fun showLoadingDialog(message: String) { - loadingDialog = QMUITipDialog - .Builder(activity) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord(message) - .create() - if (!activity.isDestroyed) { - try { - loadingDialog.show() - } catch (e: WindowManager.BadTokenException) { - e.printStackTrace() - } - } - } - - fun dismissLoadingDialog() { - if (loadingDialog.isShowing) { - loadingDialog.dismiss() - } - } -} diff --git a/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt b/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt new file mode 100644 index 0000000..e04e327 --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt @@ -0,0 +1,31 @@ +package com.casic.br.utils + +import android.app.Activity +import android.view.WindowManager +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + +object LoadingDialogHub { + + private lateinit var loadingDialog: QMUITipDialog + + fun show(activity: Activity, message: String) { + loadingDialog = QMUITipDialog + .Builder(activity) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord(message) + .create() + if (!activity.isDestroyed) { + try { + loadingDialog.show() + } catch (e: WindowManager.BadTokenException) { + e.printStackTrace() + } + } + } + + fun dismiss() { + if (loadingDialog.isShowing) { + loadingDialog.dismiss() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 197a466..dd365ad 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -53,7 +53,8 @@ * String * ============================================================================================= * */ - const val USER_DETAIL_MODEL = "userDetailModel" + const val USER_IS_LOGIN = "isLogin" + const val HOME_DETAIL_MODEL = "homeDetailModel" const val SERVER_BASE_URL = "http://111.198.10.15:11304" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val ACCOUNT = "account" diff --git a/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt index ce8f99e..210a258 100644 --- a/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt @@ -30,13 +30,12 @@ override fun initEvent() { iotDevice.setOnClickListener { - navigatePageTo() - finish() + //IoT设备首先需要先配置网络 + navigatePageTo() } notIotDevice.setOnClickListener { navigatePageTo() - finish() } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt b/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt index d58aebd..ec99e90 100644 --- a/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt @@ -4,6 +4,8 @@ import com.casic.br.extensions.initLayoutImmersionBar import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_add_device_result.* class AddDeviceResultActivity : KotlinBaseActivity() { @@ -26,7 +28,8 @@ override fun initEvent() { completeButton.setOnClickListener { - finish() + navigatePageTo() + PageNavigationManager.finishAllActivity() } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt deleted file mode 100644 index 25ce475..0000000 --- a/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt +++ /dev/null @@ -1,56 +0,0 @@ -package com.casic.br.view - -import android.view.View -import android.widget.AdapterView -import com.casic.br.R -import com.casic.br.extensions.initLayoutImmersionBar -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo -import kotlinx.android.synthetic.main.activity_add_device_iot.* - -/** - * 添加IoT设备 - * */ -class AddIoTDeviceActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_add_device_iot - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(true).init() - initLayoutImmersionBar(rootView) - leftBackView.setOnClickListener { finish() } - } - - override fun initData() { - //默认选择WIFI快连 - connectTypeSpinner.setSelection(0) - } - - override fun initEvent() { - connectTypeSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>?, view: View?, position: Int, id: Long - ) { - - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - - } - } - - nextStepButton.setOnClickListener { - if (connectTypeSpinner.selectedItemPosition == 0) { - navigatePageTo() - } else { - navigatePageTo() - } - finish() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 9de6790..54975e3 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -1,11 +1,26 @@ package com.casic.br.view +import android.content.Context import com.casic.br.R +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.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.android.user.api.ILoginCallback +import com.tuya.smart.android.user.bean.User +import com.tuya.smart.home.sdk.TuyaHomeSdk +import kotlinx.android.synthetic.main.activity_login.* +import kotlinx.android.synthetic.main.activity_login.userPhoneView +import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { + private val context: Context = this@LoginActivity + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -21,6 +36,38 @@ } override fun initEvent() { + registerView.setOnClickListener { + navigatePageTo() + } + loginButton.setOnClickListener { + val userPhone = userPhoneView.text.toString() + if (userPhone.isBlank()) { + "请输入手机号".show(this) + return@setOnClickListener + } + val userPassword = passwordView.text.toString() + if (userPassword.isBlank()) { + "请输入密码".show(this) + return@setOnClickListener + } + + LoadingDialogHub.show(this, "登录中,请稍后") + TuyaHomeSdk.getUserInstance() + .loginWithPhonePassword("86", userPhone, userPassword, object : ILoginCallback { + override fun onSuccess(user: User?) { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, true) + LoadingDialogHub.dismiss() + navigatePageTo() + PageNavigationManager.finishAllActivity() + } + + override fun onError(code: String?, error: String?) { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, false) + LoadingDialogHub.dismiss() + "登录失败".show(context) + } + }) + } } } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3ea0e96..ba3523a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,15 +41,16 @@ + + - - + + - diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt index bf8285c..c90a197 100644 --- a/app/src/main/java/com/casic/br/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt @@ -1,16 +1,10 @@ package com.casic.br.base import android.app.Application -import android.util.Log import com.casic.br.greendao.DaoMaster import com.casic.br.greendao.DaoSession -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues -import com.tuya.smart.android.user.api.ILoginCallback -import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.home.sdk.bean.HomeBean -import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlin.properties.Delegates @@ -30,46 +24,13 @@ super.onCreate() instance = this SaveKeyValues.initSharedPreferences(this) - initTuya() + TuyaHomeSdk.init(this) + TuyaHomeSdk.setDebugMode(true) val devOpenHelper = DaoMaster.DevOpenHelper(this, "SmartKitchen.db", null) val daoMaster = DaoMaster(devOpenHelper.writableDatabase) daoSession = daoMaster.newSession() } - private fun initTuya() { - TuyaHomeSdk.init(this) - TuyaHomeSdk.setDebugMode(true) - /** - * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 - * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 - * 用户账号下创建任意多个家庭。 - * */ - //TODO 必须登录 - TuyaHomeSdk.getUserInstance() - .loginWithPhonePassword("86", "18310581916", "123456", object : ILoginCallback { - override fun onSuccess(user: User?) { - Log.d(kTag, "Login success:" + user!!.username) - } - - override fun onError(code: String, error: String) { - Log.e(kTag, "code: " + code + "error:" + error) - } - }) - - - TuyaHomeSdk.getHomeManagerInstance() - .createHome("北燃生活体验馆", 116.486394, 39.885734, "北燃生活体验馆", arrayListOf(), object : - ITuyaHomeResultCallback { - override fun onSuccess(bean: HomeBean?) { - Log.d(kTag, bean!!.toJson()) - } - - override fun onError(errorCode: String?, errorMsg: String?) { - Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") - } - }) - } - fun obtainDaoSession(): DaoSession { return daoSession } diff --git a/app/src/main/java/com/casic/br/extensions/Context.kt b/app/src/main/java/com/casic/br/extensions/Context.kt index 5866614..5726394 100644 --- a/app/src/main/java/com/casic/br/extensions/Context.kt +++ b/app/src/main/java/com/casic/br/extensions/Context.kt @@ -2,11 +2,16 @@ import android.content.Context import android.view.ViewGroup +import com.casic.br.base.BaseApplication +import com.pengxh.kt.lite.extensions.dp2px import com.qmuiteam.qmui.util.QMUIDisplayHelper fun Context.initLayoutImmersionBar(rootView: ViewGroup) { //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + if (statusBarHeight == 0) { + statusBarHeight = 44f.dp2px(BaseApplication.obtainInstance()) + } rootView.setPadding(0, statusBarHeight, 0, 0) rootView.requestLayout() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index cc20c54..4ef912b 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -1,25 +1,40 @@ package com.casic.br.fragment import android.graphics.Typeface +import android.util.Log import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.model.AddedDeviceModel +import com.casic.br.model.HomeModel import com.casic.br.model.RecommendModel +import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddDeviceActivity import com.casic.br.view.AllDeviceActivity import com.casic.br.view.device.FireplaceActivity import com.casic.br.view.device.RangeHoodActivity import com.casic.br.view.device.WaterHeaterActivity +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.fragment_device.* import kotlinx.android.synthetic.main.include_main_title.* import java.util.* + class DevicePageFragment : KotlinBaseFragment() { + private val kTag = "DevicePageFragment" + private val gson by lazy { Gson() } + override fun initLayoutView(): Int = R.layout.fragment_device override fun setupTopBarLayout() { @@ -37,16 +52,6 @@ model1.deviceModel = "D40-DM1" model1.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" deviceModels.add(model1) - val model2 = AddedDeviceModel() - model2.deviceName = "万家乐油烟机" - model2.deviceModel = "CXW-320-W7" - model2.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model2) - val model3 = AddedDeviceModel() - model3.deviceName = "万家乐壁挂炉" - model3.deviceModel = "26-13A3L" - model3.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model3) val addedDeviceAdapter = AddedDeviceAdapter(requireContext()) addedDeviceAdapter.setupDevice(deviceModels) @@ -102,8 +107,28 @@ } override fun initEvent() { - showAllDeviceLayout.setOnClickListener { + showAllDeviceButton.setOnClickListener { requireContext().navigatePageTo() } } + + override fun onResume() { + super.onResume() + val s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + if (s == "") { + return + } + val homeModel = gson.fromJson(s, object : TypeToken() {}.type) + TuyaHomeSdk.newHomeInstance(homeModel.homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + Log.d(kTag, deviceList.toJson()) + } + + override fun onError(errorCode: String, errorMsg: String) { + // do something + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 8aba9b2..84e947c 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -9,9 +9,13 @@ import com.casic.br.utils.GridItemDecoration import com.casic.br.utils.LocaleConstant import com.casic.br.view.LoginActivity +import com.casic.br.view.MainActivity import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.youth.banner.Banner import com.youth.banner.adapter.BannerImageAdapter import com.youth.banner.holder.BannerImageHolder @@ -90,7 +94,39 @@ override fun initEvent() { rightOperateView.setOnClickListener { - requireContext().navigatePageTo() + if (rightOperateView.text == "退出") { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出确认") + .setMessage("退出当前账号,将不能同步数据") + .setNegativeButton("取消") + .setPositiveButton("确认退出") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, false) + requireContext().navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) + .build().show() + } else { + requireContext().navigatePageTo() + } } } + + override fun onResume() { + val isLogin = SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + if (isLogin) { + rightOperateView.text = "退出" + } else { + rightOperateView.text = "登录" + } + super.onResume() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/model/HomeModel.java b/app/src/main/java/com/casic/br/model/HomeModel.java new file mode 100644 index 0000000..638d420 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/HomeModel.java @@ -0,0 +1,127 @@ +package com.casic.br.model; + +import java.util.List; + +public class HomeModel { + + private boolean admin; + private String geoName; + private int homeId; + private int homeStatus; + private double lat; + private double lon; + private String name; + private int role; + private List rooms; + + public boolean isAdmin() { + return admin; + } + + public void setAdmin(boolean admin) { + this.admin = admin; + } + + public String getGeoName() { + return geoName; + } + + public void setGeoName(String geoName) { + this.geoName = geoName; + } + + public int getHomeId() { + return homeId; + } + + public void setHomeId(int homeId) { + this.homeId = homeId; + } + + public int getHomeStatus() { + return homeStatus; + } + + public void setHomeStatus(int homeStatus) { + this.homeStatus = homeStatus; + } + + public double getLat() { + return lat; + } + + public void setLat(double lat) { + this.lat = lat; + } + + public double getLon() { + return lon; + } + + public void setLon(double lon) { + this.lon = lon; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRole() { + return role; + } + + public void setRole(int role) { + this.role = role; + } + + public List getRooms() { + return rooms; + } + + public void setRooms(List rooms) { + this.rooms = rooms; + } + + public static class RoomsModel { + private int displayOrder; + private String name; + private int roomId; + private boolean sel; + + public int getDisplayOrder() { + return displayOrder; + } + + public void setDisplayOrder(int displayOrder) { + this.displayOrder = displayOrder; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRoomId() { + return roomId; + } + + public void setRoomId(int roomId) { + this.roomId = roomId; + } + + public boolean isSel() { + return sel; + } + + public void setSel(boolean sel) { + this.sel = sel; + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/DialogManager.kt b/app/src/main/java/com/casic/br/utils/DialogManager.kt deleted file mode 100644 index da62e63..0000000 --- a/app/src/main/java/com/casic/br/utils/DialogManager.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.casic.br.utils; - -import android.app.Activity -import android.view.WindowManager -import com.pengxh.kt.lite.base.BaseSingleton -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog - -class DialogManager private constructor(private val activity: Activity) { - - private lateinit var loadingDialog: QMUITipDialog - - companion object : BaseSingleton() { - override val creator: (Activity) -> DialogManager - get() = ::DialogManager - } - - fun showLoadingDialog(message: String) { - loadingDialog = QMUITipDialog - .Builder(activity) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord(message) - .create() - if (!activity.isDestroyed) { - try { - loadingDialog.show() - } catch (e: WindowManager.BadTokenException) { - e.printStackTrace() - } - } - } - - fun dismissLoadingDialog() { - if (loadingDialog.isShowing) { - loadingDialog.dismiss() - } - } -} diff --git a/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt b/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt new file mode 100644 index 0000000..e04e327 --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt @@ -0,0 +1,31 @@ +package com.casic.br.utils + +import android.app.Activity +import android.view.WindowManager +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + +object LoadingDialogHub { + + private lateinit var loadingDialog: QMUITipDialog + + fun show(activity: Activity, message: String) { + loadingDialog = QMUITipDialog + .Builder(activity) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord(message) + .create() + if (!activity.isDestroyed) { + try { + loadingDialog.show() + } catch (e: WindowManager.BadTokenException) { + e.printStackTrace() + } + } + } + + fun dismiss() { + if (loadingDialog.isShowing) { + loadingDialog.dismiss() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 197a466..dd365ad 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -53,7 +53,8 @@ * String * ============================================================================================= * */ - const val USER_DETAIL_MODEL = "userDetailModel" + const val USER_IS_LOGIN = "isLogin" + const val HOME_DETAIL_MODEL = "homeDetailModel" const val SERVER_BASE_URL = "http://111.198.10.15:11304" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val ACCOUNT = "account" diff --git a/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt index ce8f99e..210a258 100644 --- a/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt @@ -30,13 +30,12 @@ override fun initEvent() { iotDevice.setOnClickListener { - navigatePageTo() - finish() + //IoT设备首先需要先配置网络 + navigatePageTo() } notIotDevice.setOnClickListener { navigatePageTo() - finish() } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt b/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt index d58aebd..ec99e90 100644 --- a/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt @@ -4,6 +4,8 @@ import com.casic.br.extensions.initLayoutImmersionBar import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_add_device_result.* class AddDeviceResultActivity : KotlinBaseActivity() { @@ -26,7 +28,8 @@ override fun initEvent() { completeButton.setOnClickListener { - finish() + navigatePageTo() + PageNavigationManager.finishAllActivity() } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt deleted file mode 100644 index 25ce475..0000000 --- a/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt +++ /dev/null @@ -1,56 +0,0 @@ -package com.casic.br.view - -import android.view.View -import android.widget.AdapterView -import com.casic.br.R -import com.casic.br.extensions.initLayoutImmersionBar -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo -import kotlinx.android.synthetic.main.activity_add_device_iot.* - -/** - * 添加IoT设备 - * */ -class AddIoTDeviceActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_add_device_iot - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(true).init() - initLayoutImmersionBar(rootView) - leftBackView.setOnClickListener { finish() } - } - - override fun initData() { - //默认选择WIFI快连 - connectTypeSpinner.setSelection(0) - } - - override fun initEvent() { - connectTypeSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>?, view: View?, position: Int, id: Long - ) { - - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - - } - } - - nextStepButton.setOnClickListener { - if (connectTypeSpinner.selectedItemPosition == 0) { - navigatePageTo() - } else { - navigatePageTo() - } - finish() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 9de6790..54975e3 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -1,11 +1,26 @@ package com.casic.br.view +import android.content.Context import com.casic.br.R +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.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.android.user.api.ILoginCallback +import com.tuya.smart.android.user.bean.User +import com.tuya.smart.home.sdk.TuyaHomeSdk +import kotlinx.android.synthetic.main.activity_login.* +import kotlinx.android.synthetic.main.activity_login.userPhoneView +import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { + private val context: Context = this@LoginActivity + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -21,6 +36,38 @@ } override fun initEvent() { + registerView.setOnClickListener { + navigatePageTo() + } + loginButton.setOnClickListener { + val userPhone = userPhoneView.text.toString() + if (userPhone.isBlank()) { + "请输入手机号".show(this) + return@setOnClickListener + } + val userPassword = passwordView.text.toString() + if (userPassword.isBlank()) { + "请输入密码".show(this) + return@setOnClickListener + } + + LoadingDialogHub.show(this, "登录中,请稍后") + TuyaHomeSdk.getUserInstance() + .loginWithPhonePassword("86", userPhone, userPassword, object : ILoginCallback { + override fun onSuccess(user: User?) { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, true) + LoadingDialogHub.dismiss() + navigatePageTo() + PageNavigationManager.finishAllActivity() + } + + override fun onError(code: String?, error: String?) { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, false) + LoadingDialogHub.dismiss() + "登录失败".show(context) + } + }) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index a2fb29a..25f4254 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -1,5 +1,6 @@ package com.casic.br.view +import android.util.Log import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment @@ -7,13 +8,20 @@ import com.casic.br.R import com.casic.br.adapter.ViewPagerAdapter import com.casic.br.fragment.* +import com.casic.br.utils.LocaleConstant import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { + private val kTag = "MainActivity" private var menuItem: MenuItem? = null private var fragmentPages: ArrayList = ArrayList() private var clickTime: Long = 0 @@ -33,7 +41,27 @@ } override fun initData() { + /** + * TODO 需要改为实际情况 + * + * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 + * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 + * 用户账号下创建任意多个家庭。 + * */ + val s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + if (s == "") { + TuyaHomeSdk.getHomeManagerInstance() + .createHome("北燃生活体验馆", 116.486394, 39.885734, "西直门内南小街", arrayListOf("1"), object : + ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean?) { + SaveKeyValues.putValue(LocaleConstant.HOME_DETAIL_MODEL, bean!!.toJson()) + } + override fun onError(errorCode: String?, errorMsg: String?) { + Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") + } + }) + } } override fun observeRequestState() { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3ea0e96..ba3523a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,15 +41,16 @@ + + - - + + - diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt index bf8285c..c90a197 100644 --- a/app/src/main/java/com/casic/br/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt @@ -1,16 +1,10 @@ package com.casic.br.base import android.app.Application -import android.util.Log import com.casic.br.greendao.DaoMaster import com.casic.br.greendao.DaoSession -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues -import com.tuya.smart.android.user.api.ILoginCallback -import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.home.sdk.bean.HomeBean -import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlin.properties.Delegates @@ -30,46 +24,13 @@ super.onCreate() instance = this SaveKeyValues.initSharedPreferences(this) - initTuya() + TuyaHomeSdk.init(this) + TuyaHomeSdk.setDebugMode(true) val devOpenHelper = DaoMaster.DevOpenHelper(this, "SmartKitchen.db", null) val daoMaster = DaoMaster(devOpenHelper.writableDatabase) daoSession = daoMaster.newSession() } - private fun initTuya() { - TuyaHomeSdk.init(this) - TuyaHomeSdk.setDebugMode(true) - /** - * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 - * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 - * 用户账号下创建任意多个家庭。 - * */ - //TODO 必须登录 - TuyaHomeSdk.getUserInstance() - .loginWithPhonePassword("86", "18310581916", "123456", object : ILoginCallback { - override fun onSuccess(user: User?) { - Log.d(kTag, "Login success:" + user!!.username) - } - - override fun onError(code: String, error: String) { - Log.e(kTag, "code: " + code + "error:" + error) - } - }) - - - TuyaHomeSdk.getHomeManagerInstance() - .createHome("北燃生活体验馆", 116.486394, 39.885734, "北燃生活体验馆", arrayListOf(), object : - ITuyaHomeResultCallback { - override fun onSuccess(bean: HomeBean?) { - Log.d(kTag, bean!!.toJson()) - } - - override fun onError(errorCode: String?, errorMsg: String?) { - Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") - } - }) - } - fun obtainDaoSession(): DaoSession { return daoSession } diff --git a/app/src/main/java/com/casic/br/extensions/Context.kt b/app/src/main/java/com/casic/br/extensions/Context.kt index 5866614..5726394 100644 --- a/app/src/main/java/com/casic/br/extensions/Context.kt +++ b/app/src/main/java/com/casic/br/extensions/Context.kt @@ -2,11 +2,16 @@ import android.content.Context import android.view.ViewGroup +import com.casic.br.base.BaseApplication +import com.pengxh.kt.lite.extensions.dp2px import com.qmuiteam.qmui.util.QMUIDisplayHelper fun Context.initLayoutImmersionBar(rootView: ViewGroup) { //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + if (statusBarHeight == 0) { + statusBarHeight = 44f.dp2px(BaseApplication.obtainInstance()) + } rootView.setPadding(0, statusBarHeight, 0, 0) rootView.requestLayout() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index cc20c54..4ef912b 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -1,25 +1,40 @@ package com.casic.br.fragment import android.graphics.Typeface +import android.util.Log import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.model.AddedDeviceModel +import com.casic.br.model.HomeModel import com.casic.br.model.RecommendModel +import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddDeviceActivity import com.casic.br.view.AllDeviceActivity import com.casic.br.view.device.FireplaceActivity import com.casic.br.view.device.RangeHoodActivity import com.casic.br.view.device.WaterHeaterActivity +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.fragment_device.* import kotlinx.android.synthetic.main.include_main_title.* import java.util.* + class DevicePageFragment : KotlinBaseFragment() { + private val kTag = "DevicePageFragment" + private val gson by lazy { Gson() } + override fun initLayoutView(): Int = R.layout.fragment_device override fun setupTopBarLayout() { @@ -37,16 +52,6 @@ model1.deviceModel = "D40-DM1" model1.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" deviceModels.add(model1) - val model2 = AddedDeviceModel() - model2.deviceName = "万家乐油烟机" - model2.deviceModel = "CXW-320-W7" - model2.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model2) - val model3 = AddedDeviceModel() - model3.deviceName = "万家乐壁挂炉" - model3.deviceModel = "26-13A3L" - model3.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model3) val addedDeviceAdapter = AddedDeviceAdapter(requireContext()) addedDeviceAdapter.setupDevice(deviceModels) @@ -102,8 +107,28 @@ } override fun initEvent() { - showAllDeviceLayout.setOnClickListener { + showAllDeviceButton.setOnClickListener { requireContext().navigatePageTo() } } + + override fun onResume() { + super.onResume() + val s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + if (s == "") { + return + } + val homeModel = gson.fromJson(s, object : TypeToken() {}.type) + TuyaHomeSdk.newHomeInstance(homeModel.homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + Log.d(kTag, deviceList.toJson()) + } + + override fun onError(errorCode: String, errorMsg: String) { + // do something + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 8aba9b2..84e947c 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -9,9 +9,13 @@ import com.casic.br.utils.GridItemDecoration import com.casic.br.utils.LocaleConstant import com.casic.br.view.LoginActivity +import com.casic.br.view.MainActivity import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.youth.banner.Banner import com.youth.banner.adapter.BannerImageAdapter import com.youth.banner.holder.BannerImageHolder @@ -90,7 +94,39 @@ override fun initEvent() { rightOperateView.setOnClickListener { - requireContext().navigatePageTo() + if (rightOperateView.text == "退出") { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出确认") + .setMessage("退出当前账号,将不能同步数据") + .setNegativeButton("取消") + .setPositiveButton("确认退出") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, false) + requireContext().navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) + .build().show() + } else { + requireContext().navigatePageTo() + } } } + + override fun onResume() { + val isLogin = SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + if (isLogin) { + rightOperateView.text = "退出" + } else { + rightOperateView.text = "登录" + } + super.onResume() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/model/HomeModel.java b/app/src/main/java/com/casic/br/model/HomeModel.java new file mode 100644 index 0000000..638d420 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/HomeModel.java @@ -0,0 +1,127 @@ +package com.casic.br.model; + +import java.util.List; + +public class HomeModel { + + private boolean admin; + private String geoName; + private int homeId; + private int homeStatus; + private double lat; + private double lon; + private String name; + private int role; + private List rooms; + + public boolean isAdmin() { + return admin; + } + + public void setAdmin(boolean admin) { + this.admin = admin; + } + + public String getGeoName() { + return geoName; + } + + public void setGeoName(String geoName) { + this.geoName = geoName; + } + + public int getHomeId() { + return homeId; + } + + public void setHomeId(int homeId) { + this.homeId = homeId; + } + + public int getHomeStatus() { + return homeStatus; + } + + public void setHomeStatus(int homeStatus) { + this.homeStatus = homeStatus; + } + + public double getLat() { + return lat; + } + + public void setLat(double lat) { + this.lat = lat; + } + + public double getLon() { + return lon; + } + + public void setLon(double lon) { + this.lon = lon; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRole() { + return role; + } + + public void setRole(int role) { + this.role = role; + } + + public List getRooms() { + return rooms; + } + + public void setRooms(List rooms) { + this.rooms = rooms; + } + + public static class RoomsModel { + private int displayOrder; + private String name; + private int roomId; + private boolean sel; + + public int getDisplayOrder() { + return displayOrder; + } + + public void setDisplayOrder(int displayOrder) { + this.displayOrder = displayOrder; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRoomId() { + return roomId; + } + + public void setRoomId(int roomId) { + this.roomId = roomId; + } + + public boolean isSel() { + return sel; + } + + public void setSel(boolean sel) { + this.sel = sel; + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/DialogManager.kt b/app/src/main/java/com/casic/br/utils/DialogManager.kt deleted file mode 100644 index da62e63..0000000 --- a/app/src/main/java/com/casic/br/utils/DialogManager.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.casic.br.utils; - -import android.app.Activity -import android.view.WindowManager -import com.pengxh.kt.lite.base.BaseSingleton -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog - -class DialogManager private constructor(private val activity: Activity) { - - private lateinit var loadingDialog: QMUITipDialog - - companion object : BaseSingleton() { - override val creator: (Activity) -> DialogManager - get() = ::DialogManager - } - - fun showLoadingDialog(message: String) { - loadingDialog = QMUITipDialog - .Builder(activity) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord(message) - .create() - if (!activity.isDestroyed) { - try { - loadingDialog.show() - } catch (e: WindowManager.BadTokenException) { - e.printStackTrace() - } - } - } - - fun dismissLoadingDialog() { - if (loadingDialog.isShowing) { - loadingDialog.dismiss() - } - } -} diff --git a/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt b/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt new file mode 100644 index 0000000..e04e327 --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt @@ -0,0 +1,31 @@ +package com.casic.br.utils + +import android.app.Activity +import android.view.WindowManager +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + +object LoadingDialogHub { + + private lateinit var loadingDialog: QMUITipDialog + + fun show(activity: Activity, message: String) { + loadingDialog = QMUITipDialog + .Builder(activity) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord(message) + .create() + if (!activity.isDestroyed) { + try { + loadingDialog.show() + } catch (e: WindowManager.BadTokenException) { + e.printStackTrace() + } + } + } + + fun dismiss() { + if (loadingDialog.isShowing) { + loadingDialog.dismiss() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 197a466..dd365ad 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -53,7 +53,8 @@ * String * ============================================================================================= * */ - const val USER_DETAIL_MODEL = "userDetailModel" + const val USER_IS_LOGIN = "isLogin" + const val HOME_DETAIL_MODEL = "homeDetailModel" const val SERVER_BASE_URL = "http://111.198.10.15:11304" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val ACCOUNT = "account" diff --git a/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt index ce8f99e..210a258 100644 --- a/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt @@ -30,13 +30,12 @@ override fun initEvent() { iotDevice.setOnClickListener { - navigatePageTo() - finish() + //IoT设备首先需要先配置网络 + navigatePageTo() } notIotDevice.setOnClickListener { navigatePageTo() - finish() } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt b/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt index d58aebd..ec99e90 100644 --- a/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt @@ -4,6 +4,8 @@ import com.casic.br.extensions.initLayoutImmersionBar import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_add_device_result.* class AddDeviceResultActivity : KotlinBaseActivity() { @@ -26,7 +28,8 @@ override fun initEvent() { completeButton.setOnClickListener { - finish() + navigatePageTo() + PageNavigationManager.finishAllActivity() } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt deleted file mode 100644 index 25ce475..0000000 --- a/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt +++ /dev/null @@ -1,56 +0,0 @@ -package com.casic.br.view - -import android.view.View -import android.widget.AdapterView -import com.casic.br.R -import com.casic.br.extensions.initLayoutImmersionBar -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo -import kotlinx.android.synthetic.main.activity_add_device_iot.* - -/** - * 添加IoT设备 - * */ -class AddIoTDeviceActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_add_device_iot - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(true).init() - initLayoutImmersionBar(rootView) - leftBackView.setOnClickListener { finish() } - } - - override fun initData() { - //默认选择WIFI快连 - connectTypeSpinner.setSelection(0) - } - - override fun initEvent() { - connectTypeSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>?, view: View?, position: Int, id: Long - ) { - - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - - } - } - - nextStepButton.setOnClickListener { - if (connectTypeSpinner.selectedItemPosition == 0) { - navigatePageTo() - } else { - navigatePageTo() - } - finish() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 9de6790..54975e3 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -1,11 +1,26 @@ package com.casic.br.view +import android.content.Context import com.casic.br.R +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.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.android.user.api.ILoginCallback +import com.tuya.smart.android.user.bean.User +import com.tuya.smart.home.sdk.TuyaHomeSdk +import kotlinx.android.synthetic.main.activity_login.* +import kotlinx.android.synthetic.main.activity_login.userPhoneView +import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { + private val context: Context = this@LoginActivity + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -21,6 +36,38 @@ } override fun initEvent() { + registerView.setOnClickListener { + navigatePageTo() + } + loginButton.setOnClickListener { + val userPhone = userPhoneView.text.toString() + if (userPhone.isBlank()) { + "请输入手机号".show(this) + return@setOnClickListener + } + val userPassword = passwordView.text.toString() + if (userPassword.isBlank()) { + "请输入密码".show(this) + return@setOnClickListener + } + + LoadingDialogHub.show(this, "登录中,请稍后") + TuyaHomeSdk.getUserInstance() + .loginWithPhonePassword("86", userPhone, userPassword, object : ILoginCallback { + override fun onSuccess(user: User?) { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, true) + LoadingDialogHub.dismiss() + navigatePageTo() + PageNavigationManager.finishAllActivity() + } + + override fun onError(code: String?, error: String?) { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, false) + LoadingDialogHub.dismiss() + "登录失败".show(context) + } + }) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index a2fb29a..25f4254 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -1,5 +1,6 @@ package com.casic.br.view +import android.util.Log import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment @@ -7,13 +8,20 @@ import com.casic.br.R import com.casic.br.adapter.ViewPagerAdapter import com.casic.br.fragment.* +import com.casic.br.utils.LocaleConstant import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { + private val kTag = "MainActivity" private var menuItem: MenuItem? = null private var fragmentPages: ArrayList = ArrayList() private var clickTime: Long = 0 @@ -33,7 +41,27 @@ } override fun initData() { + /** + * TODO 需要改为实际情况 + * + * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 + * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 + * 用户账号下创建任意多个家庭。 + * */ + val s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + if (s == "") { + TuyaHomeSdk.getHomeManagerInstance() + .createHome("北燃生活体验馆", 116.486394, 39.885734, "西直门内南小街", arrayListOf("1"), object : + ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean?) { + SaveKeyValues.putValue(LocaleConstant.HOME_DETAIL_MODEL, bean!!.toJson()) + } + override fun onError(errorCode: String?, errorMsg: String?) { + Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") + } + }) + } } override fun observeRequestState() { diff --git a/app/src/main/java/com/casic/br/view/RegisterActivity.kt b/app/src/main/java/com/casic/br/view/RegisterActivity.kt new file mode 100644 index 0000000..96510fb --- /dev/null +++ b/app/src/main/java/com/casic/br/view/RegisterActivity.kt @@ -0,0 +1,113 @@ +package com.casic.br.view + +import android.content.Context +import android.os.CountDownTimer +import com.casic.br.R +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.isPhoneNumber +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.tuya.smart.android.user.api.IRegisterCallback +import com.tuya.smart.android.user.bean.User +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback +import kotlinx.android.synthetic.main.activity_register.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import java.util.* + +class RegisterActivity : KotlinBaseActivity() { + + private val kTag = "RegisterActivity" + private val context: Context = this@RegisterActivity + + override fun initLayoutView(): Int = R.layout.activity_register + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.text = "注册账号" + } + + override fun initData() { + + } + + override fun initEvent() { + requestCodeButton.setOnClickListener { + if (userPhoneView.text.toString().isBlank()) { + "请输入手机号".show(this) + return@setOnClickListener + } + if (!userPhoneView.text.toString().isPhoneNumber()) { + "手机号不正确,请检查".show(this) + return@setOnClickListener + } + //发送验证码 + TuyaHomeSdk.getUserInstance().sendVerifyCodeWithUserName( + userPhoneView.text.toString(), "", "86", 1, + object : IResultCallback { + override fun onSuccess() { + "发送验证码成功".show(context) + } + + override fun onError(code: String?, error: String?) { + "发送验证码失败".show(context) + } + }) + + //开始倒计时 + object : CountDownTimer(60 * 1000, 1000) { + override fun onTick(millisUntilFinished: Long) { + requestCodeButton.text = String.format("${millisUntilFinished / 1000}s") + requestCodeButton.isEnabled = false + } + + override fun onFinish() { + requestCodeButton.text = "获取验证码" + requestCodeButton.isEnabled = true + } + }.start() + } + + registerButton.setOnClickListener { + val userPhone = userPhoneView.text.toString() + if (userPhone.isBlank()) { + "请输入手机号".show(this) + return@setOnClickListener + } + val smsCode = requestCodeView.text.toString() + if (smsCode.isBlank()) { + "请输入验证码".show(this) + return@setOnClickListener + } + val userPassword = userPasswordView.text.toString() + if (userPassword.isBlank()) { + "请输入密码".show(this) + return@setOnClickListener + } + + LoadingDialogHub.show(this, "注册中,请稍后") + TuyaHomeSdk.getUserInstance().registerAccountWithPhone( + "86", userPhone, userPassword, smsCode, + object : IRegisterCallback { + override fun onSuccess(user: User?) { + LoadingDialogHub.dismiss() + navigatePageTo() + } + + override fun onError(code: String?, error: String?) { + LoadingDialogHub.dismiss() + "用户注册失败".show(context) + } + }) + } + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3ea0e96..ba3523a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,15 +41,16 @@ + + - - + + - diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt index bf8285c..c90a197 100644 --- a/app/src/main/java/com/casic/br/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt @@ -1,16 +1,10 @@ package com.casic.br.base import android.app.Application -import android.util.Log import com.casic.br.greendao.DaoMaster import com.casic.br.greendao.DaoSession -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues -import com.tuya.smart.android.user.api.ILoginCallback -import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.home.sdk.bean.HomeBean -import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlin.properties.Delegates @@ -30,46 +24,13 @@ super.onCreate() instance = this SaveKeyValues.initSharedPreferences(this) - initTuya() + TuyaHomeSdk.init(this) + TuyaHomeSdk.setDebugMode(true) val devOpenHelper = DaoMaster.DevOpenHelper(this, "SmartKitchen.db", null) val daoMaster = DaoMaster(devOpenHelper.writableDatabase) daoSession = daoMaster.newSession() } - private fun initTuya() { - TuyaHomeSdk.init(this) - TuyaHomeSdk.setDebugMode(true) - /** - * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 - * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 - * 用户账号下创建任意多个家庭。 - * */ - //TODO 必须登录 - TuyaHomeSdk.getUserInstance() - .loginWithPhonePassword("86", "18310581916", "123456", object : ILoginCallback { - override fun onSuccess(user: User?) { - Log.d(kTag, "Login success:" + user!!.username) - } - - override fun onError(code: String, error: String) { - Log.e(kTag, "code: " + code + "error:" + error) - } - }) - - - TuyaHomeSdk.getHomeManagerInstance() - .createHome("北燃生活体验馆", 116.486394, 39.885734, "北燃生活体验馆", arrayListOf(), object : - ITuyaHomeResultCallback { - override fun onSuccess(bean: HomeBean?) { - Log.d(kTag, bean!!.toJson()) - } - - override fun onError(errorCode: String?, errorMsg: String?) { - Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") - } - }) - } - fun obtainDaoSession(): DaoSession { return daoSession } diff --git a/app/src/main/java/com/casic/br/extensions/Context.kt b/app/src/main/java/com/casic/br/extensions/Context.kt index 5866614..5726394 100644 --- a/app/src/main/java/com/casic/br/extensions/Context.kt +++ b/app/src/main/java/com/casic/br/extensions/Context.kt @@ -2,11 +2,16 @@ import android.content.Context import android.view.ViewGroup +import com.casic.br.base.BaseApplication +import com.pengxh.kt.lite.extensions.dp2px import com.qmuiteam.qmui.util.QMUIDisplayHelper fun Context.initLayoutImmersionBar(rootView: ViewGroup) { //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + if (statusBarHeight == 0) { + statusBarHeight = 44f.dp2px(BaseApplication.obtainInstance()) + } rootView.setPadding(0, statusBarHeight, 0, 0) rootView.requestLayout() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index cc20c54..4ef912b 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -1,25 +1,40 @@ package com.casic.br.fragment import android.graphics.Typeface +import android.util.Log import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.model.AddedDeviceModel +import com.casic.br.model.HomeModel import com.casic.br.model.RecommendModel +import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddDeviceActivity import com.casic.br.view.AllDeviceActivity import com.casic.br.view.device.FireplaceActivity import com.casic.br.view.device.RangeHoodActivity import com.casic.br.view.device.WaterHeaterActivity +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.fragment_device.* import kotlinx.android.synthetic.main.include_main_title.* import java.util.* + class DevicePageFragment : KotlinBaseFragment() { + private val kTag = "DevicePageFragment" + private val gson by lazy { Gson() } + override fun initLayoutView(): Int = R.layout.fragment_device override fun setupTopBarLayout() { @@ -37,16 +52,6 @@ model1.deviceModel = "D40-DM1" model1.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" deviceModels.add(model1) - val model2 = AddedDeviceModel() - model2.deviceName = "万家乐油烟机" - model2.deviceModel = "CXW-320-W7" - model2.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model2) - val model3 = AddedDeviceModel() - model3.deviceName = "万家乐壁挂炉" - model3.deviceModel = "26-13A3L" - model3.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model3) val addedDeviceAdapter = AddedDeviceAdapter(requireContext()) addedDeviceAdapter.setupDevice(deviceModels) @@ -102,8 +107,28 @@ } override fun initEvent() { - showAllDeviceLayout.setOnClickListener { + showAllDeviceButton.setOnClickListener { requireContext().navigatePageTo() } } + + override fun onResume() { + super.onResume() + val s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + if (s == "") { + return + } + val homeModel = gson.fromJson(s, object : TypeToken() {}.type) + TuyaHomeSdk.newHomeInstance(homeModel.homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + Log.d(kTag, deviceList.toJson()) + } + + override fun onError(errorCode: String, errorMsg: String) { + // do something + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 8aba9b2..84e947c 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -9,9 +9,13 @@ import com.casic.br.utils.GridItemDecoration import com.casic.br.utils.LocaleConstant import com.casic.br.view.LoginActivity +import com.casic.br.view.MainActivity import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.youth.banner.Banner import com.youth.banner.adapter.BannerImageAdapter import com.youth.banner.holder.BannerImageHolder @@ -90,7 +94,39 @@ override fun initEvent() { rightOperateView.setOnClickListener { - requireContext().navigatePageTo() + if (rightOperateView.text == "退出") { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出确认") + .setMessage("退出当前账号,将不能同步数据") + .setNegativeButton("取消") + .setPositiveButton("确认退出") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, false) + requireContext().navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) + .build().show() + } else { + requireContext().navigatePageTo() + } } } + + override fun onResume() { + val isLogin = SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + if (isLogin) { + rightOperateView.text = "退出" + } else { + rightOperateView.text = "登录" + } + super.onResume() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/model/HomeModel.java b/app/src/main/java/com/casic/br/model/HomeModel.java new file mode 100644 index 0000000..638d420 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/HomeModel.java @@ -0,0 +1,127 @@ +package com.casic.br.model; + +import java.util.List; + +public class HomeModel { + + private boolean admin; + private String geoName; + private int homeId; + private int homeStatus; + private double lat; + private double lon; + private String name; + private int role; + private List rooms; + + public boolean isAdmin() { + return admin; + } + + public void setAdmin(boolean admin) { + this.admin = admin; + } + + public String getGeoName() { + return geoName; + } + + public void setGeoName(String geoName) { + this.geoName = geoName; + } + + public int getHomeId() { + return homeId; + } + + public void setHomeId(int homeId) { + this.homeId = homeId; + } + + public int getHomeStatus() { + return homeStatus; + } + + public void setHomeStatus(int homeStatus) { + this.homeStatus = homeStatus; + } + + public double getLat() { + return lat; + } + + public void setLat(double lat) { + this.lat = lat; + } + + public double getLon() { + return lon; + } + + public void setLon(double lon) { + this.lon = lon; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRole() { + return role; + } + + public void setRole(int role) { + this.role = role; + } + + public List getRooms() { + return rooms; + } + + public void setRooms(List rooms) { + this.rooms = rooms; + } + + public static class RoomsModel { + private int displayOrder; + private String name; + private int roomId; + private boolean sel; + + public int getDisplayOrder() { + return displayOrder; + } + + public void setDisplayOrder(int displayOrder) { + this.displayOrder = displayOrder; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRoomId() { + return roomId; + } + + public void setRoomId(int roomId) { + this.roomId = roomId; + } + + public boolean isSel() { + return sel; + } + + public void setSel(boolean sel) { + this.sel = sel; + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/DialogManager.kt b/app/src/main/java/com/casic/br/utils/DialogManager.kt deleted file mode 100644 index da62e63..0000000 --- a/app/src/main/java/com/casic/br/utils/DialogManager.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.casic.br.utils; - -import android.app.Activity -import android.view.WindowManager -import com.pengxh.kt.lite.base.BaseSingleton -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog - -class DialogManager private constructor(private val activity: Activity) { - - private lateinit var loadingDialog: QMUITipDialog - - companion object : BaseSingleton() { - override val creator: (Activity) -> DialogManager - get() = ::DialogManager - } - - fun showLoadingDialog(message: String) { - loadingDialog = QMUITipDialog - .Builder(activity) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord(message) - .create() - if (!activity.isDestroyed) { - try { - loadingDialog.show() - } catch (e: WindowManager.BadTokenException) { - e.printStackTrace() - } - } - } - - fun dismissLoadingDialog() { - if (loadingDialog.isShowing) { - loadingDialog.dismiss() - } - } -} diff --git a/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt b/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt new file mode 100644 index 0000000..e04e327 --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt @@ -0,0 +1,31 @@ +package com.casic.br.utils + +import android.app.Activity +import android.view.WindowManager +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + +object LoadingDialogHub { + + private lateinit var loadingDialog: QMUITipDialog + + fun show(activity: Activity, message: String) { + loadingDialog = QMUITipDialog + .Builder(activity) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord(message) + .create() + if (!activity.isDestroyed) { + try { + loadingDialog.show() + } catch (e: WindowManager.BadTokenException) { + e.printStackTrace() + } + } + } + + fun dismiss() { + if (loadingDialog.isShowing) { + loadingDialog.dismiss() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 197a466..dd365ad 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -53,7 +53,8 @@ * String * ============================================================================================= * */ - const val USER_DETAIL_MODEL = "userDetailModel" + const val USER_IS_LOGIN = "isLogin" + const val HOME_DETAIL_MODEL = "homeDetailModel" const val SERVER_BASE_URL = "http://111.198.10.15:11304" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val ACCOUNT = "account" diff --git a/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt index ce8f99e..210a258 100644 --- a/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt @@ -30,13 +30,12 @@ override fun initEvent() { iotDevice.setOnClickListener { - navigatePageTo() - finish() + //IoT设备首先需要先配置网络 + navigatePageTo() } notIotDevice.setOnClickListener { navigatePageTo() - finish() } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt b/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt index d58aebd..ec99e90 100644 --- a/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt @@ -4,6 +4,8 @@ import com.casic.br.extensions.initLayoutImmersionBar import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_add_device_result.* class AddDeviceResultActivity : KotlinBaseActivity() { @@ -26,7 +28,8 @@ override fun initEvent() { completeButton.setOnClickListener { - finish() + navigatePageTo() + PageNavigationManager.finishAllActivity() } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt deleted file mode 100644 index 25ce475..0000000 --- a/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt +++ /dev/null @@ -1,56 +0,0 @@ -package com.casic.br.view - -import android.view.View -import android.widget.AdapterView -import com.casic.br.R -import com.casic.br.extensions.initLayoutImmersionBar -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo -import kotlinx.android.synthetic.main.activity_add_device_iot.* - -/** - * 添加IoT设备 - * */ -class AddIoTDeviceActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_add_device_iot - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(true).init() - initLayoutImmersionBar(rootView) - leftBackView.setOnClickListener { finish() } - } - - override fun initData() { - //默认选择WIFI快连 - connectTypeSpinner.setSelection(0) - } - - override fun initEvent() { - connectTypeSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>?, view: View?, position: Int, id: Long - ) { - - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - - } - } - - nextStepButton.setOnClickListener { - if (connectTypeSpinner.selectedItemPosition == 0) { - navigatePageTo() - } else { - navigatePageTo() - } - finish() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 9de6790..54975e3 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -1,11 +1,26 @@ package com.casic.br.view +import android.content.Context import com.casic.br.R +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.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.android.user.api.ILoginCallback +import com.tuya.smart.android.user.bean.User +import com.tuya.smart.home.sdk.TuyaHomeSdk +import kotlinx.android.synthetic.main.activity_login.* +import kotlinx.android.synthetic.main.activity_login.userPhoneView +import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { + private val context: Context = this@LoginActivity + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -21,6 +36,38 @@ } override fun initEvent() { + registerView.setOnClickListener { + navigatePageTo() + } + loginButton.setOnClickListener { + val userPhone = userPhoneView.text.toString() + if (userPhone.isBlank()) { + "请输入手机号".show(this) + return@setOnClickListener + } + val userPassword = passwordView.text.toString() + if (userPassword.isBlank()) { + "请输入密码".show(this) + return@setOnClickListener + } + + LoadingDialogHub.show(this, "登录中,请稍后") + TuyaHomeSdk.getUserInstance() + .loginWithPhonePassword("86", userPhone, userPassword, object : ILoginCallback { + override fun onSuccess(user: User?) { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, true) + LoadingDialogHub.dismiss() + navigatePageTo() + PageNavigationManager.finishAllActivity() + } + + override fun onError(code: String?, error: String?) { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, false) + LoadingDialogHub.dismiss() + "登录失败".show(context) + } + }) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index a2fb29a..25f4254 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -1,5 +1,6 @@ package com.casic.br.view +import android.util.Log import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment @@ -7,13 +8,20 @@ import com.casic.br.R import com.casic.br.adapter.ViewPagerAdapter import com.casic.br.fragment.* +import com.casic.br.utils.LocaleConstant import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { + private val kTag = "MainActivity" private var menuItem: MenuItem? = null private var fragmentPages: ArrayList = ArrayList() private var clickTime: Long = 0 @@ -33,7 +41,27 @@ } override fun initData() { + /** + * TODO 需要改为实际情况 + * + * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 + * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 + * 用户账号下创建任意多个家庭。 + * */ + val s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + if (s == "") { + TuyaHomeSdk.getHomeManagerInstance() + .createHome("北燃生活体验馆", 116.486394, 39.885734, "西直门内南小街", arrayListOf("1"), object : + ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean?) { + SaveKeyValues.putValue(LocaleConstant.HOME_DETAIL_MODEL, bean!!.toJson()) + } + override fun onError(errorCode: String?, errorMsg: String?) { + Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") + } + }) + } } override fun observeRequestState() { diff --git a/app/src/main/java/com/casic/br/view/RegisterActivity.kt b/app/src/main/java/com/casic/br/view/RegisterActivity.kt new file mode 100644 index 0000000..96510fb --- /dev/null +++ b/app/src/main/java/com/casic/br/view/RegisterActivity.kt @@ -0,0 +1,113 @@ +package com.casic.br.view + +import android.content.Context +import android.os.CountDownTimer +import com.casic.br.R +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.isPhoneNumber +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.tuya.smart.android.user.api.IRegisterCallback +import com.tuya.smart.android.user.bean.User +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback +import kotlinx.android.synthetic.main.activity_register.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import java.util.* + +class RegisterActivity : KotlinBaseActivity() { + + private val kTag = "RegisterActivity" + private val context: Context = this@RegisterActivity + + override fun initLayoutView(): Int = R.layout.activity_register + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.text = "注册账号" + } + + override fun initData() { + + } + + override fun initEvent() { + requestCodeButton.setOnClickListener { + if (userPhoneView.text.toString().isBlank()) { + "请输入手机号".show(this) + return@setOnClickListener + } + if (!userPhoneView.text.toString().isPhoneNumber()) { + "手机号不正确,请检查".show(this) + return@setOnClickListener + } + //发送验证码 + TuyaHomeSdk.getUserInstance().sendVerifyCodeWithUserName( + userPhoneView.text.toString(), "", "86", 1, + object : IResultCallback { + override fun onSuccess() { + "发送验证码成功".show(context) + } + + override fun onError(code: String?, error: String?) { + "发送验证码失败".show(context) + } + }) + + //开始倒计时 + object : CountDownTimer(60 * 1000, 1000) { + override fun onTick(millisUntilFinished: Long) { + requestCodeButton.text = String.format("${millisUntilFinished / 1000}s") + requestCodeButton.isEnabled = false + } + + override fun onFinish() { + requestCodeButton.text = "获取验证码" + requestCodeButton.isEnabled = true + } + }.start() + } + + registerButton.setOnClickListener { + val userPhone = userPhoneView.text.toString() + if (userPhone.isBlank()) { + "请输入手机号".show(this) + return@setOnClickListener + } + val smsCode = requestCodeView.text.toString() + if (smsCode.isBlank()) { + "请输入验证码".show(this) + return@setOnClickListener + } + val userPassword = userPasswordView.text.toString() + if (userPassword.isBlank()) { + "请输入密码".show(this) + return@setOnClickListener + } + + LoadingDialogHub.show(this, "注册中,请稍后") + TuyaHomeSdk.getUserInstance().registerAccountWithPhone( + "86", userPhone, userPassword, smsCode, + object : IRegisterCallback { + override fun onSuccess(user: User?) { + LoadingDialogHub.dismiss() + navigatePageTo() + } + + override fun onError(code: String?, error: String?) { + LoadingDialogHub.dismiss() + "用户注册失败".show(context) + } + }) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/RegisterResultActivity.kt b/app/src/main/java/com/casic/br/view/RegisterResultActivity.kt new file mode 100644 index 0000000..6a0de18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/RegisterResultActivity.kt @@ -0,0 +1,40 @@ +package com.casic.br.view + +import android.view.View +import com.casic.br.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import kotlinx.android.synthetic.main.activity_register_result.* +import kotlinx.android.synthetic.main.include_left_back_title.* + +class RegisterResultActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_register_result + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.visibility = View.GONE + } + + override fun observeRequestState() { + + } + + override fun initData() { + + } + + override fun initEvent() { + loginButton.setOnClickListener { + navigatePageTo() + PageNavigationManager.finishAllActivity() + } + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3ea0e96..ba3523a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,15 +41,16 @@ + + - - + + - diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt index bf8285c..c90a197 100644 --- a/app/src/main/java/com/casic/br/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt @@ -1,16 +1,10 @@ package com.casic.br.base import android.app.Application -import android.util.Log import com.casic.br.greendao.DaoMaster import com.casic.br.greendao.DaoSession -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues -import com.tuya.smart.android.user.api.ILoginCallback -import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.home.sdk.bean.HomeBean -import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlin.properties.Delegates @@ -30,46 +24,13 @@ super.onCreate() instance = this SaveKeyValues.initSharedPreferences(this) - initTuya() + TuyaHomeSdk.init(this) + TuyaHomeSdk.setDebugMode(true) val devOpenHelper = DaoMaster.DevOpenHelper(this, "SmartKitchen.db", null) val daoMaster = DaoMaster(devOpenHelper.writableDatabase) daoSession = daoMaster.newSession() } - private fun initTuya() { - TuyaHomeSdk.init(this) - TuyaHomeSdk.setDebugMode(true) - /** - * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 - * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 - * 用户账号下创建任意多个家庭。 - * */ - //TODO 必须登录 - TuyaHomeSdk.getUserInstance() - .loginWithPhonePassword("86", "18310581916", "123456", object : ILoginCallback { - override fun onSuccess(user: User?) { - Log.d(kTag, "Login success:" + user!!.username) - } - - override fun onError(code: String, error: String) { - Log.e(kTag, "code: " + code + "error:" + error) - } - }) - - - TuyaHomeSdk.getHomeManagerInstance() - .createHome("北燃生活体验馆", 116.486394, 39.885734, "北燃生活体验馆", arrayListOf(), object : - ITuyaHomeResultCallback { - override fun onSuccess(bean: HomeBean?) { - Log.d(kTag, bean!!.toJson()) - } - - override fun onError(errorCode: String?, errorMsg: String?) { - Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") - } - }) - } - fun obtainDaoSession(): DaoSession { return daoSession } diff --git a/app/src/main/java/com/casic/br/extensions/Context.kt b/app/src/main/java/com/casic/br/extensions/Context.kt index 5866614..5726394 100644 --- a/app/src/main/java/com/casic/br/extensions/Context.kt +++ b/app/src/main/java/com/casic/br/extensions/Context.kt @@ -2,11 +2,16 @@ import android.content.Context import android.view.ViewGroup +import com.casic.br.base.BaseApplication +import com.pengxh.kt.lite.extensions.dp2px import com.qmuiteam.qmui.util.QMUIDisplayHelper fun Context.initLayoutImmersionBar(rootView: ViewGroup) { //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + if (statusBarHeight == 0) { + statusBarHeight = 44f.dp2px(BaseApplication.obtainInstance()) + } rootView.setPadding(0, statusBarHeight, 0, 0) rootView.requestLayout() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index cc20c54..4ef912b 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -1,25 +1,40 @@ package com.casic.br.fragment import android.graphics.Typeface +import android.util.Log import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.model.AddedDeviceModel +import com.casic.br.model.HomeModel import com.casic.br.model.RecommendModel +import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddDeviceActivity import com.casic.br.view.AllDeviceActivity import com.casic.br.view.device.FireplaceActivity import com.casic.br.view.device.RangeHoodActivity import com.casic.br.view.device.WaterHeaterActivity +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.fragment_device.* import kotlinx.android.synthetic.main.include_main_title.* import java.util.* + class DevicePageFragment : KotlinBaseFragment() { + private val kTag = "DevicePageFragment" + private val gson by lazy { Gson() } + override fun initLayoutView(): Int = R.layout.fragment_device override fun setupTopBarLayout() { @@ -37,16 +52,6 @@ model1.deviceModel = "D40-DM1" model1.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" deviceModels.add(model1) - val model2 = AddedDeviceModel() - model2.deviceName = "万家乐油烟机" - model2.deviceModel = "CXW-320-W7" - model2.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model2) - val model3 = AddedDeviceModel() - model3.deviceName = "万家乐壁挂炉" - model3.deviceModel = "26-13A3L" - model3.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model3) val addedDeviceAdapter = AddedDeviceAdapter(requireContext()) addedDeviceAdapter.setupDevice(deviceModels) @@ -102,8 +107,28 @@ } override fun initEvent() { - showAllDeviceLayout.setOnClickListener { + showAllDeviceButton.setOnClickListener { requireContext().navigatePageTo() } } + + override fun onResume() { + super.onResume() + val s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + if (s == "") { + return + } + val homeModel = gson.fromJson(s, object : TypeToken() {}.type) + TuyaHomeSdk.newHomeInstance(homeModel.homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + Log.d(kTag, deviceList.toJson()) + } + + override fun onError(errorCode: String, errorMsg: String) { + // do something + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 8aba9b2..84e947c 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -9,9 +9,13 @@ import com.casic.br.utils.GridItemDecoration import com.casic.br.utils.LocaleConstant import com.casic.br.view.LoginActivity +import com.casic.br.view.MainActivity import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.youth.banner.Banner import com.youth.banner.adapter.BannerImageAdapter import com.youth.banner.holder.BannerImageHolder @@ -90,7 +94,39 @@ override fun initEvent() { rightOperateView.setOnClickListener { - requireContext().navigatePageTo() + if (rightOperateView.text == "退出") { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出确认") + .setMessage("退出当前账号,将不能同步数据") + .setNegativeButton("取消") + .setPositiveButton("确认退出") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, false) + requireContext().navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) + .build().show() + } else { + requireContext().navigatePageTo() + } } } + + override fun onResume() { + val isLogin = SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + if (isLogin) { + rightOperateView.text = "退出" + } else { + rightOperateView.text = "登录" + } + super.onResume() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/model/HomeModel.java b/app/src/main/java/com/casic/br/model/HomeModel.java new file mode 100644 index 0000000..638d420 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/HomeModel.java @@ -0,0 +1,127 @@ +package com.casic.br.model; + +import java.util.List; + +public class HomeModel { + + private boolean admin; + private String geoName; + private int homeId; + private int homeStatus; + private double lat; + private double lon; + private String name; + private int role; + private List rooms; + + public boolean isAdmin() { + return admin; + } + + public void setAdmin(boolean admin) { + this.admin = admin; + } + + public String getGeoName() { + return geoName; + } + + public void setGeoName(String geoName) { + this.geoName = geoName; + } + + public int getHomeId() { + return homeId; + } + + public void setHomeId(int homeId) { + this.homeId = homeId; + } + + public int getHomeStatus() { + return homeStatus; + } + + public void setHomeStatus(int homeStatus) { + this.homeStatus = homeStatus; + } + + public double getLat() { + return lat; + } + + public void setLat(double lat) { + this.lat = lat; + } + + public double getLon() { + return lon; + } + + public void setLon(double lon) { + this.lon = lon; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRole() { + return role; + } + + public void setRole(int role) { + this.role = role; + } + + public List getRooms() { + return rooms; + } + + public void setRooms(List rooms) { + this.rooms = rooms; + } + + public static class RoomsModel { + private int displayOrder; + private String name; + private int roomId; + private boolean sel; + + public int getDisplayOrder() { + return displayOrder; + } + + public void setDisplayOrder(int displayOrder) { + this.displayOrder = displayOrder; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRoomId() { + return roomId; + } + + public void setRoomId(int roomId) { + this.roomId = roomId; + } + + public boolean isSel() { + return sel; + } + + public void setSel(boolean sel) { + this.sel = sel; + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/DialogManager.kt b/app/src/main/java/com/casic/br/utils/DialogManager.kt deleted file mode 100644 index da62e63..0000000 --- a/app/src/main/java/com/casic/br/utils/DialogManager.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.casic.br.utils; - -import android.app.Activity -import android.view.WindowManager -import com.pengxh.kt.lite.base.BaseSingleton -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog - -class DialogManager private constructor(private val activity: Activity) { - - private lateinit var loadingDialog: QMUITipDialog - - companion object : BaseSingleton() { - override val creator: (Activity) -> DialogManager - get() = ::DialogManager - } - - fun showLoadingDialog(message: String) { - loadingDialog = QMUITipDialog - .Builder(activity) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord(message) - .create() - if (!activity.isDestroyed) { - try { - loadingDialog.show() - } catch (e: WindowManager.BadTokenException) { - e.printStackTrace() - } - } - } - - fun dismissLoadingDialog() { - if (loadingDialog.isShowing) { - loadingDialog.dismiss() - } - } -} diff --git a/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt b/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt new file mode 100644 index 0000000..e04e327 --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt @@ -0,0 +1,31 @@ +package com.casic.br.utils + +import android.app.Activity +import android.view.WindowManager +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + +object LoadingDialogHub { + + private lateinit var loadingDialog: QMUITipDialog + + fun show(activity: Activity, message: String) { + loadingDialog = QMUITipDialog + .Builder(activity) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord(message) + .create() + if (!activity.isDestroyed) { + try { + loadingDialog.show() + } catch (e: WindowManager.BadTokenException) { + e.printStackTrace() + } + } + } + + fun dismiss() { + if (loadingDialog.isShowing) { + loadingDialog.dismiss() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 197a466..dd365ad 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -53,7 +53,8 @@ * String * ============================================================================================= * */ - const val USER_DETAIL_MODEL = "userDetailModel" + const val USER_IS_LOGIN = "isLogin" + const val HOME_DETAIL_MODEL = "homeDetailModel" const val SERVER_BASE_URL = "http://111.198.10.15:11304" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val ACCOUNT = "account" diff --git a/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt index ce8f99e..210a258 100644 --- a/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt @@ -30,13 +30,12 @@ override fun initEvent() { iotDevice.setOnClickListener { - navigatePageTo() - finish() + //IoT设备首先需要先配置网络 + navigatePageTo() } notIotDevice.setOnClickListener { navigatePageTo() - finish() } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt b/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt index d58aebd..ec99e90 100644 --- a/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt @@ -4,6 +4,8 @@ import com.casic.br.extensions.initLayoutImmersionBar import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_add_device_result.* class AddDeviceResultActivity : KotlinBaseActivity() { @@ -26,7 +28,8 @@ override fun initEvent() { completeButton.setOnClickListener { - finish() + navigatePageTo() + PageNavigationManager.finishAllActivity() } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt deleted file mode 100644 index 25ce475..0000000 --- a/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt +++ /dev/null @@ -1,56 +0,0 @@ -package com.casic.br.view - -import android.view.View -import android.widget.AdapterView -import com.casic.br.R -import com.casic.br.extensions.initLayoutImmersionBar -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo -import kotlinx.android.synthetic.main.activity_add_device_iot.* - -/** - * 添加IoT设备 - * */ -class AddIoTDeviceActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_add_device_iot - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(true).init() - initLayoutImmersionBar(rootView) - leftBackView.setOnClickListener { finish() } - } - - override fun initData() { - //默认选择WIFI快连 - connectTypeSpinner.setSelection(0) - } - - override fun initEvent() { - connectTypeSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>?, view: View?, position: Int, id: Long - ) { - - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - - } - } - - nextStepButton.setOnClickListener { - if (connectTypeSpinner.selectedItemPosition == 0) { - navigatePageTo() - } else { - navigatePageTo() - } - finish() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 9de6790..54975e3 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -1,11 +1,26 @@ package com.casic.br.view +import android.content.Context import com.casic.br.R +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.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.android.user.api.ILoginCallback +import com.tuya.smart.android.user.bean.User +import com.tuya.smart.home.sdk.TuyaHomeSdk +import kotlinx.android.synthetic.main.activity_login.* +import kotlinx.android.synthetic.main.activity_login.userPhoneView +import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { + private val context: Context = this@LoginActivity + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -21,6 +36,38 @@ } override fun initEvent() { + registerView.setOnClickListener { + navigatePageTo() + } + loginButton.setOnClickListener { + val userPhone = userPhoneView.text.toString() + if (userPhone.isBlank()) { + "请输入手机号".show(this) + return@setOnClickListener + } + val userPassword = passwordView.text.toString() + if (userPassword.isBlank()) { + "请输入密码".show(this) + return@setOnClickListener + } + + LoadingDialogHub.show(this, "登录中,请稍后") + TuyaHomeSdk.getUserInstance() + .loginWithPhonePassword("86", userPhone, userPassword, object : ILoginCallback { + override fun onSuccess(user: User?) { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, true) + LoadingDialogHub.dismiss() + navigatePageTo() + PageNavigationManager.finishAllActivity() + } + + override fun onError(code: String?, error: String?) { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, false) + LoadingDialogHub.dismiss() + "登录失败".show(context) + } + }) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index a2fb29a..25f4254 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -1,5 +1,6 @@ package com.casic.br.view +import android.util.Log import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment @@ -7,13 +8,20 @@ import com.casic.br.R import com.casic.br.adapter.ViewPagerAdapter import com.casic.br.fragment.* +import com.casic.br.utils.LocaleConstant import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { + private val kTag = "MainActivity" private var menuItem: MenuItem? = null private var fragmentPages: ArrayList = ArrayList() private var clickTime: Long = 0 @@ -33,7 +41,27 @@ } override fun initData() { + /** + * TODO 需要改为实际情况 + * + * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 + * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 + * 用户账号下创建任意多个家庭。 + * */ + val s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + if (s == "") { + TuyaHomeSdk.getHomeManagerInstance() + .createHome("北燃生活体验馆", 116.486394, 39.885734, "西直门内南小街", arrayListOf("1"), object : + ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean?) { + SaveKeyValues.putValue(LocaleConstant.HOME_DETAIL_MODEL, bean!!.toJson()) + } + override fun onError(errorCode: String?, errorMsg: String?) { + Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") + } + }) + } } override fun observeRequestState() { diff --git a/app/src/main/java/com/casic/br/view/RegisterActivity.kt b/app/src/main/java/com/casic/br/view/RegisterActivity.kt new file mode 100644 index 0000000..96510fb --- /dev/null +++ b/app/src/main/java/com/casic/br/view/RegisterActivity.kt @@ -0,0 +1,113 @@ +package com.casic.br.view + +import android.content.Context +import android.os.CountDownTimer +import com.casic.br.R +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.isPhoneNumber +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.tuya.smart.android.user.api.IRegisterCallback +import com.tuya.smart.android.user.bean.User +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback +import kotlinx.android.synthetic.main.activity_register.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import java.util.* + +class RegisterActivity : KotlinBaseActivity() { + + private val kTag = "RegisterActivity" + private val context: Context = this@RegisterActivity + + override fun initLayoutView(): Int = R.layout.activity_register + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.text = "注册账号" + } + + override fun initData() { + + } + + override fun initEvent() { + requestCodeButton.setOnClickListener { + if (userPhoneView.text.toString().isBlank()) { + "请输入手机号".show(this) + return@setOnClickListener + } + if (!userPhoneView.text.toString().isPhoneNumber()) { + "手机号不正确,请检查".show(this) + return@setOnClickListener + } + //发送验证码 + TuyaHomeSdk.getUserInstance().sendVerifyCodeWithUserName( + userPhoneView.text.toString(), "", "86", 1, + object : IResultCallback { + override fun onSuccess() { + "发送验证码成功".show(context) + } + + override fun onError(code: String?, error: String?) { + "发送验证码失败".show(context) + } + }) + + //开始倒计时 + object : CountDownTimer(60 * 1000, 1000) { + override fun onTick(millisUntilFinished: Long) { + requestCodeButton.text = String.format("${millisUntilFinished / 1000}s") + requestCodeButton.isEnabled = false + } + + override fun onFinish() { + requestCodeButton.text = "获取验证码" + requestCodeButton.isEnabled = true + } + }.start() + } + + registerButton.setOnClickListener { + val userPhone = userPhoneView.text.toString() + if (userPhone.isBlank()) { + "请输入手机号".show(this) + return@setOnClickListener + } + val smsCode = requestCodeView.text.toString() + if (smsCode.isBlank()) { + "请输入验证码".show(this) + return@setOnClickListener + } + val userPassword = userPasswordView.text.toString() + if (userPassword.isBlank()) { + "请输入密码".show(this) + return@setOnClickListener + } + + LoadingDialogHub.show(this, "注册中,请稍后") + TuyaHomeSdk.getUserInstance().registerAccountWithPhone( + "86", userPhone, userPassword, smsCode, + object : IRegisterCallback { + override fun onSuccess(user: User?) { + LoadingDialogHub.dismiss() + navigatePageTo() + } + + override fun onError(code: String?, error: String?) { + LoadingDialogHub.dismiss() + "用户注册失败".show(context) + } + }) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/RegisterResultActivity.kt b/app/src/main/java/com/casic/br/view/RegisterResultActivity.kt new file mode 100644 index 0000000..6a0de18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/RegisterResultActivity.kt @@ -0,0 +1,40 @@ +package com.casic.br.view + +import android.view.View +import com.casic.br.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import kotlinx.android.synthetic.main.activity_register_result.* +import kotlinx.android.synthetic.main.include_left_back_title.* + +class RegisterResultActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_register_result + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.visibility = View.GONE + } + + override fun observeRequestState() { + + } + + override fun initData() { + + } + + override fun initEvent() { + loginButton.setOnClickListener { + navigatePageTo() + PageNavigationManager.finishAllActivity() + } + } +} \ 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 new file mode 100644 index 0000000..4dc700e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/ResetDeviceActivity.kt @@ -0,0 +1,102 @@ +package com.casic.br.view + +import android.content.Context +import android.util.Log +import android.view.View +import com.casic.br.R +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.model.HomeModel +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.utils.LocaleConstant +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +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.extensions.toJson +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 val context: Context = this@ResetDeviceActivity + private val gson by lazy { Gson() } + 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 s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + val homeModel = gson.fromJson(s, object : TypeToken() {}.type) + TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeModel.homeId.toLong(), + object : ITuyaActivatorGetToken { + override fun onSuccess(token: String) { + Log.d(kTag, "token: $token") + //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 + val builder = object : ActivatorBuilder() {} + builder.ssid = params[0] + builder.context = context + builder.password = params[1] + builder.activatorModel = ActivatorModelEnum.TY_EZ + builder.timeOut = 100 + builder.token = token + builder.listener = object : ITuyaSmartActivatorListener { + override fun onError(errorCode: String?, errorMsg: String?) { + Log.i(kTag, "onError: $errorMsg") + LoadingDialogHub.dismiss() + } + + override fun onActiveSuccess(devResp: DeviceBean?) { + LoadingDialogHub.dismiss() + Log.d(kTag, devResp!!.toJson()) + navigatePageTo() + } + + override fun onStep(step: String?, data: Any?) { + Log.i(kTag, "step: $step") + Log.i(kTag, "data: $data") + LoadingDialogHub.dismiss() + } + } + TuyaHomeSdk.getActivatorInstance().newMultiActivator(builder).start() + } + + override fun onFailure(s: String, s1: String) { + LoadingDialogHub.dismiss() + } + }) + } + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3ea0e96..ba3523a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,15 +41,16 @@ + + - - + + - diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt index bf8285c..c90a197 100644 --- a/app/src/main/java/com/casic/br/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt @@ -1,16 +1,10 @@ package com.casic.br.base import android.app.Application -import android.util.Log import com.casic.br.greendao.DaoMaster import com.casic.br.greendao.DaoSession -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues -import com.tuya.smart.android.user.api.ILoginCallback -import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.home.sdk.bean.HomeBean -import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlin.properties.Delegates @@ -30,46 +24,13 @@ super.onCreate() instance = this SaveKeyValues.initSharedPreferences(this) - initTuya() + TuyaHomeSdk.init(this) + TuyaHomeSdk.setDebugMode(true) val devOpenHelper = DaoMaster.DevOpenHelper(this, "SmartKitchen.db", null) val daoMaster = DaoMaster(devOpenHelper.writableDatabase) daoSession = daoMaster.newSession() } - private fun initTuya() { - TuyaHomeSdk.init(this) - TuyaHomeSdk.setDebugMode(true) - /** - * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 - * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 - * 用户账号下创建任意多个家庭。 - * */ - //TODO 必须登录 - TuyaHomeSdk.getUserInstance() - .loginWithPhonePassword("86", "18310581916", "123456", object : ILoginCallback { - override fun onSuccess(user: User?) { - Log.d(kTag, "Login success:" + user!!.username) - } - - override fun onError(code: String, error: String) { - Log.e(kTag, "code: " + code + "error:" + error) - } - }) - - - TuyaHomeSdk.getHomeManagerInstance() - .createHome("北燃生活体验馆", 116.486394, 39.885734, "北燃生活体验馆", arrayListOf(), object : - ITuyaHomeResultCallback { - override fun onSuccess(bean: HomeBean?) { - Log.d(kTag, bean!!.toJson()) - } - - override fun onError(errorCode: String?, errorMsg: String?) { - Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") - } - }) - } - fun obtainDaoSession(): DaoSession { return daoSession } diff --git a/app/src/main/java/com/casic/br/extensions/Context.kt b/app/src/main/java/com/casic/br/extensions/Context.kt index 5866614..5726394 100644 --- a/app/src/main/java/com/casic/br/extensions/Context.kt +++ b/app/src/main/java/com/casic/br/extensions/Context.kt @@ -2,11 +2,16 @@ import android.content.Context import android.view.ViewGroup +import com.casic.br.base.BaseApplication +import com.pengxh.kt.lite.extensions.dp2px import com.qmuiteam.qmui.util.QMUIDisplayHelper fun Context.initLayoutImmersionBar(rootView: ViewGroup) { //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + if (statusBarHeight == 0) { + statusBarHeight = 44f.dp2px(BaseApplication.obtainInstance()) + } rootView.setPadding(0, statusBarHeight, 0, 0) rootView.requestLayout() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index cc20c54..4ef912b 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -1,25 +1,40 @@ package com.casic.br.fragment import android.graphics.Typeface +import android.util.Log import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.model.AddedDeviceModel +import com.casic.br.model.HomeModel import com.casic.br.model.RecommendModel +import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddDeviceActivity import com.casic.br.view.AllDeviceActivity import com.casic.br.view.device.FireplaceActivity import com.casic.br.view.device.RangeHoodActivity import com.casic.br.view.device.WaterHeaterActivity +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.fragment_device.* import kotlinx.android.synthetic.main.include_main_title.* import java.util.* + class DevicePageFragment : KotlinBaseFragment() { + private val kTag = "DevicePageFragment" + private val gson by lazy { Gson() } + override fun initLayoutView(): Int = R.layout.fragment_device override fun setupTopBarLayout() { @@ -37,16 +52,6 @@ model1.deviceModel = "D40-DM1" model1.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" deviceModels.add(model1) - val model2 = AddedDeviceModel() - model2.deviceName = "万家乐油烟机" - model2.deviceModel = "CXW-320-W7" - model2.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model2) - val model3 = AddedDeviceModel() - model3.deviceName = "万家乐壁挂炉" - model3.deviceModel = "26-13A3L" - model3.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model3) val addedDeviceAdapter = AddedDeviceAdapter(requireContext()) addedDeviceAdapter.setupDevice(deviceModels) @@ -102,8 +107,28 @@ } override fun initEvent() { - showAllDeviceLayout.setOnClickListener { + showAllDeviceButton.setOnClickListener { requireContext().navigatePageTo() } } + + override fun onResume() { + super.onResume() + val s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + if (s == "") { + return + } + val homeModel = gson.fromJson(s, object : TypeToken() {}.type) + TuyaHomeSdk.newHomeInstance(homeModel.homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + Log.d(kTag, deviceList.toJson()) + } + + override fun onError(errorCode: String, errorMsg: String) { + // do something + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 8aba9b2..84e947c 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -9,9 +9,13 @@ import com.casic.br.utils.GridItemDecoration import com.casic.br.utils.LocaleConstant import com.casic.br.view.LoginActivity +import com.casic.br.view.MainActivity import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.youth.banner.Banner import com.youth.banner.adapter.BannerImageAdapter import com.youth.banner.holder.BannerImageHolder @@ -90,7 +94,39 @@ override fun initEvent() { rightOperateView.setOnClickListener { - requireContext().navigatePageTo() + if (rightOperateView.text == "退出") { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出确认") + .setMessage("退出当前账号,将不能同步数据") + .setNegativeButton("取消") + .setPositiveButton("确认退出") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, false) + requireContext().navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) + .build().show() + } else { + requireContext().navigatePageTo() + } } } + + override fun onResume() { + val isLogin = SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + if (isLogin) { + rightOperateView.text = "退出" + } else { + rightOperateView.text = "登录" + } + super.onResume() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/model/HomeModel.java b/app/src/main/java/com/casic/br/model/HomeModel.java new file mode 100644 index 0000000..638d420 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/HomeModel.java @@ -0,0 +1,127 @@ +package com.casic.br.model; + +import java.util.List; + +public class HomeModel { + + private boolean admin; + private String geoName; + private int homeId; + private int homeStatus; + private double lat; + private double lon; + private String name; + private int role; + private List rooms; + + public boolean isAdmin() { + return admin; + } + + public void setAdmin(boolean admin) { + this.admin = admin; + } + + public String getGeoName() { + return geoName; + } + + public void setGeoName(String geoName) { + this.geoName = geoName; + } + + public int getHomeId() { + return homeId; + } + + public void setHomeId(int homeId) { + this.homeId = homeId; + } + + public int getHomeStatus() { + return homeStatus; + } + + public void setHomeStatus(int homeStatus) { + this.homeStatus = homeStatus; + } + + public double getLat() { + return lat; + } + + public void setLat(double lat) { + this.lat = lat; + } + + public double getLon() { + return lon; + } + + public void setLon(double lon) { + this.lon = lon; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRole() { + return role; + } + + public void setRole(int role) { + this.role = role; + } + + public List getRooms() { + return rooms; + } + + public void setRooms(List rooms) { + this.rooms = rooms; + } + + public static class RoomsModel { + private int displayOrder; + private String name; + private int roomId; + private boolean sel; + + public int getDisplayOrder() { + return displayOrder; + } + + public void setDisplayOrder(int displayOrder) { + this.displayOrder = displayOrder; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRoomId() { + return roomId; + } + + public void setRoomId(int roomId) { + this.roomId = roomId; + } + + public boolean isSel() { + return sel; + } + + public void setSel(boolean sel) { + this.sel = sel; + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/DialogManager.kt b/app/src/main/java/com/casic/br/utils/DialogManager.kt deleted file mode 100644 index da62e63..0000000 --- a/app/src/main/java/com/casic/br/utils/DialogManager.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.casic.br.utils; - -import android.app.Activity -import android.view.WindowManager -import com.pengxh.kt.lite.base.BaseSingleton -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog - -class DialogManager private constructor(private val activity: Activity) { - - private lateinit var loadingDialog: QMUITipDialog - - companion object : BaseSingleton() { - override val creator: (Activity) -> DialogManager - get() = ::DialogManager - } - - fun showLoadingDialog(message: String) { - loadingDialog = QMUITipDialog - .Builder(activity) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord(message) - .create() - if (!activity.isDestroyed) { - try { - loadingDialog.show() - } catch (e: WindowManager.BadTokenException) { - e.printStackTrace() - } - } - } - - fun dismissLoadingDialog() { - if (loadingDialog.isShowing) { - loadingDialog.dismiss() - } - } -} diff --git a/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt b/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt new file mode 100644 index 0000000..e04e327 --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt @@ -0,0 +1,31 @@ +package com.casic.br.utils + +import android.app.Activity +import android.view.WindowManager +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + +object LoadingDialogHub { + + private lateinit var loadingDialog: QMUITipDialog + + fun show(activity: Activity, message: String) { + loadingDialog = QMUITipDialog + .Builder(activity) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord(message) + .create() + if (!activity.isDestroyed) { + try { + loadingDialog.show() + } catch (e: WindowManager.BadTokenException) { + e.printStackTrace() + } + } + } + + fun dismiss() { + if (loadingDialog.isShowing) { + loadingDialog.dismiss() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 197a466..dd365ad 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -53,7 +53,8 @@ * String * ============================================================================================= * */ - const val USER_DETAIL_MODEL = "userDetailModel" + const val USER_IS_LOGIN = "isLogin" + const val HOME_DETAIL_MODEL = "homeDetailModel" const val SERVER_BASE_URL = "http://111.198.10.15:11304" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val ACCOUNT = "account" diff --git a/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt index ce8f99e..210a258 100644 --- a/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt @@ -30,13 +30,12 @@ override fun initEvent() { iotDevice.setOnClickListener { - navigatePageTo() - finish() + //IoT设备首先需要先配置网络 + navigatePageTo() } notIotDevice.setOnClickListener { navigatePageTo() - finish() } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt b/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt index d58aebd..ec99e90 100644 --- a/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt @@ -4,6 +4,8 @@ import com.casic.br.extensions.initLayoutImmersionBar import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_add_device_result.* class AddDeviceResultActivity : KotlinBaseActivity() { @@ -26,7 +28,8 @@ override fun initEvent() { completeButton.setOnClickListener { - finish() + navigatePageTo() + PageNavigationManager.finishAllActivity() } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt deleted file mode 100644 index 25ce475..0000000 --- a/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt +++ /dev/null @@ -1,56 +0,0 @@ -package com.casic.br.view - -import android.view.View -import android.widget.AdapterView -import com.casic.br.R -import com.casic.br.extensions.initLayoutImmersionBar -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo -import kotlinx.android.synthetic.main.activity_add_device_iot.* - -/** - * 添加IoT设备 - * */ -class AddIoTDeviceActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_add_device_iot - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(true).init() - initLayoutImmersionBar(rootView) - leftBackView.setOnClickListener { finish() } - } - - override fun initData() { - //默认选择WIFI快连 - connectTypeSpinner.setSelection(0) - } - - override fun initEvent() { - connectTypeSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>?, view: View?, position: Int, id: Long - ) { - - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - - } - } - - nextStepButton.setOnClickListener { - if (connectTypeSpinner.selectedItemPosition == 0) { - navigatePageTo() - } else { - navigatePageTo() - } - finish() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 9de6790..54975e3 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -1,11 +1,26 @@ package com.casic.br.view +import android.content.Context import com.casic.br.R +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.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.android.user.api.ILoginCallback +import com.tuya.smart.android.user.bean.User +import com.tuya.smart.home.sdk.TuyaHomeSdk +import kotlinx.android.synthetic.main.activity_login.* +import kotlinx.android.synthetic.main.activity_login.userPhoneView +import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { + private val context: Context = this@LoginActivity + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -21,6 +36,38 @@ } override fun initEvent() { + registerView.setOnClickListener { + navigatePageTo() + } + loginButton.setOnClickListener { + val userPhone = userPhoneView.text.toString() + if (userPhone.isBlank()) { + "请输入手机号".show(this) + return@setOnClickListener + } + val userPassword = passwordView.text.toString() + if (userPassword.isBlank()) { + "请输入密码".show(this) + return@setOnClickListener + } + + LoadingDialogHub.show(this, "登录中,请稍后") + TuyaHomeSdk.getUserInstance() + .loginWithPhonePassword("86", userPhone, userPassword, object : ILoginCallback { + override fun onSuccess(user: User?) { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, true) + LoadingDialogHub.dismiss() + navigatePageTo() + PageNavigationManager.finishAllActivity() + } + + override fun onError(code: String?, error: String?) { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, false) + LoadingDialogHub.dismiss() + "登录失败".show(context) + } + }) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index a2fb29a..25f4254 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -1,5 +1,6 @@ package com.casic.br.view +import android.util.Log import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment @@ -7,13 +8,20 @@ import com.casic.br.R import com.casic.br.adapter.ViewPagerAdapter import com.casic.br.fragment.* +import com.casic.br.utils.LocaleConstant import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { + private val kTag = "MainActivity" private var menuItem: MenuItem? = null private var fragmentPages: ArrayList = ArrayList() private var clickTime: Long = 0 @@ -33,7 +41,27 @@ } override fun initData() { + /** + * TODO 需要改为实际情况 + * + * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 + * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 + * 用户账号下创建任意多个家庭。 + * */ + val s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + if (s == "") { + TuyaHomeSdk.getHomeManagerInstance() + .createHome("北燃生活体验馆", 116.486394, 39.885734, "西直门内南小街", arrayListOf("1"), object : + ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean?) { + SaveKeyValues.putValue(LocaleConstant.HOME_DETAIL_MODEL, bean!!.toJson()) + } + override fun onError(errorCode: String?, errorMsg: String?) { + Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") + } + }) + } } override fun observeRequestState() { diff --git a/app/src/main/java/com/casic/br/view/RegisterActivity.kt b/app/src/main/java/com/casic/br/view/RegisterActivity.kt new file mode 100644 index 0000000..96510fb --- /dev/null +++ b/app/src/main/java/com/casic/br/view/RegisterActivity.kt @@ -0,0 +1,113 @@ +package com.casic.br.view + +import android.content.Context +import android.os.CountDownTimer +import com.casic.br.R +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.isPhoneNumber +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.tuya.smart.android.user.api.IRegisterCallback +import com.tuya.smart.android.user.bean.User +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback +import kotlinx.android.synthetic.main.activity_register.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import java.util.* + +class RegisterActivity : KotlinBaseActivity() { + + private val kTag = "RegisterActivity" + private val context: Context = this@RegisterActivity + + override fun initLayoutView(): Int = R.layout.activity_register + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.text = "注册账号" + } + + override fun initData() { + + } + + override fun initEvent() { + requestCodeButton.setOnClickListener { + if (userPhoneView.text.toString().isBlank()) { + "请输入手机号".show(this) + return@setOnClickListener + } + if (!userPhoneView.text.toString().isPhoneNumber()) { + "手机号不正确,请检查".show(this) + return@setOnClickListener + } + //发送验证码 + TuyaHomeSdk.getUserInstance().sendVerifyCodeWithUserName( + userPhoneView.text.toString(), "", "86", 1, + object : IResultCallback { + override fun onSuccess() { + "发送验证码成功".show(context) + } + + override fun onError(code: String?, error: String?) { + "发送验证码失败".show(context) + } + }) + + //开始倒计时 + object : CountDownTimer(60 * 1000, 1000) { + override fun onTick(millisUntilFinished: Long) { + requestCodeButton.text = String.format("${millisUntilFinished / 1000}s") + requestCodeButton.isEnabled = false + } + + override fun onFinish() { + requestCodeButton.text = "获取验证码" + requestCodeButton.isEnabled = true + } + }.start() + } + + registerButton.setOnClickListener { + val userPhone = userPhoneView.text.toString() + if (userPhone.isBlank()) { + "请输入手机号".show(this) + return@setOnClickListener + } + val smsCode = requestCodeView.text.toString() + if (smsCode.isBlank()) { + "请输入验证码".show(this) + return@setOnClickListener + } + val userPassword = userPasswordView.text.toString() + if (userPassword.isBlank()) { + "请输入密码".show(this) + return@setOnClickListener + } + + LoadingDialogHub.show(this, "注册中,请稍后") + TuyaHomeSdk.getUserInstance().registerAccountWithPhone( + "86", userPhone, userPassword, smsCode, + object : IRegisterCallback { + override fun onSuccess(user: User?) { + LoadingDialogHub.dismiss() + navigatePageTo() + } + + override fun onError(code: String?, error: String?) { + LoadingDialogHub.dismiss() + "用户注册失败".show(context) + } + }) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/RegisterResultActivity.kt b/app/src/main/java/com/casic/br/view/RegisterResultActivity.kt new file mode 100644 index 0000000..6a0de18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/RegisterResultActivity.kt @@ -0,0 +1,40 @@ +package com.casic.br.view + +import android.view.View +import com.casic.br.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import kotlinx.android.synthetic.main.activity_register_result.* +import kotlinx.android.synthetic.main.include_left_back_title.* + +class RegisterResultActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_register_result + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.visibility = View.GONE + } + + override fun observeRequestState() { + + } + + override fun initData() { + + } + + override fun initEvent() { + loginButton.setOnClickListener { + navigatePageTo() + PageNavigationManager.finishAllActivity() + } + } +} \ 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 new file mode 100644 index 0000000..4dc700e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/ResetDeviceActivity.kt @@ -0,0 +1,102 @@ +package com.casic.br.view + +import android.content.Context +import android.util.Log +import android.view.View +import com.casic.br.R +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.model.HomeModel +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.utils.LocaleConstant +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +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.extensions.toJson +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 val context: Context = this@ResetDeviceActivity + private val gson by lazy { Gson() } + 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 s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + val homeModel = gson.fromJson(s, object : TypeToken() {}.type) + TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeModel.homeId.toLong(), + object : ITuyaActivatorGetToken { + override fun onSuccess(token: String) { + Log.d(kTag, "token: $token") + //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 + val builder = object : ActivatorBuilder() {} + builder.ssid = params[0] + builder.context = context + builder.password = params[1] + builder.activatorModel = ActivatorModelEnum.TY_EZ + builder.timeOut = 100 + builder.token = token + builder.listener = object : ITuyaSmartActivatorListener { + override fun onError(errorCode: String?, errorMsg: String?) { + Log.i(kTag, "onError: $errorMsg") + LoadingDialogHub.dismiss() + } + + override fun onActiveSuccess(devResp: DeviceBean?) { + LoadingDialogHub.dismiss() + Log.d(kTag, devResp!!.toJson()) + navigatePageTo() + } + + override fun onStep(step: String?, data: Any?) { + Log.i(kTag, "step: $step") + Log.i(kTag, "data: $data") + LoadingDialogHub.dismiss() + } + } + TuyaHomeSdk.getActivatorInstance().newMultiActivator(builder).start() + } + + override fun onFailure(s: String, s1: String) { + LoadingDialogHub.dismiss() + } + }) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/SearchDeviceResult.kt b/app/src/main/java/com/casic/br/view/SearchDeviceResult.kt deleted file mode 100644 index ed466ae..0000000 --- a/app/src/main/java/com/casic/br/view/SearchDeviceResult.kt +++ /dev/null @@ -1,40 +0,0 @@ -package com.casic.br.view - -import com.casic.br.R -import com.casic.br.extensions.initLayoutImmersionBar -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo -import kotlinx.android.synthetic.main.activity_search_device_result.* -import kotlinx.android.synthetic.main.include_left_back_title.* - -class SearchDeviceResult : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_search_device_result - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(true).init() - initLayoutImmersionBar(rootView) - leftBackView.setOnClickListener { finish() } - titleView.text = "添加设备" - } - - override fun initData() { - - } - - override fun initEvent() { - confirmButton.setOnClickListener { - navigatePageTo() - finish() - } - - reSearchDeviceView.setOnClickListener { - navigatePageTo() - } - } -} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3ea0e96..ba3523a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,15 +41,16 @@ + + - - + + - diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt index bf8285c..c90a197 100644 --- a/app/src/main/java/com/casic/br/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt @@ -1,16 +1,10 @@ package com.casic.br.base import android.app.Application -import android.util.Log import com.casic.br.greendao.DaoMaster import com.casic.br.greendao.DaoSession -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues -import com.tuya.smart.android.user.api.ILoginCallback -import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.home.sdk.bean.HomeBean -import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlin.properties.Delegates @@ -30,46 +24,13 @@ super.onCreate() instance = this SaveKeyValues.initSharedPreferences(this) - initTuya() + TuyaHomeSdk.init(this) + TuyaHomeSdk.setDebugMode(true) val devOpenHelper = DaoMaster.DevOpenHelper(this, "SmartKitchen.db", null) val daoMaster = DaoMaster(devOpenHelper.writableDatabase) daoSession = daoMaster.newSession() } - private fun initTuya() { - TuyaHomeSdk.init(this) - TuyaHomeSdk.setDebugMode(true) - /** - * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 - * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 - * 用户账号下创建任意多个家庭。 - * */ - //TODO 必须登录 - TuyaHomeSdk.getUserInstance() - .loginWithPhonePassword("86", "18310581916", "123456", object : ILoginCallback { - override fun onSuccess(user: User?) { - Log.d(kTag, "Login success:" + user!!.username) - } - - override fun onError(code: String, error: String) { - Log.e(kTag, "code: " + code + "error:" + error) - } - }) - - - TuyaHomeSdk.getHomeManagerInstance() - .createHome("北燃生活体验馆", 116.486394, 39.885734, "北燃生活体验馆", arrayListOf(), object : - ITuyaHomeResultCallback { - override fun onSuccess(bean: HomeBean?) { - Log.d(kTag, bean!!.toJson()) - } - - override fun onError(errorCode: String?, errorMsg: String?) { - Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") - } - }) - } - fun obtainDaoSession(): DaoSession { return daoSession } diff --git a/app/src/main/java/com/casic/br/extensions/Context.kt b/app/src/main/java/com/casic/br/extensions/Context.kt index 5866614..5726394 100644 --- a/app/src/main/java/com/casic/br/extensions/Context.kt +++ b/app/src/main/java/com/casic/br/extensions/Context.kt @@ -2,11 +2,16 @@ import android.content.Context import android.view.ViewGroup +import com.casic.br.base.BaseApplication +import com.pengxh.kt.lite.extensions.dp2px import com.qmuiteam.qmui.util.QMUIDisplayHelper fun Context.initLayoutImmersionBar(rootView: ViewGroup) { //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + if (statusBarHeight == 0) { + statusBarHeight = 44f.dp2px(BaseApplication.obtainInstance()) + } rootView.setPadding(0, statusBarHeight, 0, 0) rootView.requestLayout() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index cc20c54..4ef912b 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -1,25 +1,40 @@ package com.casic.br.fragment import android.graphics.Typeface +import android.util.Log import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.model.AddedDeviceModel +import com.casic.br.model.HomeModel import com.casic.br.model.RecommendModel +import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddDeviceActivity import com.casic.br.view.AllDeviceActivity import com.casic.br.view.device.FireplaceActivity import com.casic.br.view.device.RangeHoodActivity import com.casic.br.view.device.WaterHeaterActivity +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.fragment_device.* import kotlinx.android.synthetic.main.include_main_title.* import java.util.* + class DevicePageFragment : KotlinBaseFragment() { + private val kTag = "DevicePageFragment" + private val gson by lazy { Gson() } + override fun initLayoutView(): Int = R.layout.fragment_device override fun setupTopBarLayout() { @@ -37,16 +52,6 @@ model1.deviceModel = "D40-DM1" model1.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" deviceModels.add(model1) - val model2 = AddedDeviceModel() - model2.deviceName = "万家乐油烟机" - model2.deviceModel = "CXW-320-W7" - model2.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model2) - val model3 = AddedDeviceModel() - model3.deviceName = "万家乐壁挂炉" - model3.deviceModel = "26-13A3L" - model3.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model3) val addedDeviceAdapter = AddedDeviceAdapter(requireContext()) addedDeviceAdapter.setupDevice(deviceModels) @@ -102,8 +107,28 @@ } override fun initEvent() { - showAllDeviceLayout.setOnClickListener { + showAllDeviceButton.setOnClickListener { requireContext().navigatePageTo() } } + + override fun onResume() { + super.onResume() + val s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + if (s == "") { + return + } + val homeModel = gson.fromJson(s, object : TypeToken() {}.type) + TuyaHomeSdk.newHomeInstance(homeModel.homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + Log.d(kTag, deviceList.toJson()) + } + + override fun onError(errorCode: String, errorMsg: String) { + // do something + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 8aba9b2..84e947c 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -9,9 +9,13 @@ import com.casic.br.utils.GridItemDecoration import com.casic.br.utils.LocaleConstant import com.casic.br.view.LoginActivity +import com.casic.br.view.MainActivity import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.youth.banner.Banner import com.youth.banner.adapter.BannerImageAdapter import com.youth.banner.holder.BannerImageHolder @@ -90,7 +94,39 @@ override fun initEvent() { rightOperateView.setOnClickListener { - requireContext().navigatePageTo() + if (rightOperateView.text == "退出") { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出确认") + .setMessage("退出当前账号,将不能同步数据") + .setNegativeButton("取消") + .setPositiveButton("确认退出") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, false) + requireContext().navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) + .build().show() + } else { + requireContext().navigatePageTo() + } } } + + override fun onResume() { + val isLogin = SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + if (isLogin) { + rightOperateView.text = "退出" + } else { + rightOperateView.text = "登录" + } + super.onResume() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/model/HomeModel.java b/app/src/main/java/com/casic/br/model/HomeModel.java new file mode 100644 index 0000000..638d420 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/HomeModel.java @@ -0,0 +1,127 @@ +package com.casic.br.model; + +import java.util.List; + +public class HomeModel { + + private boolean admin; + private String geoName; + private int homeId; + private int homeStatus; + private double lat; + private double lon; + private String name; + private int role; + private List rooms; + + public boolean isAdmin() { + return admin; + } + + public void setAdmin(boolean admin) { + this.admin = admin; + } + + public String getGeoName() { + return geoName; + } + + public void setGeoName(String geoName) { + this.geoName = geoName; + } + + public int getHomeId() { + return homeId; + } + + public void setHomeId(int homeId) { + this.homeId = homeId; + } + + public int getHomeStatus() { + return homeStatus; + } + + public void setHomeStatus(int homeStatus) { + this.homeStatus = homeStatus; + } + + public double getLat() { + return lat; + } + + public void setLat(double lat) { + this.lat = lat; + } + + public double getLon() { + return lon; + } + + public void setLon(double lon) { + this.lon = lon; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRole() { + return role; + } + + public void setRole(int role) { + this.role = role; + } + + public List getRooms() { + return rooms; + } + + public void setRooms(List rooms) { + this.rooms = rooms; + } + + public static class RoomsModel { + private int displayOrder; + private String name; + private int roomId; + private boolean sel; + + public int getDisplayOrder() { + return displayOrder; + } + + public void setDisplayOrder(int displayOrder) { + this.displayOrder = displayOrder; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRoomId() { + return roomId; + } + + public void setRoomId(int roomId) { + this.roomId = roomId; + } + + public boolean isSel() { + return sel; + } + + public void setSel(boolean sel) { + this.sel = sel; + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/DialogManager.kt b/app/src/main/java/com/casic/br/utils/DialogManager.kt deleted file mode 100644 index da62e63..0000000 --- a/app/src/main/java/com/casic/br/utils/DialogManager.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.casic.br.utils; - -import android.app.Activity -import android.view.WindowManager -import com.pengxh.kt.lite.base.BaseSingleton -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog - -class DialogManager private constructor(private val activity: Activity) { - - private lateinit var loadingDialog: QMUITipDialog - - companion object : BaseSingleton() { - override val creator: (Activity) -> DialogManager - get() = ::DialogManager - } - - fun showLoadingDialog(message: String) { - loadingDialog = QMUITipDialog - .Builder(activity) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord(message) - .create() - if (!activity.isDestroyed) { - try { - loadingDialog.show() - } catch (e: WindowManager.BadTokenException) { - e.printStackTrace() - } - } - } - - fun dismissLoadingDialog() { - if (loadingDialog.isShowing) { - loadingDialog.dismiss() - } - } -} diff --git a/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt b/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt new file mode 100644 index 0000000..e04e327 --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt @@ -0,0 +1,31 @@ +package com.casic.br.utils + +import android.app.Activity +import android.view.WindowManager +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + +object LoadingDialogHub { + + private lateinit var loadingDialog: QMUITipDialog + + fun show(activity: Activity, message: String) { + loadingDialog = QMUITipDialog + .Builder(activity) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord(message) + .create() + if (!activity.isDestroyed) { + try { + loadingDialog.show() + } catch (e: WindowManager.BadTokenException) { + e.printStackTrace() + } + } + } + + fun dismiss() { + if (loadingDialog.isShowing) { + loadingDialog.dismiss() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 197a466..dd365ad 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -53,7 +53,8 @@ * String * ============================================================================================= * */ - const val USER_DETAIL_MODEL = "userDetailModel" + const val USER_IS_LOGIN = "isLogin" + const val HOME_DETAIL_MODEL = "homeDetailModel" const val SERVER_BASE_URL = "http://111.198.10.15:11304" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val ACCOUNT = "account" diff --git a/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt index ce8f99e..210a258 100644 --- a/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt @@ -30,13 +30,12 @@ override fun initEvent() { iotDevice.setOnClickListener { - navigatePageTo() - finish() + //IoT设备首先需要先配置网络 + navigatePageTo() } notIotDevice.setOnClickListener { navigatePageTo() - finish() } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt b/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt index d58aebd..ec99e90 100644 --- a/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt @@ -4,6 +4,8 @@ import com.casic.br.extensions.initLayoutImmersionBar import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_add_device_result.* class AddDeviceResultActivity : KotlinBaseActivity() { @@ -26,7 +28,8 @@ override fun initEvent() { completeButton.setOnClickListener { - finish() + navigatePageTo() + PageNavigationManager.finishAllActivity() } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt deleted file mode 100644 index 25ce475..0000000 --- a/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt +++ /dev/null @@ -1,56 +0,0 @@ -package com.casic.br.view - -import android.view.View -import android.widget.AdapterView -import com.casic.br.R -import com.casic.br.extensions.initLayoutImmersionBar -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo -import kotlinx.android.synthetic.main.activity_add_device_iot.* - -/** - * 添加IoT设备 - * */ -class AddIoTDeviceActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_add_device_iot - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(true).init() - initLayoutImmersionBar(rootView) - leftBackView.setOnClickListener { finish() } - } - - override fun initData() { - //默认选择WIFI快连 - connectTypeSpinner.setSelection(0) - } - - override fun initEvent() { - connectTypeSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>?, view: View?, position: Int, id: Long - ) { - - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - - } - } - - nextStepButton.setOnClickListener { - if (connectTypeSpinner.selectedItemPosition == 0) { - navigatePageTo() - } else { - navigatePageTo() - } - finish() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 9de6790..54975e3 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -1,11 +1,26 @@ package com.casic.br.view +import android.content.Context import com.casic.br.R +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.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.android.user.api.ILoginCallback +import com.tuya.smart.android.user.bean.User +import com.tuya.smart.home.sdk.TuyaHomeSdk +import kotlinx.android.synthetic.main.activity_login.* +import kotlinx.android.synthetic.main.activity_login.userPhoneView +import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { + private val context: Context = this@LoginActivity + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -21,6 +36,38 @@ } override fun initEvent() { + registerView.setOnClickListener { + navigatePageTo() + } + loginButton.setOnClickListener { + val userPhone = userPhoneView.text.toString() + if (userPhone.isBlank()) { + "请输入手机号".show(this) + return@setOnClickListener + } + val userPassword = passwordView.text.toString() + if (userPassword.isBlank()) { + "请输入密码".show(this) + return@setOnClickListener + } + + LoadingDialogHub.show(this, "登录中,请稍后") + TuyaHomeSdk.getUserInstance() + .loginWithPhonePassword("86", userPhone, userPassword, object : ILoginCallback { + override fun onSuccess(user: User?) { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, true) + LoadingDialogHub.dismiss() + navigatePageTo() + PageNavigationManager.finishAllActivity() + } + + override fun onError(code: String?, error: String?) { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, false) + LoadingDialogHub.dismiss() + "登录失败".show(context) + } + }) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index a2fb29a..25f4254 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -1,5 +1,6 @@ package com.casic.br.view +import android.util.Log import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment @@ -7,13 +8,20 @@ import com.casic.br.R import com.casic.br.adapter.ViewPagerAdapter import com.casic.br.fragment.* +import com.casic.br.utils.LocaleConstant import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { + private val kTag = "MainActivity" private var menuItem: MenuItem? = null private var fragmentPages: ArrayList = ArrayList() private var clickTime: Long = 0 @@ -33,7 +41,27 @@ } override fun initData() { + /** + * TODO 需要改为实际情况 + * + * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 + * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 + * 用户账号下创建任意多个家庭。 + * */ + val s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + if (s == "") { + TuyaHomeSdk.getHomeManagerInstance() + .createHome("北燃生活体验馆", 116.486394, 39.885734, "西直门内南小街", arrayListOf("1"), object : + ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean?) { + SaveKeyValues.putValue(LocaleConstant.HOME_DETAIL_MODEL, bean!!.toJson()) + } + override fun onError(errorCode: String?, errorMsg: String?) { + Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") + } + }) + } } override fun observeRequestState() { diff --git a/app/src/main/java/com/casic/br/view/RegisterActivity.kt b/app/src/main/java/com/casic/br/view/RegisterActivity.kt new file mode 100644 index 0000000..96510fb --- /dev/null +++ b/app/src/main/java/com/casic/br/view/RegisterActivity.kt @@ -0,0 +1,113 @@ +package com.casic.br.view + +import android.content.Context +import android.os.CountDownTimer +import com.casic.br.R +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.isPhoneNumber +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.tuya.smart.android.user.api.IRegisterCallback +import com.tuya.smart.android.user.bean.User +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback +import kotlinx.android.synthetic.main.activity_register.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import java.util.* + +class RegisterActivity : KotlinBaseActivity() { + + private val kTag = "RegisterActivity" + private val context: Context = this@RegisterActivity + + override fun initLayoutView(): Int = R.layout.activity_register + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.text = "注册账号" + } + + override fun initData() { + + } + + override fun initEvent() { + requestCodeButton.setOnClickListener { + if (userPhoneView.text.toString().isBlank()) { + "请输入手机号".show(this) + return@setOnClickListener + } + if (!userPhoneView.text.toString().isPhoneNumber()) { + "手机号不正确,请检查".show(this) + return@setOnClickListener + } + //发送验证码 + TuyaHomeSdk.getUserInstance().sendVerifyCodeWithUserName( + userPhoneView.text.toString(), "", "86", 1, + object : IResultCallback { + override fun onSuccess() { + "发送验证码成功".show(context) + } + + override fun onError(code: String?, error: String?) { + "发送验证码失败".show(context) + } + }) + + //开始倒计时 + object : CountDownTimer(60 * 1000, 1000) { + override fun onTick(millisUntilFinished: Long) { + requestCodeButton.text = String.format("${millisUntilFinished / 1000}s") + requestCodeButton.isEnabled = false + } + + override fun onFinish() { + requestCodeButton.text = "获取验证码" + requestCodeButton.isEnabled = true + } + }.start() + } + + registerButton.setOnClickListener { + val userPhone = userPhoneView.text.toString() + if (userPhone.isBlank()) { + "请输入手机号".show(this) + return@setOnClickListener + } + val smsCode = requestCodeView.text.toString() + if (smsCode.isBlank()) { + "请输入验证码".show(this) + return@setOnClickListener + } + val userPassword = userPasswordView.text.toString() + if (userPassword.isBlank()) { + "请输入密码".show(this) + return@setOnClickListener + } + + LoadingDialogHub.show(this, "注册中,请稍后") + TuyaHomeSdk.getUserInstance().registerAccountWithPhone( + "86", userPhone, userPassword, smsCode, + object : IRegisterCallback { + override fun onSuccess(user: User?) { + LoadingDialogHub.dismiss() + navigatePageTo() + } + + override fun onError(code: String?, error: String?) { + LoadingDialogHub.dismiss() + "用户注册失败".show(context) + } + }) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/RegisterResultActivity.kt b/app/src/main/java/com/casic/br/view/RegisterResultActivity.kt new file mode 100644 index 0000000..6a0de18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/RegisterResultActivity.kt @@ -0,0 +1,40 @@ +package com.casic.br.view + +import android.view.View +import com.casic.br.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import kotlinx.android.synthetic.main.activity_register_result.* +import kotlinx.android.synthetic.main.include_left_back_title.* + +class RegisterResultActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_register_result + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.visibility = View.GONE + } + + override fun observeRequestState() { + + } + + override fun initData() { + + } + + override fun initEvent() { + loginButton.setOnClickListener { + navigatePageTo() + PageNavigationManager.finishAllActivity() + } + } +} \ 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 new file mode 100644 index 0000000..4dc700e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/ResetDeviceActivity.kt @@ -0,0 +1,102 @@ +package com.casic.br.view + +import android.content.Context +import android.util.Log +import android.view.View +import com.casic.br.R +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.model.HomeModel +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.utils.LocaleConstant +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +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.extensions.toJson +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 val context: Context = this@ResetDeviceActivity + private val gson by lazy { Gson() } + 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 s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + val homeModel = gson.fromJson(s, object : TypeToken() {}.type) + TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeModel.homeId.toLong(), + object : ITuyaActivatorGetToken { + override fun onSuccess(token: String) { + Log.d(kTag, "token: $token") + //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 + val builder = object : ActivatorBuilder() {} + builder.ssid = params[0] + builder.context = context + builder.password = params[1] + builder.activatorModel = ActivatorModelEnum.TY_EZ + builder.timeOut = 100 + builder.token = token + builder.listener = object : ITuyaSmartActivatorListener { + override fun onError(errorCode: String?, errorMsg: String?) { + Log.i(kTag, "onError: $errorMsg") + LoadingDialogHub.dismiss() + } + + override fun onActiveSuccess(devResp: DeviceBean?) { + LoadingDialogHub.dismiss() + Log.d(kTag, devResp!!.toJson()) + navigatePageTo() + } + + override fun onStep(step: String?, data: Any?) { + Log.i(kTag, "step: $step") + Log.i(kTag, "data: $data") + LoadingDialogHub.dismiss() + } + } + TuyaHomeSdk.getActivatorInstance().newMultiActivator(builder).start() + } + + override fun onFailure(s: String, s1: String) { + LoadingDialogHub.dismiss() + } + }) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/SearchDeviceResult.kt b/app/src/main/java/com/casic/br/view/SearchDeviceResult.kt deleted file mode 100644 index ed466ae..0000000 --- a/app/src/main/java/com/casic/br/view/SearchDeviceResult.kt +++ /dev/null @@ -1,40 +0,0 @@ -package com.casic.br.view - -import com.casic.br.R -import com.casic.br.extensions.initLayoutImmersionBar -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo -import kotlinx.android.synthetic.main.activity_search_device_result.* -import kotlinx.android.synthetic.main.include_left_back_title.* - -class SearchDeviceResult : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_search_device_result - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(true).init() - initLayoutImmersionBar(rootView) - leftBackView.setOnClickListener { finish() } - titleView.text = "添加设备" - } - - override fun initData() { - - } - - override fun initEvent() { - confirmButton.setOnClickListener { - navigatePageTo() - finish() - } - - reSearchDeviceView.setOnClickListener { - navigatePageTo() - } - } -} \ 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 new file mode 100644 index 0000000..a432adc --- /dev/null +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -0,0 +1,70 @@ +package com.casic.br.view + +import android.content.Context +import android.content.Intent +import android.net.wifi.WifiManager +import android.provider.Settings +import android.view.View +import com.casic.br.R +import com.casic.br.extensions.initLayoutImmersionBar +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 kotlinx.android.synthetic.main.activity_login.* +import kotlinx.android.synthetic.main.activity_select_wifi.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.android.synthetic.main.include_base_title.leftBackView +import kotlinx.android.synthetic.main.include_base_title.titleView +import kotlinx.android.synthetic.main.include_left_back_title.* + + +class SelectWiFiActivity : KotlinBaseActivity() { + + private val context: Context = this@SelectWiFiActivity + private val kTag = "SelectWifiActivity" + private val wifi by lazy { applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager } + + override fun initLayoutView(): Int = R.layout.activity_select_wifi + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.visibility = View.GONE + } + + override fun initData() { + + } + + override fun initEvent() { + changeWifiView.setOnClickListener { + startActivity(Intent(Settings.ACTION_WIFI_SETTINGS)) + } + + nextStepButton.setOnClickListener { + val wifiName = wifiNameView.text.toString() + if (wifiName.isBlank()) { + "请确认WiFi已连接".show(this) + return@setOnClickListener + } + val wifiKey = wifiKeyView.text.toString() + if (wifiKey.isBlank()) { + "请输入WiFi密码".show(this) + return@setOnClickListener + } + navigatePageTo(arrayListOf(wifiName, wifiKey)) + } + } + + override fun onResume() { + super.onResume() + //获取已连接WiFi配置 + wifiNameView.setText(wifi.connectionInfo.ssid.replace("\"", "")) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3ea0e96..ba3523a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,15 +41,16 @@ + + - - + + - diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt index bf8285c..c90a197 100644 --- a/app/src/main/java/com/casic/br/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt @@ -1,16 +1,10 @@ package com.casic.br.base import android.app.Application -import android.util.Log import com.casic.br.greendao.DaoMaster import com.casic.br.greendao.DaoSession -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues -import com.tuya.smart.android.user.api.ILoginCallback -import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.home.sdk.bean.HomeBean -import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlin.properties.Delegates @@ -30,46 +24,13 @@ super.onCreate() instance = this SaveKeyValues.initSharedPreferences(this) - initTuya() + TuyaHomeSdk.init(this) + TuyaHomeSdk.setDebugMode(true) val devOpenHelper = DaoMaster.DevOpenHelper(this, "SmartKitchen.db", null) val daoMaster = DaoMaster(devOpenHelper.writableDatabase) daoSession = daoMaster.newSession() } - private fun initTuya() { - TuyaHomeSdk.init(this) - TuyaHomeSdk.setDebugMode(true) - /** - * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 - * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 - * 用户账号下创建任意多个家庭。 - * */ - //TODO 必须登录 - TuyaHomeSdk.getUserInstance() - .loginWithPhonePassword("86", "18310581916", "123456", object : ILoginCallback { - override fun onSuccess(user: User?) { - Log.d(kTag, "Login success:" + user!!.username) - } - - override fun onError(code: String, error: String) { - Log.e(kTag, "code: " + code + "error:" + error) - } - }) - - - TuyaHomeSdk.getHomeManagerInstance() - .createHome("北燃生活体验馆", 116.486394, 39.885734, "北燃生活体验馆", arrayListOf(), object : - ITuyaHomeResultCallback { - override fun onSuccess(bean: HomeBean?) { - Log.d(kTag, bean!!.toJson()) - } - - override fun onError(errorCode: String?, errorMsg: String?) { - Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") - } - }) - } - fun obtainDaoSession(): DaoSession { return daoSession } diff --git a/app/src/main/java/com/casic/br/extensions/Context.kt b/app/src/main/java/com/casic/br/extensions/Context.kt index 5866614..5726394 100644 --- a/app/src/main/java/com/casic/br/extensions/Context.kt +++ b/app/src/main/java/com/casic/br/extensions/Context.kt @@ -2,11 +2,16 @@ import android.content.Context import android.view.ViewGroup +import com.casic.br.base.BaseApplication +import com.pengxh.kt.lite.extensions.dp2px import com.qmuiteam.qmui.util.QMUIDisplayHelper fun Context.initLayoutImmersionBar(rootView: ViewGroup) { //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + if (statusBarHeight == 0) { + statusBarHeight = 44f.dp2px(BaseApplication.obtainInstance()) + } rootView.setPadding(0, statusBarHeight, 0, 0) rootView.requestLayout() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index cc20c54..4ef912b 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -1,25 +1,40 @@ package com.casic.br.fragment import android.graphics.Typeface +import android.util.Log import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.model.AddedDeviceModel +import com.casic.br.model.HomeModel import com.casic.br.model.RecommendModel +import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddDeviceActivity import com.casic.br.view.AllDeviceActivity import com.casic.br.view.device.FireplaceActivity import com.casic.br.view.device.RangeHoodActivity import com.casic.br.view.device.WaterHeaterActivity +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.fragment_device.* import kotlinx.android.synthetic.main.include_main_title.* import java.util.* + class DevicePageFragment : KotlinBaseFragment() { + private val kTag = "DevicePageFragment" + private val gson by lazy { Gson() } + override fun initLayoutView(): Int = R.layout.fragment_device override fun setupTopBarLayout() { @@ -37,16 +52,6 @@ model1.deviceModel = "D40-DM1" model1.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" deviceModels.add(model1) - val model2 = AddedDeviceModel() - model2.deviceName = "万家乐油烟机" - model2.deviceModel = "CXW-320-W7" - model2.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model2) - val model3 = AddedDeviceModel() - model3.deviceName = "万家乐壁挂炉" - model3.deviceModel = "26-13A3L" - model3.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model3) val addedDeviceAdapter = AddedDeviceAdapter(requireContext()) addedDeviceAdapter.setupDevice(deviceModels) @@ -102,8 +107,28 @@ } override fun initEvent() { - showAllDeviceLayout.setOnClickListener { + showAllDeviceButton.setOnClickListener { requireContext().navigatePageTo() } } + + override fun onResume() { + super.onResume() + val s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + if (s == "") { + return + } + val homeModel = gson.fromJson(s, object : TypeToken() {}.type) + TuyaHomeSdk.newHomeInstance(homeModel.homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + Log.d(kTag, deviceList.toJson()) + } + + override fun onError(errorCode: String, errorMsg: String) { + // do something + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 8aba9b2..84e947c 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -9,9 +9,13 @@ import com.casic.br.utils.GridItemDecoration import com.casic.br.utils.LocaleConstant import com.casic.br.view.LoginActivity +import com.casic.br.view.MainActivity import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.youth.banner.Banner import com.youth.banner.adapter.BannerImageAdapter import com.youth.banner.holder.BannerImageHolder @@ -90,7 +94,39 @@ override fun initEvent() { rightOperateView.setOnClickListener { - requireContext().navigatePageTo() + if (rightOperateView.text == "退出") { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出确认") + .setMessage("退出当前账号,将不能同步数据") + .setNegativeButton("取消") + .setPositiveButton("确认退出") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, false) + requireContext().navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) + .build().show() + } else { + requireContext().navigatePageTo() + } } } + + override fun onResume() { + val isLogin = SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + if (isLogin) { + rightOperateView.text = "退出" + } else { + rightOperateView.text = "登录" + } + super.onResume() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/model/HomeModel.java b/app/src/main/java/com/casic/br/model/HomeModel.java new file mode 100644 index 0000000..638d420 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/HomeModel.java @@ -0,0 +1,127 @@ +package com.casic.br.model; + +import java.util.List; + +public class HomeModel { + + private boolean admin; + private String geoName; + private int homeId; + private int homeStatus; + private double lat; + private double lon; + private String name; + private int role; + private List rooms; + + public boolean isAdmin() { + return admin; + } + + public void setAdmin(boolean admin) { + this.admin = admin; + } + + public String getGeoName() { + return geoName; + } + + public void setGeoName(String geoName) { + this.geoName = geoName; + } + + public int getHomeId() { + return homeId; + } + + public void setHomeId(int homeId) { + this.homeId = homeId; + } + + public int getHomeStatus() { + return homeStatus; + } + + public void setHomeStatus(int homeStatus) { + this.homeStatus = homeStatus; + } + + public double getLat() { + return lat; + } + + public void setLat(double lat) { + this.lat = lat; + } + + public double getLon() { + return lon; + } + + public void setLon(double lon) { + this.lon = lon; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRole() { + return role; + } + + public void setRole(int role) { + this.role = role; + } + + public List getRooms() { + return rooms; + } + + public void setRooms(List rooms) { + this.rooms = rooms; + } + + public static class RoomsModel { + private int displayOrder; + private String name; + private int roomId; + private boolean sel; + + public int getDisplayOrder() { + return displayOrder; + } + + public void setDisplayOrder(int displayOrder) { + this.displayOrder = displayOrder; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRoomId() { + return roomId; + } + + public void setRoomId(int roomId) { + this.roomId = roomId; + } + + public boolean isSel() { + return sel; + } + + public void setSel(boolean sel) { + this.sel = sel; + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/DialogManager.kt b/app/src/main/java/com/casic/br/utils/DialogManager.kt deleted file mode 100644 index da62e63..0000000 --- a/app/src/main/java/com/casic/br/utils/DialogManager.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.casic.br.utils; - -import android.app.Activity -import android.view.WindowManager -import com.pengxh.kt.lite.base.BaseSingleton -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog - -class DialogManager private constructor(private val activity: Activity) { - - private lateinit var loadingDialog: QMUITipDialog - - companion object : BaseSingleton() { - override val creator: (Activity) -> DialogManager - get() = ::DialogManager - } - - fun showLoadingDialog(message: String) { - loadingDialog = QMUITipDialog - .Builder(activity) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord(message) - .create() - if (!activity.isDestroyed) { - try { - loadingDialog.show() - } catch (e: WindowManager.BadTokenException) { - e.printStackTrace() - } - } - } - - fun dismissLoadingDialog() { - if (loadingDialog.isShowing) { - loadingDialog.dismiss() - } - } -} diff --git a/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt b/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt new file mode 100644 index 0000000..e04e327 --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt @@ -0,0 +1,31 @@ +package com.casic.br.utils + +import android.app.Activity +import android.view.WindowManager +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + +object LoadingDialogHub { + + private lateinit var loadingDialog: QMUITipDialog + + fun show(activity: Activity, message: String) { + loadingDialog = QMUITipDialog + .Builder(activity) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord(message) + .create() + if (!activity.isDestroyed) { + try { + loadingDialog.show() + } catch (e: WindowManager.BadTokenException) { + e.printStackTrace() + } + } + } + + fun dismiss() { + if (loadingDialog.isShowing) { + loadingDialog.dismiss() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 197a466..dd365ad 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -53,7 +53,8 @@ * String * ============================================================================================= * */ - const val USER_DETAIL_MODEL = "userDetailModel" + const val USER_IS_LOGIN = "isLogin" + const val HOME_DETAIL_MODEL = "homeDetailModel" const val SERVER_BASE_URL = "http://111.198.10.15:11304" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val ACCOUNT = "account" diff --git a/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt index ce8f99e..210a258 100644 --- a/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt @@ -30,13 +30,12 @@ override fun initEvent() { iotDevice.setOnClickListener { - navigatePageTo() - finish() + //IoT设备首先需要先配置网络 + navigatePageTo() } notIotDevice.setOnClickListener { navigatePageTo() - finish() } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt b/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt index d58aebd..ec99e90 100644 --- a/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt @@ -4,6 +4,8 @@ import com.casic.br.extensions.initLayoutImmersionBar import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_add_device_result.* class AddDeviceResultActivity : KotlinBaseActivity() { @@ -26,7 +28,8 @@ override fun initEvent() { completeButton.setOnClickListener { - finish() + navigatePageTo() + PageNavigationManager.finishAllActivity() } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt deleted file mode 100644 index 25ce475..0000000 --- a/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt +++ /dev/null @@ -1,56 +0,0 @@ -package com.casic.br.view - -import android.view.View -import android.widget.AdapterView -import com.casic.br.R -import com.casic.br.extensions.initLayoutImmersionBar -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo -import kotlinx.android.synthetic.main.activity_add_device_iot.* - -/** - * 添加IoT设备 - * */ -class AddIoTDeviceActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_add_device_iot - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(true).init() - initLayoutImmersionBar(rootView) - leftBackView.setOnClickListener { finish() } - } - - override fun initData() { - //默认选择WIFI快连 - connectTypeSpinner.setSelection(0) - } - - override fun initEvent() { - connectTypeSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>?, view: View?, position: Int, id: Long - ) { - - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - - } - } - - nextStepButton.setOnClickListener { - if (connectTypeSpinner.selectedItemPosition == 0) { - navigatePageTo() - } else { - navigatePageTo() - } - finish() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 9de6790..54975e3 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -1,11 +1,26 @@ package com.casic.br.view +import android.content.Context import com.casic.br.R +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.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.android.user.api.ILoginCallback +import com.tuya.smart.android.user.bean.User +import com.tuya.smart.home.sdk.TuyaHomeSdk +import kotlinx.android.synthetic.main.activity_login.* +import kotlinx.android.synthetic.main.activity_login.userPhoneView +import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { + private val context: Context = this@LoginActivity + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -21,6 +36,38 @@ } override fun initEvent() { + registerView.setOnClickListener { + navigatePageTo() + } + loginButton.setOnClickListener { + val userPhone = userPhoneView.text.toString() + if (userPhone.isBlank()) { + "请输入手机号".show(this) + return@setOnClickListener + } + val userPassword = passwordView.text.toString() + if (userPassword.isBlank()) { + "请输入密码".show(this) + return@setOnClickListener + } + + LoadingDialogHub.show(this, "登录中,请稍后") + TuyaHomeSdk.getUserInstance() + .loginWithPhonePassword("86", userPhone, userPassword, object : ILoginCallback { + override fun onSuccess(user: User?) { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, true) + LoadingDialogHub.dismiss() + navigatePageTo() + PageNavigationManager.finishAllActivity() + } + + override fun onError(code: String?, error: String?) { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, false) + LoadingDialogHub.dismiss() + "登录失败".show(context) + } + }) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index a2fb29a..25f4254 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -1,5 +1,6 @@ package com.casic.br.view +import android.util.Log import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment @@ -7,13 +8,20 @@ import com.casic.br.R import com.casic.br.adapter.ViewPagerAdapter import com.casic.br.fragment.* +import com.casic.br.utils.LocaleConstant import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { + private val kTag = "MainActivity" private var menuItem: MenuItem? = null private var fragmentPages: ArrayList = ArrayList() private var clickTime: Long = 0 @@ -33,7 +41,27 @@ } override fun initData() { + /** + * TODO 需要改为实际情况 + * + * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 + * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 + * 用户账号下创建任意多个家庭。 + * */ + val s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + if (s == "") { + TuyaHomeSdk.getHomeManagerInstance() + .createHome("北燃生活体验馆", 116.486394, 39.885734, "西直门内南小街", arrayListOf("1"), object : + ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean?) { + SaveKeyValues.putValue(LocaleConstant.HOME_DETAIL_MODEL, bean!!.toJson()) + } + override fun onError(errorCode: String?, errorMsg: String?) { + Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") + } + }) + } } override fun observeRequestState() { diff --git a/app/src/main/java/com/casic/br/view/RegisterActivity.kt b/app/src/main/java/com/casic/br/view/RegisterActivity.kt new file mode 100644 index 0000000..96510fb --- /dev/null +++ b/app/src/main/java/com/casic/br/view/RegisterActivity.kt @@ -0,0 +1,113 @@ +package com.casic.br.view + +import android.content.Context +import android.os.CountDownTimer +import com.casic.br.R +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.isPhoneNumber +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.tuya.smart.android.user.api.IRegisterCallback +import com.tuya.smart.android.user.bean.User +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback +import kotlinx.android.synthetic.main.activity_register.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import java.util.* + +class RegisterActivity : KotlinBaseActivity() { + + private val kTag = "RegisterActivity" + private val context: Context = this@RegisterActivity + + override fun initLayoutView(): Int = R.layout.activity_register + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.text = "注册账号" + } + + override fun initData() { + + } + + override fun initEvent() { + requestCodeButton.setOnClickListener { + if (userPhoneView.text.toString().isBlank()) { + "请输入手机号".show(this) + return@setOnClickListener + } + if (!userPhoneView.text.toString().isPhoneNumber()) { + "手机号不正确,请检查".show(this) + return@setOnClickListener + } + //发送验证码 + TuyaHomeSdk.getUserInstance().sendVerifyCodeWithUserName( + userPhoneView.text.toString(), "", "86", 1, + object : IResultCallback { + override fun onSuccess() { + "发送验证码成功".show(context) + } + + override fun onError(code: String?, error: String?) { + "发送验证码失败".show(context) + } + }) + + //开始倒计时 + object : CountDownTimer(60 * 1000, 1000) { + override fun onTick(millisUntilFinished: Long) { + requestCodeButton.text = String.format("${millisUntilFinished / 1000}s") + requestCodeButton.isEnabled = false + } + + override fun onFinish() { + requestCodeButton.text = "获取验证码" + requestCodeButton.isEnabled = true + } + }.start() + } + + registerButton.setOnClickListener { + val userPhone = userPhoneView.text.toString() + if (userPhone.isBlank()) { + "请输入手机号".show(this) + return@setOnClickListener + } + val smsCode = requestCodeView.text.toString() + if (smsCode.isBlank()) { + "请输入验证码".show(this) + return@setOnClickListener + } + val userPassword = userPasswordView.text.toString() + if (userPassword.isBlank()) { + "请输入密码".show(this) + return@setOnClickListener + } + + LoadingDialogHub.show(this, "注册中,请稍后") + TuyaHomeSdk.getUserInstance().registerAccountWithPhone( + "86", userPhone, userPassword, smsCode, + object : IRegisterCallback { + override fun onSuccess(user: User?) { + LoadingDialogHub.dismiss() + navigatePageTo() + } + + override fun onError(code: String?, error: String?) { + LoadingDialogHub.dismiss() + "用户注册失败".show(context) + } + }) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/RegisterResultActivity.kt b/app/src/main/java/com/casic/br/view/RegisterResultActivity.kt new file mode 100644 index 0000000..6a0de18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/RegisterResultActivity.kt @@ -0,0 +1,40 @@ +package com.casic.br.view + +import android.view.View +import com.casic.br.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import kotlinx.android.synthetic.main.activity_register_result.* +import kotlinx.android.synthetic.main.include_left_back_title.* + +class RegisterResultActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_register_result + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.visibility = View.GONE + } + + override fun observeRequestState() { + + } + + override fun initData() { + + } + + override fun initEvent() { + loginButton.setOnClickListener { + navigatePageTo() + PageNavigationManager.finishAllActivity() + } + } +} \ 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 new file mode 100644 index 0000000..4dc700e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/ResetDeviceActivity.kt @@ -0,0 +1,102 @@ +package com.casic.br.view + +import android.content.Context +import android.util.Log +import android.view.View +import com.casic.br.R +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.model.HomeModel +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.utils.LocaleConstant +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +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.extensions.toJson +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 val context: Context = this@ResetDeviceActivity + private val gson by lazy { Gson() } + 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 s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + val homeModel = gson.fromJson(s, object : TypeToken() {}.type) + TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeModel.homeId.toLong(), + object : ITuyaActivatorGetToken { + override fun onSuccess(token: String) { + Log.d(kTag, "token: $token") + //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 + val builder = object : ActivatorBuilder() {} + builder.ssid = params[0] + builder.context = context + builder.password = params[1] + builder.activatorModel = ActivatorModelEnum.TY_EZ + builder.timeOut = 100 + builder.token = token + builder.listener = object : ITuyaSmartActivatorListener { + override fun onError(errorCode: String?, errorMsg: String?) { + Log.i(kTag, "onError: $errorMsg") + LoadingDialogHub.dismiss() + } + + override fun onActiveSuccess(devResp: DeviceBean?) { + LoadingDialogHub.dismiss() + Log.d(kTag, devResp!!.toJson()) + navigatePageTo() + } + + override fun onStep(step: String?, data: Any?) { + Log.i(kTag, "step: $step") + Log.i(kTag, "data: $data") + LoadingDialogHub.dismiss() + } + } + TuyaHomeSdk.getActivatorInstance().newMultiActivator(builder).start() + } + + override fun onFailure(s: String, s1: String) { + LoadingDialogHub.dismiss() + } + }) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/SearchDeviceResult.kt b/app/src/main/java/com/casic/br/view/SearchDeviceResult.kt deleted file mode 100644 index ed466ae..0000000 --- a/app/src/main/java/com/casic/br/view/SearchDeviceResult.kt +++ /dev/null @@ -1,40 +0,0 @@ -package com.casic.br.view - -import com.casic.br.R -import com.casic.br.extensions.initLayoutImmersionBar -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo -import kotlinx.android.synthetic.main.activity_search_device_result.* -import kotlinx.android.synthetic.main.include_left_back_title.* - -class SearchDeviceResult : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_search_device_result - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(true).init() - initLayoutImmersionBar(rootView) - leftBackView.setOnClickListener { finish() } - titleView.text = "添加设备" - } - - override fun initData() { - - } - - override fun initEvent() { - confirmButton.setOnClickListener { - navigatePageTo() - finish() - } - - reSearchDeviceView.setOnClickListener { - navigatePageTo() - } - } -} \ 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 new file mode 100644 index 0000000..a432adc --- /dev/null +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -0,0 +1,70 @@ +package com.casic.br.view + +import android.content.Context +import android.content.Intent +import android.net.wifi.WifiManager +import android.provider.Settings +import android.view.View +import com.casic.br.R +import com.casic.br.extensions.initLayoutImmersionBar +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 kotlinx.android.synthetic.main.activity_login.* +import kotlinx.android.synthetic.main.activity_select_wifi.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.android.synthetic.main.include_base_title.leftBackView +import kotlinx.android.synthetic.main.include_base_title.titleView +import kotlinx.android.synthetic.main.include_left_back_title.* + + +class SelectWiFiActivity : KotlinBaseActivity() { + + private val context: Context = this@SelectWiFiActivity + private val kTag = "SelectWifiActivity" + private val wifi by lazy { applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager } + + override fun initLayoutView(): Int = R.layout.activity_select_wifi + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.visibility = View.GONE + } + + override fun initData() { + + } + + override fun initEvent() { + changeWifiView.setOnClickListener { + startActivity(Intent(Settings.ACTION_WIFI_SETTINGS)) + } + + nextStepButton.setOnClickListener { + val wifiName = wifiNameView.text.toString() + if (wifiName.isBlank()) { + "请确认WiFi已连接".show(this) + return@setOnClickListener + } + val wifiKey = wifiKeyView.text.toString() + if (wifiKey.isBlank()) { + "请输入WiFi密码".show(this) + return@setOnClickListener + } + navigatePageTo(arrayListOf(wifiName, wifiKey)) + } + } + + override fun onResume() { + super.onResume() + //获取已连接WiFi配置 + wifiNameView.setText(wifi.connectionInfo.ssid.replace("\"", "")) + } +} \ 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 deleted file mode 100644 index d53fc31..0000000 --- a/app/src/main/java/com/casic/br/view/SelectWifiActivity.kt +++ /dev/null @@ -1,35 +0,0 @@ -package com.casic.br.view - -import com.casic.br.R -import com.casic.br.extensions.initLayoutImmersionBar -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo -import kotlinx.android.synthetic.main.activity_select_wifi.* -import kotlinx.android.synthetic.main.include_base_title.* - -class SelectWifiActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_select_wifi - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(true).init() - initLayoutImmersionBar(rootView) - leftBackView.setOnClickListener { finish() } - } - - override fun initData() { - - } - - override fun initEvent() { - nextStepButton.setOnClickListener { - navigatePageTo() - finish() - } - } -} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3ea0e96..ba3523a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,15 +41,16 @@ + + - - + + - diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt index bf8285c..c90a197 100644 --- a/app/src/main/java/com/casic/br/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt @@ -1,16 +1,10 @@ package com.casic.br.base import android.app.Application -import android.util.Log import com.casic.br.greendao.DaoMaster import com.casic.br.greendao.DaoSession -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues -import com.tuya.smart.android.user.api.ILoginCallback -import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.home.sdk.bean.HomeBean -import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlin.properties.Delegates @@ -30,46 +24,13 @@ super.onCreate() instance = this SaveKeyValues.initSharedPreferences(this) - initTuya() + TuyaHomeSdk.init(this) + TuyaHomeSdk.setDebugMode(true) val devOpenHelper = DaoMaster.DevOpenHelper(this, "SmartKitchen.db", null) val daoMaster = DaoMaster(devOpenHelper.writableDatabase) daoSession = daoMaster.newSession() } - private fun initTuya() { - TuyaHomeSdk.init(this) - TuyaHomeSdk.setDebugMode(true) - /** - * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 - * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 - * 用户账号下创建任意多个家庭。 - * */ - //TODO 必须登录 - TuyaHomeSdk.getUserInstance() - .loginWithPhonePassword("86", "18310581916", "123456", object : ILoginCallback { - override fun onSuccess(user: User?) { - Log.d(kTag, "Login success:" + user!!.username) - } - - override fun onError(code: String, error: String) { - Log.e(kTag, "code: " + code + "error:" + error) - } - }) - - - TuyaHomeSdk.getHomeManagerInstance() - .createHome("北燃生活体验馆", 116.486394, 39.885734, "北燃生活体验馆", arrayListOf(), object : - ITuyaHomeResultCallback { - override fun onSuccess(bean: HomeBean?) { - Log.d(kTag, bean!!.toJson()) - } - - override fun onError(errorCode: String?, errorMsg: String?) { - Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") - } - }) - } - fun obtainDaoSession(): DaoSession { return daoSession } diff --git a/app/src/main/java/com/casic/br/extensions/Context.kt b/app/src/main/java/com/casic/br/extensions/Context.kt index 5866614..5726394 100644 --- a/app/src/main/java/com/casic/br/extensions/Context.kt +++ b/app/src/main/java/com/casic/br/extensions/Context.kt @@ -2,11 +2,16 @@ import android.content.Context import android.view.ViewGroup +import com.casic.br.base.BaseApplication +import com.pengxh.kt.lite.extensions.dp2px import com.qmuiteam.qmui.util.QMUIDisplayHelper fun Context.initLayoutImmersionBar(rootView: ViewGroup) { //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + if (statusBarHeight == 0) { + statusBarHeight = 44f.dp2px(BaseApplication.obtainInstance()) + } rootView.setPadding(0, statusBarHeight, 0, 0) rootView.requestLayout() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index cc20c54..4ef912b 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -1,25 +1,40 @@ package com.casic.br.fragment import android.graphics.Typeface +import android.util.Log import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.model.AddedDeviceModel +import com.casic.br.model.HomeModel import com.casic.br.model.RecommendModel +import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddDeviceActivity import com.casic.br.view.AllDeviceActivity import com.casic.br.view.device.FireplaceActivity import com.casic.br.view.device.RangeHoodActivity import com.casic.br.view.device.WaterHeaterActivity +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.fragment_device.* import kotlinx.android.synthetic.main.include_main_title.* import java.util.* + class DevicePageFragment : KotlinBaseFragment() { + private val kTag = "DevicePageFragment" + private val gson by lazy { Gson() } + override fun initLayoutView(): Int = R.layout.fragment_device override fun setupTopBarLayout() { @@ -37,16 +52,6 @@ model1.deviceModel = "D40-DM1" model1.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" deviceModels.add(model1) - val model2 = AddedDeviceModel() - model2.deviceName = "万家乐油烟机" - model2.deviceModel = "CXW-320-W7" - model2.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model2) - val model3 = AddedDeviceModel() - model3.deviceName = "万家乐壁挂炉" - model3.deviceModel = "26-13A3L" - model3.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model3) val addedDeviceAdapter = AddedDeviceAdapter(requireContext()) addedDeviceAdapter.setupDevice(deviceModels) @@ -102,8 +107,28 @@ } override fun initEvent() { - showAllDeviceLayout.setOnClickListener { + showAllDeviceButton.setOnClickListener { requireContext().navigatePageTo() } } + + override fun onResume() { + super.onResume() + val s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + if (s == "") { + return + } + val homeModel = gson.fromJson(s, object : TypeToken() {}.type) + TuyaHomeSdk.newHomeInstance(homeModel.homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + Log.d(kTag, deviceList.toJson()) + } + + override fun onError(errorCode: String, errorMsg: String) { + // do something + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 8aba9b2..84e947c 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -9,9 +9,13 @@ import com.casic.br.utils.GridItemDecoration import com.casic.br.utils.LocaleConstant import com.casic.br.view.LoginActivity +import com.casic.br.view.MainActivity import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.youth.banner.Banner import com.youth.banner.adapter.BannerImageAdapter import com.youth.banner.holder.BannerImageHolder @@ -90,7 +94,39 @@ override fun initEvent() { rightOperateView.setOnClickListener { - requireContext().navigatePageTo() + if (rightOperateView.text == "退出") { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出确认") + .setMessage("退出当前账号,将不能同步数据") + .setNegativeButton("取消") + .setPositiveButton("确认退出") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, false) + requireContext().navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) + .build().show() + } else { + requireContext().navigatePageTo() + } } } + + override fun onResume() { + val isLogin = SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + if (isLogin) { + rightOperateView.text = "退出" + } else { + rightOperateView.text = "登录" + } + super.onResume() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/model/HomeModel.java b/app/src/main/java/com/casic/br/model/HomeModel.java new file mode 100644 index 0000000..638d420 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/HomeModel.java @@ -0,0 +1,127 @@ +package com.casic.br.model; + +import java.util.List; + +public class HomeModel { + + private boolean admin; + private String geoName; + private int homeId; + private int homeStatus; + private double lat; + private double lon; + private String name; + private int role; + private List rooms; + + public boolean isAdmin() { + return admin; + } + + public void setAdmin(boolean admin) { + this.admin = admin; + } + + public String getGeoName() { + return geoName; + } + + public void setGeoName(String geoName) { + this.geoName = geoName; + } + + public int getHomeId() { + return homeId; + } + + public void setHomeId(int homeId) { + this.homeId = homeId; + } + + public int getHomeStatus() { + return homeStatus; + } + + public void setHomeStatus(int homeStatus) { + this.homeStatus = homeStatus; + } + + public double getLat() { + return lat; + } + + public void setLat(double lat) { + this.lat = lat; + } + + public double getLon() { + return lon; + } + + public void setLon(double lon) { + this.lon = lon; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRole() { + return role; + } + + public void setRole(int role) { + this.role = role; + } + + public List getRooms() { + return rooms; + } + + public void setRooms(List rooms) { + this.rooms = rooms; + } + + public static class RoomsModel { + private int displayOrder; + private String name; + private int roomId; + private boolean sel; + + public int getDisplayOrder() { + return displayOrder; + } + + public void setDisplayOrder(int displayOrder) { + this.displayOrder = displayOrder; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRoomId() { + return roomId; + } + + public void setRoomId(int roomId) { + this.roomId = roomId; + } + + public boolean isSel() { + return sel; + } + + public void setSel(boolean sel) { + this.sel = sel; + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/DialogManager.kt b/app/src/main/java/com/casic/br/utils/DialogManager.kt deleted file mode 100644 index da62e63..0000000 --- a/app/src/main/java/com/casic/br/utils/DialogManager.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.casic.br.utils; - -import android.app.Activity -import android.view.WindowManager -import com.pengxh.kt.lite.base.BaseSingleton -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog - -class DialogManager private constructor(private val activity: Activity) { - - private lateinit var loadingDialog: QMUITipDialog - - companion object : BaseSingleton() { - override val creator: (Activity) -> DialogManager - get() = ::DialogManager - } - - fun showLoadingDialog(message: String) { - loadingDialog = QMUITipDialog - .Builder(activity) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord(message) - .create() - if (!activity.isDestroyed) { - try { - loadingDialog.show() - } catch (e: WindowManager.BadTokenException) { - e.printStackTrace() - } - } - } - - fun dismissLoadingDialog() { - if (loadingDialog.isShowing) { - loadingDialog.dismiss() - } - } -} diff --git a/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt b/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt new file mode 100644 index 0000000..e04e327 --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt @@ -0,0 +1,31 @@ +package com.casic.br.utils + +import android.app.Activity +import android.view.WindowManager +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + +object LoadingDialogHub { + + private lateinit var loadingDialog: QMUITipDialog + + fun show(activity: Activity, message: String) { + loadingDialog = QMUITipDialog + .Builder(activity) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord(message) + .create() + if (!activity.isDestroyed) { + try { + loadingDialog.show() + } catch (e: WindowManager.BadTokenException) { + e.printStackTrace() + } + } + } + + fun dismiss() { + if (loadingDialog.isShowing) { + loadingDialog.dismiss() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 197a466..dd365ad 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -53,7 +53,8 @@ * String * ============================================================================================= * */ - const val USER_DETAIL_MODEL = "userDetailModel" + const val USER_IS_LOGIN = "isLogin" + const val HOME_DETAIL_MODEL = "homeDetailModel" const val SERVER_BASE_URL = "http://111.198.10.15:11304" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val ACCOUNT = "account" diff --git a/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt index ce8f99e..210a258 100644 --- a/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt @@ -30,13 +30,12 @@ override fun initEvent() { iotDevice.setOnClickListener { - navigatePageTo() - finish() + //IoT设备首先需要先配置网络 + navigatePageTo() } notIotDevice.setOnClickListener { navigatePageTo() - finish() } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt b/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt index d58aebd..ec99e90 100644 --- a/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt @@ -4,6 +4,8 @@ import com.casic.br.extensions.initLayoutImmersionBar import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_add_device_result.* class AddDeviceResultActivity : KotlinBaseActivity() { @@ -26,7 +28,8 @@ override fun initEvent() { completeButton.setOnClickListener { - finish() + navigatePageTo() + PageNavigationManager.finishAllActivity() } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt deleted file mode 100644 index 25ce475..0000000 --- a/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt +++ /dev/null @@ -1,56 +0,0 @@ -package com.casic.br.view - -import android.view.View -import android.widget.AdapterView -import com.casic.br.R -import com.casic.br.extensions.initLayoutImmersionBar -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo -import kotlinx.android.synthetic.main.activity_add_device_iot.* - -/** - * 添加IoT设备 - * */ -class AddIoTDeviceActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_add_device_iot - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(true).init() - initLayoutImmersionBar(rootView) - leftBackView.setOnClickListener { finish() } - } - - override fun initData() { - //默认选择WIFI快连 - connectTypeSpinner.setSelection(0) - } - - override fun initEvent() { - connectTypeSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>?, view: View?, position: Int, id: Long - ) { - - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - - } - } - - nextStepButton.setOnClickListener { - if (connectTypeSpinner.selectedItemPosition == 0) { - navigatePageTo() - } else { - navigatePageTo() - } - finish() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 9de6790..54975e3 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -1,11 +1,26 @@ package com.casic.br.view +import android.content.Context import com.casic.br.R +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.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.android.user.api.ILoginCallback +import com.tuya.smart.android.user.bean.User +import com.tuya.smart.home.sdk.TuyaHomeSdk +import kotlinx.android.synthetic.main.activity_login.* +import kotlinx.android.synthetic.main.activity_login.userPhoneView +import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { + private val context: Context = this@LoginActivity + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -21,6 +36,38 @@ } override fun initEvent() { + registerView.setOnClickListener { + navigatePageTo() + } + loginButton.setOnClickListener { + val userPhone = userPhoneView.text.toString() + if (userPhone.isBlank()) { + "请输入手机号".show(this) + return@setOnClickListener + } + val userPassword = passwordView.text.toString() + if (userPassword.isBlank()) { + "请输入密码".show(this) + return@setOnClickListener + } + + LoadingDialogHub.show(this, "登录中,请稍后") + TuyaHomeSdk.getUserInstance() + .loginWithPhonePassword("86", userPhone, userPassword, object : ILoginCallback { + override fun onSuccess(user: User?) { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, true) + LoadingDialogHub.dismiss() + navigatePageTo() + PageNavigationManager.finishAllActivity() + } + + override fun onError(code: String?, error: String?) { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, false) + LoadingDialogHub.dismiss() + "登录失败".show(context) + } + }) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index a2fb29a..25f4254 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -1,5 +1,6 @@ package com.casic.br.view +import android.util.Log import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment @@ -7,13 +8,20 @@ import com.casic.br.R import com.casic.br.adapter.ViewPagerAdapter import com.casic.br.fragment.* +import com.casic.br.utils.LocaleConstant import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { + private val kTag = "MainActivity" private var menuItem: MenuItem? = null private var fragmentPages: ArrayList = ArrayList() private var clickTime: Long = 0 @@ -33,7 +41,27 @@ } override fun initData() { + /** + * TODO 需要改为实际情况 + * + * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 + * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 + * 用户账号下创建任意多个家庭。 + * */ + val s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + if (s == "") { + TuyaHomeSdk.getHomeManagerInstance() + .createHome("北燃生活体验馆", 116.486394, 39.885734, "西直门内南小街", arrayListOf("1"), object : + ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean?) { + SaveKeyValues.putValue(LocaleConstant.HOME_DETAIL_MODEL, bean!!.toJson()) + } + override fun onError(errorCode: String?, errorMsg: String?) { + Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") + } + }) + } } override fun observeRequestState() { diff --git a/app/src/main/java/com/casic/br/view/RegisterActivity.kt b/app/src/main/java/com/casic/br/view/RegisterActivity.kt new file mode 100644 index 0000000..96510fb --- /dev/null +++ b/app/src/main/java/com/casic/br/view/RegisterActivity.kt @@ -0,0 +1,113 @@ +package com.casic.br.view + +import android.content.Context +import android.os.CountDownTimer +import com.casic.br.R +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.isPhoneNumber +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.tuya.smart.android.user.api.IRegisterCallback +import com.tuya.smart.android.user.bean.User +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback +import kotlinx.android.synthetic.main.activity_register.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import java.util.* + +class RegisterActivity : KotlinBaseActivity() { + + private val kTag = "RegisterActivity" + private val context: Context = this@RegisterActivity + + override fun initLayoutView(): Int = R.layout.activity_register + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.text = "注册账号" + } + + override fun initData() { + + } + + override fun initEvent() { + requestCodeButton.setOnClickListener { + if (userPhoneView.text.toString().isBlank()) { + "请输入手机号".show(this) + return@setOnClickListener + } + if (!userPhoneView.text.toString().isPhoneNumber()) { + "手机号不正确,请检查".show(this) + return@setOnClickListener + } + //发送验证码 + TuyaHomeSdk.getUserInstance().sendVerifyCodeWithUserName( + userPhoneView.text.toString(), "", "86", 1, + object : IResultCallback { + override fun onSuccess() { + "发送验证码成功".show(context) + } + + override fun onError(code: String?, error: String?) { + "发送验证码失败".show(context) + } + }) + + //开始倒计时 + object : CountDownTimer(60 * 1000, 1000) { + override fun onTick(millisUntilFinished: Long) { + requestCodeButton.text = String.format("${millisUntilFinished / 1000}s") + requestCodeButton.isEnabled = false + } + + override fun onFinish() { + requestCodeButton.text = "获取验证码" + requestCodeButton.isEnabled = true + } + }.start() + } + + registerButton.setOnClickListener { + val userPhone = userPhoneView.text.toString() + if (userPhone.isBlank()) { + "请输入手机号".show(this) + return@setOnClickListener + } + val smsCode = requestCodeView.text.toString() + if (smsCode.isBlank()) { + "请输入验证码".show(this) + return@setOnClickListener + } + val userPassword = userPasswordView.text.toString() + if (userPassword.isBlank()) { + "请输入密码".show(this) + return@setOnClickListener + } + + LoadingDialogHub.show(this, "注册中,请稍后") + TuyaHomeSdk.getUserInstance().registerAccountWithPhone( + "86", userPhone, userPassword, smsCode, + object : IRegisterCallback { + override fun onSuccess(user: User?) { + LoadingDialogHub.dismiss() + navigatePageTo() + } + + override fun onError(code: String?, error: String?) { + LoadingDialogHub.dismiss() + "用户注册失败".show(context) + } + }) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/RegisterResultActivity.kt b/app/src/main/java/com/casic/br/view/RegisterResultActivity.kt new file mode 100644 index 0000000..6a0de18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/RegisterResultActivity.kt @@ -0,0 +1,40 @@ +package com.casic.br.view + +import android.view.View +import com.casic.br.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import kotlinx.android.synthetic.main.activity_register_result.* +import kotlinx.android.synthetic.main.include_left_back_title.* + +class RegisterResultActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_register_result + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.visibility = View.GONE + } + + override fun observeRequestState() { + + } + + override fun initData() { + + } + + override fun initEvent() { + loginButton.setOnClickListener { + navigatePageTo() + PageNavigationManager.finishAllActivity() + } + } +} \ 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 new file mode 100644 index 0000000..4dc700e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/ResetDeviceActivity.kt @@ -0,0 +1,102 @@ +package com.casic.br.view + +import android.content.Context +import android.util.Log +import android.view.View +import com.casic.br.R +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.model.HomeModel +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.utils.LocaleConstant +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +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.extensions.toJson +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 val context: Context = this@ResetDeviceActivity + private val gson by lazy { Gson() } + 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 s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + val homeModel = gson.fromJson(s, object : TypeToken() {}.type) + TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeModel.homeId.toLong(), + object : ITuyaActivatorGetToken { + override fun onSuccess(token: String) { + Log.d(kTag, "token: $token") + //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 + val builder = object : ActivatorBuilder() {} + builder.ssid = params[0] + builder.context = context + builder.password = params[1] + builder.activatorModel = ActivatorModelEnum.TY_EZ + builder.timeOut = 100 + builder.token = token + builder.listener = object : ITuyaSmartActivatorListener { + override fun onError(errorCode: String?, errorMsg: String?) { + Log.i(kTag, "onError: $errorMsg") + LoadingDialogHub.dismiss() + } + + override fun onActiveSuccess(devResp: DeviceBean?) { + LoadingDialogHub.dismiss() + Log.d(kTag, devResp!!.toJson()) + navigatePageTo() + } + + override fun onStep(step: String?, data: Any?) { + Log.i(kTag, "step: $step") + Log.i(kTag, "data: $data") + LoadingDialogHub.dismiss() + } + } + TuyaHomeSdk.getActivatorInstance().newMultiActivator(builder).start() + } + + override fun onFailure(s: String, s1: String) { + LoadingDialogHub.dismiss() + } + }) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/SearchDeviceResult.kt b/app/src/main/java/com/casic/br/view/SearchDeviceResult.kt deleted file mode 100644 index ed466ae..0000000 --- a/app/src/main/java/com/casic/br/view/SearchDeviceResult.kt +++ /dev/null @@ -1,40 +0,0 @@ -package com.casic.br.view - -import com.casic.br.R -import com.casic.br.extensions.initLayoutImmersionBar -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo -import kotlinx.android.synthetic.main.activity_search_device_result.* -import kotlinx.android.synthetic.main.include_left_back_title.* - -class SearchDeviceResult : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_search_device_result - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(true).init() - initLayoutImmersionBar(rootView) - leftBackView.setOnClickListener { finish() } - titleView.text = "添加设备" - } - - override fun initData() { - - } - - override fun initEvent() { - confirmButton.setOnClickListener { - navigatePageTo() - finish() - } - - reSearchDeviceView.setOnClickListener { - navigatePageTo() - } - } -} \ 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 new file mode 100644 index 0000000..a432adc --- /dev/null +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -0,0 +1,70 @@ +package com.casic.br.view + +import android.content.Context +import android.content.Intent +import android.net.wifi.WifiManager +import android.provider.Settings +import android.view.View +import com.casic.br.R +import com.casic.br.extensions.initLayoutImmersionBar +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 kotlinx.android.synthetic.main.activity_login.* +import kotlinx.android.synthetic.main.activity_select_wifi.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.android.synthetic.main.include_base_title.leftBackView +import kotlinx.android.synthetic.main.include_base_title.titleView +import kotlinx.android.synthetic.main.include_left_back_title.* + + +class SelectWiFiActivity : KotlinBaseActivity() { + + private val context: Context = this@SelectWiFiActivity + private val kTag = "SelectWifiActivity" + private val wifi by lazy { applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager } + + override fun initLayoutView(): Int = R.layout.activity_select_wifi + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.visibility = View.GONE + } + + override fun initData() { + + } + + override fun initEvent() { + changeWifiView.setOnClickListener { + startActivity(Intent(Settings.ACTION_WIFI_SETTINGS)) + } + + nextStepButton.setOnClickListener { + val wifiName = wifiNameView.text.toString() + if (wifiName.isBlank()) { + "请确认WiFi已连接".show(this) + return@setOnClickListener + } + val wifiKey = wifiKeyView.text.toString() + if (wifiKey.isBlank()) { + "请输入WiFi密码".show(this) + return@setOnClickListener + } + navigatePageTo(arrayListOf(wifiName, wifiKey)) + } + } + + override fun onResume() { + super.onResume() + //获取已连接WiFi配置 + wifiNameView.setText(wifi.connectionInfo.ssid.replace("\"", "")) + } +} \ 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 deleted file mode 100644 index d53fc31..0000000 --- a/app/src/main/java/com/casic/br/view/SelectWifiActivity.kt +++ /dev/null @@ -1,35 +0,0 @@ -package com.casic.br.view - -import com.casic.br.R -import com.casic.br.extensions.initLayoutImmersionBar -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo -import kotlinx.android.synthetic.main.activity_select_wifi.* -import kotlinx.android.synthetic.main.include_base_title.* - -class SelectWifiActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_select_wifi - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(true).init() - initLayoutImmersionBar(rootView) - leftBackView.setOnClickListener { finish() } - } - - override fun initData() { - - } - - override fun initEvent() { - nextStepButton.setOnClickListener { - navigatePageTo() - finish() - } - } -} \ No newline at end of file diff --git a/app/src/main/res/drawable/button_gray_selector.xml b/app/src/main/res/drawable/button_gray_selector.xml new file mode 100644 index 0000000..44ae329 --- /dev/null +++ b/app/src/main/res/drawable/button_gray_selector.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3ea0e96..ba3523a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,15 +41,16 @@ + + - - + + - diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt index bf8285c..c90a197 100644 --- a/app/src/main/java/com/casic/br/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt @@ -1,16 +1,10 @@ package com.casic.br.base import android.app.Application -import android.util.Log import com.casic.br.greendao.DaoMaster import com.casic.br.greendao.DaoSession -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues -import com.tuya.smart.android.user.api.ILoginCallback -import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.home.sdk.bean.HomeBean -import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlin.properties.Delegates @@ -30,46 +24,13 @@ super.onCreate() instance = this SaveKeyValues.initSharedPreferences(this) - initTuya() + TuyaHomeSdk.init(this) + TuyaHomeSdk.setDebugMode(true) val devOpenHelper = DaoMaster.DevOpenHelper(this, "SmartKitchen.db", null) val daoMaster = DaoMaster(devOpenHelper.writableDatabase) daoSession = daoMaster.newSession() } - private fun initTuya() { - TuyaHomeSdk.init(this) - TuyaHomeSdk.setDebugMode(true) - /** - * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 - * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 - * 用户账号下创建任意多个家庭。 - * */ - //TODO 必须登录 - TuyaHomeSdk.getUserInstance() - .loginWithPhonePassword("86", "18310581916", "123456", object : ILoginCallback { - override fun onSuccess(user: User?) { - Log.d(kTag, "Login success:" + user!!.username) - } - - override fun onError(code: String, error: String) { - Log.e(kTag, "code: " + code + "error:" + error) - } - }) - - - TuyaHomeSdk.getHomeManagerInstance() - .createHome("北燃生活体验馆", 116.486394, 39.885734, "北燃生活体验馆", arrayListOf(), object : - ITuyaHomeResultCallback { - override fun onSuccess(bean: HomeBean?) { - Log.d(kTag, bean!!.toJson()) - } - - override fun onError(errorCode: String?, errorMsg: String?) { - Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") - } - }) - } - fun obtainDaoSession(): DaoSession { return daoSession } diff --git a/app/src/main/java/com/casic/br/extensions/Context.kt b/app/src/main/java/com/casic/br/extensions/Context.kt index 5866614..5726394 100644 --- a/app/src/main/java/com/casic/br/extensions/Context.kt +++ b/app/src/main/java/com/casic/br/extensions/Context.kt @@ -2,11 +2,16 @@ import android.content.Context import android.view.ViewGroup +import com.casic.br.base.BaseApplication +import com.pengxh.kt.lite.extensions.dp2px import com.qmuiteam.qmui.util.QMUIDisplayHelper fun Context.initLayoutImmersionBar(rootView: ViewGroup) { //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + if (statusBarHeight == 0) { + statusBarHeight = 44f.dp2px(BaseApplication.obtainInstance()) + } rootView.setPadding(0, statusBarHeight, 0, 0) rootView.requestLayout() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index cc20c54..4ef912b 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -1,25 +1,40 @@ package com.casic.br.fragment import android.graphics.Typeface +import android.util.Log import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.model.AddedDeviceModel +import com.casic.br.model.HomeModel import com.casic.br.model.RecommendModel +import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddDeviceActivity import com.casic.br.view.AllDeviceActivity import com.casic.br.view.device.FireplaceActivity import com.casic.br.view.device.RangeHoodActivity import com.casic.br.view.device.WaterHeaterActivity +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.fragment_device.* import kotlinx.android.synthetic.main.include_main_title.* import java.util.* + class DevicePageFragment : KotlinBaseFragment() { + private val kTag = "DevicePageFragment" + private val gson by lazy { Gson() } + override fun initLayoutView(): Int = R.layout.fragment_device override fun setupTopBarLayout() { @@ -37,16 +52,6 @@ model1.deviceModel = "D40-DM1" model1.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" deviceModels.add(model1) - val model2 = AddedDeviceModel() - model2.deviceName = "万家乐油烟机" - model2.deviceModel = "CXW-320-W7" - model2.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model2) - val model3 = AddedDeviceModel() - model3.deviceName = "万家乐壁挂炉" - model3.deviceModel = "26-13A3L" - model3.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model3) val addedDeviceAdapter = AddedDeviceAdapter(requireContext()) addedDeviceAdapter.setupDevice(deviceModels) @@ -102,8 +107,28 @@ } override fun initEvent() { - showAllDeviceLayout.setOnClickListener { + showAllDeviceButton.setOnClickListener { requireContext().navigatePageTo() } } + + override fun onResume() { + super.onResume() + val s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + if (s == "") { + return + } + val homeModel = gson.fromJson(s, object : TypeToken() {}.type) + TuyaHomeSdk.newHomeInstance(homeModel.homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + Log.d(kTag, deviceList.toJson()) + } + + override fun onError(errorCode: String, errorMsg: String) { + // do something + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 8aba9b2..84e947c 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -9,9 +9,13 @@ import com.casic.br.utils.GridItemDecoration import com.casic.br.utils.LocaleConstant import com.casic.br.view.LoginActivity +import com.casic.br.view.MainActivity import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.youth.banner.Banner import com.youth.banner.adapter.BannerImageAdapter import com.youth.banner.holder.BannerImageHolder @@ -90,7 +94,39 @@ override fun initEvent() { rightOperateView.setOnClickListener { - requireContext().navigatePageTo() + if (rightOperateView.text == "退出") { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出确认") + .setMessage("退出当前账号,将不能同步数据") + .setNegativeButton("取消") + .setPositiveButton("确认退出") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, false) + requireContext().navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) + .build().show() + } else { + requireContext().navigatePageTo() + } } } + + override fun onResume() { + val isLogin = SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + if (isLogin) { + rightOperateView.text = "退出" + } else { + rightOperateView.text = "登录" + } + super.onResume() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/model/HomeModel.java b/app/src/main/java/com/casic/br/model/HomeModel.java new file mode 100644 index 0000000..638d420 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/HomeModel.java @@ -0,0 +1,127 @@ +package com.casic.br.model; + +import java.util.List; + +public class HomeModel { + + private boolean admin; + private String geoName; + private int homeId; + private int homeStatus; + private double lat; + private double lon; + private String name; + private int role; + private List rooms; + + public boolean isAdmin() { + return admin; + } + + public void setAdmin(boolean admin) { + this.admin = admin; + } + + public String getGeoName() { + return geoName; + } + + public void setGeoName(String geoName) { + this.geoName = geoName; + } + + public int getHomeId() { + return homeId; + } + + public void setHomeId(int homeId) { + this.homeId = homeId; + } + + public int getHomeStatus() { + return homeStatus; + } + + public void setHomeStatus(int homeStatus) { + this.homeStatus = homeStatus; + } + + public double getLat() { + return lat; + } + + public void setLat(double lat) { + this.lat = lat; + } + + public double getLon() { + return lon; + } + + public void setLon(double lon) { + this.lon = lon; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRole() { + return role; + } + + public void setRole(int role) { + this.role = role; + } + + public List getRooms() { + return rooms; + } + + public void setRooms(List rooms) { + this.rooms = rooms; + } + + public static class RoomsModel { + private int displayOrder; + private String name; + private int roomId; + private boolean sel; + + public int getDisplayOrder() { + return displayOrder; + } + + public void setDisplayOrder(int displayOrder) { + this.displayOrder = displayOrder; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRoomId() { + return roomId; + } + + public void setRoomId(int roomId) { + this.roomId = roomId; + } + + public boolean isSel() { + return sel; + } + + public void setSel(boolean sel) { + this.sel = sel; + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/DialogManager.kt b/app/src/main/java/com/casic/br/utils/DialogManager.kt deleted file mode 100644 index da62e63..0000000 --- a/app/src/main/java/com/casic/br/utils/DialogManager.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.casic.br.utils; - -import android.app.Activity -import android.view.WindowManager -import com.pengxh.kt.lite.base.BaseSingleton -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog - -class DialogManager private constructor(private val activity: Activity) { - - private lateinit var loadingDialog: QMUITipDialog - - companion object : BaseSingleton() { - override val creator: (Activity) -> DialogManager - get() = ::DialogManager - } - - fun showLoadingDialog(message: String) { - loadingDialog = QMUITipDialog - .Builder(activity) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord(message) - .create() - if (!activity.isDestroyed) { - try { - loadingDialog.show() - } catch (e: WindowManager.BadTokenException) { - e.printStackTrace() - } - } - } - - fun dismissLoadingDialog() { - if (loadingDialog.isShowing) { - loadingDialog.dismiss() - } - } -} diff --git a/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt b/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt new file mode 100644 index 0000000..e04e327 --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt @@ -0,0 +1,31 @@ +package com.casic.br.utils + +import android.app.Activity +import android.view.WindowManager +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + +object LoadingDialogHub { + + private lateinit var loadingDialog: QMUITipDialog + + fun show(activity: Activity, message: String) { + loadingDialog = QMUITipDialog + .Builder(activity) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord(message) + .create() + if (!activity.isDestroyed) { + try { + loadingDialog.show() + } catch (e: WindowManager.BadTokenException) { + e.printStackTrace() + } + } + } + + fun dismiss() { + if (loadingDialog.isShowing) { + loadingDialog.dismiss() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 197a466..dd365ad 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -53,7 +53,8 @@ * String * ============================================================================================= * */ - const val USER_DETAIL_MODEL = "userDetailModel" + const val USER_IS_LOGIN = "isLogin" + const val HOME_DETAIL_MODEL = "homeDetailModel" const val SERVER_BASE_URL = "http://111.198.10.15:11304" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val ACCOUNT = "account" diff --git a/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt index ce8f99e..210a258 100644 --- a/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt @@ -30,13 +30,12 @@ override fun initEvent() { iotDevice.setOnClickListener { - navigatePageTo() - finish() + //IoT设备首先需要先配置网络 + navigatePageTo() } notIotDevice.setOnClickListener { navigatePageTo() - finish() } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt b/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt index d58aebd..ec99e90 100644 --- a/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt @@ -4,6 +4,8 @@ import com.casic.br.extensions.initLayoutImmersionBar import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_add_device_result.* class AddDeviceResultActivity : KotlinBaseActivity() { @@ -26,7 +28,8 @@ override fun initEvent() { completeButton.setOnClickListener { - finish() + navigatePageTo() + PageNavigationManager.finishAllActivity() } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt deleted file mode 100644 index 25ce475..0000000 --- a/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt +++ /dev/null @@ -1,56 +0,0 @@ -package com.casic.br.view - -import android.view.View -import android.widget.AdapterView -import com.casic.br.R -import com.casic.br.extensions.initLayoutImmersionBar -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo -import kotlinx.android.synthetic.main.activity_add_device_iot.* - -/** - * 添加IoT设备 - * */ -class AddIoTDeviceActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_add_device_iot - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(true).init() - initLayoutImmersionBar(rootView) - leftBackView.setOnClickListener { finish() } - } - - override fun initData() { - //默认选择WIFI快连 - connectTypeSpinner.setSelection(0) - } - - override fun initEvent() { - connectTypeSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>?, view: View?, position: Int, id: Long - ) { - - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - - } - } - - nextStepButton.setOnClickListener { - if (connectTypeSpinner.selectedItemPosition == 0) { - navigatePageTo() - } else { - navigatePageTo() - } - finish() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 9de6790..54975e3 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -1,11 +1,26 @@ package com.casic.br.view +import android.content.Context import com.casic.br.R +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.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.android.user.api.ILoginCallback +import com.tuya.smart.android.user.bean.User +import com.tuya.smart.home.sdk.TuyaHomeSdk +import kotlinx.android.synthetic.main.activity_login.* +import kotlinx.android.synthetic.main.activity_login.userPhoneView +import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { + private val context: Context = this@LoginActivity + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -21,6 +36,38 @@ } override fun initEvent() { + registerView.setOnClickListener { + navigatePageTo() + } + loginButton.setOnClickListener { + val userPhone = userPhoneView.text.toString() + if (userPhone.isBlank()) { + "请输入手机号".show(this) + return@setOnClickListener + } + val userPassword = passwordView.text.toString() + if (userPassword.isBlank()) { + "请输入密码".show(this) + return@setOnClickListener + } + + LoadingDialogHub.show(this, "登录中,请稍后") + TuyaHomeSdk.getUserInstance() + .loginWithPhonePassword("86", userPhone, userPassword, object : ILoginCallback { + override fun onSuccess(user: User?) { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, true) + LoadingDialogHub.dismiss() + navigatePageTo() + PageNavigationManager.finishAllActivity() + } + + override fun onError(code: String?, error: String?) { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, false) + LoadingDialogHub.dismiss() + "登录失败".show(context) + } + }) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index a2fb29a..25f4254 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -1,5 +1,6 @@ package com.casic.br.view +import android.util.Log import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment @@ -7,13 +8,20 @@ import com.casic.br.R import com.casic.br.adapter.ViewPagerAdapter import com.casic.br.fragment.* +import com.casic.br.utils.LocaleConstant import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { + private val kTag = "MainActivity" private var menuItem: MenuItem? = null private var fragmentPages: ArrayList = ArrayList() private var clickTime: Long = 0 @@ -33,7 +41,27 @@ } override fun initData() { + /** + * TODO 需要改为实际情况 + * + * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 + * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 + * 用户账号下创建任意多个家庭。 + * */ + val s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + if (s == "") { + TuyaHomeSdk.getHomeManagerInstance() + .createHome("北燃生活体验馆", 116.486394, 39.885734, "西直门内南小街", arrayListOf("1"), object : + ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean?) { + SaveKeyValues.putValue(LocaleConstant.HOME_DETAIL_MODEL, bean!!.toJson()) + } + override fun onError(errorCode: String?, errorMsg: String?) { + Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") + } + }) + } } override fun observeRequestState() { diff --git a/app/src/main/java/com/casic/br/view/RegisterActivity.kt b/app/src/main/java/com/casic/br/view/RegisterActivity.kt new file mode 100644 index 0000000..96510fb --- /dev/null +++ b/app/src/main/java/com/casic/br/view/RegisterActivity.kt @@ -0,0 +1,113 @@ +package com.casic.br.view + +import android.content.Context +import android.os.CountDownTimer +import com.casic.br.R +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.isPhoneNumber +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.tuya.smart.android.user.api.IRegisterCallback +import com.tuya.smart.android.user.bean.User +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback +import kotlinx.android.synthetic.main.activity_register.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import java.util.* + +class RegisterActivity : KotlinBaseActivity() { + + private val kTag = "RegisterActivity" + private val context: Context = this@RegisterActivity + + override fun initLayoutView(): Int = R.layout.activity_register + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.text = "注册账号" + } + + override fun initData() { + + } + + override fun initEvent() { + requestCodeButton.setOnClickListener { + if (userPhoneView.text.toString().isBlank()) { + "请输入手机号".show(this) + return@setOnClickListener + } + if (!userPhoneView.text.toString().isPhoneNumber()) { + "手机号不正确,请检查".show(this) + return@setOnClickListener + } + //发送验证码 + TuyaHomeSdk.getUserInstance().sendVerifyCodeWithUserName( + userPhoneView.text.toString(), "", "86", 1, + object : IResultCallback { + override fun onSuccess() { + "发送验证码成功".show(context) + } + + override fun onError(code: String?, error: String?) { + "发送验证码失败".show(context) + } + }) + + //开始倒计时 + object : CountDownTimer(60 * 1000, 1000) { + override fun onTick(millisUntilFinished: Long) { + requestCodeButton.text = String.format("${millisUntilFinished / 1000}s") + requestCodeButton.isEnabled = false + } + + override fun onFinish() { + requestCodeButton.text = "获取验证码" + requestCodeButton.isEnabled = true + } + }.start() + } + + registerButton.setOnClickListener { + val userPhone = userPhoneView.text.toString() + if (userPhone.isBlank()) { + "请输入手机号".show(this) + return@setOnClickListener + } + val smsCode = requestCodeView.text.toString() + if (smsCode.isBlank()) { + "请输入验证码".show(this) + return@setOnClickListener + } + val userPassword = userPasswordView.text.toString() + if (userPassword.isBlank()) { + "请输入密码".show(this) + return@setOnClickListener + } + + LoadingDialogHub.show(this, "注册中,请稍后") + TuyaHomeSdk.getUserInstance().registerAccountWithPhone( + "86", userPhone, userPassword, smsCode, + object : IRegisterCallback { + override fun onSuccess(user: User?) { + LoadingDialogHub.dismiss() + navigatePageTo() + } + + override fun onError(code: String?, error: String?) { + LoadingDialogHub.dismiss() + "用户注册失败".show(context) + } + }) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/RegisterResultActivity.kt b/app/src/main/java/com/casic/br/view/RegisterResultActivity.kt new file mode 100644 index 0000000..6a0de18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/RegisterResultActivity.kt @@ -0,0 +1,40 @@ +package com.casic.br.view + +import android.view.View +import com.casic.br.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import kotlinx.android.synthetic.main.activity_register_result.* +import kotlinx.android.synthetic.main.include_left_back_title.* + +class RegisterResultActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_register_result + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.visibility = View.GONE + } + + override fun observeRequestState() { + + } + + override fun initData() { + + } + + override fun initEvent() { + loginButton.setOnClickListener { + navigatePageTo() + PageNavigationManager.finishAllActivity() + } + } +} \ 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 new file mode 100644 index 0000000..4dc700e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/ResetDeviceActivity.kt @@ -0,0 +1,102 @@ +package com.casic.br.view + +import android.content.Context +import android.util.Log +import android.view.View +import com.casic.br.R +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.model.HomeModel +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.utils.LocaleConstant +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +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.extensions.toJson +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 val context: Context = this@ResetDeviceActivity + private val gson by lazy { Gson() } + 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 s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + val homeModel = gson.fromJson(s, object : TypeToken() {}.type) + TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeModel.homeId.toLong(), + object : ITuyaActivatorGetToken { + override fun onSuccess(token: String) { + Log.d(kTag, "token: $token") + //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 + val builder = object : ActivatorBuilder() {} + builder.ssid = params[0] + builder.context = context + builder.password = params[1] + builder.activatorModel = ActivatorModelEnum.TY_EZ + builder.timeOut = 100 + builder.token = token + builder.listener = object : ITuyaSmartActivatorListener { + override fun onError(errorCode: String?, errorMsg: String?) { + Log.i(kTag, "onError: $errorMsg") + LoadingDialogHub.dismiss() + } + + override fun onActiveSuccess(devResp: DeviceBean?) { + LoadingDialogHub.dismiss() + Log.d(kTag, devResp!!.toJson()) + navigatePageTo() + } + + override fun onStep(step: String?, data: Any?) { + Log.i(kTag, "step: $step") + Log.i(kTag, "data: $data") + LoadingDialogHub.dismiss() + } + } + TuyaHomeSdk.getActivatorInstance().newMultiActivator(builder).start() + } + + override fun onFailure(s: String, s1: String) { + LoadingDialogHub.dismiss() + } + }) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/SearchDeviceResult.kt b/app/src/main/java/com/casic/br/view/SearchDeviceResult.kt deleted file mode 100644 index ed466ae..0000000 --- a/app/src/main/java/com/casic/br/view/SearchDeviceResult.kt +++ /dev/null @@ -1,40 +0,0 @@ -package com.casic.br.view - -import com.casic.br.R -import com.casic.br.extensions.initLayoutImmersionBar -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo -import kotlinx.android.synthetic.main.activity_search_device_result.* -import kotlinx.android.synthetic.main.include_left_back_title.* - -class SearchDeviceResult : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_search_device_result - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(true).init() - initLayoutImmersionBar(rootView) - leftBackView.setOnClickListener { finish() } - titleView.text = "添加设备" - } - - override fun initData() { - - } - - override fun initEvent() { - confirmButton.setOnClickListener { - navigatePageTo() - finish() - } - - reSearchDeviceView.setOnClickListener { - navigatePageTo() - } - } -} \ 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 new file mode 100644 index 0000000..a432adc --- /dev/null +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -0,0 +1,70 @@ +package com.casic.br.view + +import android.content.Context +import android.content.Intent +import android.net.wifi.WifiManager +import android.provider.Settings +import android.view.View +import com.casic.br.R +import com.casic.br.extensions.initLayoutImmersionBar +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 kotlinx.android.synthetic.main.activity_login.* +import kotlinx.android.synthetic.main.activity_select_wifi.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.android.synthetic.main.include_base_title.leftBackView +import kotlinx.android.synthetic.main.include_base_title.titleView +import kotlinx.android.synthetic.main.include_left_back_title.* + + +class SelectWiFiActivity : KotlinBaseActivity() { + + private val context: Context = this@SelectWiFiActivity + private val kTag = "SelectWifiActivity" + private val wifi by lazy { applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager } + + override fun initLayoutView(): Int = R.layout.activity_select_wifi + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.visibility = View.GONE + } + + override fun initData() { + + } + + override fun initEvent() { + changeWifiView.setOnClickListener { + startActivity(Intent(Settings.ACTION_WIFI_SETTINGS)) + } + + nextStepButton.setOnClickListener { + val wifiName = wifiNameView.text.toString() + if (wifiName.isBlank()) { + "请确认WiFi已连接".show(this) + return@setOnClickListener + } + val wifiKey = wifiKeyView.text.toString() + if (wifiKey.isBlank()) { + "请输入WiFi密码".show(this) + return@setOnClickListener + } + navigatePageTo(arrayListOf(wifiName, wifiKey)) + } + } + + override fun onResume() { + super.onResume() + //获取已连接WiFi配置 + wifiNameView.setText(wifi.connectionInfo.ssid.replace("\"", "")) + } +} \ 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 deleted file mode 100644 index d53fc31..0000000 --- a/app/src/main/java/com/casic/br/view/SelectWifiActivity.kt +++ /dev/null @@ -1,35 +0,0 @@ -package com.casic.br.view - -import com.casic.br.R -import com.casic.br.extensions.initLayoutImmersionBar -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo -import kotlinx.android.synthetic.main.activity_select_wifi.* -import kotlinx.android.synthetic.main.include_base_title.* - -class SelectWifiActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_select_wifi - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(true).init() - initLayoutImmersionBar(rootView) - leftBackView.setOnClickListener { finish() } - } - - override fun initData() { - - } - - override fun initEvent() { - nextStepButton.setOnClickListener { - navigatePageTo() - finish() - } - } -} \ No newline at end of file diff --git a/app/src/main/res/drawable/button_gray_selector.xml b/app/src/main/res/drawable/button_gray_selector.xml new file mode 100644 index 0000000..44ae329 --- /dev/null +++ b/app/src/main/res/drawable/button_gray_selector.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_change.xml b/app/src/main/res/drawable/ic_change.xml new file mode 100644 index 0000000..acb654f --- /dev/null +++ b/app/src/main/res/drawable/ic_change.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3ea0e96..ba3523a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,15 +41,16 @@ + + - - + + - diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt index bf8285c..c90a197 100644 --- a/app/src/main/java/com/casic/br/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt @@ -1,16 +1,10 @@ package com.casic.br.base import android.app.Application -import android.util.Log import com.casic.br.greendao.DaoMaster import com.casic.br.greendao.DaoSession -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues -import com.tuya.smart.android.user.api.ILoginCallback -import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.home.sdk.bean.HomeBean -import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlin.properties.Delegates @@ -30,46 +24,13 @@ super.onCreate() instance = this SaveKeyValues.initSharedPreferences(this) - initTuya() + TuyaHomeSdk.init(this) + TuyaHomeSdk.setDebugMode(true) val devOpenHelper = DaoMaster.DevOpenHelper(this, "SmartKitchen.db", null) val daoMaster = DaoMaster(devOpenHelper.writableDatabase) daoSession = daoMaster.newSession() } - private fun initTuya() { - TuyaHomeSdk.init(this) - TuyaHomeSdk.setDebugMode(true) - /** - * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 - * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 - * 用户账号下创建任意多个家庭。 - * */ - //TODO 必须登录 - TuyaHomeSdk.getUserInstance() - .loginWithPhonePassword("86", "18310581916", "123456", object : ILoginCallback { - override fun onSuccess(user: User?) { - Log.d(kTag, "Login success:" + user!!.username) - } - - override fun onError(code: String, error: String) { - Log.e(kTag, "code: " + code + "error:" + error) - } - }) - - - TuyaHomeSdk.getHomeManagerInstance() - .createHome("北燃生活体验馆", 116.486394, 39.885734, "北燃生活体验馆", arrayListOf(), object : - ITuyaHomeResultCallback { - override fun onSuccess(bean: HomeBean?) { - Log.d(kTag, bean!!.toJson()) - } - - override fun onError(errorCode: String?, errorMsg: String?) { - Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") - } - }) - } - fun obtainDaoSession(): DaoSession { return daoSession } diff --git a/app/src/main/java/com/casic/br/extensions/Context.kt b/app/src/main/java/com/casic/br/extensions/Context.kt index 5866614..5726394 100644 --- a/app/src/main/java/com/casic/br/extensions/Context.kt +++ b/app/src/main/java/com/casic/br/extensions/Context.kt @@ -2,11 +2,16 @@ import android.content.Context import android.view.ViewGroup +import com.casic.br.base.BaseApplication +import com.pengxh.kt.lite.extensions.dp2px import com.qmuiteam.qmui.util.QMUIDisplayHelper fun Context.initLayoutImmersionBar(rootView: ViewGroup) { //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + if (statusBarHeight == 0) { + statusBarHeight = 44f.dp2px(BaseApplication.obtainInstance()) + } rootView.setPadding(0, statusBarHeight, 0, 0) rootView.requestLayout() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index cc20c54..4ef912b 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -1,25 +1,40 @@ package com.casic.br.fragment import android.graphics.Typeface +import android.util.Log import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.model.AddedDeviceModel +import com.casic.br.model.HomeModel import com.casic.br.model.RecommendModel +import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddDeviceActivity import com.casic.br.view.AllDeviceActivity import com.casic.br.view.device.FireplaceActivity import com.casic.br.view.device.RangeHoodActivity import com.casic.br.view.device.WaterHeaterActivity +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.fragment_device.* import kotlinx.android.synthetic.main.include_main_title.* import java.util.* + class DevicePageFragment : KotlinBaseFragment() { + private val kTag = "DevicePageFragment" + private val gson by lazy { Gson() } + override fun initLayoutView(): Int = R.layout.fragment_device override fun setupTopBarLayout() { @@ -37,16 +52,6 @@ model1.deviceModel = "D40-DM1" model1.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" deviceModels.add(model1) - val model2 = AddedDeviceModel() - model2.deviceName = "万家乐油烟机" - model2.deviceModel = "CXW-320-W7" - model2.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model2) - val model3 = AddedDeviceModel() - model3.deviceName = "万家乐壁挂炉" - model3.deviceModel = "26-13A3L" - model3.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model3) val addedDeviceAdapter = AddedDeviceAdapter(requireContext()) addedDeviceAdapter.setupDevice(deviceModels) @@ -102,8 +107,28 @@ } override fun initEvent() { - showAllDeviceLayout.setOnClickListener { + showAllDeviceButton.setOnClickListener { requireContext().navigatePageTo() } } + + override fun onResume() { + super.onResume() + val s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + if (s == "") { + return + } + val homeModel = gson.fromJson(s, object : TypeToken() {}.type) + TuyaHomeSdk.newHomeInstance(homeModel.homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + Log.d(kTag, deviceList.toJson()) + } + + override fun onError(errorCode: String, errorMsg: String) { + // do something + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 8aba9b2..84e947c 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -9,9 +9,13 @@ import com.casic.br.utils.GridItemDecoration import com.casic.br.utils.LocaleConstant import com.casic.br.view.LoginActivity +import com.casic.br.view.MainActivity import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.youth.banner.Banner import com.youth.banner.adapter.BannerImageAdapter import com.youth.banner.holder.BannerImageHolder @@ -90,7 +94,39 @@ override fun initEvent() { rightOperateView.setOnClickListener { - requireContext().navigatePageTo() + if (rightOperateView.text == "退出") { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出确认") + .setMessage("退出当前账号,将不能同步数据") + .setNegativeButton("取消") + .setPositiveButton("确认退出") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, false) + requireContext().navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) + .build().show() + } else { + requireContext().navigatePageTo() + } } } + + override fun onResume() { + val isLogin = SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + if (isLogin) { + rightOperateView.text = "退出" + } else { + rightOperateView.text = "登录" + } + super.onResume() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/model/HomeModel.java b/app/src/main/java/com/casic/br/model/HomeModel.java new file mode 100644 index 0000000..638d420 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/HomeModel.java @@ -0,0 +1,127 @@ +package com.casic.br.model; + +import java.util.List; + +public class HomeModel { + + private boolean admin; + private String geoName; + private int homeId; + private int homeStatus; + private double lat; + private double lon; + private String name; + private int role; + private List rooms; + + public boolean isAdmin() { + return admin; + } + + public void setAdmin(boolean admin) { + this.admin = admin; + } + + public String getGeoName() { + return geoName; + } + + public void setGeoName(String geoName) { + this.geoName = geoName; + } + + public int getHomeId() { + return homeId; + } + + public void setHomeId(int homeId) { + this.homeId = homeId; + } + + public int getHomeStatus() { + return homeStatus; + } + + public void setHomeStatus(int homeStatus) { + this.homeStatus = homeStatus; + } + + public double getLat() { + return lat; + } + + public void setLat(double lat) { + this.lat = lat; + } + + public double getLon() { + return lon; + } + + public void setLon(double lon) { + this.lon = lon; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRole() { + return role; + } + + public void setRole(int role) { + this.role = role; + } + + public List getRooms() { + return rooms; + } + + public void setRooms(List rooms) { + this.rooms = rooms; + } + + public static class RoomsModel { + private int displayOrder; + private String name; + private int roomId; + private boolean sel; + + public int getDisplayOrder() { + return displayOrder; + } + + public void setDisplayOrder(int displayOrder) { + this.displayOrder = displayOrder; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRoomId() { + return roomId; + } + + public void setRoomId(int roomId) { + this.roomId = roomId; + } + + public boolean isSel() { + return sel; + } + + public void setSel(boolean sel) { + this.sel = sel; + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/DialogManager.kt b/app/src/main/java/com/casic/br/utils/DialogManager.kt deleted file mode 100644 index da62e63..0000000 --- a/app/src/main/java/com/casic/br/utils/DialogManager.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.casic.br.utils; - -import android.app.Activity -import android.view.WindowManager -import com.pengxh.kt.lite.base.BaseSingleton -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog - -class DialogManager private constructor(private val activity: Activity) { - - private lateinit var loadingDialog: QMUITipDialog - - companion object : BaseSingleton() { - override val creator: (Activity) -> DialogManager - get() = ::DialogManager - } - - fun showLoadingDialog(message: String) { - loadingDialog = QMUITipDialog - .Builder(activity) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord(message) - .create() - if (!activity.isDestroyed) { - try { - loadingDialog.show() - } catch (e: WindowManager.BadTokenException) { - e.printStackTrace() - } - } - } - - fun dismissLoadingDialog() { - if (loadingDialog.isShowing) { - loadingDialog.dismiss() - } - } -} diff --git a/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt b/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt new file mode 100644 index 0000000..e04e327 --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt @@ -0,0 +1,31 @@ +package com.casic.br.utils + +import android.app.Activity +import android.view.WindowManager +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + +object LoadingDialogHub { + + private lateinit var loadingDialog: QMUITipDialog + + fun show(activity: Activity, message: String) { + loadingDialog = QMUITipDialog + .Builder(activity) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord(message) + .create() + if (!activity.isDestroyed) { + try { + loadingDialog.show() + } catch (e: WindowManager.BadTokenException) { + e.printStackTrace() + } + } + } + + fun dismiss() { + if (loadingDialog.isShowing) { + loadingDialog.dismiss() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 197a466..dd365ad 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -53,7 +53,8 @@ * String * ============================================================================================= * */ - const val USER_DETAIL_MODEL = "userDetailModel" + const val USER_IS_LOGIN = "isLogin" + const val HOME_DETAIL_MODEL = "homeDetailModel" const val SERVER_BASE_URL = "http://111.198.10.15:11304" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val ACCOUNT = "account" diff --git a/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt index ce8f99e..210a258 100644 --- a/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt @@ -30,13 +30,12 @@ override fun initEvent() { iotDevice.setOnClickListener { - navigatePageTo() - finish() + //IoT设备首先需要先配置网络 + navigatePageTo() } notIotDevice.setOnClickListener { navigatePageTo() - finish() } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt b/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt index d58aebd..ec99e90 100644 --- a/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt @@ -4,6 +4,8 @@ import com.casic.br.extensions.initLayoutImmersionBar import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_add_device_result.* class AddDeviceResultActivity : KotlinBaseActivity() { @@ -26,7 +28,8 @@ override fun initEvent() { completeButton.setOnClickListener { - finish() + navigatePageTo() + PageNavigationManager.finishAllActivity() } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt deleted file mode 100644 index 25ce475..0000000 --- a/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt +++ /dev/null @@ -1,56 +0,0 @@ -package com.casic.br.view - -import android.view.View -import android.widget.AdapterView -import com.casic.br.R -import com.casic.br.extensions.initLayoutImmersionBar -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo -import kotlinx.android.synthetic.main.activity_add_device_iot.* - -/** - * 添加IoT设备 - * */ -class AddIoTDeviceActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_add_device_iot - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(true).init() - initLayoutImmersionBar(rootView) - leftBackView.setOnClickListener { finish() } - } - - override fun initData() { - //默认选择WIFI快连 - connectTypeSpinner.setSelection(0) - } - - override fun initEvent() { - connectTypeSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>?, view: View?, position: Int, id: Long - ) { - - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - - } - } - - nextStepButton.setOnClickListener { - if (connectTypeSpinner.selectedItemPosition == 0) { - navigatePageTo() - } else { - navigatePageTo() - } - finish() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 9de6790..54975e3 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -1,11 +1,26 @@ package com.casic.br.view +import android.content.Context import com.casic.br.R +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.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.android.user.api.ILoginCallback +import com.tuya.smart.android.user.bean.User +import com.tuya.smart.home.sdk.TuyaHomeSdk +import kotlinx.android.synthetic.main.activity_login.* +import kotlinx.android.synthetic.main.activity_login.userPhoneView +import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { + private val context: Context = this@LoginActivity + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -21,6 +36,38 @@ } override fun initEvent() { + registerView.setOnClickListener { + navigatePageTo() + } + loginButton.setOnClickListener { + val userPhone = userPhoneView.text.toString() + if (userPhone.isBlank()) { + "请输入手机号".show(this) + return@setOnClickListener + } + val userPassword = passwordView.text.toString() + if (userPassword.isBlank()) { + "请输入密码".show(this) + return@setOnClickListener + } + + LoadingDialogHub.show(this, "登录中,请稍后") + TuyaHomeSdk.getUserInstance() + .loginWithPhonePassword("86", userPhone, userPassword, object : ILoginCallback { + override fun onSuccess(user: User?) { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, true) + LoadingDialogHub.dismiss() + navigatePageTo() + PageNavigationManager.finishAllActivity() + } + + override fun onError(code: String?, error: String?) { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, false) + LoadingDialogHub.dismiss() + "登录失败".show(context) + } + }) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index a2fb29a..25f4254 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -1,5 +1,6 @@ package com.casic.br.view +import android.util.Log import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment @@ -7,13 +8,20 @@ import com.casic.br.R import com.casic.br.adapter.ViewPagerAdapter import com.casic.br.fragment.* +import com.casic.br.utils.LocaleConstant import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { + private val kTag = "MainActivity" private var menuItem: MenuItem? = null private var fragmentPages: ArrayList = ArrayList() private var clickTime: Long = 0 @@ -33,7 +41,27 @@ } override fun initData() { + /** + * TODO 需要改为实际情况 + * + * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 + * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 + * 用户账号下创建任意多个家庭。 + * */ + val s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + if (s == "") { + TuyaHomeSdk.getHomeManagerInstance() + .createHome("北燃生活体验馆", 116.486394, 39.885734, "西直门内南小街", arrayListOf("1"), object : + ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean?) { + SaveKeyValues.putValue(LocaleConstant.HOME_DETAIL_MODEL, bean!!.toJson()) + } + override fun onError(errorCode: String?, errorMsg: String?) { + Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") + } + }) + } } override fun observeRequestState() { diff --git a/app/src/main/java/com/casic/br/view/RegisterActivity.kt b/app/src/main/java/com/casic/br/view/RegisterActivity.kt new file mode 100644 index 0000000..96510fb --- /dev/null +++ b/app/src/main/java/com/casic/br/view/RegisterActivity.kt @@ -0,0 +1,113 @@ +package com.casic.br.view + +import android.content.Context +import android.os.CountDownTimer +import com.casic.br.R +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.isPhoneNumber +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.tuya.smart.android.user.api.IRegisterCallback +import com.tuya.smart.android.user.bean.User +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback +import kotlinx.android.synthetic.main.activity_register.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import java.util.* + +class RegisterActivity : KotlinBaseActivity() { + + private val kTag = "RegisterActivity" + private val context: Context = this@RegisterActivity + + override fun initLayoutView(): Int = R.layout.activity_register + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.text = "注册账号" + } + + override fun initData() { + + } + + override fun initEvent() { + requestCodeButton.setOnClickListener { + if (userPhoneView.text.toString().isBlank()) { + "请输入手机号".show(this) + return@setOnClickListener + } + if (!userPhoneView.text.toString().isPhoneNumber()) { + "手机号不正确,请检查".show(this) + return@setOnClickListener + } + //发送验证码 + TuyaHomeSdk.getUserInstance().sendVerifyCodeWithUserName( + userPhoneView.text.toString(), "", "86", 1, + object : IResultCallback { + override fun onSuccess() { + "发送验证码成功".show(context) + } + + override fun onError(code: String?, error: String?) { + "发送验证码失败".show(context) + } + }) + + //开始倒计时 + object : CountDownTimer(60 * 1000, 1000) { + override fun onTick(millisUntilFinished: Long) { + requestCodeButton.text = String.format("${millisUntilFinished / 1000}s") + requestCodeButton.isEnabled = false + } + + override fun onFinish() { + requestCodeButton.text = "获取验证码" + requestCodeButton.isEnabled = true + } + }.start() + } + + registerButton.setOnClickListener { + val userPhone = userPhoneView.text.toString() + if (userPhone.isBlank()) { + "请输入手机号".show(this) + return@setOnClickListener + } + val smsCode = requestCodeView.text.toString() + if (smsCode.isBlank()) { + "请输入验证码".show(this) + return@setOnClickListener + } + val userPassword = userPasswordView.text.toString() + if (userPassword.isBlank()) { + "请输入密码".show(this) + return@setOnClickListener + } + + LoadingDialogHub.show(this, "注册中,请稍后") + TuyaHomeSdk.getUserInstance().registerAccountWithPhone( + "86", userPhone, userPassword, smsCode, + object : IRegisterCallback { + override fun onSuccess(user: User?) { + LoadingDialogHub.dismiss() + navigatePageTo() + } + + override fun onError(code: String?, error: String?) { + LoadingDialogHub.dismiss() + "用户注册失败".show(context) + } + }) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/RegisterResultActivity.kt b/app/src/main/java/com/casic/br/view/RegisterResultActivity.kt new file mode 100644 index 0000000..6a0de18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/RegisterResultActivity.kt @@ -0,0 +1,40 @@ +package com.casic.br.view + +import android.view.View +import com.casic.br.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import kotlinx.android.synthetic.main.activity_register_result.* +import kotlinx.android.synthetic.main.include_left_back_title.* + +class RegisterResultActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_register_result + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.visibility = View.GONE + } + + override fun observeRequestState() { + + } + + override fun initData() { + + } + + override fun initEvent() { + loginButton.setOnClickListener { + navigatePageTo() + PageNavigationManager.finishAllActivity() + } + } +} \ 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 new file mode 100644 index 0000000..4dc700e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/ResetDeviceActivity.kt @@ -0,0 +1,102 @@ +package com.casic.br.view + +import android.content.Context +import android.util.Log +import android.view.View +import com.casic.br.R +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.model.HomeModel +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.utils.LocaleConstant +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +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.extensions.toJson +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 val context: Context = this@ResetDeviceActivity + private val gson by lazy { Gson() } + 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 s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + val homeModel = gson.fromJson(s, object : TypeToken() {}.type) + TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeModel.homeId.toLong(), + object : ITuyaActivatorGetToken { + override fun onSuccess(token: String) { + Log.d(kTag, "token: $token") + //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 + val builder = object : ActivatorBuilder() {} + builder.ssid = params[0] + builder.context = context + builder.password = params[1] + builder.activatorModel = ActivatorModelEnum.TY_EZ + builder.timeOut = 100 + builder.token = token + builder.listener = object : ITuyaSmartActivatorListener { + override fun onError(errorCode: String?, errorMsg: String?) { + Log.i(kTag, "onError: $errorMsg") + LoadingDialogHub.dismiss() + } + + override fun onActiveSuccess(devResp: DeviceBean?) { + LoadingDialogHub.dismiss() + Log.d(kTag, devResp!!.toJson()) + navigatePageTo() + } + + override fun onStep(step: String?, data: Any?) { + Log.i(kTag, "step: $step") + Log.i(kTag, "data: $data") + LoadingDialogHub.dismiss() + } + } + TuyaHomeSdk.getActivatorInstance().newMultiActivator(builder).start() + } + + override fun onFailure(s: String, s1: String) { + LoadingDialogHub.dismiss() + } + }) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/SearchDeviceResult.kt b/app/src/main/java/com/casic/br/view/SearchDeviceResult.kt deleted file mode 100644 index ed466ae..0000000 --- a/app/src/main/java/com/casic/br/view/SearchDeviceResult.kt +++ /dev/null @@ -1,40 +0,0 @@ -package com.casic.br.view - -import com.casic.br.R -import com.casic.br.extensions.initLayoutImmersionBar -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo -import kotlinx.android.synthetic.main.activity_search_device_result.* -import kotlinx.android.synthetic.main.include_left_back_title.* - -class SearchDeviceResult : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_search_device_result - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(true).init() - initLayoutImmersionBar(rootView) - leftBackView.setOnClickListener { finish() } - titleView.text = "添加设备" - } - - override fun initData() { - - } - - override fun initEvent() { - confirmButton.setOnClickListener { - navigatePageTo() - finish() - } - - reSearchDeviceView.setOnClickListener { - navigatePageTo() - } - } -} \ 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 new file mode 100644 index 0000000..a432adc --- /dev/null +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -0,0 +1,70 @@ +package com.casic.br.view + +import android.content.Context +import android.content.Intent +import android.net.wifi.WifiManager +import android.provider.Settings +import android.view.View +import com.casic.br.R +import com.casic.br.extensions.initLayoutImmersionBar +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 kotlinx.android.synthetic.main.activity_login.* +import kotlinx.android.synthetic.main.activity_select_wifi.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.android.synthetic.main.include_base_title.leftBackView +import kotlinx.android.synthetic.main.include_base_title.titleView +import kotlinx.android.synthetic.main.include_left_back_title.* + + +class SelectWiFiActivity : KotlinBaseActivity() { + + private val context: Context = this@SelectWiFiActivity + private val kTag = "SelectWifiActivity" + private val wifi by lazy { applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager } + + override fun initLayoutView(): Int = R.layout.activity_select_wifi + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.visibility = View.GONE + } + + override fun initData() { + + } + + override fun initEvent() { + changeWifiView.setOnClickListener { + startActivity(Intent(Settings.ACTION_WIFI_SETTINGS)) + } + + nextStepButton.setOnClickListener { + val wifiName = wifiNameView.text.toString() + if (wifiName.isBlank()) { + "请确认WiFi已连接".show(this) + return@setOnClickListener + } + val wifiKey = wifiKeyView.text.toString() + if (wifiKey.isBlank()) { + "请输入WiFi密码".show(this) + return@setOnClickListener + } + navigatePageTo(arrayListOf(wifiName, wifiKey)) + } + } + + override fun onResume() { + super.onResume() + //获取已连接WiFi配置 + wifiNameView.setText(wifi.connectionInfo.ssid.replace("\"", "")) + } +} \ 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 deleted file mode 100644 index d53fc31..0000000 --- a/app/src/main/java/com/casic/br/view/SelectWifiActivity.kt +++ /dev/null @@ -1,35 +0,0 @@ -package com.casic.br.view - -import com.casic.br.R -import com.casic.br.extensions.initLayoutImmersionBar -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo -import kotlinx.android.synthetic.main.activity_select_wifi.* -import kotlinx.android.synthetic.main.include_base_title.* - -class SelectWifiActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_select_wifi - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(true).init() - initLayoutImmersionBar(rootView) - leftBackView.setOnClickListener { finish() } - } - - override fun initData() { - - } - - override fun initEvent() { - nextStepButton.setOnClickListener { - navigatePageTo() - finish() - } - } -} \ No newline at end of file diff --git a/app/src/main/res/drawable/button_gray_selector.xml b/app/src/main/res/drawable/button_gray_selector.xml new file mode 100644 index 0000000..44ae329 --- /dev/null +++ b/app/src/main/res/drawable/button_gray_selector.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_change.xml b/app/src/main/res/drawable/ic_change.xml new file mode 100644 index 0000000..acb654f --- /dev/null +++ b/app/src/main/res/drawable/ic_change.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_lock.xml b/app/src/main/res/drawable/ic_lock.xml new file mode 100644 index 0000000..9bcbe61 --- /dev/null +++ b/app/src/main/res/drawable/ic_lock.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3ea0e96..ba3523a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,15 +41,16 @@ + + - - + + - diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt index bf8285c..c90a197 100644 --- a/app/src/main/java/com/casic/br/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt @@ -1,16 +1,10 @@ package com.casic.br.base import android.app.Application -import android.util.Log import com.casic.br.greendao.DaoMaster import com.casic.br.greendao.DaoSession -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues -import com.tuya.smart.android.user.api.ILoginCallback -import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.home.sdk.bean.HomeBean -import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlin.properties.Delegates @@ -30,46 +24,13 @@ super.onCreate() instance = this SaveKeyValues.initSharedPreferences(this) - initTuya() + TuyaHomeSdk.init(this) + TuyaHomeSdk.setDebugMode(true) val devOpenHelper = DaoMaster.DevOpenHelper(this, "SmartKitchen.db", null) val daoMaster = DaoMaster(devOpenHelper.writableDatabase) daoSession = daoMaster.newSession() } - private fun initTuya() { - TuyaHomeSdk.init(this) - TuyaHomeSdk.setDebugMode(true) - /** - * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 - * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 - * 用户账号下创建任意多个家庭。 - * */ - //TODO 必须登录 - TuyaHomeSdk.getUserInstance() - .loginWithPhonePassword("86", "18310581916", "123456", object : ILoginCallback { - override fun onSuccess(user: User?) { - Log.d(kTag, "Login success:" + user!!.username) - } - - override fun onError(code: String, error: String) { - Log.e(kTag, "code: " + code + "error:" + error) - } - }) - - - TuyaHomeSdk.getHomeManagerInstance() - .createHome("北燃生活体验馆", 116.486394, 39.885734, "北燃生活体验馆", arrayListOf(), object : - ITuyaHomeResultCallback { - override fun onSuccess(bean: HomeBean?) { - Log.d(kTag, bean!!.toJson()) - } - - override fun onError(errorCode: String?, errorMsg: String?) { - Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") - } - }) - } - fun obtainDaoSession(): DaoSession { return daoSession } diff --git a/app/src/main/java/com/casic/br/extensions/Context.kt b/app/src/main/java/com/casic/br/extensions/Context.kt index 5866614..5726394 100644 --- a/app/src/main/java/com/casic/br/extensions/Context.kt +++ b/app/src/main/java/com/casic/br/extensions/Context.kt @@ -2,11 +2,16 @@ import android.content.Context import android.view.ViewGroup +import com.casic.br.base.BaseApplication +import com.pengxh.kt.lite.extensions.dp2px import com.qmuiteam.qmui.util.QMUIDisplayHelper fun Context.initLayoutImmersionBar(rootView: ViewGroup) { //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + if (statusBarHeight == 0) { + statusBarHeight = 44f.dp2px(BaseApplication.obtainInstance()) + } rootView.setPadding(0, statusBarHeight, 0, 0) rootView.requestLayout() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index cc20c54..4ef912b 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -1,25 +1,40 @@ package com.casic.br.fragment import android.graphics.Typeface +import android.util.Log import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.model.AddedDeviceModel +import com.casic.br.model.HomeModel import com.casic.br.model.RecommendModel +import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddDeviceActivity import com.casic.br.view.AllDeviceActivity import com.casic.br.view.device.FireplaceActivity import com.casic.br.view.device.RangeHoodActivity import com.casic.br.view.device.WaterHeaterActivity +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.fragment_device.* import kotlinx.android.synthetic.main.include_main_title.* import java.util.* + class DevicePageFragment : KotlinBaseFragment() { + private val kTag = "DevicePageFragment" + private val gson by lazy { Gson() } + override fun initLayoutView(): Int = R.layout.fragment_device override fun setupTopBarLayout() { @@ -37,16 +52,6 @@ model1.deviceModel = "D40-DM1" model1.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" deviceModels.add(model1) - val model2 = AddedDeviceModel() - model2.deviceName = "万家乐油烟机" - model2.deviceModel = "CXW-320-W7" - model2.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model2) - val model3 = AddedDeviceModel() - model3.deviceName = "万家乐壁挂炉" - model3.deviceModel = "26-13A3L" - model3.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model3) val addedDeviceAdapter = AddedDeviceAdapter(requireContext()) addedDeviceAdapter.setupDevice(deviceModels) @@ -102,8 +107,28 @@ } override fun initEvent() { - showAllDeviceLayout.setOnClickListener { + showAllDeviceButton.setOnClickListener { requireContext().navigatePageTo() } } + + override fun onResume() { + super.onResume() + val s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + if (s == "") { + return + } + val homeModel = gson.fromJson(s, object : TypeToken() {}.type) + TuyaHomeSdk.newHomeInstance(homeModel.homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + Log.d(kTag, deviceList.toJson()) + } + + override fun onError(errorCode: String, errorMsg: String) { + // do something + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 8aba9b2..84e947c 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -9,9 +9,13 @@ import com.casic.br.utils.GridItemDecoration import com.casic.br.utils.LocaleConstant import com.casic.br.view.LoginActivity +import com.casic.br.view.MainActivity import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.youth.banner.Banner import com.youth.banner.adapter.BannerImageAdapter import com.youth.banner.holder.BannerImageHolder @@ -90,7 +94,39 @@ override fun initEvent() { rightOperateView.setOnClickListener { - requireContext().navigatePageTo() + if (rightOperateView.text == "退出") { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出确认") + .setMessage("退出当前账号,将不能同步数据") + .setNegativeButton("取消") + .setPositiveButton("确认退出") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, false) + requireContext().navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) + .build().show() + } else { + requireContext().navigatePageTo() + } } } + + override fun onResume() { + val isLogin = SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + if (isLogin) { + rightOperateView.text = "退出" + } else { + rightOperateView.text = "登录" + } + super.onResume() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/model/HomeModel.java b/app/src/main/java/com/casic/br/model/HomeModel.java new file mode 100644 index 0000000..638d420 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/HomeModel.java @@ -0,0 +1,127 @@ +package com.casic.br.model; + +import java.util.List; + +public class HomeModel { + + private boolean admin; + private String geoName; + private int homeId; + private int homeStatus; + private double lat; + private double lon; + private String name; + private int role; + private List rooms; + + public boolean isAdmin() { + return admin; + } + + public void setAdmin(boolean admin) { + this.admin = admin; + } + + public String getGeoName() { + return geoName; + } + + public void setGeoName(String geoName) { + this.geoName = geoName; + } + + public int getHomeId() { + return homeId; + } + + public void setHomeId(int homeId) { + this.homeId = homeId; + } + + public int getHomeStatus() { + return homeStatus; + } + + public void setHomeStatus(int homeStatus) { + this.homeStatus = homeStatus; + } + + public double getLat() { + return lat; + } + + public void setLat(double lat) { + this.lat = lat; + } + + public double getLon() { + return lon; + } + + public void setLon(double lon) { + this.lon = lon; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRole() { + return role; + } + + public void setRole(int role) { + this.role = role; + } + + public List getRooms() { + return rooms; + } + + public void setRooms(List rooms) { + this.rooms = rooms; + } + + public static class RoomsModel { + private int displayOrder; + private String name; + private int roomId; + private boolean sel; + + public int getDisplayOrder() { + return displayOrder; + } + + public void setDisplayOrder(int displayOrder) { + this.displayOrder = displayOrder; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRoomId() { + return roomId; + } + + public void setRoomId(int roomId) { + this.roomId = roomId; + } + + public boolean isSel() { + return sel; + } + + public void setSel(boolean sel) { + this.sel = sel; + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/DialogManager.kt b/app/src/main/java/com/casic/br/utils/DialogManager.kt deleted file mode 100644 index da62e63..0000000 --- a/app/src/main/java/com/casic/br/utils/DialogManager.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.casic.br.utils; - -import android.app.Activity -import android.view.WindowManager -import com.pengxh.kt.lite.base.BaseSingleton -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog - -class DialogManager private constructor(private val activity: Activity) { - - private lateinit var loadingDialog: QMUITipDialog - - companion object : BaseSingleton() { - override val creator: (Activity) -> DialogManager - get() = ::DialogManager - } - - fun showLoadingDialog(message: String) { - loadingDialog = QMUITipDialog - .Builder(activity) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord(message) - .create() - if (!activity.isDestroyed) { - try { - loadingDialog.show() - } catch (e: WindowManager.BadTokenException) { - e.printStackTrace() - } - } - } - - fun dismissLoadingDialog() { - if (loadingDialog.isShowing) { - loadingDialog.dismiss() - } - } -} diff --git a/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt b/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt new file mode 100644 index 0000000..e04e327 --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt @@ -0,0 +1,31 @@ +package com.casic.br.utils + +import android.app.Activity +import android.view.WindowManager +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + +object LoadingDialogHub { + + private lateinit var loadingDialog: QMUITipDialog + + fun show(activity: Activity, message: String) { + loadingDialog = QMUITipDialog + .Builder(activity) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord(message) + .create() + if (!activity.isDestroyed) { + try { + loadingDialog.show() + } catch (e: WindowManager.BadTokenException) { + e.printStackTrace() + } + } + } + + fun dismiss() { + if (loadingDialog.isShowing) { + loadingDialog.dismiss() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 197a466..dd365ad 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -53,7 +53,8 @@ * String * ============================================================================================= * */ - const val USER_DETAIL_MODEL = "userDetailModel" + const val USER_IS_LOGIN = "isLogin" + const val HOME_DETAIL_MODEL = "homeDetailModel" const val SERVER_BASE_URL = "http://111.198.10.15:11304" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val ACCOUNT = "account" diff --git a/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt index ce8f99e..210a258 100644 --- a/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt @@ -30,13 +30,12 @@ override fun initEvent() { iotDevice.setOnClickListener { - navigatePageTo() - finish() + //IoT设备首先需要先配置网络 + navigatePageTo() } notIotDevice.setOnClickListener { navigatePageTo() - finish() } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt b/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt index d58aebd..ec99e90 100644 --- a/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt @@ -4,6 +4,8 @@ import com.casic.br.extensions.initLayoutImmersionBar import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_add_device_result.* class AddDeviceResultActivity : KotlinBaseActivity() { @@ -26,7 +28,8 @@ override fun initEvent() { completeButton.setOnClickListener { - finish() + navigatePageTo() + PageNavigationManager.finishAllActivity() } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt deleted file mode 100644 index 25ce475..0000000 --- a/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt +++ /dev/null @@ -1,56 +0,0 @@ -package com.casic.br.view - -import android.view.View -import android.widget.AdapterView -import com.casic.br.R -import com.casic.br.extensions.initLayoutImmersionBar -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo -import kotlinx.android.synthetic.main.activity_add_device_iot.* - -/** - * 添加IoT设备 - * */ -class AddIoTDeviceActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_add_device_iot - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(true).init() - initLayoutImmersionBar(rootView) - leftBackView.setOnClickListener { finish() } - } - - override fun initData() { - //默认选择WIFI快连 - connectTypeSpinner.setSelection(0) - } - - override fun initEvent() { - connectTypeSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>?, view: View?, position: Int, id: Long - ) { - - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - - } - } - - nextStepButton.setOnClickListener { - if (connectTypeSpinner.selectedItemPosition == 0) { - navigatePageTo() - } else { - navigatePageTo() - } - finish() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 9de6790..54975e3 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -1,11 +1,26 @@ package com.casic.br.view +import android.content.Context import com.casic.br.R +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.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.android.user.api.ILoginCallback +import com.tuya.smart.android.user.bean.User +import com.tuya.smart.home.sdk.TuyaHomeSdk +import kotlinx.android.synthetic.main.activity_login.* +import kotlinx.android.synthetic.main.activity_login.userPhoneView +import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { + private val context: Context = this@LoginActivity + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -21,6 +36,38 @@ } override fun initEvent() { + registerView.setOnClickListener { + navigatePageTo() + } + loginButton.setOnClickListener { + val userPhone = userPhoneView.text.toString() + if (userPhone.isBlank()) { + "请输入手机号".show(this) + return@setOnClickListener + } + val userPassword = passwordView.text.toString() + if (userPassword.isBlank()) { + "请输入密码".show(this) + return@setOnClickListener + } + + LoadingDialogHub.show(this, "登录中,请稍后") + TuyaHomeSdk.getUserInstance() + .loginWithPhonePassword("86", userPhone, userPassword, object : ILoginCallback { + override fun onSuccess(user: User?) { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, true) + LoadingDialogHub.dismiss() + navigatePageTo() + PageNavigationManager.finishAllActivity() + } + + override fun onError(code: String?, error: String?) { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, false) + LoadingDialogHub.dismiss() + "登录失败".show(context) + } + }) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index a2fb29a..25f4254 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -1,5 +1,6 @@ package com.casic.br.view +import android.util.Log import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment @@ -7,13 +8,20 @@ import com.casic.br.R import com.casic.br.adapter.ViewPagerAdapter import com.casic.br.fragment.* +import com.casic.br.utils.LocaleConstant import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { + private val kTag = "MainActivity" private var menuItem: MenuItem? = null private var fragmentPages: ArrayList = ArrayList() private var clickTime: Long = 0 @@ -33,7 +41,27 @@ } override fun initData() { + /** + * TODO 需要改为实际情况 + * + * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 + * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 + * 用户账号下创建任意多个家庭。 + * */ + val s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + if (s == "") { + TuyaHomeSdk.getHomeManagerInstance() + .createHome("北燃生活体验馆", 116.486394, 39.885734, "西直门内南小街", arrayListOf("1"), object : + ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean?) { + SaveKeyValues.putValue(LocaleConstant.HOME_DETAIL_MODEL, bean!!.toJson()) + } + override fun onError(errorCode: String?, errorMsg: String?) { + Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") + } + }) + } } override fun observeRequestState() { diff --git a/app/src/main/java/com/casic/br/view/RegisterActivity.kt b/app/src/main/java/com/casic/br/view/RegisterActivity.kt new file mode 100644 index 0000000..96510fb --- /dev/null +++ b/app/src/main/java/com/casic/br/view/RegisterActivity.kt @@ -0,0 +1,113 @@ +package com.casic.br.view + +import android.content.Context +import android.os.CountDownTimer +import com.casic.br.R +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.isPhoneNumber +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.tuya.smart.android.user.api.IRegisterCallback +import com.tuya.smart.android.user.bean.User +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback +import kotlinx.android.synthetic.main.activity_register.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import java.util.* + +class RegisterActivity : KotlinBaseActivity() { + + private val kTag = "RegisterActivity" + private val context: Context = this@RegisterActivity + + override fun initLayoutView(): Int = R.layout.activity_register + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.text = "注册账号" + } + + override fun initData() { + + } + + override fun initEvent() { + requestCodeButton.setOnClickListener { + if (userPhoneView.text.toString().isBlank()) { + "请输入手机号".show(this) + return@setOnClickListener + } + if (!userPhoneView.text.toString().isPhoneNumber()) { + "手机号不正确,请检查".show(this) + return@setOnClickListener + } + //发送验证码 + TuyaHomeSdk.getUserInstance().sendVerifyCodeWithUserName( + userPhoneView.text.toString(), "", "86", 1, + object : IResultCallback { + override fun onSuccess() { + "发送验证码成功".show(context) + } + + override fun onError(code: String?, error: String?) { + "发送验证码失败".show(context) + } + }) + + //开始倒计时 + object : CountDownTimer(60 * 1000, 1000) { + override fun onTick(millisUntilFinished: Long) { + requestCodeButton.text = String.format("${millisUntilFinished / 1000}s") + requestCodeButton.isEnabled = false + } + + override fun onFinish() { + requestCodeButton.text = "获取验证码" + requestCodeButton.isEnabled = true + } + }.start() + } + + registerButton.setOnClickListener { + val userPhone = userPhoneView.text.toString() + if (userPhone.isBlank()) { + "请输入手机号".show(this) + return@setOnClickListener + } + val smsCode = requestCodeView.text.toString() + if (smsCode.isBlank()) { + "请输入验证码".show(this) + return@setOnClickListener + } + val userPassword = userPasswordView.text.toString() + if (userPassword.isBlank()) { + "请输入密码".show(this) + return@setOnClickListener + } + + LoadingDialogHub.show(this, "注册中,请稍后") + TuyaHomeSdk.getUserInstance().registerAccountWithPhone( + "86", userPhone, userPassword, smsCode, + object : IRegisterCallback { + override fun onSuccess(user: User?) { + LoadingDialogHub.dismiss() + navigatePageTo() + } + + override fun onError(code: String?, error: String?) { + LoadingDialogHub.dismiss() + "用户注册失败".show(context) + } + }) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/RegisterResultActivity.kt b/app/src/main/java/com/casic/br/view/RegisterResultActivity.kt new file mode 100644 index 0000000..6a0de18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/RegisterResultActivity.kt @@ -0,0 +1,40 @@ +package com.casic.br.view + +import android.view.View +import com.casic.br.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import kotlinx.android.synthetic.main.activity_register_result.* +import kotlinx.android.synthetic.main.include_left_back_title.* + +class RegisterResultActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_register_result + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.visibility = View.GONE + } + + override fun observeRequestState() { + + } + + override fun initData() { + + } + + override fun initEvent() { + loginButton.setOnClickListener { + navigatePageTo() + PageNavigationManager.finishAllActivity() + } + } +} \ 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 new file mode 100644 index 0000000..4dc700e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/ResetDeviceActivity.kt @@ -0,0 +1,102 @@ +package com.casic.br.view + +import android.content.Context +import android.util.Log +import android.view.View +import com.casic.br.R +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.model.HomeModel +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.utils.LocaleConstant +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +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.extensions.toJson +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 val context: Context = this@ResetDeviceActivity + private val gson by lazy { Gson() } + 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 s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + val homeModel = gson.fromJson(s, object : TypeToken() {}.type) + TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeModel.homeId.toLong(), + object : ITuyaActivatorGetToken { + override fun onSuccess(token: String) { + Log.d(kTag, "token: $token") + //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 + val builder = object : ActivatorBuilder() {} + builder.ssid = params[0] + builder.context = context + builder.password = params[1] + builder.activatorModel = ActivatorModelEnum.TY_EZ + builder.timeOut = 100 + builder.token = token + builder.listener = object : ITuyaSmartActivatorListener { + override fun onError(errorCode: String?, errorMsg: String?) { + Log.i(kTag, "onError: $errorMsg") + LoadingDialogHub.dismiss() + } + + override fun onActiveSuccess(devResp: DeviceBean?) { + LoadingDialogHub.dismiss() + Log.d(kTag, devResp!!.toJson()) + navigatePageTo() + } + + override fun onStep(step: String?, data: Any?) { + Log.i(kTag, "step: $step") + Log.i(kTag, "data: $data") + LoadingDialogHub.dismiss() + } + } + TuyaHomeSdk.getActivatorInstance().newMultiActivator(builder).start() + } + + override fun onFailure(s: String, s1: String) { + LoadingDialogHub.dismiss() + } + }) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/SearchDeviceResult.kt b/app/src/main/java/com/casic/br/view/SearchDeviceResult.kt deleted file mode 100644 index ed466ae..0000000 --- a/app/src/main/java/com/casic/br/view/SearchDeviceResult.kt +++ /dev/null @@ -1,40 +0,0 @@ -package com.casic.br.view - -import com.casic.br.R -import com.casic.br.extensions.initLayoutImmersionBar -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo -import kotlinx.android.synthetic.main.activity_search_device_result.* -import kotlinx.android.synthetic.main.include_left_back_title.* - -class SearchDeviceResult : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_search_device_result - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(true).init() - initLayoutImmersionBar(rootView) - leftBackView.setOnClickListener { finish() } - titleView.text = "添加设备" - } - - override fun initData() { - - } - - override fun initEvent() { - confirmButton.setOnClickListener { - navigatePageTo() - finish() - } - - reSearchDeviceView.setOnClickListener { - navigatePageTo() - } - } -} \ 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 new file mode 100644 index 0000000..a432adc --- /dev/null +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -0,0 +1,70 @@ +package com.casic.br.view + +import android.content.Context +import android.content.Intent +import android.net.wifi.WifiManager +import android.provider.Settings +import android.view.View +import com.casic.br.R +import com.casic.br.extensions.initLayoutImmersionBar +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 kotlinx.android.synthetic.main.activity_login.* +import kotlinx.android.synthetic.main.activity_select_wifi.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.android.synthetic.main.include_base_title.leftBackView +import kotlinx.android.synthetic.main.include_base_title.titleView +import kotlinx.android.synthetic.main.include_left_back_title.* + + +class SelectWiFiActivity : KotlinBaseActivity() { + + private val context: Context = this@SelectWiFiActivity + private val kTag = "SelectWifiActivity" + private val wifi by lazy { applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager } + + override fun initLayoutView(): Int = R.layout.activity_select_wifi + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.visibility = View.GONE + } + + override fun initData() { + + } + + override fun initEvent() { + changeWifiView.setOnClickListener { + startActivity(Intent(Settings.ACTION_WIFI_SETTINGS)) + } + + nextStepButton.setOnClickListener { + val wifiName = wifiNameView.text.toString() + if (wifiName.isBlank()) { + "请确认WiFi已连接".show(this) + return@setOnClickListener + } + val wifiKey = wifiKeyView.text.toString() + if (wifiKey.isBlank()) { + "请输入WiFi密码".show(this) + return@setOnClickListener + } + navigatePageTo(arrayListOf(wifiName, wifiKey)) + } + } + + override fun onResume() { + super.onResume() + //获取已连接WiFi配置 + wifiNameView.setText(wifi.connectionInfo.ssid.replace("\"", "")) + } +} \ 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 deleted file mode 100644 index d53fc31..0000000 --- a/app/src/main/java/com/casic/br/view/SelectWifiActivity.kt +++ /dev/null @@ -1,35 +0,0 @@ -package com.casic.br.view - -import com.casic.br.R -import com.casic.br.extensions.initLayoutImmersionBar -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo -import kotlinx.android.synthetic.main.activity_select_wifi.* -import kotlinx.android.synthetic.main.include_base_title.* - -class SelectWifiActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_select_wifi - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(true).init() - initLayoutImmersionBar(rootView) - leftBackView.setOnClickListener { finish() } - } - - override fun initData() { - - } - - override fun initEvent() { - nextStepButton.setOnClickListener { - navigatePageTo() - finish() - } - } -} \ No newline at end of file diff --git a/app/src/main/res/drawable/button_gray_selector.xml b/app/src/main/res/drawable/button_gray_selector.xml new file mode 100644 index 0000000..44ae329 --- /dev/null +++ b/app/src/main/res/drawable/button_gray_selector.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_change.xml b/app/src/main/res/drawable/ic_change.xml new file mode 100644 index 0000000..acb654f --- /dev/null +++ b/app/src/main/res/drawable/ic_change.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_lock.xml b/app/src/main/res/drawable/ic_lock.xml new file mode 100644 index 0000000..9bcbe61 --- /dev/null +++ b/app/src/main/res/drawable/ic_lock.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_register_success.xml b/app/src/main/res/drawable/ic_register_success.xml new file mode 100644 index 0000000..14c2ac5 --- /dev/null +++ b/app/src/main/res/drawable/ic_register_success.xml @@ -0,0 +1,389 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3ea0e96..ba3523a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,15 +41,16 @@ + + - - + + - diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt index bf8285c..c90a197 100644 --- a/app/src/main/java/com/casic/br/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt @@ -1,16 +1,10 @@ package com.casic.br.base import android.app.Application -import android.util.Log import com.casic.br.greendao.DaoMaster import com.casic.br.greendao.DaoSession -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues -import com.tuya.smart.android.user.api.ILoginCallback -import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.home.sdk.bean.HomeBean -import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlin.properties.Delegates @@ -30,46 +24,13 @@ super.onCreate() instance = this SaveKeyValues.initSharedPreferences(this) - initTuya() + TuyaHomeSdk.init(this) + TuyaHomeSdk.setDebugMode(true) val devOpenHelper = DaoMaster.DevOpenHelper(this, "SmartKitchen.db", null) val daoMaster = DaoMaster(devOpenHelper.writableDatabase) daoSession = daoMaster.newSession() } - private fun initTuya() { - TuyaHomeSdk.init(this) - TuyaHomeSdk.setDebugMode(true) - /** - * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 - * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 - * 用户账号下创建任意多个家庭。 - * */ - //TODO 必须登录 - TuyaHomeSdk.getUserInstance() - .loginWithPhonePassword("86", "18310581916", "123456", object : ILoginCallback { - override fun onSuccess(user: User?) { - Log.d(kTag, "Login success:" + user!!.username) - } - - override fun onError(code: String, error: String) { - Log.e(kTag, "code: " + code + "error:" + error) - } - }) - - - TuyaHomeSdk.getHomeManagerInstance() - .createHome("北燃生活体验馆", 116.486394, 39.885734, "北燃生活体验馆", arrayListOf(), object : - ITuyaHomeResultCallback { - override fun onSuccess(bean: HomeBean?) { - Log.d(kTag, bean!!.toJson()) - } - - override fun onError(errorCode: String?, errorMsg: String?) { - Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") - } - }) - } - fun obtainDaoSession(): DaoSession { return daoSession } diff --git a/app/src/main/java/com/casic/br/extensions/Context.kt b/app/src/main/java/com/casic/br/extensions/Context.kt index 5866614..5726394 100644 --- a/app/src/main/java/com/casic/br/extensions/Context.kt +++ b/app/src/main/java/com/casic/br/extensions/Context.kt @@ -2,11 +2,16 @@ import android.content.Context import android.view.ViewGroup +import com.casic.br.base.BaseApplication +import com.pengxh.kt.lite.extensions.dp2px import com.qmuiteam.qmui.util.QMUIDisplayHelper fun Context.initLayoutImmersionBar(rootView: ViewGroup) { //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + if (statusBarHeight == 0) { + statusBarHeight = 44f.dp2px(BaseApplication.obtainInstance()) + } rootView.setPadding(0, statusBarHeight, 0, 0) rootView.requestLayout() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index cc20c54..4ef912b 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -1,25 +1,40 @@ package com.casic.br.fragment import android.graphics.Typeface +import android.util.Log import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.model.AddedDeviceModel +import com.casic.br.model.HomeModel import com.casic.br.model.RecommendModel +import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddDeviceActivity import com.casic.br.view.AllDeviceActivity import com.casic.br.view.device.FireplaceActivity import com.casic.br.view.device.RangeHoodActivity import com.casic.br.view.device.WaterHeaterActivity +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.fragment_device.* import kotlinx.android.synthetic.main.include_main_title.* import java.util.* + class DevicePageFragment : KotlinBaseFragment() { + private val kTag = "DevicePageFragment" + private val gson by lazy { Gson() } + override fun initLayoutView(): Int = R.layout.fragment_device override fun setupTopBarLayout() { @@ -37,16 +52,6 @@ model1.deviceModel = "D40-DM1" model1.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" deviceModels.add(model1) - val model2 = AddedDeviceModel() - model2.deviceName = "万家乐油烟机" - model2.deviceModel = "CXW-320-W7" - model2.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model2) - val model3 = AddedDeviceModel() - model3.deviceName = "万家乐壁挂炉" - model3.deviceModel = "26-13A3L" - model3.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model3) val addedDeviceAdapter = AddedDeviceAdapter(requireContext()) addedDeviceAdapter.setupDevice(deviceModels) @@ -102,8 +107,28 @@ } override fun initEvent() { - showAllDeviceLayout.setOnClickListener { + showAllDeviceButton.setOnClickListener { requireContext().navigatePageTo() } } + + override fun onResume() { + super.onResume() + val s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + if (s == "") { + return + } + val homeModel = gson.fromJson(s, object : TypeToken() {}.type) + TuyaHomeSdk.newHomeInstance(homeModel.homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + Log.d(kTag, deviceList.toJson()) + } + + override fun onError(errorCode: String, errorMsg: String) { + // do something + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 8aba9b2..84e947c 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -9,9 +9,13 @@ import com.casic.br.utils.GridItemDecoration import com.casic.br.utils.LocaleConstant import com.casic.br.view.LoginActivity +import com.casic.br.view.MainActivity import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.youth.banner.Banner import com.youth.banner.adapter.BannerImageAdapter import com.youth.banner.holder.BannerImageHolder @@ -90,7 +94,39 @@ override fun initEvent() { rightOperateView.setOnClickListener { - requireContext().navigatePageTo() + if (rightOperateView.text == "退出") { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出确认") + .setMessage("退出当前账号,将不能同步数据") + .setNegativeButton("取消") + .setPositiveButton("确认退出") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, false) + requireContext().navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) + .build().show() + } else { + requireContext().navigatePageTo() + } } } + + override fun onResume() { + val isLogin = SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + if (isLogin) { + rightOperateView.text = "退出" + } else { + rightOperateView.text = "登录" + } + super.onResume() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/model/HomeModel.java b/app/src/main/java/com/casic/br/model/HomeModel.java new file mode 100644 index 0000000..638d420 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/HomeModel.java @@ -0,0 +1,127 @@ +package com.casic.br.model; + +import java.util.List; + +public class HomeModel { + + private boolean admin; + private String geoName; + private int homeId; + private int homeStatus; + private double lat; + private double lon; + private String name; + private int role; + private List rooms; + + public boolean isAdmin() { + return admin; + } + + public void setAdmin(boolean admin) { + this.admin = admin; + } + + public String getGeoName() { + return geoName; + } + + public void setGeoName(String geoName) { + this.geoName = geoName; + } + + public int getHomeId() { + return homeId; + } + + public void setHomeId(int homeId) { + this.homeId = homeId; + } + + public int getHomeStatus() { + return homeStatus; + } + + public void setHomeStatus(int homeStatus) { + this.homeStatus = homeStatus; + } + + public double getLat() { + return lat; + } + + public void setLat(double lat) { + this.lat = lat; + } + + public double getLon() { + return lon; + } + + public void setLon(double lon) { + this.lon = lon; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRole() { + return role; + } + + public void setRole(int role) { + this.role = role; + } + + public List getRooms() { + return rooms; + } + + public void setRooms(List rooms) { + this.rooms = rooms; + } + + public static class RoomsModel { + private int displayOrder; + private String name; + private int roomId; + private boolean sel; + + public int getDisplayOrder() { + return displayOrder; + } + + public void setDisplayOrder(int displayOrder) { + this.displayOrder = displayOrder; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRoomId() { + return roomId; + } + + public void setRoomId(int roomId) { + this.roomId = roomId; + } + + public boolean isSel() { + return sel; + } + + public void setSel(boolean sel) { + this.sel = sel; + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/DialogManager.kt b/app/src/main/java/com/casic/br/utils/DialogManager.kt deleted file mode 100644 index da62e63..0000000 --- a/app/src/main/java/com/casic/br/utils/DialogManager.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.casic.br.utils; - -import android.app.Activity -import android.view.WindowManager -import com.pengxh.kt.lite.base.BaseSingleton -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog - -class DialogManager private constructor(private val activity: Activity) { - - private lateinit var loadingDialog: QMUITipDialog - - companion object : BaseSingleton() { - override val creator: (Activity) -> DialogManager - get() = ::DialogManager - } - - fun showLoadingDialog(message: String) { - loadingDialog = QMUITipDialog - .Builder(activity) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord(message) - .create() - if (!activity.isDestroyed) { - try { - loadingDialog.show() - } catch (e: WindowManager.BadTokenException) { - e.printStackTrace() - } - } - } - - fun dismissLoadingDialog() { - if (loadingDialog.isShowing) { - loadingDialog.dismiss() - } - } -} diff --git a/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt b/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt new file mode 100644 index 0000000..e04e327 --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt @@ -0,0 +1,31 @@ +package com.casic.br.utils + +import android.app.Activity +import android.view.WindowManager +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + +object LoadingDialogHub { + + private lateinit var loadingDialog: QMUITipDialog + + fun show(activity: Activity, message: String) { + loadingDialog = QMUITipDialog + .Builder(activity) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord(message) + .create() + if (!activity.isDestroyed) { + try { + loadingDialog.show() + } catch (e: WindowManager.BadTokenException) { + e.printStackTrace() + } + } + } + + fun dismiss() { + if (loadingDialog.isShowing) { + loadingDialog.dismiss() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 197a466..dd365ad 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -53,7 +53,8 @@ * String * ============================================================================================= * */ - const val USER_DETAIL_MODEL = "userDetailModel" + const val USER_IS_LOGIN = "isLogin" + const val HOME_DETAIL_MODEL = "homeDetailModel" const val SERVER_BASE_URL = "http://111.198.10.15:11304" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val ACCOUNT = "account" diff --git a/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt index ce8f99e..210a258 100644 --- a/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt @@ -30,13 +30,12 @@ override fun initEvent() { iotDevice.setOnClickListener { - navigatePageTo() - finish() + //IoT设备首先需要先配置网络 + navigatePageTo() } notIotDevice.setOnClickListener { navigatePageTo() - finish() } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt b/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt index d58aebd..ec99e90 100644 --- a/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt @@ -4,6 +4,8 @@ import com.casic.br.extensions.initLayoutImmersionBar import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_add_device_result.* class AddDeviceResultActivity : KotlinBaseActivity() { @@ -26,7 +28,8 @@ override fun initEvent() { completeButton.setOnClickListener { - finish() + navigatePageTo() + PageNavigationManager.finishAllActivity() } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt deleted file mode 100644 index 25ce475..0000000 --- a/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt +++ /dev/null @@ -1,56 +0,0 @@ -package com.casic.br.view - -import android.view.View -import android.widget.AdapterView -import com.casic.br.R -import com.casic.br.extensions.initLayoutImmersionBar -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo -import kotlinx.android.synthetic.main.activity_add_device_iot.* - -/** - * 添加IoT设备 - * */ -class AddIoTDeviceActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_add_device_iot - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(true).init() - initLayoutImmersionBar(rootView) - leftBackView.setOnClickListener { finish() } - } - - override fun initData() { - //默认选择WIFI快连 - connectTypeSpinner.setSelection(0) - } - - override fun initEvent() { - connectTypeSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>?, view: View?, position: Int, id: Long - ) { - - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - - } - } - - nextStepButton.setOnClickListener { - if (connectTypeSpinner.selectedItemPosition == 0) { - navigatePageTo() - } else { - navigatePageTo() - } - finish() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 9de6790..54975e3 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -1,11 +1,26 @@ package com.casic.br.view +import android.content.Context import com.casic.br.R +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.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.android.user.api.ILoginCallback +import com.tuya.smart.android.user.bean.User +import com.tuya.smart.home.sdk.TuyaHomeSdk +import kotlinx.android.synthetic.main.activity_login.* +import kotlinx.android.synthetic.main.activity_login.userPhoneView +import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { + private val context: Context = this@LoginActivity + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -21,6 +36,38 @@ } override fun initEvent() { + registerView.setOnClickListener { + navigatePageTo() + } + loginButton.setOnClickListener { + val userPhone = userPhoneView.text.toString() + if (userPhone.isBlank()) { + "请输入手机号".show(this) + return@setOnClickListener + } + val userPassword = passwordView.text.toString() + if (userPassword.isBlank()) { + "请输入密码".show(this) + return@setOnClickListener + } + + LoadingDialogHub.show(this, "登录中,请稍后") + TuyaHomeSdk.getUserInstance() + .loginWithPhonePassword("86", userPhone, userPassword, object : ILoginCallback { + override fun onSuccess(user: User?) { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, true) + LoadingDialogHub.dismiss() + navigatePageTo() + PageNavigationManager.finishAllActivity() + } + + override fun onError(code: String?, error: String?) { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, false) + LoadingDialogHub.dismiss() + "登录失败".show(context) + } + }) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index a2fb29a..25f4254 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -1,5 +1,6 @@ package com.casic.br.view +import android.util.Log import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment @@ -7,13 +8,20 @@ import com.casic.br.R import com.casic.br.adapter.ViewPagerAdapter import com.casic.br.fragment.* +import com.casic.br.utils.LocaleConstant import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { + private val kTag = "MainActivity" private var menuItem: MenuItem? = null private var fragmentPages: ArrayList = ArrayList() private var clickTime: Long = 0 @@ -33,7 +41,27 @@ } override fun initData() { + /** + * TODO 需要改为实际情况 + * + * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 + * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 + * 用户账号下创建任意多个家庭。 + * */ + val s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + if (s == "") { + TuyaHomeSdk.getHomeManagerInstance() + .createHome("北燃生活体验馆", 116.486394, 39.885734, "西直门内南小街", arrayListOf("1"), object : + ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean?) { + SaveKeyValues.putValue(LocaleConstant.HOME_DETAIL_MODEL, bean!!.toJson()) + } + override fun onError(errorCode: String?, errorMsg: String?) { + Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") + } + }) + } } override fun observeRequestState() { diff --git a/app/src/main/java/com/casic/br/view/RegisterActivity.kt b/app/src/main/java/com/casic/br/view/RegisterActivity.kt new file mode 100644 index 0000000..96510fb --- /dev/null +++ b/app/src/main/java/com/casic/br/view/RegisterActivity.kt @@ -0,0 +1,113 @@ +package com.casic.br.view + +import android.content.Context +import android.os.CountDownTimer +import com.casic.br.R +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.isPhoneNumber +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.tuya.smart.android.user.api.IRegisterCallback +import com.tuya.smart.android.user.bean.User +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback +import kotlinx.android.synthetic.main.activity_register.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import java.util.* + +class RegisterActivity : KotlinBaseActivity() { + + private val kTag = "RegisterActivity" + private val context: Context = this@RegisterActivity + + override fun initLayoutView(): Int = R.layout.activity_register + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.text = "注册账号" + } + + override fun initData() { + + } + + override fun initEvent() { + requestCodeButton.setOnClickListener { + if (userPhoneView.text.toString().isBlank()) { + "请输入手机号".show(this) + return@setOnClickListener + } + if (!userPhoneView.text.toString().isPhoneNumber()) { + "手机号不正确,请检查".show(this) + return@setOnClickListener + } + //发送验证码 + TuyaHomeSdk.getUserInstance().sendVerifyCodeWithUserName( + userPhoneView.text.toString(), "", "86", 1, + object : IResultCallback { + override fun onSuccess() { + "发送验证码成功".show(context) + } + + override fun onError(code: String?, error: String?) { + "发送验证码失败".show(context) + } + }) + + //开始倒计时 + object : CountDownTimer(60 * 1000, 1000) { + override fun onTick(millisUntilFinished: Long) { + requestCodeButton.text = String.format("${millisUntilFinished / 1000}s") + requestCodeButton.isEnabled = false + } + + override fun onFinish() { + requestCodeButton.text = "获取验证码" + requestCodeButton.isEnabled = true + } + }.start() + } + + registerButton.setOnClickListener { + val userPhone = userPhoneView.text.toString() + if (userPhone.isBlank()) { + "请输入手机号".show(this) + return@setOnClickListener + } + val smsCode = requestCodeView.text.toString() + if (smsCode.isBlank()) { + "请输入验证码".show(this) + return@setOnClickListener + } + val userPassword = userPasswordView.text.toString() + if (userPassword.isBlank()) { + "请输入密码".show(this) + return@setOnClickListener + } + + LoadingDialogHub.show(this, "注册中,请稍后") + TuyaHomeSdk.getUserInstance().registerAccountWithPhone( + "86", userPhone, userPassword, smsCode, + object : IRegisterCallback { + override fun onSuccess(user: User?) { + LoadingDialogHub.dismiss() + navigatePageTo() + } + + override fun onError(code: String?, error: String?) { + LoadingDialogHub.dismiss() + "用户注册失败".show(context) + } + }) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/RegisterResultActivity.kt b/app/src/main/java/com/casic/br/view/RegisterResultActivity.kt new file mode 100644 index 0000000..6a0de18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/RegisterResultActivity.kt @@ -0,0 +1,40 @@ +package com.casic.br.view + +import android.view.View +import com.casic.br.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import kotlinx.android.synthetic.main.activity_register_result.* +import kotlinx.android.synthetic.main.include_left_back_title.* + +class RegisterResultActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_register_result + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.visibility = View.GONE + } + + override fun observeRequestState() { + + } + + override fun initData() { + + } + + override fun initEvent() { + loginButton.setOnClickListener { + navigatePageTo() + PageNavigationManager.finishAllActivity() + } + } +} \ 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 new file mode 100644 index 0000000..4dc700e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/ResetDeviceActivity.kt @@ -0,0 +1,102 @@ +package com.casic.br.view + +import android.content.Context +import android.util.Log +import android.view.View +import com.casic.br.R +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.model.HomeModel +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.utils.LocaleConstant +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +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.extensions.toJson +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 val context: Context = this@ResetDeviceActivity + private val gson by lazy { Gson() } + 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 s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + val homeModel = gson.fromJson(s, object : TypeToken() {}.type) + TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeModel.homeId.toLong(), + object : ITuyaActivatorGetToken { + override fun onSuccess(token: String) { + Log.d(kTag, "token: $token") + //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 + val builder = object : ActivatorBuilder() {} + builder.ssid = params[0] + builder.context = context + builder.password = params[1] + builder.activatorModel = ActivatorModelEnum.TY_EZ + builder.timeOut = 100 + builder.token = token + builder.listener = object : ITuyaSmartActivatorListener { + override fun onError(errorCode: String?, errorMsg: String?) { + Log.i(kTag, "onError: $errorMsg") + LoadingDialogHub.dismiss() + } + + override fun onActiveSuccess(devResp: DeviceBean?) { + LoadingDialogHub.dismiss() + Log.d(kTag, devResp!!.toJson()) + navigatePageTo() + } + + override fun onStep(step: String?, data: Any?) { + Log.i(kTag, "step: $step") + Log.i(kTag, "data: $data") + LoadingDialogHub.dismiss() + } + } + TuyaHomeSdk.getActivatorInstance().newMultiActivator(builder).start() + } + + override fun onFailure(s: String, s1: String) { + LoadingDialogHub.dismiss() + } + }) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/SearchDeviceResult.kt b/app/src/main/java/com/casic/br/view/SearchDeviceResult.kt deleted file mode 100644 index ed466ae..0000000 --- a/app/src/main/java/com/casic/br/view/SearchDeviceResult.kt +++ /dev/null @@ -1,40 +0,0 @@ -package com.casic.br.view - -import com.casic.br.R -import com.casic.br.extensions.initLayoutImmersionBar -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo -import kotlinx.android.synthetic.main.activity_search_device_result.* -import kotlinx.android.synthetic.main.include_left_back_title.* - -class SearchDeviceResult : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_search_device_result - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(true).init() - initLayoutImmersionBar(rootView) - leftBackView.setOnClickListener { finish() } - titleView.text = "添加设备" - } - - override fun initData() { - - } - - override fun initEvent() { - confirmButton.setOnClickListener { - navigatePageTo() - finish() - } - - reSearchDeviceView.setOnClickListener { - navigatePageTo() - } - } -} \ 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 new file mode 100644 index 0000000..a432adc --- /dev/null +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -0,0 +1,70 @@ +package com.casic.br.view + +import android.content.Context +import android.content.Intent +import android.net.wifi.WifiManager +import android.provider.Settings +import android.view.View +import com.casic.br.R +import com.casic.br.extensions.initLayoutImmersionBar +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 kotlinx.android.synthetic.main.activity_login.* +import kotlinx.android.synthetic.main.activity_select_wifi.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.android.synthetic.main.include_base_title.leftBackView +import kotlinx.android.synthetic.main.include_base_title.titleView +import kotlinx.android.synthetic.main.include_left_back_title.* + + +class SelectWiFiActivity : KotlinBaseActivity() { + + private val context: Context = this@SelectWiFiActivity + private val kTag = "SelectWifiActivity" + private val wifi by lazy { applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager } + + override fun initLayoutView(): Int = R.layout.activity_select_wifi + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.visibility = View.GONE + } + + override fun initData() { + + } + + override fun initEvent() { + changeWifiView.setOnClickListener { + startActivity(Intent(Settings.ACTION_WIFI_SETTINGS)) + } + + nextStepButton.setOnClickListener { + val wifiName = wifiNameView.text.toString() + if (wifiName.isBlank()) { + "请确认WiFi已连接".show(this) + return@setOnClickListener + } + val wifiKey = wifiKeyView.text.toString() + if (wifiKey.isBlank()) { + "请输入WiFi密码".show(this) + return@setOnClickListener + } + navigatePageTo(arrayListOf(wifiName, wifiKey)) + } + } + + override fun onResume() { + super.onResume() + //获取已连接WiFi配置 + wifiNameView.setText(wifi.connectionInfo.ssid.replace("\"", "")) + } +} \ 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 deleted file mode 100644 index d53fc31..0000000 --- a/app/src/main/java/com/casic/br/view/SelectWifiActivity.kt +++ /dev/null @@ -1,35 +0,0 @@ -package com.casic.br.view - -import com.casic.br.R -import com.casic.br.extensions.initLayoutImmersionBar -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo -import kotlinx.android.synthetic.main.activity_select_wifi.* -import kotlinx.android.synthetic.main.include_base_title.* - -class SelectWifiActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_select_wifi - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(true).init() - initLayoutImmersionBar(rootView) - leftBackView.setOnClickListener { finish() } - } - - override fun initData() { - - } - - override fun initEvent() { - nextStepButton.setOnClickListener { - navigatePageTo() - finish() - } - } -} \ No newline at end of file diff --git a/app/src/main/res/drawable/button_gray_selector.xml b/app/src/main/res/drawable/button_gray_selector.xml new file mode 100644 index 0000000..44ae329 --- /dev/null +++ b/app/src/main/res/drawable/button_gray_selector.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_change.xml b/app/src/main/res/drawable/ic_change.xml new file mode 100644 index 0000000..acb654f --- /dev/null +++ b/app/src/main/res/drawable/ic_change.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_lock.xml b/app/src/main/res/drawable/ic_lock.xml new file mode 100644 index 0000000..9bcbe61 --- /dev/null +++ b/app/src/main/res/drawable/ic_lock.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_register_success.xml b/app/src/main/res/drawable/ic_register_success.xml new file mode 100644 index 0000000..14c2ac5 --- /dev/null +++ b/app/src/main/res/drawable/ic_register_success.xml @@ -0,0 +1,389 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_wifi.xml b/app/src/main/res/drawable/ic_wifi.xml new file mode 100644 index 0000000..1b2f7a3 --- /dev/null +++ b/app/src/main/res/drawable/ic_wifi.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3ea0e96..ba3523a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,15 +41,16 @@ + + - - + + - diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt index bf8285c..c90a197 100644 --- a/app/src/main/java/com/casic/br/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt @@ -1,16 +1,10 @@ package com.casic.br.base import android.app.Application -import android.util.Log import com.casic.br.greendao.DaoMaster import com.casic.br.greendao.DaoSession -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues -import com.tuya.smart.android.user.api.ILoginCallback -import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.home.sdk.bean.HomeBean -import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlin.properties.Delegates @@ -30,46 +24,13 @@ super.onCreate() instance = this SaveKeyValues.initSharedPreferences(this) - initTuya() + TuyaHomeSdk.init(this) + TuyaHomeSdk.setDebugMode(true) val devOpenHelper = DaoMaster.DevOpenHelper(this, "SmartKitchen.db", null) val daoMaster = DaoMaster(devOpenHelper.writableDatabase) daoSession = daoMaster.newSession() } - private fun initTuya() { - TuyaHomeSdk.init(this) - TuyaHomeSdk.setDebugMode(true) - /** - * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 - * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 - * 用户账号下创建任意多个家庭。 - * */ - //TODO 必须登录 - TuyaHomeSdk.getUserInstance() - .loginWithPhonePassword("86", "18310581916", "123456", object : ILoginCallback { - override fun onSuccess(user: User?) { - Log.d(kTag, "Login success:" + user!!.username) - } - - override fun onError(code: String, error: String) { - Log.e(kTag, "code: " + code + "error:" + error) - } - }) - - - TuyaHomeSdk.getHomeManagerInstance() - .createHome("北燃生活体验馆", 116.486394, 39.885734, "北燃生活体验馆", arrayListOf(), object : - ITuyaHomeResultCallback { - override fun onSuccess(bean: HomeBean?) { - Log.d(kTag, bean!!.toJson()) - } - - override fun onError(errorCode: String?, errorMsg: String?) { - Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") - } - }) - } - fun obtainDaoSession(): DaoSession { return daoSession } diff --git a/app/src/main/java/com/casic/br/extensions/Context.kt b/app/src/main/java/com/casic/br/extensions/Context.kt index 5866614..5726394 100644 --- a/app/src/main/java/com/casic/br/extensions/Context.kt +++ b/app/src/main/java/com/casic/br/extensions/Context.kt @@ -2,11 +2,16 @@ import android.content.Context import android.view.ViewGroup +import com.casic.br.base.BaseApplication +import com.pengxh.kt.lite.extensions.dp2px import com.qmuiteam.qmui.util.QMUIDisplayHelper fun Context.initLayoutImmersionBar(rootView: ViewGroup) { //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + if (statusBarHeight == 0) { + statusBarHeight = 44f.dp2px(BaseApplication.obtainInstance()) + } rootView.setPadding(0, statusBarHeight, 0, 0) rootView.requestLayout() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index cc20c54..4ef912b 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -1,25 +1,40 @@ package com.casic.br.fragment import android.graphics.Typeface +import android.util.Log import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.model.AddedDeviceModel +import com.casic.br.model.HomeModel import com.casic.br.model.RecommendModel +import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddDeviceActivity import com.casic.br.view.AllDeviceActivity import com.casic.br.view.device.FireplaceActivity import com.casic.br.view.device.RangeHoodActivity import com.casic.br.view.device.WaterHeaterActivity +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.fragment_device.* import kotlinx.android.synthetic.main.include_main_title.* import java.util.* + class DevicePageFragment : KotlinBaseFragment() { + private val kTag = "DevicePageFragment" + private val gson by lazy { Gson() } + override fun initLayoutView(): Int = R.layout.fragment_device override fun setupTopBarLayout() { @@ -37,16 +52,6 @@ model1.deviceModel = "D40-DM1" model1.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" deviceModels.add(model1) - val model2 = AddedDeviceModel() - model2.deviceName = "万家乐油烟机" - model2.deviceModel = "CXW-320-W7" - model2.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model2) - val model3 = AddedDeviceModel() - model3.deviceName = "万家乐壁挂炉" - model3.deviceModel = "26-13A3L" - model3.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model3) val addedDeviceAdapter = AddedDeviceAdapter(requireContext()) addedDeviceAdapter.setupDevice(deviceModels) @@ -102,8 +107,28 @@ } override fun initEvent() { - showAllDeviceLayout.setOnClickListener { + showAllDeviceButton.setOnClickListener { requireContext().navigatePageTo() } } + + override fun onResume() { + super.onResume() + val s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + if (s == "") { + return + } + val homeModel = gson.fromJson(s, object : TypeToken() {}.type) + TuyaHomeSdk.newHomeInstance(homeModel.homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + Log.d(kTag, deviceList.toJson()) + } + + override fun onError(errorCode: String, errorMsg: String) { + // do something + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 8aba9b2..84e947c 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -9,9 +9,13 @@ import com.casic.br.utils.GridItemDecoration import com.casic.br.utils.LocaleConstant import com.casic.br.view.LoginActivity +import com.casic.br.view.MainActivity import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.youth.banner.Banner import com.youth.banner.adapter.BannerImageAdapter import com.youth.banner.holder.BannerImageHolder @@ -90,7 +94,39 @@ override fun initEvent() { rightOperateView.setOnClickListener { - requireContext().navigatePageTo() + if (rightOperateView.text == "退出") { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出确认") + .setMessage("退出当前账号,将不能同步数据") + .setNegativeButton("取消") + .setPositiveButton("确认退出") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, false) + requireContext().navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) + .build().show() + } else { + requireContext().navigatePageTo() + } } } + + override fun onResume() { + val isLogin = SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + if (isLogin) { + rightOperateView.text = "退出" + } else { + rightOperateView.text = "登录" + } + super.onResume() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/model/HomeModel.java b/app/src/main/java/com/casic/br/model/HomeModel.java new file mode 100644 index 0000000..638d420 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/HomeModel.java @@ -0,0 +1,127 @@ +package com.casic.br.model; + +import java.util.List; + +public class HomeModel { + + private boolean admin; + private String geoName; + private int homeId; + private int homeStatus; + private double lat; + private double lon; + private String name; + private int role; + private List rooms; + + public boolean isAdmin() { + return admin; + } + + public void setAdmin(boolean admin) { + this.admin = admin; + } + + public String getGeoName() { + return geoName; + } + + public void setGeoName(String geoName) { + this.geoName = geoName; + } + + public int getHomeId() { + return homeId; + } + + public void setHomeId(int homeId) { + this.homeId = homeId; + } + + public int getHomeStatus() { + return homeStatus; + } + + public void setHomeStatus(int homeStatus) { + this.homeStatus = homeStatus; + } + + public double getLat() { + return lat; + } + + public void setLat(double lat) { + this.lat = lat; + } + + public double getLon() { + return lon; + } + + public void setLon(double lon) { + this.lon = lon; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRole() { + return role; + } + + public void setRole(int role) { + this.role = role; + } + + public List getRooms() { + return rooms; + } + + public void setRooms(List rooms) { + this.rooms = rooms; + } + + public static class RoomsModel { + private int displayOrder; + private String name; + private int roomId; + private boolean sel; + + public int getDisplayOrder() { + return displayOrder; + } + + public void setDisplayOrder(int displayOrder) { + this.displayOrder = displayOrder; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRoomId() { + return roomId; + } + + public void setRoomId(int roomId) { + this.roomId = roomId; + } + + public boolean isSel() { + return sel; + } + + public void setSel(boolean sel) { + this.sel = sel; + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/DialogManager.kt b/app/src/main/java/com/casic/br/utils/DialogManager.kt deleted file mode 100644 index da62e63..0000000 --- a/app/src/main/java/com/casic/br/utils/DialogManager.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.casic.br.utils; - -import android.app.Activity -import android.view.WindowManager -import com.pengxh.kt.lite.base.BaseSingleton -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog - -class DialogManager private constructor(private val activity: Activity) { - - private lateinit var loadingDialog: QMUITipDialog - - companion object : BaseSingleton() { - override val creator: (Activity) -> DialogManager - get() = ::DialogManager - } - - fun showLoadingDialog(message: String) { - loadingDialog = QMUITipDialog - .Builder(activity) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord(message) - .create() - if (!activity.isDestroyed) { - try { - loadingDialog.show() - } catch (e: WindowManager.BadTokenException) { - e.printStackTrace() - } - } - } - - fun dismissLoadingDialog() { - if (loadingDialog.isShowing) { - loadingDialog.dismiss() - } - } -} diff --git a/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt b/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt new file mode 100644 index 0000000..e04e327 --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt @@ -0,0 +1,31 @@ +package com.casic.br.utils + +import android.app.Activity +import android.view.WindowManager +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + +object LoadingDialogHub { + + private lateinit var loadingDialog: QMUITipDialog + + fun show(activity: Activity, message: String) { + loadingDialog = QMUITipDialog + .Builder(activity) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord(message) + .create() + if (!activity.isDestroyed) { + try { + loadingDialog.show() + } catch (e: WindowManager.BadTokenException) { + e.printStackTrace() + } + } + } + + fun dismiss() { + if (loadingDialog.isShowing) { + loadingDialog.dismiss() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 197a466..dd365ad 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -53,7 +53,8 @@ * String * ============================================================================================= * */ - const val USER_DETAIL_MODEL = "userDetailModel" + const val USER_IS_LOGIN = "isLogin" + const val HOME_DETAIL_MODEL = "homeDetailModel" const val SERVER_BASE_URL = "http://111.198.10.15:11304" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val ACCOUNT = "account" diff --git a/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt index ce8f99e..210a258 100644 --- a/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt @@ -30,13 +30,12 @@ override fun initEvent() { iotDevice.setOnClickListener { - navigatePageTo() - finish() + //IoT设备首先需要先配置网络 + navigatePageTo() } notIotDevice.setOnClickListener { navigatePageTo() - finish() } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt b/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt index d58aebd..ec99e90 100644 --- a/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt @@ -4,6 +4,8 @@ import com.casic.br.extensions.initLayoutImmersionBar import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_add_device_result.* class AddDeviceResultActivity : KotlinBaseActivity() { @@ -26,7 +28,8 @@ override fun initEvent() { completeButton.setOnClickListener { - finish() + navigatePageTo() + PageNavigationManager.finishAllActivity() } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt deleted file mode 100644 index 25ce475..0000000 --- a/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt +++ /dev/null @@ -1,56 +0,0 @@ -package com.casic.br.view - -import android.view.View -import android.widget.AdapterView -import com.casic.br.R -import com.casic.br.extensions.initLayoutImmersionBar -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo -import kotlinx.android.synthetic.main.activity_add_device_iot.* - -/** - * 添加IoT设备 - * */ -class AddIoTDeviceActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_add_device_iot - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(true).init() - initLayoutImmersionBar(rootView) - leftBackView.setOnClickListener { finish() } - } - - override fun initData() { - //默认选择WIFI快连 - connectTypeSpinner.setSelection(0) - } - - override fun initEvent() { - connectTypeSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>?, view: View?, position: Int, id: Long - ) { - - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - - } - } - - nextStepButton.setOnClickListener { - if (connectTypeSpinner.selectedItemPosition == 0) { - navigatePageTo() - } else { - navigatePageTo() - } - finish() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 9de6790..54975e3 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -1,11 +1,26 @@ package com.casic.br.view +import android.content.Context import com.casic.br.R +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.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.android.user.api.ILoginCallback +import com.tuya.smart.android.user.bean.User +import com.tuya.smart.home.sdk.TuyaHomeSdk +import kotlinx.android.synthetic.main.activity_login.* +import kotlinx.android.synthetic.main.activity_login.userPhoneView +import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { + private val context: Context = this@LoginActivity + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -21,6 +36,38 @@ } override fun initEvent() { + registerView.setOnClickListener { + navigatePageTo() + } + loginButton.setOnClickListener { + val userPhone = userPhoneView.text.toString() + if (userPhone.isBlank()) { + "请输入手机号".show(this) + return@setOnClickListener + } + val userPassword = passwordView.text.toString() + if (userPassword.isBlank()) { + "请输入密码".show(this) + return@setOnClickListener + } + + LoadingDialogHub.show(this, "登录中,请稍后") + TuyaHomeSdk.getUserInstance() + .loginWithPhonePassword("86", userPhone, userPassword, object : ILoginCallback { + override fun onSuccess(user: User?) { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, true) + LoadingDialogHub.dismiss() + navigatePageTo() + PageNavigationManager.finishAllActivity() + } + + override fun onError(code: String?, error: String?) { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, false) + LoadingDialogHub.dismiss() + "登录失败".show(context) + } + }) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index a2fb29a..25f4254 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -1,5 +1,6 @@ package com.casic.br.view +import android.util.Log import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment @@ -7,13 +8,20 @@ import com.casic.br.R import com.casic.br.adapter.ViewPagerAdapter import com.casic.br.fragment.* +import com.casic.br.utils.LocaleConstant import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { + private val kTag = "MainActivity" private var menuItem: MenuItem? = null private var fragmentPages: ArrayList = ArrayList() private var clickTime: Long = 0 @@ -33,7 +41,27 @@ } override fun initData() { + /** + * TODO 需要改为实际情况 + * + * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 + * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 + * 用户账号下创建任意多个家庭。 + * */ + val s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + if (s == "") { + TuyaHomeSdk.getHomeManagerInstance() + .createHome("北燃生活体验馆", 116.486394, 39.885734, "西直门内南小街", arrayListOf("1"), object : + ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean?) { + SaveKeyValues.putValue(LocaleConstant.HOME_DETAIL_MODEL, bean!!.toJson()) + } + override fun onError(errorCode: String?, errorMsg: String?) { + Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") + } + }) + } } override fun observeRequestState() { diff --git a/app/src/main/java/com/casic/br/view/RegisterActivity.kt b/app/src/main/java/com/casic/br/view/RegisterActivity.kt new file mode 100644 index 0000000..96510fb --- /dev/null +++ b/app/src/main/java/com/casic/br/view/RegisterActivity.kt @@ -0,0 +1,113 @@ +package com.casic.br.view + +import android.content.Context +import android.os.CountDownTimer +import com.casic.br.R +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.isPhoneNumber +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.tuya.smart.android.user.api.IRegisterCallback +import com.tuya.smart.android.user.bean.User +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback +import kotlinx.android.synthetic.main.activity_register.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import java.util.* + +class RegisterActivity : KotlinBaseActivity() { + + private val kTag = "RegisterActivity" + private val context: Context = this@RegisterActivity + + override fun initLayoutView(): Int = R.layout.activity_register + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.text = "注册账号" + } + + override fun initData() { + + } + + override fun initEvent() { + requestCodeButton.setOnClickListener { + if (userPhoneView.text.toString().isBlank()) { + "请输入手机号".show(this) + return@setOnClickListener + } + if (!userPhoneView.text.toString().isPhoneNumber()) { + "手机号不正确,请检查".show(this) + return@setOnClickListener + } + //发送验证码 + TuyaHomeSdk.getUserInstance().sendVerifyCodeWithUserName( + userPhoneView.text.toString(), "", "86", 1, + object : IResultCallback { + override fun onSuccess() { + "发送验证码成功".show(context) + } + + override fun onError(code: String?, error: String?) { + "发送验证码失败".show(context) + } + }) + + //开始倒计时 + object : CountDownTimer(60 * 1000, 1000) { + override fun onTick(millisUntilFinished: Long) { + requestCodeButton.text = String.format("${millisUntilFinished / 1000}s") + requestCodeButton.isEnabled = false + } + + override fun onFinish() { + requestCodeButton.text = "获取验证码" + requestCodeButton.isEnabled = true + } + }.start() + } + + registerButton.setOnClickListener { + val userPhone = userPhoneView.text.toString() + if (userPhone.isBlank()) { + "请输入手机号".show(this) + return@setOnClickListener + } + val smsCode = requestCodeView.text.toString() + if (smsCode.isBlank()) { + "请输入验证码".show(this) + return@setOnClickListener + } + val userPassword = userPasswordView.text.toString() + if (userPassword.isBlank()) { + "请输入密码".show(this) + return@setOnClickListener + } + + LoadingDialogHub.show(this, "注册中,请稍后") + TuyaHomeSdk.getUserInstance().registerAccountWithPhone( + "86", userPhone, userPassword, smsCode, + object : IRegisterCallback { + override fun onSuccess(user: User?) { + LoadingDialogHub.dismiss() + navigatePageTo() + } + + override fun onError(code: String?, error: String?) { + LoadingDialogHub.dismiss() + "用户注册失败".show(context) + } + }) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/RegisterResultActivity.kt b/app/src/main/java/com/casic/br/view/RegisterResultActivity.kt new file mode 100644 index 0000000..6a0de18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/RegisterResultActivity.kt @@ -0,0 +1,40 @@ +package com.casic.br.view + +import android.view.View +import com.casic.br.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import kotlinx.android.synthetic.main.activity_register_result.* +import kotlinx.android.synthetic.main.include_left_back_title.* + +class RegisterResultActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_register_result + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.visibility = View.GONE + } + + override fun observeRequestState() { + + } + + override fun initData() { + + } + + override fun initEvent() { + loginButton.setOnClickListener { + navigatePageTo() + PageNavigationManager.finishAllActivity() + } + } +} \ 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 new file mode 100644 index 0000000..4dc700e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/ResetDeviceActivity.kt @@ -0,0 +1,102 @@ +package com.casic.br.view + +import android.content.Context +import android.util.Log +import android.view.View +import com.casic.br.R +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.model.HomeModel +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.utils.LocaleConstant +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +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.extensions.toJson +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 val context: Context = this@ResetDeviceActivity + private val gson by lazy { Gson() } + 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 s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + val homeModel = gson.fromJson(s, object : TypeToken() {}.type) + TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeModel.homeId.toLong(), + object : ITuyaActivatorGetToken { + override fun onSuccess(token: String) { + Log.d(kTag, "token: $token") + //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 + val builder = object : ActivatorBuilder() {} + builder.ssid = params[0] + builder.context = context + builder.password = params[1] + builder.activatorModel = ActivatorModelEnum.TY_EZ + builder.timeOut = 100 + builder.token = token + builder.listener = object : ITuyaSmartActivatorListener { + override fun onError(errorCode: String?, errorMsg: String?) { + Log.i(kTag, "onError: $errorMsg") + LoadingDialogHub.dismiss() + } + + override fun onActiveSuccess(devResp: DeviceBean?) { + LoadingDialogHub.dismiss() + Log.d(kTag, devResp!!.toJson()) + navigatePageTo() + } + + override fun onStep(step: String?, data: Any?) { + Log.i(kTag, "step: $step") + Log.i(kTag, "data: $data") + LoadingDialogHub.dismiss() + } + } + TuyaHomeSdk.getActivatorInstance().newMultiActivator(builder).start() + } + + override fun onFailure(s: String, s1: String) { + LoadingDialogHub.dismiss() + } + }) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/SearchDeviceResult.kt b/app/src/main/java/com/casic/br/view/SearchDeviceResult.kt deleted file mode 100644 index ed466ae..0000000 --- a/app/src/main/java/com/casic/br/view/SearchDeviceResult.kt +++ /dev/null @@ -1,40 +0,0 @@ -package com.casic.br.view - -import com.casic.br.R -import com.casic.br.extensions.initLayoutImmersionBar -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo -import kotlinx.android.synthetic.main.activity_search_device_result.* -import kotlinx.android.synthetic.main.include_left_back_title.* - -class SearchDeviceResult : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_search_device_result - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(true).init() - initLayoutImmersionBar(rootView) - leftBackView.setOnClickListener { finish() } - titleView.text = "添加设备" - } - - override fun initData() { - - } - - override fun initEvent() { - confirmButton.setOnClickListener { - navigatePageTo() - finish() - } - - reSearchDeviceView.setOnClickListener { - navigatePageTo() - } - } -} \ 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 new file mode 100644 index 0000000..a432adc --- /dev/null +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -0,0 +1,70 @@ +package com.casic.br.view + +import android.content.Context +import android.content.Intent +import android.net.wifi.WifiManager +import android.provider.Settings +import android.view.View +import com.casic.br.R +import com.casic.br.extensions.initLayoutImmersionBar +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 kotlinx.android.synthetic.main.activity_login.* +import kotlinx.android.synthetic.main.activity_select_wifi.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.android.synthetic.main.include_base_title.leftBackView +import kotlinx.android.synthetic.main.include_base_title.titleView +import kotlinx.android.synthetic.main.include_left_back_title.* + + +class SelectWiFiActivity : KotlinBaseActivity() { + + private val context: Context = this@SelectWiFiActivity + private val kTag = "SelectWifiActivity" + private val wifi by lazy { applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager } + + override fun initLayoutView(): Int = R.layout.activity_select_wifi + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.visibility = View.GONE + } + + override fun initData() { + + } + + override fun initEvent() { + changeWifiView.setOnClickListener { + startActivity(Intent(Settings.ACTION_WIFI_SETTINGS)) + } + + nextStepButton.setOnClickListener { + val wifiName = wifiNameView.text.toString() + if (wifiName.isBlank()) { + "请确认WiFi已连接".show(this) + return@setOnClickListener + } + val wifiKey = wifiKeyView.text.toString() + if (wifiKey.isBlank()) { + "请输入WiFi密码".show(this) + return@setOnClickListener + } + navigatePageTo(arrayListOf(wifiName, wifiKey)) + } + } + + override fun onResume() { + super.onResume() + //获取已连接WiFi配置 + wifiNameView.setText(wifi.connectionInfo.ssid.replace("\"", "")) + } +} \ 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 deleted file mode 100644 index d53fc31..0000000 --- a/app/src/main/java/com/casic/br/view/SelectWifiActivity.kt +++ /dev/null @@ -1,35 +0,0 @@ -package com.casic.br.view - -import com.casic.br.R -import com.casic.br.extensions.initLayoutImmersionBar -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo -import kotlinx.android.synthetic.main.activity_select_wifi.* -import kotlinx.android.synthetic.main.include_base_title.* - -class SelectWifiActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_select_wifi - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(true).init() - initLayoutImmersionBar(rootView) - leftBackView.setOnClickListener { finish() } - } - - override fun initData() { - - } - - override fun initEvent() { - nextStepButton.setOnClickListener { - navigatePageTo() - finish() - } - } -} \ No newline at end of file diff --git a/app/src/main/res/drawable/button_gray_selector.xml b/app/src/main/res/drawable/button_gray_selector.xml new file mode 100644 index 0000000..44ae329 --- /dev/null +++ b/app/src/main/res/drawable/button_gray_selector.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_change.xml b/app/src/main/res/drawable/ic_change.xml new file mode 100644 index 0000000..acb654f --- /dev/null +++ b/app/src/main/res/drawable/ic_change.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_lock.xml b/app/src/main/res/drawable/ic_lock.xml new file mode 100644 index 0000000..9bcbe61 --- /dev/null +++ b/app/src/main/res/drawable/ic_lock.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_register_success.xml b/app/src/main/res/drawable/ic_register_success.xml new file mode 100644 index 0000000..14c2ac5 --- /dev/null +++ b/app/src/main/res/drawable/ic_register_success.xml @@ -0,0 +1,389 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_wifi.xml b/app/src/main/res/drawable/ic_wifi.xml new file mode 100644 index 0000000..1b2f7a3 --- /dev/null +++ b/app/src/main/res/drawable/ic_wifi.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_add_device.xml b/app/src/main/res/layout/activity_add_device.xml index 8b7466a..d6185bb 100644 --- a/app/src/main/res/layout/activity_add_device.xml +++ b/app/src/main/res/layout/activity_add_device.xml @@ -22,7 +22,7 @@ android:background="@drawable/bg_solid_layout_white_radius_10" android:fontFamily="sans-serif-medium" android:gravity="center" - android:text="IOT设备" + android:text="IoT设备" android:textSize="@dimen/sp_22" /> \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3ea0e96..ba3523a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -41,15 +41,16 @@ + + - - + + - diff --git a/app/src/main/java/com/casic/br/base/BaseApplication.kt b/app/src/main/java/com/casic/br/base/BaseApplication.kt index bf8285c..c90a197 100644 --- a/app/src/main/java/com/casic/br/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/br/base/BaseApplication.kt @@ -1,16 +1,10 @@ package com.casic.br.base import android.app.Application -import android.util.Log import com.casic.br.greendao.DaoMaster import com.casic.br.greendao.DaoSession -import com.pengxh.kt.lite.extensions.toJson import com.pengxh.kt.lite.utils.SaveKeyValues -import com.tuya.smart.android.user.api.ILoginCallback -import com.tuya.smart.android.user.bean.User import com.tuya.smart.home.sdk.TuyaHomeSdk -import com.tuya.smart.home.sdk.bean.HomeBean -import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlin.properties.Delegates @@ -30,46 +24,13 @@ super.onCreate() instance = this SaveKeyValues.initSharedPreferences(this) - initTuya() + TuyaHomeSdk.init(this) + TuyaHomeSdk.setDebugMode(true) val devOpenHelper = DaoMaster.DevOpenHelper(this, "SmartKitchen.db", null) val daoMaster = DaoMaster(devOpenHelper.writableDatabase) daoSession = daoMaster.newSession() } - private fun initTuya() { - TuyaHomeSdk.init(this) - TuyaHomeSdk.setDebugMode(true) - /** - * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 - * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 - * 用户账号下创建任意多个家庭。 - * */ - //TODO 必须登录 - TuyaHomeSdk.getUserInstance() - .loginWithPhonePassword("86", "18310581916", "123456", object : ILoginCallback { - override fun onSuccess(user: User?) { - Log.d(kTag, "Login success:" + user!!.username) - } - - override fun onError(code: String, error: String) { - Log.e(kTag, "code: " + code + "error:" + error) - } - }) - - - TuyaHomeSdk.getHomeManagerInstance() - .createHome("北燃生活体验馆", 116.486394, 39.885734, "北燃生活体验馆", arrayListOf(), object : - ITuyaHomeResultCallback { - override fun onSuccess(bean: HomeBean?) { - Log.d(kTag, bean!!.toJson()) - } - - override fun onError(errorCode: String?, errorMsg: String?) { - Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") - } - }) - } - fun obtainDaoSession(): DaoSession { return daoSession } diff --git a/app/src/main/java/com/casic/br/extensions/Context.kt b/app/src/main/java/com/casic/br/extensions/Context.kt index 5866614..5726394 100644 --- a/app/src/main/java/com/casic/br/extensions/Context.kt +++ b/app/src/main/java/com/casic/br/extensions/Context.kt @@ -2,11 +2,16 @@ import android.content.Context import android.view.ViewGroup +import com.casic.br.base.BaseApplication +import com.pengxh.kt.lite.extensions.dp2px import com.qmuiteam.qmui.util.QMUIDisplayHelper fun Context.initLayoutImmersionBar(rootView: ViewGroup) { //根据不同设备状态栏高度设置"跳过"按钮的Margin值 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + var statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(this) + if (statusBarHeight == 0) { + statusBarHeight = 44f.dp2px(BaseApplication.obtainInstance()) + } rootView.setPadding(0, statusBarHeight, 0, 0) rootView.requestLayout() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index cc20c54..4ef912b 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -1,25 +1,40 @@ package com.casic.br.fragment import android.graphics.Typeface +import android.util.Log import com.casic.br.R import com.casic.br.adapter.AddedDeviceAdapter import com.casic.br.adapter.RecommendAdapter import com.casic.br.extensions.initLayoutImmersionBar import com.casic.br.model.AddedDeviceModel +import com.casic.br.model.HomeModel import com.casic.br.model.RecommendModel +import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddDeviceActivity import com.casic.br.view.AllDeviceActivity import com.casic.br.view.device.FireplaceActivity import com.casic.br.view.device.RangeHoodActivity import com.casic.br.view.device.WaterHeaterActivity +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback +import com.tuya.smart.sdk.bean.DeviceBean import kotlinx.android.synthetic.main.fragment_device.* import kotlinx.android.synthetic.main.include_main_title.* import java.util.* + class DevicePageFragment : KotlinBaseFragment() { + private val kTag = "DevicePageFragment" + private val gson by lazy { Gson() } + override fun initLayoutView(): Int = R.layout.fragment_device override fun setupTopBarLayout() { @@ -37,16 +52,6 @@ model1.deviceModel = "D40-DM1" model1.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" deviceModels.add(model1) - val model2 = AddedDeviceModel() - model2.deviceName = "万家乐油烟机" - model2.deviceModel = "CXW-320-W7" - model2.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model2) - val model3 = AddedDeviceModel() - model3.deviceName = "万家乐壁挂炉" - model3.deviceModel = "26-13A3L" - model3.deviceUsedTime = "已使用${Random().nextInt(12)}个月${Random().nextInt(31)}天" - deviceModels.add(model3) val addedDeviceAdapter = AddedDeviceAdapter(requireContext()) addedDeviceAdapter.setupDevice(deviceModels) @@ -102,8 +107,28 @@ } override fun initEvent() { - showAllDeviceLayout.setOnClickListener { + showAllDeviceButton.setOnClickListener { requireContext().navigatePageTo() } } + + override fun onResume() { + super.onResume() + val s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + if (s == "") { + return + } + val homeModel = gson.fromJson(s, object : TypeToken() {}.type) + TuyaHomeSdk.newHomeInstance(homeModel.homeId.toLong()) + .getHomeDetail(object : ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean) { + val deviceList: List = bean.deviceList + Log.d(kTag, deviceList.toJson()) + } + + override fun onError(errorCode: String, errorMsg: String) { + // do something + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt index 8aba9b2..84e947c 100644 --- a/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/HomePageFragment.kt @@ -9,9 +9,13 @@ import com.casic.br.utils.GridItemDecoration import com.casic.br.utils.LocaleConstant import com.casic.br.view.LoginActivity +import com.casic.br.view.MainActivity import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.youth.banner.Banner import com.youth.banner.adapter.BannerImageAdapter import com.youth.banner.holder.BannerImageHolder @@ -90,7 +94,39 @@ override fun initEvent() { rightOperateView.setOnClickListener { - requireContext().navigatePageTo() + if (rightOperateView.text == "退出") { + AlertControlDialog.Builder() + .setContext(requireContext()) + .setTitle("退出确认") + .setMessage("退出当前账号,将不能同步数据") + .setNegativeButton("取消") + .setPositiveButton("确认退出") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick() { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, false) + requireContext().navigatePageTo() + PageNavigationManager.finishAllActivity() + } + }) + .build().show() + } else { + requireContext().navigatePageTo() + } } } + + override fun onResume() { + val isLogin = SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + if (isLogin) { + rightOperateView.text = "退出" + } else { + rightOperateView.text = "登录" + } + super.onResume() + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/model/HomeModel.java b/app/src/main/java/com/casic/br/model/HomeModel.java new file mode 100644 index 0000000..638d420 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/HomeModel.java @@ -0,0 +1,127 @@ +package com.casic.br.model; + +import java.util.List; + +public class HomeModel { + + private boolean admin; + private String geoName; + private int homeId; + private int homeStatus; + private double lat; + private double lon; + private String name; + private int role; + private List rooms; + + public boolean isAdmin() { + return admin; + } + + public void setAdmin(boolean admin) { + this.admin = admin; + } + + public String getGeoName() { + return geoName; + } + + public void setGeoName(String geoName) { + this.geoName = geoName; + } + + public int getHomeId() { + return homeId; + } + + public void setHomeId(int homeId) { + this.homeId = homeId; + } + + public int getHomeStatus() { + return homeStatus; + } + + public void setHomeStatus(int homeStatus) { + this.homeStatus = homeStatus; + } + + public double getLat() { + return lat; + } + + public void setLat(double lat) { + this.lat = lat; + } + + public double getLon() { + return lon; + } + + public void setLon(double lon) { + this.lon = lon; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRole() { + return role; + } + + public void setRole(int role) { + this.role = role; + } + + public List getRooms() { + return rooms; + } + + public void setRooms(List rooms) { + this.rooms = rooms; + } + + public static class RoomsModel { + private int displayOrder; + private String name; + private int roomId; + private boolean sel; + + public int getDisplayOrder() { + return displayOrder; + } + + public void setDisplayOrder(int displayOrder) { + this.displayOrder = displayOrder; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getRoomId() { + return roomId; + } + + public void setRoomId(int roomId) { + this.roomId = roomId; + } + + public boolean isSel() { + return sel; + } + + public void setSel(boolean sel) { + this.sel = sel; + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/DialogManager.kt b/app/src/main/java/com/casic/br/utils/DialogManager.kt deleted file mode 100644 index da62e63..0000000 --- a/app/src/main/java/com/casic/br/utils/DialogManager.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.casic.br.utils; - -import android.app.Activity -import android.view.WindowManager -import com.pengxh.kt.lite.base.BaseSingleton -import com.qmuiteam.qmui.widget.dialog.QMUITipDialog - -class DialogManager private constructor(private val activity: Activity) { - - private lateinit var loadingDialog: QMUITipDialog - - companion object : BaseSingleton() { - override val creator: (Activity) -> DialogManager - get() = ::DialogManager - } - - fun showLoadingDialog(message: String) { - loadingDialog = QMUITipDialog - .Builder(activity) - .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) - .setTipWord(message) - .create() - if (!activity.isDestroyed) { - try { - loadingDialog.show() - } catch (e: WindowManager.BadTokenException) { - e.printStackTrace() - } - } - } - - fun dismissLoadingDialog() { - if (loadingDialog.isShowing) { - loadingDialog.dismiss() - } - } -} diff --git a/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt b/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt new file mode 100644 index 0000000..e04e327 --- /dev/null +++ b/app/src/main/java/com/casic/br/utils/LoadingDialogHub.kt @@ -0,0 +1,31 @@ +package com.casic.br.utils + +import android.app.Activity +import android.view.WindowManager +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + +object LoadingDialogHub { + + private lateinit var loadingDialog: QMUITipDialog + + fun show(activity: Activity, message: String) { + loadingDialog = QMUITipDialog + .Builder(activity) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord(message) + .create() + if (!activity.isDestroyed) { + try { + loadingDialog.show() + } catch (e: WindowManager.BadTokenException) { + e.printStackTrace() + } + } + } + + fun dismiss() { + if (loadingDialog.isShowing) { + loadingDialog.dismiss() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt index 197a466..dd365ad 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -53,7 +53,8 @@ * String * ============================================================================================= * */ - const val USER_DETAIL_MODEL = "userDetailModel" + const val USER_IS_LOGIN = "isLogin" + const val HOME_DETAIL_MODEL = "homeDetailModel" const val SERVER_BASE_URL = "http://111.198.10.15:11304" const val DEFAULT_SERVER_CONFIG = "defaultServerConfig" const val ACCOUNT = "account" diff --git a/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt index ce8f99e..210a258 100644 --- a/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddDeviceActivity.kt @@ -30,13 +30,12 @@ override fun initEvent() { iotDevice.setOnClickListener { - navigatePageTo() - finish() + //IoT设备首先需要先配置网络 + navigatePageTo() } notIotDevice.setOnClickListener { navigatePageTo() - finish() } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt b/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt index d58aebd..ec99e90 100644 --- a/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddDeviceResultActivity.kt @@ -4,6 +4,8 @@ import com.casic.br.extensions.initLayoutImmersionBar import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.PageNavigationManager import kotlinx.android.synthetic.main.activity_add_device_result.* class AddDeviceResultActivity : KotlinBaseActivity() { @@ -26,7 +28,8 @@ override fun initEvent() { completeButton.setOnClickListener { - finish() + navigatePageTo() + PageNavigationManager.finishAllActivity() } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt b/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt deleted file mode 100644 index 25ce475..0000000 --- a/app/src/main/java/com/casic/br/view/AddIoTDeviceActivity.kt +++ /dev/null @@ -1,56 +0,0 @@ -package com.casic.br.view - -import android.view.View -import android.widget.AdapterView -import com.casic.br.R -import com.casic.br.extensions.initLayoutImmersionBar -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo -import kotlinx.android.synthetic.main.activity_add_device_iot.* - -/** - * 添加IoT设备 - * */ -class AddIoTDeviceActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_add_device_iot - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(true).init() - initLayoutImmersionBar(rootView) - leftBackView.setOnClickListener { finish() } - } - - override fun initData() { - //默认选择WIFI快连 - connectTypeSpinner.setSelection(0) - } - - override fun initEvent() { - connectTypeSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { - override fun onItemSelected( - parent: AdapterView<*>?, view: View?, position: Int, id: Long - ) { - - } - - override fun onNothingSelected(parent: AdapterView<*>?) { - - } - } - - nextStepButton.setOnClickListener { - if (connectTypeSpinner.selectedItemPosition == 0) { - navigatePageTo() - } else { - navigatePageTo() - } - finish() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/LoginActivity.kt b/app/src/main/java/com/casic/br/view/LoginActivity.kt index 9de6790..54975e3 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -1,11 +1,26 @@ package com.casic.br.view +import android.content.Context import com.casic.br.R +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.PageNavigationManager +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.android.user.api.ILoginCallback +import com.tuya.smart.android.user.bean.User +import com.tuya.smart.home.sdk.TuyaHomeSdk +import kotlinx.android.synthetic.main.activity_login.* +import kotlinx.android.synthetic.main.activity_login.userPhoneView +import kotlinx.android.synthetic.main.activity_register.* class LoginActivity : KotlinBaseActivity() { + private val context: Context = this@LoginActivity + override fun initLayoutView(): Int = R.layout.activity_login override fun setupTopBarLayout() { @@ -21,6 +36,38 @@ } override fun initEvent() { + registerView.setOnClickListener { + navigatePageTo() + } + loginButton.setOnClickListener { + val userPhone = userPhoneView.text.toString() + if (userPhone.isBlank()) { + "请输入手机号".show(this) + return@setOnClickListener + } + val userPassword = passwordView.text.toString() + if (userPassword.isBlank()) { + "请输入密码".show(this) + return@setOnClickListener + } + + LoadingDialogHub.show(this, "登录中,请稍后") + TuyaHomeSdk.getUserInstance() + .loginWithPhonePassword("86", userPhone, userPassword, object : ILoginCallback { + override fun onSuccess(user: User?) { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, true) + LoadingDialogHub.dismiss() + navigatePageTo() + PageNavigationManager.finishAllActivity() + } + + override fun onError(code: String?, error: String?) { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, false) + LoadingDialogHub.dismiss() + "登录失败".show(context) + } + }) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/MainActivity.kt b/app/src/main/java/com/casic/br/view/MainActivity.kt index a2fb29a..25f4254 100644 --- a/app/src/main/java/com/casic/br/view/MainActivity.kt +++ b/app/src/main/java/com/casic/br/view/MainActivity.kt @@ -1,5 +1,6 @@ package com.casic.br.view +import android.util.Log import android.view.KeyEvent import android.view.MenuItem import androidx.fragment.app.Fragment @@ -7,13 +8,20 @@ import com.casic.br.R import com.casic.br.adapter.ViewPagerAdapter import com.casic.br.fragment.* +import com.casic.br.utils.LocaleConstant import com.gyf.immersionbar.ImmersionBar import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.home.sdk.bean.HomeBean +import com.tuya.smart.home.sdk.callback.ITuyaHomeResultCallback import kotlinx.android.synthetic.main.activity_main.* class MainActivity : KotlinBaseActivity() { + private val kTag = "MainActivity" private var menuItem: MenuItem? = null private var fragmentPages: ArrayList = ArrayList() private var clickTime: Long = 0 @@ -33,7 +41,27 @@ } override fun initData() { + /** + * TODO 需要改为实际情况 + * + * 家庭是智能生活 App SDK 开发下实际场景的最大单位。 + * IoT 设备的添加、编辑、移除、状态变化的监听基于家庭下。 + * 用户账号下创建任意多个家庭。 + * */ + val s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + if (s == "") { + TuyaHomeSdk.getHomeManagerInstance() + .createHome("北燃生活体验馆", 116.486394, 39.885734, "西直门内南小街", arrayListOf("1"), object : + ITuyaHomeResultCallback { + override fun onSuccess(bean: HomeBean?) { + SaveKeyValues.putValue(LocaleConstant.HOME_DETAIL_MODEL, bean!!.toJson()) + } + override fun onError(errorCode: String?, errorMsg: String?) { + Log.e(kTag, "errorCode: $errorCode ---- $errorMsg") + } + }) + } } override fun observeRequestState() { diff --git a/app/src/main/java/com/casic/br/view/RegisterActivity.kt b/app/src/main/java/com/casic/br/view/RegisterActivity.kt new file mode 100644 index 0000000..96510fb --- /dev/null +++ b/app/src/main/java/com/casic/br/view/RegisterActivity.kt @@ -0,0 +1,113 @@ +package com.casic.br.view + +import android.content.Context +import android.os.CountDownTimer +import com.casic.br.R +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.utils.LoadingDialogHub +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.isPhoneNumber +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.tuya.smart.android.user.api.IRegisterCallback +import com.tuya.smart.android.user.bean.User +import com.tuya.smart.home.sdk.TuyaHomeSdk +import com.tuya.smart.sdk.api.IResultCallback +import kotlinx.android.synthetic.main.activity_register.* +import kotlinx.android.synthetic.main.include_left_back_title.* +import java.util.* + +class RegisterActivity : KotlinBaseActivity() { + + private val kTag = "RegisterActivity" + private val context: Context = this@RegisterActivity + + override fun initLayoutView(): Int = R.layout.activity_register + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.text = "注册账号" + } + + override fun initData() { + + } + + override fun initEvent() { + requestCodeButton.setOnClickListener { + if (userPhoneView.text.toString().isBlank()) { + "请输入手机号".show(this) + return@setOnClickListener + } + if (!userPhoneView.text.toString().isPhoneNumber()) { + "手机号不正确,请检查".show(this) + return@setOnClickListener + } + //发送验证码 + TuyaHomeSdk.getUserInstance().sendVerifyCodeWithUserName( + userPhoneView.text.toString(), "", "86", 1, + object : IResultCallback { + override fun onSuccess() { + "发送验证码成功".show(context) + } + + override fun onError(code: String?, error: String?) { + "发送验证码失败".show(context) + } + }) + + //开始倒计时 + object : CountDownTimer(60 * 1000, 1000) { + override fun onTick(millisUntilFinished: Long) { + requestCodeButton.text = String.format("${millisUntilFinished / 1000}s") + requestCodeButton.isEnabled = false + } + + override fun onFinish() { + requestCodeButton.text = "获取验证码" + requestCodeButton.isEnabled = true + } + }.start() + } + + registerButton.setOnClickListener { + val userPhone = userPhoneView.text.toString() + if (userPhone.isBlank()) { + "请输入手机号".show(this) + return@setOnClickListener + } + val smsCode = requestCodeView.text.toString() + if (smsCode.isBlank()) { + "请输入验证码".show(this) + return@setOnClickListener + } + val userPassword = userPasswordView.text.toString() + if (userPassword.isBlank()) { + "请输入密码".show(this) + return@setOnClickListener + } + + LoadingDialogHub.show(this, "注册中,请稍后") + TuyaHomeSdk.getUserInstance().registerAccountWithPhone( + "86", userPhone, userPassword, smsCode, + object : IRegisterCallback { + override fun onSuccess(user: User?) { + LoadingDialogHub.dismiss() + navigatePageTo() + } + + override fun onError(code: String?, error: String?) { + LoadingDialogHub.dismiss() + "用户注册失败".show(context) + } + }) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/RegisterResultActivity.kt b/app/src/main/java/com/casic/br/view/RegisterResultActivity.kt new file mode 100644 index 0000000..6a0de18 --- /dev/null +++ b/app/src/main/java/com/casic/br/view/RegisterResultActivity.kt @@ -0,0 +1,40 @@ +package com.casic.br.view + +import android.view.View +import com.casic.br.R +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.PageNavigationManager +import kotlinx.android.synthetic.main.activity_register_result.* +import kotlinx.android.synthetic.main.include_left_back_title.* + +class RegisterResultActivity : KotlinBaseActivity() { + + override fun initLayoutView(): Int = R.layout.activity_register_result + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this)) + + leftBackView.setOnClickListener { finish() } + titleView.visibility = View.GONE + } + + override fun observeRequestState() { + + } + + override fun initData() { + + } + + override fun initEvent() { + loginButton.setOnClickListener { + navigatePageTo() + PageNavigationManager.finishAllActivity() + } + } +} \ 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 new file mode 100644 index 0000000..4dc700e --- /dev/null +++ b/app/src/main/java/com/casic/br/view/ResetDeviceActivity.kt @@ -0,0 +1,102 @@ +package com.casic.br.view + +import android.content.Context +import android.util.Log +import android.view.View +import com.casic.br.R +import com.casic.br.extensions.initLayoutImmersionBar +import com.casic.br.model.HomeModel +import com.casic.br.utils.LoadingDialogHub +import com.casic.br.utils.LocaleConstant +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +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.extensions.toJson +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 val context: Context = this@ResetDeviceActivity + private val gson by lazy { Gson() } + 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 s = SaveKeyValues.getValue(LocaleConstant.HOME_DETAIL_MODEL, "") as String + val homeModel = gson.fromJson(s, object : TypeToken() {}.type) + TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeModel.homeId.toLong(), + object : ITuyaActivatorGetToken { + override fun onSuccess(token: String) { + Log.d(kTag, "token: $token") + //调用 配网接口 需要提供路由器的 SSID(即 Wi-Fi 名称)、密码、从云端获取的 Token 等。 + val builder = object : ActivatorBuilder() {} + builder.ssid = params[0] + builder.context = context + builder.password = params[1] + builder.activatorModel = ActivatorModelEnum.TY_EZ + builder.timeOut = 100 + builder.token = token + builder.listener = object : ITuyaSmartActivatorListener { + override fun onError(errorCode: String?, errorMsg: String?) { + Log.i(kTag, "onError: $errorMsg") + LoadingDialogHub.dismiss() + } + + override fun onActiveSuccess(devResp: DeviceBean?) { + LoadingDialogHub.dismiss() + Log.d(kTag, devResp!!.toJson()) + navigatePageTo() + } + + override fun onStep(step: String?, data: Any?) { + Log.i(kTag, "step: $step") + Log.i(kTag, "data: $data") + LoadingDialogHub.dismiss() + } + } + TuyaHomeSdk.getActivatorInstance().newMultiActivator(builder).start() + } + + override fun onFailure(s: String, s1: String) { + LoadingDialogHub.dismiss() + } + }) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/SearchDeviceResult.kt b/app/src/main/java/com/casic/br/view/SearchDeviceResult.kt deleted file mode 100644 index ed466ae..0000000 --- a/app/src/main/java/com/casic/br/view/SearchDeviceResult.kt +++ /dev/null @@ -1,40 +0,0 @@ -package com.casic.br.view - -import com.casic.br.R -import com.casic.br.extensions.initLayoutImmersionBar -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo -import kotlinx.android.synthetic.main.activity_search_device_result.* -import kotlinx.android.synthetic.main.include_left_back_title.* - -class SearchDeviceResult : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_search_device_result - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(true).init() - initLayoutImmersionBar(rootView) - leftBackView.setOnClickListener { finish() } - titleView.text = "添加设备" - } - - override fun initData() { - - } - - override fun initEvent() { - confirmButton.setOnClickListener { - navigatePageTo() - finish() - } - - reSearchDeviceView.setOnClickListener { - navigatePageTo() - } - } -} \ 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 new file mode 100644 index 0000000..a432adc --- /dev/null +++ b/app/src/main/java/com/casic/br/view/SelectWiFiActivity.kt @@ -0,0 +1,70 @@ +package com.casic.br.view + +import android.content.Context +import android.content.Intent +import android.net.wifi.WifiManager +import android.provider.Settings +import android.view.View +import com.casic.br.R +import com.casic.br.extensions.initLayoutImmersionBar +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 kotlinx.android.synthetic.main.activity_login.* +import kotlinx.android.synthetic.main.activity_select_wifi.* +import kotlinx.android.synthetic.main.include_base_title.* +import kotlinx.android.synthetic.main.include_base_title.leftBackView +import kotlinx.android.synthetic.main.include_base_title.titleView +import kotlinx.android.synthetic.main.include_left_back_title.* + + +class SelectWiFiActivity : KotlinBaseActivity() { + + private val context: Context = this@SelectWiFiActivity + private val kTag = "SelectWifiActivity" + private val wifi by lazy { applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager } + + override fun initLayoutView(): Int = R.layout.activity_select_wifi + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + leftBackView.setOnClickListener { finish() } + titleView.visibility = View.GONE + } + + override fun initData() { + + } + + override fun initEvent() { + changeWifiView.setOnClickListener { + startActivity(Intent(Settings.ACTION_WIFI_SETTINGS)) + } + + nextStepButton.setOnClickListener { + val wifiName = wifiNameView.text.toString() + if (wifiName.isBlank()) { + "请确认WiFi已连接".show(this) + return@setOnClickListener + } + val wifiKey = wifiKeyView.text.toString() + if (wifiKey.isBlank()) { + "请输入WiFi密码".show(this) + return@setOnClickListener + } + navigatePageTo(arrayListOf(wifiName, wifiKey)) + } + } + + override fun onResume() { + super.onResume() + //获取已连接WiFi配置 + wifiNameView.setText(wifi.connectionInfo.ssid.replace("\"", "")) + } +} \ 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 deleted file mode 100644 index d53fc31..0000000 --- a/app/src/main/java/com/casic/br/view/SelectWifiActivity.kt +++ /dev/null @@ -1,35 +0,0 @@ -package com.casic.br.view - -import com.casic.br.R -import com.casic.br.extensions.initLayoutImmersionBar -import com.gyf.immersionbar.ImmersionBar -import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.navigatePageTo -import kotlinx.android.synthetic.main.activity_select_wifi.* -import kotlinx.android.synthetic.main.include_base_title.* - -class SelectWifiActivity : KotlinBaseActivity() { - - override fun initLayoutView(): Int = R.layout.activity_select_wifi - - override fun observeRequestState() { - - } - - override fun setupTopBarLayout() { - ImmersionBar.with(this).statusBarDarkFont(true).init() - initLayoutImmersionBar(rootView) - leftBackView.setOnClickListener { finish() } - } - - override fun initData() { - - } - - override fun initEvent() { - nextStepButton.setOnClickListener { - navigatePageTo() - finish() - } - } -} \ No newline at end of file diff --git a/app/src/main/res/drawable/button_gray_selector.xml b/app/src/main/res/drawable/button_gray_selector.xml new file mode 100644 index 0000000..44ae329 --- /dev/null +++ b/app/src/main/res/drawable/button_gray_selector.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_change.xml b/app/src/main/res/drawable/ic_change.xml new file mode 100644 index 0000000..acb654f --- /dev/null +++ b/app/src/main/res/drawable/ic_change.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_lock.xml b/app/src/main/res/drawable/ic_lock.xml new file mode 100644 index 0000000..9bcbe61 --- /dev/null +++ b/app/src/main/res/drawable/ic_lock.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_register_success.xml b/app/src/main/res/drawable/ic_register_success.xml new file mode 100644 index 0000000..14c2ac5 --- /dev/null +++ b/app/src/main/res/drawable/ic_register_success.xml @@ -0,0 +1,389 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_wifi.xml b/app/src/main/res/drawable/ic_wifi.xml new file mode 100644 index 0000000..1b2f7a3 --- /dev/null +++ b/app/src/main/res/drawable/ic_wifi.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_add_device.xml b/app/src/main/res/layout/activity_add_device.xml index 8b7466a..d6185bb 100644 --- a/app/src/main/res/layout/activity_add_device.xml +++ b/app/src/main/res/layout/activity_add_device.xml @@ -22,7 +22,7 @@ android:background="@drawable/bg_solid_layout_white_radius_10" android:fontFamily="sans-serif-medium" android:gravity="center" - android:text="IOT设备" + android:text="IoT设备" android:textSize="@dimen/sp_22" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_add_device_iot.xml b/app/src/main/res/layout/activity_add_device_iot.xml deleted file mode 100644 index a8c71ea..0000000 --- a/app/src/main/res/layout/activity_add_device_iot.xml +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - - - - - - - - - - - -