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 db3ffae..626ac5b 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -19,7 +19,6 @@ import com.casic.br.view.device.WaterHeaterActivity 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.pengxh.kt.lite.utils.WeakReferenceHandler import com.tuya.smart.home.sdk.TuyaHomeSdk @@ -82,6 +81,7 @@ super.onResume() val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String if (homeId == "") { + Log.e(kTag, "homeId is null") return } TuyaHomeSdk.newHomeInstance(homeId.toLong()) @@ -90,8 +90,6 @@ val deviceList: List = bean.deviceList val deviceModels = ArrayList() deviceList.forEach { - - Log.d(kTag, it.toJson()) val model = AddedDeviceModel() model.deviceId = it.devId when (it.deviceCategory) { 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 db3ffae..626ac5b 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -19,7 +19,6 @@ import com.casic.br.view.device.WaterHeaterActivity 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.pengxh.kt.lite.utils.WeakReferenceHandler import com.tuya.smart.home.sdk.TuyaHomeSdk @@ -82,6 +81,7 @@ super.onResume() val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String if (homeId == "") { + Log.e(kTag, "homeId is null") return } TuyaHomeSdk.newHomeInstance(homeId.toLong()) @@ -90,8 +90,6 @@ val deviceList: List = bean.deviceList val deviceModels = ArrayList() deviceList.forEach { - - Log.d(kTag, it.toJson()) val model = AddedDeviceModel() model.deviceId = it.devId when (it.deviceCategory) { diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt index 159070c..bfd488f 100644 --- a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt @@ -1,5 +1,6 @@ package com.casic.br.fragment +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions @@ -11,14 +12,20 @@ import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddressManagerActivity import com.casic.br.view.EditUserActivity +import com.casic.br.view.LoginActivity import com.casic.br.view.SettingsActivity +import com.casic.br.vm.UserViewModel 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 kotlinx.android.synthetic.main.fragment_mine.* import kotlinx.android.synthetic.main.include_main_title.* class MinePageFragment : KotlinBaseFragment() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.fragment_mine override fun setupTopBarLayout() { @@ -27,6 +34,7 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] val shopGridAdapter = IconTextGridAdapter( requireContext(), LocaleConstant.SHOP_IMAGE, @@ -80,9 +88,21 @@ 1 -> {} 2 -> {} //地址管理 - 3 -> requireContext().navigatePageTo() + 3 -> { + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } + } //系统设置 - 4 -> requireContext().navigatePageTo() + 4 -> { + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } + } } } }) @@ -94,7 +114,11 @@ override fun initEvent() { editUserView.setOnClickListener { - requireContext().navigatePageTo() + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } } } @@ -102,25 +126,28 @@ super.onResume() if (DeserializeModel.isLogin()) { val userModel = DeserializeModel.getUserModel()!! - if (userModel.headPic == "") { - Glide.with(this) - .load(R.mipmap.ic_launcher) - .apply(RequestOptions.circleCropTransform()) - .placeholder(R.mipmap.load_image_error) - .into(userAvatarView) - } else { - Glide.with(this) - .load(userModel.headPic) - .apply(RequestOptions.circleCropTransform()) - .placeholder(R.mipmap.load_image_error) - .into(userAvatarView) - } - userNameView.text = String.format( - "${requireContext().resources.getString(R.string.app_name)}${ - userModel.username.subSequence(10, 14) - }" - ) - userPhoneView.text = userModel.mobile + userViewModel.obtainUserDetail(userModel.account) + userViewModel.userDetailResult.observe(this, { user -> + if (user.code == 200) { + SaveKeyValues.putValue(LocaleConstant.USER_MODEL, user.toJson()) + val currentUser = user.data + if (currentUser.avatar == "") { + Glide.with(this) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } else { + Glide.with(this) + .load(currentUser.avatar) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } + userNameView.text = currentUser.name + userPhoneView.text = currentUser.phone + } + }) } else { Glide.with(this) .load(R.mipmap.ic_launcher) 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 db3ffae..626ac5b 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -19,7 +19,6 @@ import com.casic.br.view.device.WaterHeaterActivity 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.pengxh.kt.lite.utils.WeakReferenceHandler import com.tuya.smart.home.sdk.TuyaHomeSdk @@ -82,6 +81,7 @@ super.onResume() val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String if (homeId == "") { + Log.e(kTag, "homeId is null") return } TuyaHomeSdk.newHomeInstance(homeId.toLong()) @@ -90,8 +90,6 @@ val deviceList: List = bean.deviceList val deviceModels = ArrayList() deviceList.forEach { - - Log.d(kTag, it.toJson()) val model = AddedDeviceModel() model.deviceId = it.devId when (it.deviceCategory) { diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt index 159070c..bfd488f 100644 --- a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt @@ -1,5 +1,6 @@ package com.casic.br.fragment +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions @@ -11,14 +12,20 @@ import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddressManagerActivity import com.casic.br.view.EditUserActivity +import com.casic.br.view.LoginActivity import com.casic.br.view.SettingsActivity +import com.casic.br.vm.UserViewModel 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 kotlinx.android.synthetic.main.fragment_mine.* import kotlinx.android.synthetic.main.include_main_title.* class MinePageFragment : KotlinBaseFragment() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.fragment_mine override fun setupTopBarLayout() { @@ -27,6 +34,7 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] val shopGridAdapter = IconTextGridAdapter( requireContext(), LocaleConstant.SHOP_IMAGE, @@ -80,9 +88,21 @@ 1 -> {} 2 -> {} //地址管理 - 3 -> requireContext().navigatePageTo() + 3 -> { + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } + } //系统设置 - 4 -> requireContext().navigatePageTo() + 4 -> { + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } + } } } }) @@ -94,7 +114,11 @@ override fun initEvent() { editUserView.setOnClickListener { - requireContext().navigatePageTo() + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } } } @@ -102,25 +126,28 @@ super.onResume() if (DeserializeModel.isLogin()) { val userModel = DeserializeModel.getUserModel()!! - if (userModel.headPic == "") { - Glide.with(this) - .load(R.mipmap.ic_launcher) - .apply(RequestOptions.circleCropTransform()) - .placeholder(R.mipmap.load_image_error) - .into(userAvatarView) - } else { - Glide.with(this) - .load(userModel.headPic) - .apply(RequestOptions.circleCropTransform()) - .placeholder(R.mipmap.load_image_error) - .into(userAvatarView) - } - userNameView.text = String.format( - "${requireContext().resources.getString(R.string.app_name)}${ - userModel.username.subSequence(10, 14) - }" - ) - userPhoneView.text = userModel.mobile + userViewModel.obtainUserDetail(userModel.account) + userViewModel.userDetailResult.observe(this, { user -> + if (user.code == 200) { + SaveKeyValues.putValue(LocaleConstant.USER_MODEL, user.toJson()) + val currentUser = user.data + if (currentUser.avatar == "") { + Glide.with(this) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } else { + Glide.with(this) + .load(currentUser.avatar) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } + userNameView.text = currentUser.name + userPhoneView.text = currentUser.phone + } + }) } else { Glide.with(this) .load(R.mipmap.ic_launcher) diff --git a/app/src/main/java/com/casic/br/model/UserDetailModel.java b/app/src/main/java/com/casic/br/model/UserDetailModel.java new file mode 100644 index 0000000..cca5690 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/UserDetailModel.java @@ -0,0 +1,341 @@ +package com.casic.br.model; + +public class UserDetailModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String account; + private String attr1; + private String avatar; + private String birthday; + private String createTime; + private String createUser; + private String delFlag; + private String deptId; + private String deptname; + private String devices; + private String email; + private String id; + private String isSync; + private String lastTime; + private String loginIp; + private String loginMac; + private String name; + private String operation; + private String password; + private String phone; + private String positionLat; + private String positionLng; + private String roleId; + private String salt; + private Integer sex; + private String status; + private String syncDeptid; + private String syncId; + private String syncName; + private String syncPwd; + private String updateTime; + private String updateUser; + private String version; + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + public String getAttr1() { + return attr1; + } + + public void setAttr1(String attr1) { + this.attr1 = attr1; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getBirthday() { + return birthday; + } + + public void setBirthday(String birthday) { + this.birthday = birthday; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getDelFlag() { + return delFlag; + } + + public void setDelFlag(String delFlag) { + this.delFlag = delFlag; + } + + public String getDeptId() { + return deptId; + } + + public void setDeptId(String deptId) { + this.deptId = deptId; + } + + public String getDeptname() { + return deptname; + } + + public void setDeptname(String deptname) { + this.deptname = deptname; + } + + public String getDevices() { + return devices; + } + + public void setDevices(String devices) { + this.devices = devices; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLastTime() { + return lastTime; + } + + public void setLastTime(String lastTime) { + this.lastTime = lastTime; + } + + public String getLoginIp() { + return loginIp; + } + + public void setLoginIp(String loginIp) { + this.loginIp = loginIp; + } + + public String getLoginMac() { + return loginMac; + } + + public void setLoginMac(String loginMac) { + this.loginMac = loginMac; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getOperation() { + return operation; + } + + public void setOperation(String operation) { + this.operation = operation; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getPositionLat() { + return positionLat; + } + + public void setPositionLat(String positionLat) { + this.positionLat = positionLat; + } + + public String getPositionLng() { + return positionLng; + } + + public void setPositionLng(String positionLng) { + this.positionLng = positionLng; + } + + public String getRoleId() { + return roleId; + } + + public void setRoleId(String roleId) { + this.roleId = roleId; + } + + public String getSalt() { + return salt; + } + + public void setSalt(String salt) { + this.salt = salt; + } + + public Integer getSex() { + return sex; + } + + public void setSex(Integer sex) { + this.sex = sex; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getSyncDeptid() { + return syncDeptid; + } + + public void setSyncDeptid(String syncDeptid) { + this.syncDeptid = syncDeptid; + } + + public String getSyncId() { + return syncId; + } + + public void setSyncId(String syncId) { + this.syncId = syncId; + } + + public String getSyncName() { + return syncName; + } + + public void setSyncName(String syncName) { + this.syncName = syncName; + } + + public String getSyncPwd() { + return syncPwd; + } + + public void setSyncPwd(String syncPwd) { + this.syncPwd = syncPwd; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getUpdateUser() { + return updateUser; + } + + public void setUpdateUser(String updateUser) { + this.updateUser = updateUser; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} 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 db3ffae..626ac5b 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -19,7 +19,6 @@ import com.casic.br.view.device.WaterHeaterActivity 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.pengxh.kt.lite.utils.WeakReferenceHandler import com.tuya.smart.home.sdk.TuyaHomeSdk @@ -82,6 +81,7 @@ super.onResume() val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String if (homeId == "") { + Log.e(kTag, "homeId is null") return } TuyaHomeSdk.newHomeInstance(homeId.toLong()) @@ -90,8 +90,6 @@ val deviceList: List = bean.deviceList val deviceModels = ArrayList() deviceList.forEach { - - Log.d(kTag, it.toJson()) val model = AddedDeviceModel() model.deviceId = it.devId when (it.deviceCategory) { diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt index 159070c..bfd488f 100644 --- a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt @@ -1,5 +1,6 @@ package com.casic.br.fragment +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions @@ -11,14 +12,20 @@ import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddressManagerActivity import com.casic.br.view.EditUserActivity +import com.casic.br.view.LoginActivity import com.casic.br.view.SettingsActivity +import com.casic.br.vm.UserViewModel 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 kotlinx.android.synthetic.main.fragment_mine.* import kotlinx.android.synthetic.main.include_main_title.* class MinePageFragment : KotlinBaseFragment() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.fragment_mine override fun setupTopBarLayout() { @@ -27,6 +34,7 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] val shopGridAdapter = IconTextGridAdapter( requireContext(), LocaleConstant.SHOP_IMAGE, @@ -80,9 +88,21 @@ 1 -> {} 2 -> {} //地址管理 - 3 -> requireContext().navigatePageTo() + 3 -> { + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } + } //系统设置 - 4 -> requireContext().navigatePageTo() + 4 -> { + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } + } } } }) @@ -94,7 +114,11 @@ override fun initEvent() { editUserView.setOnClickListener { - requireContext().navigatePageTo() + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } } } @@ -102,25 +126,28 @@ super.onResume() if (DeserializeModel.isLogin()) { val userModel = DeserializeModel.getUserModel()!! - if (userModel.headPic == "") { - Glide.with(this) - .load(R.mipmap.ic_launcher) - .apply(RequestOptions.circleCropTransform()) - .placeholder(R.mipmap.load_image_error) - .into(userAvatarView) - } else { - Glide.with(this) - .load(userModel.headPic) - .apply(RequestOptions.circleCropTransform()) - .placeholder(R.mipmap.load_image_error) - .into(userAvatarView) - } - userNameView.text = String.format( - "${requireContext().resources.getString(R.string.app_name)}${ - userModel.username.subSequence(10, 14) - }" - ) - userPhoneView.text = userModel.mobile + userViewModel.obtainUserDetail(userModel.account) + userViewModel.userDetailResult.observe(this, { user -> + if (user.code == 200) { + SaveKeyValues.putValue(LocaleConstant.USER_MODEL, user.toJson()) + val currentUser = user.data + if (currentUser.avatar == "") { + Glide.with(this) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } else { + Glide.with(this) + .load(currentUser.avatar) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } + userNameView.text = currentUser.name + userPhoneView.text = currentUser.phone + } + }) } else { Glide.with(this) .load(R.mipmap.ic_launcher) diff --git a/app/src/main/java/com/casic/br/model/UserDetailModel.java b/app/src/main/java/com/casic/br/model/UserDetailModel.java new file mode 100644 index 0000000..cca5690 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/UserDetailModel.java @@ -0,0 +1,341 @@ +package com.casic.br.model; + +public class UserDetailModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String account; + private String attr1; + private String avatar; + private String birthday; + private String createTime; + private String createUser; + private String delFlag; + private String deptId; + private String deptname; + private String devices; + private String email; + private String id; + private String isSync; + private String lastTime; + private String loginIp; + private String loginMac; + private String name; + private String operation; + private String password; + private String phone; + private String positionLat; + private String positionLng; + private String roleId; + private String salt; + private Integer sex; + private String status; + private String syncDeptid; + private String syncId; + private String syncName; + private String syncPwd; + private String updateTime; + private String updateUser; + private String version; + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + public String getAttr1() { + return attr1; + } + + public void setAttr1(String attr1) { + this.attr1 = attr1; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getBirthday() { + return birthday; + } + + public void setBirthday(String birthday) { + this.birthday = birthday; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getDelFlag() { + return delFlag; + } + + public void setDelFlag(String delFlag) { + this.delFlag = delFlag; + } + + public String getDeptId() { + return deptId; + } + + public void setDeptId(String deptId) { + this.deptId = deptId; + } + + public String getDeptname() { + return deptname; + } + + public void setDeptname(String deptname) { + this.deptname = deptname; + } + + public String getDevices() { + return devices; + } + + public void setDevices(String devices) { + this.devices = devices; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLastTime() { + return lastTime; + } + + public void setLastTime(String lastTime) { + this.lastTime = lastTime; + } + + public String getLoginIp() { + return loginIp; + } + + public void setLoginIp(String loginIp) { + this.loginIp = loginIp; + } + + public String getLoginMac() { + return loginMac; + } + + public void setLoginMac(String loginMac) { + this.loginMac = loginMac; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getOperation() { + return operation; + } + + public void setOperation(String operation) { + this.operation = operation; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getPositionLat() { + return positionLat; + } + + public void setPositionLat(String positionLat) { + this.positionLat = positionLat; + } + + public String getPositionLng() { + return positionLng; + } + + public void setPositionLng(String positionLng) { + this.positionLng = positionLng; + } + + public String getRoleId() { + return roleId; + } + + public void setRoleId(String roleId) { + this.roleId = roleId; + } + + public String getSalt() { + return salt; + } + + public void setSalt(String salt) { + this.salt = salt; + } + + public Integer getSex() { + return sex; + } + + public void setSex(Integer sex) { + this.sex = sex; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getSyncDeptid() { + return syncDeptid; + } + + public void setSyncDeptid(String syncDeptid) { + this.syncDeptid = syncDeptid; + } + + public String getSyncId() { + return syncId; + } + + public void setSyncId(String syncId) { + this.syncId = syncId; + } + + public String getSyncName() { + return syncName; + } + + public void setSyncName(String syncName) { + this.syncName = syncName; + } + + public String getSyncPwd() { + return syncPwd; + } + + public void setSyncPwd(String syncPwd) { + this.syncPwd = syncPwd; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getUpdateUser() { + return updateUser; + } + + public void setUpdateUser(String updateUser) { + this.updateUser = updateUser; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt index 9c3cccc..51c107c 100644 --- a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt +++ b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt @@ -1,6 +1,6 @@ package com.casic.br.utils -import com.casic.br.model.UserModel +import com.casic.br.model.UserDetailModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.utils.SaveKeyValues @@ -9,15 +9,27 @@ private val gson by lazy { Gson() } - fun getUserModel(): UserModel? { + fun getUserModel(): UserDetailModel.DataModel? { val userJson = SaveKeyValues.getValue(LocaleConstant.USER_MODEL, "") as String if (userJson == "") { return null } - return gson.fromJson(userJson, object : TypeToken() {}.type) + val userDetailModel = gson.fromJson( + userJson, object : TypeToken() {}.type + ) + return userDetailModel.data } fun isLogin(): Boolean { - return SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + val loginTime = SaveKeyValues.getValue(LocaleConstant.LOGIN_TIME, 0L) as Long + return if (loginTime == 0L) { + false + } else { + if (System.currentTimeMillis() - loginTime > 84600 * 1000L) { + false + } else { + SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + } + } } } \ 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 db3ffae..626ac5b 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -19,7 +19,6 @@ import com.casic.br.view.device.WaterHeaterActivity 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.pengxh.kt.lite.utils.WeakReferenceHandler import com.tuya.smart.home.sdk.TuyaHomeSdk @@ -82,6 +81,7 @@ super.onResume() val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String if (homeId == "") { + Log.e(kTag, "homeId is null") return } TuyaHomeSdk.newHomeInstance(homeId.toLong()) @@ -90,8 +90,6 @@ val deviceList: List = bean.deviceList val deviceModels = ArrayList() deviceList.forEach { - - Log.d(kTag, it.toJson()) val model = AddedDeviceModel() model.deviceId = it.devId when (it.deviceCategory) { diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt index 159070c..bfd488f 100644 --- a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt @@ -1,5 +1,6 @@ package com.casic.br.fragment +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions @@ -11,14 +12,20 @@ import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddressManagerActivity import com.casic.br.view.EditUserActivity +import com.casic.br.view.LoginActivity import com.casic.br.view.SettingsActivity +import com.casic.br.vm.UserViewModel 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 kotlinx.android.synthetic.main.fragment_mine.* import kotlinx.android.synthetic.main.include_main_title.* class MinePageFragment : KotlinBaseFragment() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.fragment_mine override fun setupTopBarLayout() { @@ -27,6 +34,7 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] val shopGridAdapter = IconTextGridAdapter( requireContext(), LocaleConstant.SHOP_IMAGE, @@ -80,9 +88,21 @@ 1 -> {} 2 -> {} //地址管理 - 3 -> requireContext().navigatePageTo() + 3 -> { + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } + } //系统设置 - 4 -> requireContext().navigatePageTo() + 4 -> { + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } + } } } }) @@ -94,7 +114,11 @@ override fun initEvent() { editUserView.setOnClickListener { - requireContext().navigatePageTo() + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } } } @@ -102,25 +126,28 @@ super.onResume() if (DeserializeModel.isLogin()) { val userModel = DeserializeModel.getUserModel()!! - if (userModel.headPic == "") { - Glide.with(this) - .load(R.mipmap.ic_launcher) - .apply(RequestOptions.circleCropTransform()) - .placeholder(R.mipmap.load_image_error) - .into(userAvatarView) - } else { - Glide.with(this) - .load(userModel.headPic) - .apply(RequestOptions.circleCropTransform()) - .placeholder(R.mipmap.load_image_error) - .into(userAvatarView) - } - userNameView.text = String.format( - "${requireContext().resources.getString(R.string.app_name)}${ - userModel.username.subSequence(10, 14) - }" - ) - userPhoneView.text = userModel.mobile + userViewModel.obtainUserDetail(userModel.account) + userViewModel.userDetailResult.observe(this, { user -> + if (user.code == 200) { + SaveKeyValues.putValue(LocaleConstant.USER_MODEL, user.toJson()) + val currentUser = user.data + if (currentUser.avatar == "") { + Glide.with(this) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } else { + Glide.with(this) + .load(currentUser.avatar) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } + userNameView.text = currentUser.name + userPhoneView.text = currentUser.phone + } + }) } else { Glide.with(this) .load(R.mipmap.ic_launcher) diff --git a/app/src/main/java/com/casic/br/model/UserDetailModel.java b/app/src/main/java/com/casic/br/model/UserDetailModel.java new file mode 100644 index 0000000..cca5690 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/UserDetailModel.java @@ -0,0 +1,341 @@ +package com.casic.br.model; + +public class UserDetailModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String account; + private String attr1; + private String avatar; + private String birthday; + private String createTime; + private String createUser; + private String delFlag; + private String deptId; + private String deptname; + private String devices; + private String email; + private String id; + private String isSync; + private String lastTime; + private String loginIp; + private String loginMac; + private String name; + private String operation; + private String password; + private String phone; + private String positionLat; + private String positionLng; + private String roleId; + private String salt; + private Integer sex; + private String status; + private String syncDeptid; + private String syncId; + private String syncName; + private String syncPwd; + private String updateTime; + private String updateUser; + private String version; + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + public String getAttr1() { + return attr1; + } + + public void setAttr1(String attr1) { + this.attr1 = attr1; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getBirthday() { + return birthday; + } + + public void setBirthday(String birthday) { + this.birthday = birthday; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getDelFlag() { + return delFlag; + } + + public void setDelFlag(String delFlag) { + this.delFlag = delFlag; + } + + public String getDeptId() { + return deptId; + } + + public void setDeptId(String deptId) { + this.deptId = deptId; + } + + public String getDeptname() { + return deptname; + } + + public void setDeptname(String deptname) { + this.deptname = deptname; + } + + public String getDevices() { + return devices; + } + + public void setDevices(String devices) { + this.devices = devices; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLastTime() { + return lastTime; + } + + public void setLastTime(String lastTime) { + this.lastTime = lastTime; + } + + public String getLoginIp() { + return loginIp; + } + + public void setLoginIp(String loginIp) { + this.loginIp = loginIp; + } + + public String getLoginMac() { + return loginMac; + } + + public void setLoginMac(String loginMac) { + this.loginMac = loginMac; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getOperation() { + return operation; + } + + public void setOperation(String operation) { + this.operation = operation; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getPositionLat() { + return positionLat; + } + + public void setPositionLat(String positionLat) { + this.positionLat = positionLat; + } + + public String getPositionLng() { + return positionLng; + } + + public void setPositionLng(String positionLng) { + this.positionLng = positionLng; + } + + public String getRoleId() { + return roleId; + } + + public void setRoleId(String roleId) { + this.roleId = roleId; + } + + public String getSalt() { + return salt; + } + + public void setSalt(String salt) { + this.salt = salt; + } + + public Integer getSex() { + return sex; + } + + public void setSex(Integer sex) { + this.sex = sex; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getSyncDeptid() { + return syncDeptid; + } + + public void setSyncDeptid(String syncDeptid) { + this.syncDeptid = syncDeptid; + } + + public String getSyncId() { + return syncId; + } + + public void setSyncId(String syncId) { + this.syncId = syncId; + } + + public String getSyncName() { + return syncName; + } + + public void setSyncName(String syncName) { + this.syncName = syncName; + } + + public String getSyncPwd() { + return syncPwd; + } + + public void setSyncPwd(String syncPwd) { + this.syncPwd = syncPwd; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getUpdateUser() { + return updateUser; + } + + public void setUpdateUser(String updateUser) { + this.updateUser = updateUser; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt index 9c3cccc..51c107c 100644 --- a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt +++ b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt @@ -1,6 +1,6 @@ package com.casic.br.utils -import com.casic.br.model.UserModel +import com.casic.br.model.UserDetailModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.utils.SaveKeyValues @@ -9,15 +9,27 @@ private val gson by lazy { Gson() } - fun getUserModel(): UserModel? { + fun getUserModel(): UserDetailModel.DataModel? { val userJson = SaveKeyValues.getValue(LocaleConstant.USER_MODEL, "") as String if (userJson == "") { return null } - return gson.fromJson(userJson, object : TypeToken() {}.type) + val userDetailModel = gson.fromJson( + userJson, object : TypeToken() {}.type + ) + return userDetailModel.data } fun isLogin(): Boolean { - return SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + val loginTime = SaveKeyValues.getValue(LocaleConstant.LOGIN_TIME, 0L) as Long + return if (loginTime == 0L) { + false + } else { + if (System.currentTimeMillis() - loginTime > 84600 * 1000L) { + false + } else { + SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + } + } } } \ 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 be1986d..0bc86c6 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -64,6 +64,7 @@ * */ const val PUSH_CLIENT_ID = "clientId" const val COUNTRY_CODE = "86" + const val LOGIN_TIME = "loginTime" const val USER_IS_LOGIN = "isLogin" const val HOME_ID = "homeId" const val USER_MODEL = "userModel" 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 db3ffae..626ac5b 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -19,7 +19,6 @@ import com.casic.br.view.device.WaterHeaterActivity 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.pengxh.kt.lite.utils.WeakReferenceHandler import com.tuya.smart.home.sdk.TuyaHomeSdk @@ -82,6 +81,7 @@ super.onResume() val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String if (homeId == "") { + Log.e(kTag, "homeId is null") return } TuyaHomeSdk.newHomeInstance(homeId.toLong()) @@ -90,8 +90,6 @@ val deviceList: List = bean.deviceList val deviceModels = ArrayList() deviceList.forEach { - - Log.d(kTag, it.toJson()) val model = AddedDeviceModel() model.deviceId = it.devId when (it.deviceCategory) { diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt index 159070c..bfd488f 100644 --- a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt @@ -1,5 +1,6 @@ package com.casic.br.fragment +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions @@ -11,14 +12,20 @@ import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddressManagerActivity import com.casic.br.view.EditUserActivity +import com.casic.br.view.LoginActivity import com.casic.br.view.SettingsActivity +import com.casic.br.vm.UserViewModel 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 kotlinx.android.synthetic.main.fragment_mine.* import kotlinx.android.synthetic.main.include_main_title.* class MinePageFragment : KotlinBaseFragment() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.fragment_mine override fun setupTopBarLayout() { @@ -27,6 +34,7 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] val shopGridAdapter = IconTextGridAdapter( requireContext(), LocaleConstant.SHOP_IMAGE, @@ -80,9 +88,21 @@ 1 -> {} 2 -> {} //地址管理 - 3 -> requireContext().navigatePageTo() + 3 -> { + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } + } //系统设置 - 4 -> requireContext().navigatePageTo() + 4 -> { + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } + } } } }) @@ -94,7 +114,11 @@ override fun initEvent() { editUserView.setOnClickListener { - requireContext().navigatePageTo() + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } } } @@ -102,25 +126,28 @@ super.onResume() if (DeserializeModel.isLogin()) { val userModel = DeserializeModel.getUserModel()!! - if (userModel.headPic == "") { - Glide.with(this) - .load(R.mipmap.ic_launcher) - .apply(RequestOptions.circleCropTransform()) - .placeholder(R.mipmap.load_image_error) - .into(userAvatarView) - } else { - Glide.with(this) - .load(userModel.headPic) - .apply(RequestOptions.circleCropTransform()) - .placeholder(R.mipmap.load_image_error) - .into(userAvatarView) - } - userNameView.text = String.format( - "${requireContext().resources.getString(R.string.app_name)}${ - userModel.username.subSequence(10, 14) - }" - ) - userPhoneView.text = userModel.mobile + userViewModel.obtainUserDetail(userModel.account) + userViewModel.userDetailResult.observe(this, { user -> + if (user.code == 200) { + SaveKeyValues.putValue(LocaleConstant.USER_MODEL, user.toJson()) + val currentUser = user.data + if (currentUser.avatar == "") { + Glide.with(this) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } else { + Glide.with(this) + .load(currentUser.avatar) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } + userNameView.text = currentUser.name + userPhoneView.text = currentUser.phone + } + }) } else { Glide.with(this) .load(R.mipmap.ic_launcher) diff --git a/app/src/main/java/com/casic/br/model/UserDetailModel.java b/app/src/main/java/com/casic/br/model/UserDetailModel.java new file mode 100644 index 0000000..cca5690 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/UserDetailModel.java @@ -0,0 +1,341 @@ +package com.casic.br.model; + +public class UserDetailModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String account; + private String attr1; + private String avatar; + private String birthday; + private String createTime; + private String createUser; + private String delFlag; + private String deptId; + private String deptname; + private String devices; + private String email; + private String id; + private String isSync; + private String lastTime; + private String loginIp; + private String loginMac; + private String name; + private String operation; + private String password; + private String phone; + private String positionLat; + private String positionLng; + private String roleId; + private String salt; + private Integer sex; + private String status; + private String syncDeptid; + private String syncId; + private String syncName; + private String syncPwd; + private String updateTime; + private String updateUser; + private String version; + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + public String getAttr1() { + return attr1; + } + + public void setAttr1(String attr1) { + this.attr1 = attr1; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getBirthday() { + return birthday; + } + + public void setBirthday(String birthday) { + this.birthday = birthday; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getDelFlag() { + return delFlag; + } + + public void setDelFlag(String delFlag) { + this.delFlag = delFlag; + } + + public String getDeptId() { + return deptId; + } + + public void setDeptId(String deptId) { + this.deptId = deptId; + } + + public String getDeptname() { + return deptname; + } + + public void setDeptname(String deptname) { + this.deptname = deptname; + } + + public String getDevices() { + return devices; + } + + public void setDevices(String devices) { + this.devices = devices; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLastTime() { + return lastTime; + } + + public void setLastTime(String lastTime) { + this.lastTime = lastTime; + } + + public String getLoginIp() { + return loginIp; + } + + public void setLoginIp(String loginIp) { + this.loginIp = loginIp; + } + + public String getLoginMac() { + return loginMac; + } + + public void setLoginMac(String loginMac) { + this.loginMac = loginMac; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getOperation() { + return operation; + } + + public void setOperation(String operation) { + this.operation = operation; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getPositionLat() { + return positionLat; + } + + public void setPositionLat(String positionLat) { + this.positionLat = positionLat; + } + + public String getPositionLng() { + return positionLng; + } + + public void setPositionLng(String positionLng) { + this.positionLng = positionLng; + } + + public String getRoleId() { + return roleId; + } + + public void setRoleId(String roleId) { + this.roleId = roleId; + } + + public String getSalt() { + return salt; + } + + public void setSalt(String salt) { + this.salt = salt; + } + + public Integer getSex() { + return sex; + } + + public void setSex(Integer sex) { + this.sex = sex; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getSyncDeptid() { + return syncDeptid; + } + + public void setSyncDeptid(String syncDeptid) { + this.syncDeptid = syncDeptid; + } + + public String getSyncId() { + return syncId; + } + + public void setSyncId(String syncId) { + this.syncId = syncId; + } + + public String getSyncName() { + return syncName; + } + + public void setSyncName(String syncName) { + this.syncName = syncName; + } + + public String getSyncPwd() { + return syncPwd; + } + + public void setSyncPwd(String syncPwd) { + this.syncPwd = syncPwd; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getUpdateUser() { + return updateUser; + } + + public void setUpdateUser(String updateUser) { + this.updateUser = updateUser; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt index 9c3cccc..51c107c 100644 --- a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt +++ b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt @@ -1,6 +1,6 @@ package com.casic.br.utils -import com.casic.br.model.UserModel +import com.casic.br.model.UserDetailModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.utils.SaveKeyValues @@ -9,15 +9,27 @@ private val gson by lazy { Gson() } - fun getUserModel(): UserModel? { + fun getUserModel(): UserDetailModel.DataModel? { val userJson = SaveKeyValues.getValue(LocaleConstant.USER_MODEL, "") as String if (userJson == "") { return null } - return gson.fromJson(userJson, object : TypeToken() {}.type) + val userDetailModel = gson.fromJson( + userJson, object : TypeToken() {}.type + ) + return userDetailModel.data } fun isLogin(): Boolean { - return SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + val loginTime = SaveKeyValues.getValue(LocaleConstant.LOGIN_TIME, 0L) as Long + return if (loginTime == 0L) { + false + } else { + if (System.currentTimeMillis() - loginTime > 84600 * 1000L) { + false + } else { + SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + } + } } } \ 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 be1986d..0bc86c6 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -64,6 +64,7 @@ * */ const val PUSH_CLIENT_ID = "clientId" const val COUNTRY_CODE = "86" + const val LOGIN_TIME = "loginTime" const val USER_IS_LOGIN = "isLogin" const val HOME_ID = "homeId" const val USER_MODEL = "userModel" diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1360cca..6495d77 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -1,5 +1,6 @@ package com.casic.br.utils.retrofit +import okhttp3.MultipartBody import okhttp3.RequestBody import retrofit2.http.* @@ -32,8 +33,20 @@ /** * 获取用户信息 */ - @GET("/user/info") - suspend fun obtainUserDetail(@Header("token") token: String): String + @GET("/appUser/info") + suspend fun obtainUserDetail( + @Header("token") token: String, + @Query("account") account: String + ): String + + /** + * 获取用户信息 + */ + @POST("/appUser/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String /** * 新增地址 @@ -79,4 +92,16 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 上传图片 + * 系统路径static拼接图片返回路径 + * http://xx.com/static/2019-10/8050891248624f2bbefedcb196ce89cb.jpeg + */ + @Multipart + @POST("/file/uploadFile") + suspend fun uploadImage( + @Header("token") token: String, + @Part file: MultipartBody.Part + ): String } \ 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 db3ffae..626ac5b 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -19,7 +19,6 @@ import com.casic.br.view.device.WaterHeaterActivity 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.pengxh.kt.lite.utils.WeakReferenceHandler import com.tuya.smart.home.sdk.TuyaHomeSdk @@ -82,6 +81,7 @@ super.onResume() val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String if (homeId == "") { + Log.e(kTag, "homeId is null") return } TuyaHomeSdk.newHomeInstance(homeId.toLong()) @@ -90,8 +90,6 @@ val deviceList: List = bean.deviceList val deviceModels = ArrayList() deviceList.forEach { - - Log.d(kTag, it.toJson()) val model = AddedDeviceModel() model.deviceId = it.devId when (it.deviceCategory) { diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt index 159070c..bfd488f 100644 --- a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt @@ -1,5 +1,6 @@ package com.casic.br.fragment +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions @@ -11,14 +12,20 @@ import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddressManagerActivity import com.casic.br.view.EditUserActivity +import com.casic.br.view.LoginActivity import com.casic.br.view.SettingsActivity +import com.casic.br.vm.UserViewModel 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 kotlinx.android.synthetic.main.fragment_mine.* import kotlinx.android.synthetic.main.include_main_title.* class MinePageFragment : KotlinBaseFragment() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.fragment_mine override fun setupTopBarLayout() { @@ -27,6 +34,7 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] val shopGridAdapter = IconTextGridAdapter( requireContext(), LocaleConstant.SHOP_IMAGE, @@ -80,9 +88,21 @@ 1 -> {} 2 -> {} //地址管理 - 3 -> requireContext().navigatePageTo() + 3 -> { + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } + } //系统设置 - 4 -> requireContext().navigatePageTo() + 4 -> { + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } + } } } }) @@ -94,7 +114,11 @@ override fun initEvent() { editUserView.setOnClickListener { - requireContext().navigatePageTo() + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } } } @@ -102,25 +126,28 @@ super.onResume() if (DeserializeModel.isLogin()) { val userModel = DeserializeModel.getUserModel()!! - if (userModel.headPic == "") { - Glide.with(this) - .load(R.mipmap.ic_launcher) - .apply(RequestOptions.circleCropTransform()) - .placeholder(R.mipmap.load_image_error) - .into(userAvatarView) - } else { - Glide.with(this) - .load(userModel.headPic) - .apply(RequestOptions.circleCropTransform()) - .placeholder(R.mipmap.load_image_error) - .into(userAvatarView) - } - userNameView.text = String.format( - "${requireContext().resources.getString(R.string.app_name)}${ - userModel.username.subSequence(10, 14) - }" - ) - userPhoneView.text = userModel.mobile + userViewModel.obtainUserDetail(userModel.account) + userViewModel.userDetailResult.observe(this, { user -> + if (user.code == 200) { + SaveKeyValues.putValue(LocaleConstant.USER_MODEL, user.toJson()) + val currentUser = user.data + if (currentUser.avatar == "") { + Glide.with(this) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } else { + Glide.with(this) + .load(currentUser.avatar) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } + userNameView.text = currentUser.name + userPhoneView.text = currentUser.phone + } + }) } else { Glide.with(this) .load(R.mipmap.ic_launcher) diff --git a/app/src/main/java/com/casic/br/model/UserDetailModel.java b/app/src/main/java/com/casic/br/model/UserDetailModel.java new file mode 100644 index 0000000..cca5690 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/UserDetailModel.java @@ -0,0 +1,341 @@ +package com.casic.br.model; + +public class UserDetailModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String account; + private String attr1; + private String avatar; + private String birthday; + private String createTime; + private String createUser; + private String delFlag; + private String deptId; + private String deptname; + private String devices; + private String email; + private String id; + private String isSync; + private String lastTime; + private String loginIp; + private String loginMac; + private String name; + private String operation; + private String password; + private String phone; + private String positionLat; + private String positionLng; + private String roleId; + private String salt; + private Integer sex; + private String status; + private String syncDeptid; + private String syncId; + private String syncName; + private String syncPwd; + private String updateTime; + private String updateUser; + private String version; + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + public String getAttr1() { + return attr1; + } + + public void setAttr1(String attr1) { + this.attr1 = attr1; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getBirthday() { + return birthday; + } + + public void setBirthday(String birthday) { + this.birthday = birthday; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getDelFlag() { + return delFlag; + } + + public void setDelFlag(String delFlag) { + this.delFlag = delFlag; + } + + public String getDeptId() { + return deptId; + } + + public void setDeptId(String deptId) { + this.deptId = deptId; + } + + public String getDeptname() { + return deptname; + } + + public void setDeptname(String deptname) { + this.deptname = deptname; + } + + public String getDevices() { + return devices; + } + + public void setDevices(String devices) { + this.devices = devices; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLastTime() { + return lastTime; + } + + public void setLastTime(String lastTime) { + this.lastTime = lastTime; + } + + public String getLoginIp() { + return loginIp; + } + + public void setLoginIp(String loginIp) { + this.loginIp = loginIp; + } + + public String getLoginMac() { + return loginMac; + } + + public void setLoginMac(String loginMac) { + this.loginMac = loginMac; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getOperation() { + return operation; + } + + public void setOperation(String operation) { + this.operation = operation; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getPositionLat() { + return positionLat; + } + + public void setPositionLat(String positionLat) { + this.positionLat = positionLat; + } + + public String getPositionLng() { + return positionLng; + } + + public void setPositionLng(String positionLng) { + this.positionLng = positionLng; + } + + public String getRoleId() { + return roleId; + } + + public void setRoleId(String roleId) { + this.roleId = roleId; + } + + public String getSalt() { + return salt; + } + + public void setSalt(String salt) { + this.salt = salt; + } + + public Integer getSex() { + return sex; + } + + public void setSex(Integer sex) { + this.sex = sex; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getSyncDeptid() { + return syncDeptid; + } + + public void setSyncDeptid(String syncDeptid) { + this.syncDeptid = syncDeptid; + } + + public String getSyncId() { + return syncId; + } + + public void setSyncId(String syncId) { + this.syncId = syncId; + } + + public String getSyncName() { + return syncName; + } + + public void setSyncName(String syncName) { + this.syncName = syncName; + } + + public String getSyncPwd() { + return syncPwd; + } + + public void setSyncPwd(String syncPwd) { + this.syncPwd = syncPwd; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getUpdateUser() { + return updateUser; + } + + public void setUpdateUser(String updateUser) { + this.updateUser = updateUser; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt index 9c3cccc..51c107c 100644 --- a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt +++ b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt @@ -1,6 +1,6 @@ package com.casic.br.utils -import com.casic.br.model.UserModel +import com.casic.br.model.UserDetailModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.utils.SaveKeyValues @@ -9,15 +9,27 @@ private val gson by lazy { Gson() } - fun getUserModel(): UserModel? { + fun getUserModel(): UserDetailModel.DataModel? { val userJson = SaveKeyValues.getValue(LocaleConstant.USER_MODEL, "") as String if (userJson == "") { return null } - return gson.fromJson(userJson, object : TypeToken() {}.type) + val userDetailModel = gson.fromJson( + userJson, object : TypeToken() {}.type + ) + return userDetailModel.data } fun isLogin(): Boolean { - return SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + val loginTime = SaveKeyValues.getValue(LocaleConstant.LOGIN_TIME, 0L) as Long + return if (loginTime == 0L) { + false + } else { + if (System.currentTimeMillis() - loginTime > 84600 * 1000L) { + false + } else { + SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + } + } } } \ 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 be1986d..0bc86c6 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -64,6 +64,7 @@ * */ const val PUSH_CLIENT_ID = "clientId" const val COUNTRY_CODE = "86" + const val LOGIN_TIME = "loginTime" const val USER_IS_LOGIN = "isLogin" const val HOME_ID = "homeId" const val USER_MODEL = "userModel" diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1360cca..6495d77 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -1,5 +1,6 @@ package com.casic.br.utils.retrofit +import okhttp3.MultipartBody import okhttp3.RequestBody import retrofit2.http.* @@ -32,8 +33,20 @@ /** * 获取用户信息 */ - @GET("/user/info") - suspend fun obtainUserDetail(@Header("token") token: String): String + @GET("/appUser/info") + suspend fun obtainUserDetail( + @Header("token") token: String, + @Query("account") account: String + ): String + + /** + * 获取用户信息 + */ + @POST("/appUser/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String /** * 新增地址 @@ -79,4 +92,16 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 上传图片 + * 系统路径static拼接图片返回路径 + * http://xx.com/static/2019-10/8050891248624f2bbefedcb196ce89cb.jpeg + */ + @Multipart + @POST("/file/uploadFile") + suspend fun uploadImage( + @Header("token") token: String, + @Part file: MultipartBody.Part + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 83784fc..344bd26 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -1,12 +1,17 @@ package com.casic.br.utils.retrofit +import com.casic.br.model.UserDetailModel import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant import com.pengxh.kt.lite.utils.RetrofitFactory.createRetrofit import com.pengxh.kt.lite.utils.SaveKeyValues import okhttp3.MediaType.Companion.toMediaType +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MultipartBody +import okhttp3.RequestBody import okhttp3.RequestBody.Companion.toRequestBody import org.json.JSONObject +import java.io.File object RetrofitServiceManager { @@ -83,8 +88,26 @@ /** * 获取用户信息 */ - suspend fun obtainUserDetail(): String { - return api.obtainUserDetail(AuthenticationHelper.token!!) + suspend fun obtainUserDetail(account: String): String { + return api.obtainUserDetail(AuthenticationHelper.token!!, account) + } + + /** + * 获取用户信息 + */ + suspend fun updateUserInfo(userData: UserDetailModel.DataModel): String { + val paramObject = JSONObject() + paramObject.put("id", userData.id) + paramObject.put("name", userData.name) + paramObject.put("birthday", userData.birthday) + paramObject.put("sex", userData.sex) + paramObject.put("email", userData.email) + paramObject.put("phone", userData.phone) + paramObject.put("avatar", userData.avatar) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.updateUserInfo(AuthenticationHelper.token!!, requestBody) } /** @@ -175,4 +198,13 @@ ) return api.obtainBanner(AuthenticationHelper.token!!, requestBody) } + + /** + * 上传图片 + */ + suspend fun uploadImage(image: File): String { + val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) + val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) + return api.uploadImage(AuthenticationHelper.token!!, imagePart) + } } \ 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 db3ffae..626ac5b 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -19,7 +19,6 @@ import com.casic.br.view.device.WaterHeaterActivity 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.pengxh.kt.lite.utils.WeakReferenceHandler import com.tuya.smart.home.sdk.TuyaHomeSdk @@ -82,6 +81,7 @@ super.onResume() val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String if (homeId == "") { + Log.e(kTag, "homeId is null") return } TuyaHomeSdk.newHomeInstance(homeId.toLong()) @@ -90,8 +90,6 @@ val deviceList: List = bean.deviceList val deviceModels = ArrayList() deviceList.forEach { - - Log.d(kTag, it.toJson()) val model = AddedDeviceModel() model.deviceId = it.devId when (it.deviceCategory) { diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt index 159070c..bfd488f 100644 --- a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt @@ -1,5 +1,6 @@ package com.casic.br.fragment +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions @@ -11,14 +12,20 @@ import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddressManagerActivity import com.casic.br.view.EditUserActivity +import com.casic.br.view.LoginActivity import com.casic.br.view.SettingsActivity +import com.casic.br.vm.UserViewModel 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 kotlinx.android.synthetic.main.fragment_mine.* import kotlinx.android.synthetic.main.include_main_title.* class MinePageFragment : KotlinBaseFragment() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.fragment_mine override fun setupTopBarLayout() { @@ -27,6 +34,7 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] val shopGridAdapter = IconTextGridAdapter( requireContext(), LocaleConstant.SHOP_IMAGE, @@ -80,9 +88,21 @@ 1 -> {} 2 -> {} //地址管理 - 3 -> requireContext().navigatePageTo() + 3 -> { + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } + } //系统设置 - 4 -> requireContext().navigatePageTo() + 4 -> { + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } + } } } }) @@ -94,7 +114,11 @@ override fun initEvent() { editUserView.setOnClickListener { - requireContext().navigatePageTo() + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } } } @@ -102,25 +126,28 @@ super.onResume() if (DeserializeModel.isLogin()) { val userModel = DeserializeModel.getUserModel()!! - if (userModel.headPic == "") { - Glide.with(this) - .load(R.mipmap.ic_launcher) - .apply(RequestOptions.circleCropTransform()) - .placeholder(R.mipmap.load_image_error) - .into(userAvatarView) - } else { - Glide.with(this) - .load(userModel.headPic) - .apply(RequestOptions.circleCropTransform()) - .placeholder(R.mipmap.load_image_error) - .into(userAvatarView) - } - userNameView.text = String.format( - "${requireContext().resources.getString(R.string.app_name)}${ - userModel.username.subSequence(10, 14) - }" - ) - userPhoneView.text = userModel.mobile + userViewModel.obtainUserDetail(userModel.account) + userViewModel.userDetailResult.observe(this, { user -> + if (user.code == 200) { + SaveKeyValues.putValue(LocaleConstant.USER_MODEL, user.toJson()) + val currentUser = user.data + if (currentUser.avatar == "") { + Glide.with(this) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } else { + Glide.with(this) + .load(currentUser.avatar) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } + userNameView.text = currentUser.name + userPhoneView.text = currentUser.phone + } + }) } else { Glide.with(this) .load(R.mipmap.ic_launcher) diff --git a/app/src/main/java/com/casic/br/model/UserDetailModel.java b/app/src/main/java/com/casic/br/model/UserDetailModel.java new file mode 100644 index 0000000..cca5690 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/UserDetailModel.java @@ -0,0 +1,341 @@ +package com.casic.br.model; + +public class UserDetailModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String account; + private String attr1; + private String avatar; + private String birthday; + private String createTime; + private String createUser; + private String delFlag; + private String deptId; + private String deptname; + private String devices; + private String email; + private String id; + private String isSync; + private String lastTime; + private String loginIp; + private String loginMac; + private String name; + private String operation; + private String password; + private String phone; + private String positionLat; + private String positionLng; + private String roleId; + private String salt; + private Integer sex; + private String status; + private String syncDeptid; + private String syncId; + private String syncName; + private String syncPwd; + private String updateTime; + private String updateUser; + private String version; + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + public String getAttr1() { + return attr1; + } + + public void setAttr1(String attr1) { + this.attr1 = attr1; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getBirthday() { + return birthday; + } + + public void setBirthday(String birthday) { + this.birthday = birthday; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getDelFlag() { + return delFlag; + } + + public void setDelFlag(String delFlag) { + this.delFlag = delFlag; + } + + public String getDeptId() { + return deptId; + } + + public void setDeptId(String deptId) { + this.deptId = deptId; + } + + public String getDeptname() { + return deptname; + } + + public void setDeptname(String deptname) { + this.deptname = deptname; + } + + public String getDevices() { + return devices; + } + + public void setDevices(String devices) { + this.devices = devices; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLastTime() { + return lastTime; + } + + public void setLastTime(String lastTime) { + this.lastTime = lastTime; + } + + public String getLoginIp() { + return loginIp; + } + + public void setLoginIp(String loginIp) { + this.loginIp = loginIp; + } + + public String getLoginMac() { + return loginMac; + } + + public void setLoginMac(String loginMac) { + this.loginMac = loginMac; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getOperation() { + return operation; + } + + public void setOperation(String operation) { + this.operation = operation; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getPositionLat() { + return positionLat; + } + + public void setPositionLat(String positionLat) { + this.positionLat = positionLat; + } + + public String getPositionLng() { + return positionLng; + } + + public void setPositionLng(String positionLng) { + this.positionLng = positionLng; + } + + public String getRoleId() { + return roleId; + } + + public void setRoleId(String roleId) { + this.roleId = roleId; + } + + public String getSalt() { + return salt; + } + + public void setSalt(String salt) { + this.salt = salt; + } + + public Integer getSex() { + return sex; + } + + public void setSex(Integer sex) { + this.sex = sex; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getSyncDeptid() { + return syncDeptid; + } + + public void setSyncDeptid(String syncDeptid) { + this.syncDeptid = syncDeptid; + } + + public String getSyncId() { + return syncId; + } + + public void setSyncId(String syncId) { + this.syncId = syncId; + } + + public String getSyncName() { + return syncName; + } + + public void setSyncName(String syncName) { + this.syncName = syncName; + } + + public String getSyncPwd() { + return syncPwd; + } + + public void setSyncPwd(String syncPwd) { + this.syncPwd = syncPwd; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getUpdateUser() { + return updateUser; + } + + public void setUpdateUser(String updateUser) { + this.updateUser = updateUser; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt index 9c3cccc..51c107c 100644 --- a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt +++ b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt @@ -1,6 +1,6 @@ package com.casic.br.utils -import com.casic.br.model.UserModel +import com.casic.br.model.UserDetailModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.utils.SaveKeyValues @@ -9,15 +9,27 @@ private val gson by lazy { Gson() } - fun getUserModel(): UserModel? { + fun getUserModel(): UserDetailModel.DataModel? { val userJson = SaveKeyValues.getValue(LocaleConstant.USER_MODEL, "") as String if (userJson == "") { return null } - return gson.fromJson(userJson, object : TypeToken() {}.type) + val userDetailModel = gson.fromJson( + userJson, object : TypeToken() {}.type + ) + return userDetailModel.data } fun isLogin(): Boolean { - return SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + val loginTime = SaveKeyValues.getValue(LocaleConstant.LOGIN_TIME, 0L) as Long + return if (loginTime == 0L) { + false + } else { + if (System.currentTimeMillis() - loginTime > 84600 * 1000L) { + false + } else { + SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + } + } } } \ 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 be1986d..0bc86c6 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -64,6 +64,7 @@ * */ const val PUSH_CLIENT_ID = "clientId" const val COUNTRY_CODE = "86" + const val LOGIN_TIME = "loginTime" const val USER_IS_LOGIN = "isLogin" const val HOME_ID = "homeId" const val USER_MODEL = "userModel" diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1360cca..6495d77 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -1,5 +1,6 @@ package com.casic.br.utils.retrofit +import okhttp3.MultipartBody import okhttp3.RequestBody import retrofit2.http.* @@ -32,8 +33,20 @@ /** * 获取用户信息 */ - @GET("/user/info") - suspend fun obtainUserDetail(@Header("token") token: String): String + @GET("/appUser/info") + suspend fun obtainUserDetail( + @Header("token") token: String, + @Query("account") account: String + ): String + + /** + * 获取用户信息 + */ + @POST("/appUser/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String /** * 新增地址 @@ -79,4 +92,16 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 上传图片 + * 系统路径static拼接图片返回路径 + * http://xx.com/static/2019-10/8050891248624f2bbefedcb196ce89cb.jpeg + */ + @Multipart + @POST("/file/uploadFile") + suspend fun uploadImage( + @Header("token") token: String, + @Part file: MultipartBody.Part + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 83784fc..344bd26 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -1,12 +1,17 @@ package com.casic.br.utils.retrofit +import com.casic.br.model.UserDetailModel import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant import com.pengxh.kt.lite.utils.RetrofitFactory.createRetrofit import com.pengxh.kt.lite.utils.SaveKeyValues import okhttp3.MediaType.Companion.toMediaType +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MultipartBody +import okhttp3.RequestBody import okhttp3.RequestBody.Companion.toRequestBody import org.json.JSONObject +import java.io.File object RetrofitServiceManager { @@ -83,8 +88,26 @@ /** * 获取用户信息 */ - suspend fun obtainUserDetail(): String { - return api.obtainUserDetail(AuthenticationHelper.token!!) + suspend fun obtainUserDetail(account: String): String { + return api.obtainUserDetail(AuthenticationHelper.token!!, account) + } + + /** + * 获取用户信息 + */ + suspend fun updateUserInfo(userData: UserDetailModel.DataModel): String { + val paramObject = JSONObject() + paramObject.put("id", userData.id) + paramObject.put("name", userData.name) + paramObject.put("birthday", userData.birthday) + paramObject.put("sex", userData.sex) + paramObject.put("email", userData.email) + paramObject.put("phone", userData.phone) + paramObject.put("avatar", userData.avatar) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.updateUserInfo(AuthenticationHelper.token!!, requestBody) } /** @@ -175,4 +198,13 @@ ) return api.obtainBanner(AuthenticationHelper.token!!, requestBody) } + + /** + * 上传图片 + */ + suspend fun uploadImage(image: File): String { + val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) + val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) + return api.uploadImage(AuthenticationHelper.token!!, imagePart) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressActivity.kt b/app/src/main/java/com/casic/br/view/AddressActivity.kt index 26303ad..5c47a8f 100644 --- a/app/src/main/java/com/casic/br/view/AddressActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressActivity.kt @@ -102,7 +102,7 @@ if (id == null) { //新增地址 addressViewModel.addAddress( - userModel.mobile, + userModel.phone, split[0], split[1], split[2], @@ -114,7 +114,7 @@ //修改地址 addressViewModel.updateAddressById( id!!, - userModel.mobile, + userModel.phone, split[0], split[1], split[2], 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 db3ffae..626ac5b 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -19,7 +19,6 @@ import com.casic.br.view.device.WaterHeaterActivity 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.pengxh.kt.lite.utils.WeakReferenceHandler import com.tuya.smart.home.sdk.TuyaHomeSdk @@ -82,6 +81,7 @@ super.onResume() val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String if (homeId == "") { + Log.e(kTag, "homeId is null") return } TuyaHomeSdk.newHomeInstance(homeId.toLong()) @@ -90,8 +90,6 @@ val deviceList: List = bean.deviceList val deviceModels = ArrayList() deviceList.forEach { - - Log.d(kTag, it.toJson()) val model = AddedDeviceModel() model.deviceId = it.devId when (it.deviceCategory) { diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt index 159070c..bfd488f 100644 --- a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt @@ -1,5 +1,6 @@ package com.casic.br.fragment +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions @@ -11,14 +12,20 @@ import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddressManagerActivity import com.casic.br.view.EditUserActivity +import com.casic.br.view.LoginActivity import com.casic.br.view.SettingsActivity +import com.casic.br.vm.UserViewModel 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 kotlinx.android.synthetic.main.fragment_mine.* import kotlinx.android.synthetic.main.include_main_title.* class MinePageFragment : KotlinBaseFragment() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.fragment_mine override fun setupTopBarLayout() { @@ -27,6 +34,7 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] val shopGridAdapter = IconTextGridAdapter( requireContext(), LocaleConstant.SHOP_IMAGE, @@ -80,9 +88,21 @@ 1 -> {} 2 -> {} //地址管理 - 3 -> requireContext().navigatePageTo() + 3 -> { + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } + } //系统设置 - 4 -> requireContext().navigatePageTo() + 4 -> { + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } + } } } }) @@ -94,7 +114,11 @@ override fun initEvent() { editUserView.setOnClickListener { - requireContext().navigatePageTo() + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } } } @@ -102,25 +126,28 @@ super.onResume() if (DeserializeModel.isLogin()) { val userModel = DeserializeModel.getUserModel()!! - if (userModel.headPic == "") { - Glide.with(this) - .load(R.mipmap.ic_launcher) - .apply(RequestOptions.circleCropTransform()) - .placeholder(R.mipmap.load_image_error) - .into(userAvatarView) - } else { - Glide.with(this) - .load(userModel.headPic) - .apply(RequestOptions.circleCropTransform()) - .placeholder(R.mipmap.load_image_error) - .into(userAvatarView) - } - userNameView.text = String.format( - "${requireContext().resources.getString(R.string.app_name)}${ - userModel.username.subSequence(10, 14) - }" - ) - userPhoneView.text = userModel.mobile + userViewModel.obtainUserDetail(userModel.account) + userViewModel.userDetailResult.observe(this, { user -> + if (user.code == 200) { + SaveKeyValues.putValue(LocaleConstant.USER_MODEL, user.toJson()) + val currentUser = user.data + if (currentUser.avatar == "") { + Glide.with(this) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } else { + Glide.with(this) + .load(currentUser.avatar) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } + userNameView.text = currentUser.name + userPhoneView.text = currentUser.phone + } + }) } else { Glide.with(this) .load(R.mipmap.ic_launcher) diff --git a/app/src/main/java/com/casic/br/model/UserDetailModel.java b/app/src/main/java/com/casic/br/model/UserDetailModel.java new file mode 100644 index 0000000..cca5690 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/UserDetailModel.java @@ -0,0 +1,341 @@ +package com.casic.br.model; + +public class UserDetailModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String account; + private String attr1; + private String avatar; + private String birthday; + private String createTime; + private String createUser; + private String delFlag; + private String deptId; + private String deptname; + private String devices; + private String email; + private String id; + private String isSync; + private String lastTime; + private String loginIp; + private String loginMac; + private String name; + private String operation; + private String password; + private String phone; + private String positionLat; + private String positionLng; + private String roleId; + private String salt; + private Integer sex; + private String status; + private String syncDeptid; + private String syncId; + private String syncName; + private String syncPwd; + private String updateTime; + private String updateUser; + private String version; + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + public String getAttr1() { + return attr1; + } + + public void setAttr1(String attr1) { + this.attr1 = attr1; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getBirthday() { + return birthday; + } + + public void setBirthday(String birthday) { + this.birthday = birthday; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getDelFlag() { + return delFlag; + } + + public void setDelFlag(String delFlag) { + this.delFlag = delFlag; + } + + public String getDeptId() { + return deptId; + } + + public void setDeptId(String deptId) { + this.deptId = deptId; + } + + public String getDeptname() { + return deptname; + } + + public void setDeptname(String deptname) { + this.deptname = deptname; + } + + public String getDevices() { + return devices; + } + + public void setDevices(String devices) { + this.devices = devices; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLastTime() { + return lastTime; + } + + public void setLastTime(String lastTime) { + this.lastTime = lastTime; + } + + public String getLoginIp() { + return loginIp; + } + + public void setLoginIp(String loginIp) { + this.loginIp = loginIp; + } + + public String getLoginMac() { + return loginMac; + } + + public void setLoginMac(String loginMac) { + this.loginMac = loginMac; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getOperation() { + return operation; + } + + public void setOperation(String operation) { + this.operation = operation; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getPositionLat() { + return positionLat; + } + + public void setPositionLat(String positionLat) { + this.positionLat = positionLat; + } + + public String getPositionLng() { + return positionLng; + } + + public void setPositionLng(String positionLng) { + this.positionLng = positionLng; + } + + public String getRoleId() { + return roleId; + } + + public void setRoleId(String roleId) { + this.roleId = roleId; + } + + public String getSalt() { + return salt; + } + + public void setSalt(String salt) { + this.salt = salt; + } + + public Integer getSex() { + return sex; + } + + public void setSex(Integer sex) { + this.sex = sex; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getSyncDeptid() { + return syncDeptid; + } + + public void setSyncDeptid(String syncDeptid) { + this.syncDeptid = syncDeptid; + } + + public String getSyncId() { + return syncId; + } + + public void setSyncId(String syncId) { + this.syncId = syncId; + } + + public String getSyncName() { + return syncName; + } + + public void setSyncName(String syncName) { + this.syncName = syncName; + } + + public String getSyncPwd() { + return syncPwd; + } + + public void setSyncPwd(String syncPwd) { + this.syncPwd = syncPwd; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getUpdateUser() { + return updateUser; + } + + public void setUpdateUser(String updateUser) { + this.updateUser = updateUser; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt index 9c3cccc..51c107c 100644 --- a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt +++ b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt @@ -1,6 +1,6 @@ package com.casic.br.utils -import com.casic.br.model.UserModel +import com.casic.br.model.UserDetailModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.utils.SaveKeyValues @@ -9,15 +9,27 @@ private val gson by lazy { Gson() } - fun getUserModel(): UserModel? { + fun getUserModel(): UserDetailModel.DataModel? { val userJson = SaveKeyValues.getValue(LocaleConstant.USER_MODEL, "") as String if (userJson == "") { return null } - return gson.fromJson(userJson, object : TypeToken() {}.type) + val userDetailModel = gson.fromJson( + userJson, object : TypeToken() {}.type + ) + return userDetailModel.data } fun isLogin(): Boolean { - return SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + val loginTime = SaveKeyValues.getValue(LocaleConstant.LOGIN_TIME, 0L) as Long + return if (loginTime == 0L) { + false + } else { + if (System.currentTimeMillis() - loginTime > 84600 * 1000L) { + false + } else { + SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + } + } } } \ 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 be1986d..0bc86c6 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -64,6 +64,7 @@ * */ const val PUSH_CLIENT_ID = "clientId" const val COUNTRY_CODE = "86" + const val LOGIN_TIME = "loginTime" const val USER_IS_LOGIN = "isLogin" const val HOME_ID = "homeId" const val USER_MODEL = "userModel" diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1360cca..6495d77 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -1,5 +1,6 @@ package com.casic.br.utils.retrofit +import okhttp3.MultipartBody import okhttp3.RequestBody import retrofit2.http.* @@ -32,8 +33,20 @@ /** * 获取用户信息 */ - @GET("/user/info") - suspend fun obtainUserDetail(@Header("token") token: String): String + @GET("/appUser/info") + suspend fun obtainUserDetail( + @Header("token") token: String, + @Query("account") account: String + ): String + + /** + * 获取用户信息 + */ + @POST("/appUser/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String /** * 新增地址 @@ -79,4 +92,16 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 上传图片 + * 系统路径static拼接图片返回路径 + * http://xx.com/static/2019-10/8050891248624f2bbefedcb196ce89cb.jpeg + */ + @Multipart + @POST("/file/uploadFile") + suspend fun uploadImage( + @Header("token") token: String, + @Part file: MultipartBody.Part + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 83784fc..344bd26 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -1,12 +1,17 @@ package com.casic.br.utils.retrofit +import com.casic.br.model.UserDetailModel import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant import com.pengxh.kt.lite.utils.RetrofitFactory.createRetrofit import com.pengxh.kt.lite.utils.SaveKeyValues import okhttp3.MediaType.Companion.toMediaType +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MultipartBody +import okhttp3.RequestBody import okhttp3.RequestBody.Companion.toRequestBody import org.json.JSONObject +import java.io.File object RetrofitServiceManager { @@ -83,8 +88,26 @@ /** * 获取用户信息 */ - suspend fun obtainUserDetail(): String { - return api.obtainUserDetail(AuthenticationHelper.token!!) + suspend fun obtainUserDetail(account: String): String { + return api.obtainUserDetail(AuthenticationHelper.token!!, account) + } + + /** + * 获取用户信息 + */ + suspend fun updateUserInfo(userData: UserDetailModel.DataModel): String { + val paramObject = JSONObject() + paramObject.put("id", userData.id) + paramObject.put("name", userData.name) + paramObject.put("birthday", userData.birthday) + paramObject.put("sex", userData.sex) + paramObject.put("email", userData.email) + paramObject.put("phone", userData.phone) + paramObject.put("avatar", userData.avatar) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.updateUserInfo(AuthenticationHelper.token!!, requestBody) } /** @@ -175,4 +198,13 @@ ) return api.obtainBanner(AuthenticationHelper.token!!, requestBody) } + + /** + * 上传图片 + */ + suspend fun uploadImage(image: File): String { + val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) + val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) + return api.uploadImage(AuthenticationHelper.token!!, imagePart) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressActivity.kt b/app/src/main/java/com/casic/br/view/AddressActivity.kt index 26303ad..5c47a8f 100644 --- a/app/src/main/java/com/casic/br/view/AddressActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressActivity.kt @@ -102,7 +102,7 @@ if (id == null) { //新增地址 addressViewModel.addAddress( - userModel.mobile, + userModel.phone, split[0], split[1], split[2], @@ -114,7 +114,7 @@ //修改地址 addressViewModel.updateAddressById( id!!, - userModel.mobile, + userModel.phone, split[0], split[1], split[2], diff --git a/app/src/main/java/com/casic/br/view/EditUserActivity.kt b/app/src/main/java/com/casic/br/view/EditUserActivity.kt index 3d8536d..71639b5 100644 --- a/app/src/main/java/com/casic/br/view/EditUserActivity.kt +++ b/app/src/main/java/com/casic/br/view/EditUserActivity.kt @@ -2,12 +2,18 @@ import android.graphics.Color import android.util.Log +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.br.R -import com.casic.br.extensions.compressImage -import com.casic.br.utils.DeserializeModel -import com.casic.br.utils.GlideLoadEngine -import com.casic.br.utils.LocaleConstant import com.casic.br.callback.OnImageCompressListener +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.compressImage +import com.casic.br.model.UserDetailModel +import com.casic.br.utils.* +import com.casic.br.vm.UploadFileViewModel +import com.casic.br.vm.UserViewModel +import com.github.gzuliyujiang.wheelpicker.BirthdayPicker import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.basic.PictureSelector import com.luck.picture.lib.config.SelectMimeType @@ -16,12 +22,11 @@ import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_edit_user.* -import kotlinx.android.synthetic.main.activity_edit_user.userNameView -import kotlinx.android.synthetic.main.activity_edit_user.userPhoneView -import kotlinx.android.synthetic.main.fragment_mine.* -import kotlinx.android.synthetic.main.include_base_title.* import java.io.File import java.util.* @@ -30,6 +35,9 @@ private val kTag = "EditUserActivity" private val context = this@EditUserActivity + private lateinit var uploadFileViewModel: UploadFileViewModel + private lateinit var userViewModel: UserViewModel + private lateinit var currentUser: UserDetailModel.DataModel override fun initLayoutView(): Int = R.layout.activity_edit_user @@ -38,24 +46,42 @@ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this)) leftBackView.setOnClickListener { finish() } - titleView.text = "个人中心" } override fun initData() { - val userModel = DeserializeModel.getUserModel() ?: return - userNameView.text = resources.getString(R.string.app_name) + - userModel.username.subSequence(10, 14) - userPhoneView.text = userModel.mobile -// genderView.text = userModel.mobile -// birthdayView.text = userModel.mobile - } + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] - override fun observeRequestState() { - + currentUser = DeserializeModel.getUserModel() ?: return + userViewModel.obtainUserDetail(currentUser.account) + userViewModel.userDetailResult.observe(this, { user -> + if (user.code == 200) { + SaveKeyValues.putValue(LocaleConstant.USER_MODEL, user.toJson()) + currentUser = user.data + if (currentUser.avatar == "") { + Glide.with(this) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } else { + Glide.with(this) + .load(currentUser.avatar) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } + userNameView.text = currentUser.name + userPhoneView.text = currentUser.phone + genderView.text = LocaleConstant.GENDER_ARRAY[currentUser.sex - 1] + birthdayView.text = currentUser.birthday + calculateCompleteValue() + } + }) } override fun initEvent() { - avatarLayout.setOnClickListener { + changeAvatarView.setOnClickListener { BottomActionSheet.Builder() .setContext(this) .setActionItemTitle(listOf("拍照", "相册")) @@ -108,12 +134,71 @@ }).build().show() } - userNameLayout.setOnClickListener { + uploadFileViewModel.resultModel.observe(this, { + if (it.code == 200) { + val url = it.data.toString() + if (url.isNotBlank()) { + Glide.with(this) + .load(url.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + currentUser.avatar = url + userViewModel.updateUserInfo(currentUser) + } + } + }) + userNameLayout.setOnClickListener { + AlertInputDialog.Builder() + .setContext(this) + .setTitle("修改用户名") + .setHintMessage("请输入您的名字、昵称") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertInputDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick(value: String) { + //更新名字 + currentUser.name = value + userViewModel.updateUserInfo(currentUser) + userNameView.text = value + calculateCompleteValue() + } + }) + .build().show() } userPhoneLayout.setOnClickListener { + AlertInputDialog.Builder() + .setContext(this) + .setTitle("修改登录手机号") + .setHintMessage("请输入您新的手机号") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertInputDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + } + + override fun onConfirmClick(value: String) { + //更新手机号 + if (value.isPhoneNumber()) { + currentUser.phone = value + userViewModel.updateUserInfo(currentUser) + userPhoneView.text = value + calculateCompleteValue() + } else { + "无效手机号,请检查".show(context) + } + } + }) + .build().show() } genderLayout.setOnClickListener { @@ -123,23 +208,80 @@ .setItemTextColor(Color.BLUE) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { - + //更新性别 + currentUser.sex = position + 1 + userViewModel.updateUserInfo(currentUser) + genderView.text = LocaleConstant.GENDER_ARRAY[position] + calculateCompleteValue() } }) .build().show() } birthdayLayout.setOnClickListener { - + val birthdayPicker = BirthdayPicker(this) + birthdayPicker.setDefaultValue(1991, 8, 3) + birthdayPicker.setOnDatePickedListener { year, month, day -> + val birthdayDate = String.format("%s年%s月%s日", year, month, day) + //更新生日 + currentUser.birthday = birthdayDate + userViewModel.updateUserInfo(currentUser) + birthdayView.text = currentUser.birthday + calculateCompleteValue() + } + val layout = birthdayPicker.wheelLayout + layout.setTextSize(14f.sp2px(context).toFloat()) + layout.setSelectedTextSize(16f.sp2px(context).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + birthdayPicker.show() } } + /** + * 计算个人信息完成度 + * */ + private fun calculateCompleteValue() { + var value = 0 + if (userNameView.text.toString().isNotBlank()) { + value += 25 + } + if (userPhoneView.text.toString().isNotBlank()) { + value += 25 + } + if (genderView.text.toString().isNotBlank()) { + value += 25 + } + if (birthdayView.text.toString().isNotBlank()) { + value += 25 + } + userCompleteView.text = "资料完成度${value}%" + } + + override fun observeRequestState() { + uploadFileViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "头像上传中") + else -> LoadingDialogHub.dismiss() + } + }) + + userViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "信息修改中") + else -> LoadingDialogHub.dismiss() + } + }) + } + private fun analyticalSelectResults(result: LocalMedia) { //压缩图片后上传 result.realPath.compressImage(this, object : OnImageCompressListener { override fun onSuccess(file: File) { Log.d(kTag, "onSuccess: " + file.absolutePath) //上传图片 + uploadFileViewModel.uploadImage(file) } override fun onError(e: Throwable) { 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 db3ffae..626ac5b 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -19,7 +19,6 @@ import com.casic.br.view.device.WaterHeaterActivity 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.pengxh.kt.lite.utils.WeakReferenceHandler import com.tuya.smart.home.sdk.TuyaHomeSdk @@ -82,6 +81,7 @@ super.onResume() val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String if (homeId == "") { + Log.e(kTag, "homeId is null") return } TuyaHomeSdk.newHomeInstance(homeId.toLong()) @@ -90,8 +90,6 @@ val deviceList: List = bean.deviceList val deviceModels = ArrayList() deviceList.forEach { - - Log.d(kTag, it.toJson()) val model = AddedDeviceModel() model.deviceId = it.devId when (it.deviceCategory) { diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt index 159070c..bfd488f 100644 --- a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt @@ -1,5 +1,6 @@ package com.casic.br.fragment +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions @@ -11,14 +12,20 @@ import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddressManagerActivity import com.casic.br.view.EditUserActivity +import com.casic.br.view.LoginActivity import com.casic.br.view.SettingsActivity +import com.casic.br.vm.UserViewModel 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 kotlinx.android.synthetic.main.fragment_mine.* import kotlinx.android.synthetic.main.include_main_title.* class MinePageFragment : KotlinBaseFragment() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.fragment_mine override fun setupTopBarLayout() { @@ -27,6 +34,7 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] val shopGridAdapter = IconTextGridAdapter( requireContext(), LocaleConstant.SHOP_IMAGE, @@ -80,9 +88,21 @@ 1 -> {} 2 -> {} //地址管理 - 3 -> requireContext().navigatePageTo() + 3 -> { + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } + } //系统设置 - 4 -> requireContext().navigatePageTo() + 4 -> { + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } + } } } }) @@ -94,7 +114,11 @@ override fun initEvent() { editUserView.setOnClickListener { - requireContext().navigatePageTo() + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } } } @@ -102,25 +126,28 @@ super.onResume() if (DeserializeModel.isLogin()) { val userModel = DeserializeModel.getUserModel()!! - if (userModel.headPic == "") { - Glide.with(this) - .load(R.mipmap.ic_launcher) - .apply(RequestOptions.circleCropTransform()) - .placeholder(R.mipmap.load_image_error) - .into(userAvatarView) - } else { - Glide.with(this) - .load(userModel.headPic) - .apply(RequestOptions.circleCropTransform()) - .placeholder(R.mipmap.load_image_error) - .into(userAvatarView) - } - userNameView.text = String.format( - "${requireContext().resources.getString(R.string.app_name)}${ - userModel.username.subSequence(10, 14) - }" - ) - userPhoneView.text = userModel.mobile + userViewModel.obtainUserDetail(userModel.account) + userViewModel.userDetailResult.observe(this, { user -> + if (user.code == 200) { + SaveKeyValues.putValue(LocaleConstant.USER_MODEL, user.toJson()) + val currentUser = user.data + if (currentUser.avatar == "") { + Glide.with(this) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } else { + Glide.with(this) + .load(currentUser.avatar) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } + userNameView.text = currentUser.name + userPhoneView.text = currentUser.phone + } + }) } else { Glide.with(this) .load(R.mipmap.ic_launcher) diff --git a/app/src/main/java/com/casic/br/model/UserDetailModel.java b/app/src/main/java/com/casic/br/model/UserDetailModel.java new file mode 100644 index 0000000..cca5690 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/UserDetailModel.java @@ -0,0 +1,341 @@ +package com.casic.br.model; + +public class UserDetailModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String account; + private String attr1; + private String avatar; + private String birthday; + private String createTime; + private String createUser; + private String delFlag; + private String deptId; + private String deptname; + private String devices; + private String email; + private String id; + private String isSync; + private String lastTime; + private String loginIp; + private String loginMac; + private String name; + private String operation; + private String password; + private String phone; + private String positionLat; + private String positionLng; + private String roleId; + private String salt; + private Integer sex; + private String status; + private String syncDeptid; + private String syncId; + private String syncName; + private String syncPwd; + private String updateTime; + private String updateUser; + private String version; + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + public String getAttr1() { + return attr1; + } + + public void setAttr1(String attr1) { + this.attr1 = attr1; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getBirthday() { + return birthday; + } + + public void setBirthday(String birthday) { + this.birthday = birthday; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getDelFlag() { + return delFlag; + } + + public void setDelFlag(String delFlag) { + this.delFlag = delFlag; + } + + public String getDeptId() { + return deptId; + } + + public void setDeptId(String deptId) { + this.deptId = deptId; + } + + public String getDeptname() { + return deptname; + } + + public void setDeptname(String deptname) { + this.deptname = deptname; + } + + public String getDevices() { + return devices; + } + + public void setDevices(String devices) { + this.devices = devices; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLastTime() { + return lastTime; + } + + public void setLastTime(String lastTime) { + this.lastTime = lastTime; + } + + public String getLoginIp() { + return loginIp; + } + + public void setLoginIp(String loginIp) { + this.loginIp = loginIp; + } + + public String getLoginMac() { + return loginMac; + } + + public void setLoginMac(String loginMac) { + this.loginMac = loginMac; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getOperation() { + return operation; + } + + public void setOperation(String operation) { + this.operation = operation; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getPositionLat() { + return positionLat; + } + + public void setPositionLat(String positionLat) { + this.positionLat = positionLat; + } + + public String getPositionLng() { + return positionLng; + } + + public void setPositionLng(String positionLng) { + this.positionLng = positionLng; + } + + public String getRoleId() { + return roleId; + } + + public void setRoleId(String roleId) { + this.roleId = roleId; + } + + public String getSalt() { + return salt; + } + + public void setSalt(String salt) { + this.salt = salt; + } + + public Integer getSex() { + return sex; + } + + public void setSex(Integer sex) { + this.sex = sex; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getSyncDeptid() { + return syncDeptid; + } + + public void setSyncDeptid(String syncDeptid) { + this.syncDeptid = syncDeptid; + } + + public String getSyncId() { + return syncId; + } + + public void setSyncId(String syncId) { + this.syncId = syncId; + } + + public String getSyncName() { + return syncName; + } + + public void setSyncName(String syncName) { + this.syncName = syncName; + } + + public String getSyncPwd() { + return syncPwd; + } + + public void setSyncPwd(String syncPwd) { + this.syncPwd = syncPwd; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getUpdateUser() { + return updateUser; + } + + public void setUpdateUser(String updateUser) { + this.updateUser = updateUser; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt index 9c3cccc..51c107c 100644 --- a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt +++ b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt @@ -1,6 +1,6 @@ package com.casic.br.utils -import com.casic.br.model.UserModel +import com.casic.br.model.UserDetailModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.utils.SaveKeyValues @@ -9,15 +9,27 @@ private val gson by lazy { Gson() } - fun getUserModel(): UserModel? { + fun getUserModel(): UserDetailModel.DataModel? { val userJson = SaveKeyValues.getValue(LocaleConstant.USER_MODEL, "") as String if (userJson == "") { return null } - return gson.fromJson(userJson, object : TypeToken() {}.type) + val userDetailModel = gson.fromJson( + userJson, object : TypeToken() {}.type + ) + return userDetailModel.data } fun isLogin(): Boolean { - return SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + val loginTime = SaveKeyValues.getValue(LocaleConstant.LOGIN_TIME, 0L) as Long + return if (loginTime == 0L) { + false + } else { + if (System.currentTimeMillis() - loginTime > 84600 * 1000L) { + false + } else { + SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + } + } } } \ 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 be1986d..0bc86c6 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -64,6 +64,7 @@ * */ const val PUSH_CLIENT_ID = "clientId" const val COUNTRY_CODE = "86" + const val LOGIN_TIME = "loginTime" const val USER_IS_LOGIN = "isLogin" const val HOME_ID = "homeId" const val USER_MODEL = "userModel" diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1360cca..6495d77 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -1,5 +1,6 @@ package com.casic.br.utils.retrofit +import okhttp3.MultipartBody import okhttp3.RequestBody import retrofit2.http.* @@ -32,8 +33,20 @@ /** * 获取用户信息 */ - @GET("/user/info") - suspend fun obtainUserDetail(@Header("token") token: String): String + @GET("/appUser/info") + suspend fun obtainUserDetail( + @Header("token") token: String, + @Query("account") account: String + ): String + + /** + * 获取用户信息 + */ + @POST("/appUser/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String /** * 新增地址 @@ -79,4 +92,16 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 上传图片 + * 系统路径static拼接图片返回路径 + * http://xx.com/static/2019-10/8050891248624f2bbefedcb196ce89cb.jpeg + */ + @Multipart + @POST("/file/uploadFile") + suspend fun uploadImage( + @Header("token") token: String, + @Part file: MultipartBody.Part + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 83784fc..344bd26 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -1,12 +1,17 @@ package com.casic.br.utils.retrofit +import com.casic.br.model.UserDetailModel import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant import com.pengxh.kt.lite.utils.RetrofitFactory.createRetrofit import com.pengxh.kt.lite.utils.SaveKeyValues import okhttp3.MediaType.Companion.toMediaType +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MultipartBody +import okhttp3.RequestBody import okhttp3.RequestBody.Companion.toRequestBody import org.json.JSONObject +import java.io.File object RetrofitServiceManager { @@ -83,8 +88,26 @@ /** * 获取用户信息 */ - suspend fun obtainUserDetail(): String { - return api.obtainUserDetail(AuthenticationHelper.token!!) + suspend fun obtainUserDetail(account: String): String { + return api.obtainUserDetail(AuthenticationHelper.token!!, account) + } + + /** + * 获取用户信息 + */ + suspend fun updateUserInfo(userData: UserDetailModel.DataModel): String { + val paramObject = JSONObject() + paramObject.put("id", userData.id) + paramObject.put("name", userData.name) + paramObject.put("birthday", userData.birthday) + paramObject.put("sex", userData.sex) + paramObject.put("email", userData.email) + paramObject.put("phone", userData.phone) + paramObject.put("avatar", userData.avatar) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.updateUserInfo(AuthenticationHelper.token!!, requestBody) } /** @@ -175,4 +198,13 @@ ) return api.obtainBanner(AuthenticationHelper.token!!, requestBody) } + + /** + * 上传图片 + */ + suspend fun uploadImage(image: File): String { + val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) + val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) + return api.uploadImage(AuthenticationHelper.token!!, imagePart) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressActivity.kt b/app/src/main/java/com/casic/br/view/AddressActivity.kt index 26303ad..5c47a8f 100644 --- a/app/src/main/java/com/casic/br/view/AddressActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressActivity.kt @@ -102,7 +102,7 @@ if (id == null) { //新增地址 addressViewModel.addAddress( - userModel.mobile, + userModel.phone, split[0], split[1], split[2], @@ -114,7 +114,7 @@ //修改地址 addressViewModel.updateAddressById( id!!, - userModel.mobile, + userModel.phone, split[0], split[1], split[2], diff --git a/app/src/main/java/com/casic/br/view/EditUserActivity.kt b/app/src/main/java/com/casic/br/view/EditUserActivity.kt index 3d8536d..71639b5 100644 --- a/app/src/main/java/com/casic/br/view/EditUserActivity.kt +++ b/app/src/main/java/com/casic/br/view/EditUserActivity.kt @@ -2,12 +2,18 @@ import android.graphics.Color import android.util.Log +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.br.R -import com.casic.br.extensions.compressImage -import com.casic.br.utils.DeserializeModel -import com.casic.br.utils.GlideLoadEngine -import com.casic.br.utils.LocaleConstant import com.casic.br.callback.OnImageCompressListener +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.compressImage +import com.casic.br.model.UserDetailModel +import com.casic.br.utils.* +import com.casic.br.vm.UploadFileViewModel +import com.casic.br.vm.UserViewModel +import com.github.gzuliyujiang.wheelpicker.BirthdayPicker import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.basic.PictureSelector import com.luck.picture.lib.config.SelectMimeType @@ -16,12 +22,11 @@ import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_edit_user.* -import kotlinx.android.synthetic.main.activity_edit_user.userNameView -import kotlinx.android.synthetic.main.activity_edit_user.userPhoneView -import kotlinx.android.synthetic.main.fragment_mine.* -import kotlinx.android.synthetic.main.include_base_title.* import java.io.File import java.util.* @@ -30,6 +35,9 @@ private val kTag = "EditUserActivity" private val context = this@EditUserActivity + private lateinit var uploadFileViewModel: UploadFileViewModel + private lateinit var userViewModel: UserViewModel + private lateinit var currentUser: UserDetailModel.DataModel override fun initLayoutView(): Int = R.layout.activity_edit_user @@ -38,24 +46,42 @@ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this)) leftBackView.setOnClickListener { finish() } - titleView.text = "个人中心" } override fun initData() { - val userModel = DeserializeModel.getUserModel() ?: return - userNameView.text = resources.getString(R.string.app_name) + - userModel.username.subSequence(10, 14) - userPhoneView.text = userModel.mobile -// genderView.text = userModel.mobile -// birthdayView.text = userModel.mobile - } + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] - override fun observeRequestState() { - + currentUser = DeserializeModel.getUserModel() ?: return + userViewModel.obtainUserDetail(currentUser.account) + userViewModel.userDetailResult.observe(this, { user -> + if (user.code == 200) { + SaveKeyValues.putValue(LocaleConstant.USER_MODEL, user.toJson()) + currentUser = user.data + if (currentUser.avatar == "") { + Glide.with(this) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } else { + Glide.with(this) + .load(currentUser.avatar) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } + userNameView.text = currentUser.name + userPhoneView.text = currentUser.phone + genderView.text = LocaleConstant.GENDER_ARRAY[currentUser.sex - 1] + birthdayView.text = currentUser.birthday + calculateCompleteValue() + } + }) } override fun initEvent() { - avatarLayout.setOnClickListener { + changeAvatarView.setOnClickListener { BottomActionSheet.Builder() .setContext(this) .setActionItemTitle(listOf("拍照", "相册")) @@ -108,12 +134,71 @@ }).build().show() } - userNameLayout.setOnClickListener { + uploadFileViewModel.resultModel.observe(this, { + if (it.code == 200) { + val url = it.data.toString() + if (url.isNotBlank()) { + Glide.with(this) + .load(url.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + currentUser.avatar = url + userViewModel.updateUserInfo(currentUser) + } + } + }) + userNameLayout.setOnClickListener { + AlertInputDialog.Builder() + .setContext(this) + .setTitle("修改用户名") + .setHintMessage("请输入您的名字、昵称") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertInputDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick(value: String) { + //更新名字 + currentUser.name = value + userViewModel.updateUserInfo(currentUser) + userNameView.text = value + calculateCompleteValue() + } + }) + .build().show() } userPhoneLayout.setOnClickListener { + AlertInputDialog.Builder() + .setContext(this) + .setTitle("修改登录手机号") + .setHintMessage("请输入您新的手机号") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertInputDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + } + + override fun onConfirmClick(value: String) { + //更新手机号 + if (value.isPhoneNumber()) { + currentUser.phone = value + userViewModel.updateUserInfo(currentUser) + userPhoneView.text = value + calculateCompleteValue() + } else { + "无效手机号,请检查".show(context) + } + } + }) + .build().show() } genderLayout.setOnClickListener { @@ -123,23 +208,80 @@ .setItemTextColor(Color.BLUE) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { - + //更新性别 + currentUser.sex = position + 1 + userViewModel.updateUserInfo(currentUser) + genderView.text = LocaleConstant.GENDER_ARRAY[position] + calculateCompleteValue() } }) .build().show() } birthdayLayout.setOnClickListener { - + val birthdayPicker = BirthdayPicker(this) + birthdayPicker.setDefaultValue(1991, 8, 3) + birthdayPicker.setOnDatePickedListener { year, month, day -> + val birthdayDate = String.format("%s年%s月%s日", year, month, day) + //更新生日 + currentUser.birthday = birthdayDate + userViewModel.updateUserInfo(currentUser) + birthdayView.text = currentUser.birthday + calculateCompleteValue() + } + val layout = birthdayPicker.wheelLayout + layout.setTextSize(14f.sp2px(context).toFloat()) + layout.setSelectedTextSize(16f.sp2px(context).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + birthdayPicker.show() } } + /** + * 计算个人信息完成度 + * */ + private fun calculateCompleteValue() { + var value = 0 + if (userNameView.text.toString().isNotBlank()) { + value += 25 + } + if (userPhoneView.text.toString().isNotBlank()) { + value += 25 + } + if (genderView.text.toString().isNotBlank()) { + value += 25 + } + if (birthdayView.text.toString().isNotBlank()) { + value += 25 + } + userCompleteView.text = "资料完成度${value}%" + } + + override fun observeRequestState() { + uploadFileViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "头像上传中") + else -> LoadingDialogHub.dismiss() + } + }) + + userViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "信息修改中") + else -> LoadingDialogHub.dismiss() + } + }) + } + private fun analyticalSelectResults(result: LocalMedia) { //压缩图片后上传 result.realPath.compressImage(this, object : OnImageCompressListener { override fun onSuccess(file: File) { Log.d(kTag, "onSuccess: " + file.absolutePath) //上传图片 + uploadFileViewModel.uploadImage(file) } override fun onError(e: Throwable) { 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 2c090a6..6f4088a 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -66,7 +66,7 @@ LoadingDialogHub.dismiss() "登录失败".show(context) } - loginWithTuya(userPhone, userPassword, user!!) + loginWithTuya(userPhone, userPassword) } override fun onError(code: String?, error: String?) { @@ -78,7 +78,7 @@ } } - private fun loginWithTuya(userPhone: String, userPassword: String, user: User) { + private fun loginWithTuya(userPhone: String, userPassword: String) { authenticateViewModel.obtainPublicKey() authenticateViewModel.keyModel.observe(this, { keyModel -> if (keyModel.code == 200) { @@ -95,12 +95,17 @@ userViewModel.enter(keyModel.data!!.sid!!, userPhone, dataByPublicKey) userViewModel.loginResult.observe(this, { if (it.code == 200) { - SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, true) - SaveKeyValues.putValue(LocaleConstant.USER_MODEL, user.toJson()) - AuthenticationHelper.saveToken(it.data!!.token!!) - LoadingDialogHub.dismiss() - PageNavigationManager.finishAllActivity() - navigatePageTo() + userViewModel.obtainUserDetail(userPhone) + userViewModel.userDetailResult.observe(this, { user -> + if (user.code == 200) { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, true) + SaveKeyValues.putValue(LocaleConstant.USER_MODEL, user.toJson()) + AuthenticationHelper.saveToken(it.data!!.token!!) + LoadingDialogHub.dismiss() + PageNavigationManager.finishAllActivity() + navigatePageTo() + } + }) } }) } diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index db3ffae..626ac5b 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -19,7 +19,6 @@ import com.casic.br.view.device.WaterHeaterActivity 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.pengxh.kt.lite.utils.WeakReferenceHandler import com.tuya.smart.home.sdk.TuyaHomeSdk @@ -82,6 +81,7 @@ super.onResume() val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String if (homeId == "") { + Log.e(kTag, "homeId is null") return } TuyaHomeSdk.newHomeInstance(homeId.toLong()) @@ -90,8 +90,6 @@ val deviceList: List = bean.deviceList val deviceModels = ArrayList() deviceList.forEach { - - Log.d(kTag, it.toJson()) val model = AddedDeviceModel() model.deviceId = it.devId when (it.deviceCategory) { diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt index 159070c..bfd488f 100644 --- a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt @@ -1,5 +1,6 @@ package com.casic.br.fragment +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions @@ -11,14 +12,20 @@ import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddressManagerActivity import com.casic.br.view.EditUserActivity +import com.casic.br.view.LoginActivity import com.casic.br.view.SettingsActivity +import com.casic.br.vm.UserViewModel 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 kotlinx.android.synthetic.main.fragment_mine.* import kotlinx.android.synthetic.main.include_main_title.* class MinePageFragment : KotlinBaseFragment() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.fragment_mine override fun setupTopBarLayout() { @@ -27,6 +34,7 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] val shopGridAdapter = IconTextGridAdapter( requireContext(), LocaleConstant.SHOP_IMAGE, @@ -80,9 +88,21 @@ 1 -> {} 2 -> {} //地址管理 - 3 -> requireContext().navigatePageTo() + 3 -> { + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } + } //系统设置 - 4 -> requireContext().navigatePageTo() + 4 -> { + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } + } } } }) @@ -94,7 +114,11 @@ override fun initEvent() { editUserView.setOnClickListener { - requireContext().navigatePageTo() + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } } } @@ -102,25 +126,28 @@ super.onResume() if (DeserializeModel.isLogin()) { val userModel = DeserializeModel.getUserModel()!! - if (userModel.headPic == "") { - Glide.with(this) - .load(R.mipmap.ic_launcher) - .apply(RequestOptions.circleCropTransform()) - .placeholder(R.mipmap.load_image_error) - .into(userAvatarView) - } else { - Glide.with(this) - .load(userModel.headPic) - .apply(RequestOptions.circleCropTransform()) - .placeholder(R.mipmap.load_image_error) - .into(userAvatarView) - } - userNameView.text = String.format( - "${requireContext().resources.getString(R.string.app_name)}${ - userModel.username.subSequence(10, 14) - }" - ) - userPhoneView.text = userModel.mobile + userViewModel.obtainUserDetail(userModel.account) + userViewModel.userDetailResult.observe(this, { user -> + if (user.code == 200) { + SaveKeyValues.putValue(LocaleConstant.USER_MODEL, user.toJson()) + val currentUser = user.data + if (currentUser.avatar == "") { + Glide.with(this) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } else { + Glide.with(this) + .load(currentUser.avatar) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } + userNameView.text = currentUser.name + userPhoneView.text = currentUser.phone + } + }) } else { Glide.with(this) .load(R.mipmap.ic_launcher) diff --git a/app/src/main/java/com/casic/br/model/UserDetailModel.java b/app/src/main/java/com/casic/br/model/UserDetailModel.java new file mode 100644 index 0000000..cca5690 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/UserDetailModel.java @@ -0,0 +1,341 @@ +package com.casic.br.model; + +public class UserDetailModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String account; + private String attr1; + private String avatar; + private String birthday; + private String createTime; + private String createUser; + private String delFlag; + private String deptId; + private String deptname; + private String devices; + private String email; + private String id; + private String isSync; + private String lastTime; + private String loginIp; + private String loginMac; + private String name; + private String operation; + private String password; + private String phone; + private String positionLat; + private String positionLng; + private String roleId; + private String salt; + private Integer sex; + private String status; + private String syncDeptid; + private String syncId; + private String syncName; + private String syncPwd; + private String updateTime; + private String updateUser; + private String version; + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + public String getAttr1() { + return attr1; + } + + public void setAttr1(String attr1) { + this.attr1 = attr1; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getBirthday() { + return birthday; + } + + public void setBirthday(String birthday) { + this.birthday = birthday; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getDelFlag() { + return delFlag; + } + + public void setDelFlag(String delFlag) { + this.delFlag = delFlag; + } + + public String getDeptId() { + return deptId; + } + + public void setDeptId(String deptId) { + this.deptId = deptId; + } + + public String getDeptname() { + return deptname; + } + + public void setDeptname(String deptname) { + this.deptname = deptname; + } + + public String getDevices() { + return devices; + } + + public void setDevices(String devices) { + this.devices = devices; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLastTime() { + return lastTime; + } + + public void setLastTime(String lastTime) { + this.lastTime = lastTime; + } + + public String getLoginIp() { + return loginIp; + } + + public void setLoginIp(String loginIp) { + this.loginIp = loginIp; + } + + public String getLoginMac() { + return loginMac; + } + + public void setLoginMac(String loginMac) { + this.loginMac = loginMac; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getOperation() { + return operation; + } + + public void setOperation(String operation) { + this.operation = operation; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getPositionLat() { + return positionLat; + } + + public void setPositionLat(String positionLat) { + this.positionLat = positionLat; + } + + public String getPositionLng() { + return positionLng; + } + + public void setPositionLng(String positionLng) { + this.positionLng = positionLng; + } + + public String getRoleId() { + return roleId; + } + + public void setRoleId(String roleId) { + this.roleId = roleId; + } + + public String getSalt() { + return salt; + } + + public void setSalt(String salt) { + this.salt = salt; + } + + public Integer getSex() { + return sex; + } + + public void setSex(Integer sex) { + this.sex = sex; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getSyncDeptid() { + return syncDeptid; + } + + public void setSyncDeptid(String syncDeptid) { + this.syncDeptid = syncDeptid; + } + + public String getSyncId() { + return syncId; + } + + public void setSyncId(String syncId) { + this.syncId = syncId; + } + + public String getSyncName() { + return syncName; + } + + public void setSyncName(String syncName) { + this.syncName = syncName; + } + + public String getSyncPwd() { + return syncPwd; + } + + public void setSyncPwd(String syncPwd) { + this.syncPwd = syncPwd; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getUpdateUser() { + return updateUser; + } + + public void setUpdateUser(String updateUser) { + this.updateUser = updateUser; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt index 9c3cccc..51c107c 100644 --- a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt +++ b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt @@ -1,6 +1,6 @@ package com.casic.br.utils -import com.casic.br.model.UserModel +import com.casic.br.model.UserDetailModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.utils.SaveKeyValues @@ -9,15 +9,27 @@ private val gson by lazy { Gson() } - fun getUserModel(): UserModel? { + fun getUserModel(): UserDetailModel.DataModel? { val userJson = SaveKeyValues.getValue(LocaleConstant.USER_MODEL, "") as String if (userJson == "") { return null } - return gson.fromJson(userJson, object : TypeToken() {}.type) + val userDetailModel = gson.fromJson( + userJson, object : TypeToken() {}.type + ) + return userDetailModel.data } fun isLogin(): Boolean { - return SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + val loginTime = SaveKeyValues.getValue(LocaleConstant.LOGIN_TIME, 0L) as Long + return if (loginTime == 0L) { + false + } else { + if (System.currentTimeMillis() - loginTime > 84600 * 1000L) { + false + } else { + SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + } + } } } \ 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 be1986d..0bc86c6 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -64,6 +64,7 @@ * */ const val PUSH_CLIENT_ID = "clientId" const val COUNTRY_CODE = "86" + const val LOGIN_TIME = "loginTime" const val USER_IS_LOGIN = "isLogin" const val HOME_ID = "homeId" const val USER_MODEL = "userModel" diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1360cca..6495d77 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -1,5 +1,6 @@ package com.casic.br.utils.retrofit +import okhttp3.MultipartBody import okhttp3.RequestBody import retrofit2.http.* @@ -32,8 +33,20 @@ /** * 获取用户信息 */ - @GET("/user/info") - suspend fun obtainUserDetail(@Header("token") token: String): String + @GET("/appUser/info") + suspend fun obtainUserDetail( + @Header("token") token: String, + @Query("account") account: String + ): String + + /** + * 获取用户信息 + */ + @POST("/appUser/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String /** * 新增地址 @@ -79,4 +92,16 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 上传图片 + * 系统路径static拼接图片返回路径 + * http://xx.com/static/2019-10/8050891248624f2bbefedcb196ce89cb.jpeg + */ + @Multipart + @POST("/file/uploadFile") + suspend fun uploadImage( + @Header("token") token: String, + @Part file: MultipartBody.Part + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 83784fc..344bd26 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -1,12 +1,17 @@ package com.casic.br.utils.retrofit +import com.casic.br.model.UserDetailModel import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant import com.pengxh.kt.lite.utils.RetrofitFactory.createRetrofit import com.pengxh.kt.lite.utils.SaveKeyValues import okhttp3.MediaType.Companion.toMediaType +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MultipartBody +import okhttp3.RequestBody import okhttp3.RequestBody.Companion.toRequestBody import org.json.JSONObject +import java.io.File object RetrofitServiceManager { @@ -83,8 +88,26 @@ /** * 获取用户信息 */ - suspend fun obtainUserDetail(): String { - return api.obtainUserDetail(AuthenticationHelper.token!!) + suspend fun obtainUserDetail(account: String): String { + return api.obtainUserDetail(AuthenticationHelper.token!!, account) + } + + /** + * 获取用户信息 + */ + suspend fun updateUserInfo(userData: UserDetailModel.DataModel): String { + val paramObject = JSONObject() + paramObject.put("id", userData.id) + paramObject.put("name", userData.name) + paramObject.put("birthday", userData.birthday) + paramObject.put("sex", userData.sex) + paramObject.put("email", userData.email) + paramObject.put("phone", userData.phone) + paramObject.put("avatar", userData.avatar) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.updateUserInfo(AuthenticationHelper.token!!, requestBody) } /** @@ -175,4 +198,13 @@ ) return api.obtainBanner(AuthenticationHelper.token!!, requestBody) } + + /** + * 上传图片 + */ + suspend fun uploadImage(image: File): String { + val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) + val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) + return api.uploadImage(AuthenticationHelper.token!!, imagePart) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressActivity.kt b/app/src/main/java/com/casic/br/view/AddressActivity.kt index 26303ad..5c47a8f 100644 --- a/app/src/main/java/com/casic/br/view/AddressActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressActivity.kt @@ -102,7 +102,7 @@ if (id == null) { //新增地址 addressViewModel.addAddress( - userModel.mobile, + userModel.phone, split[0], split[1], split[2], @@ -114,7 +114,7 @@ //修改地址 addressViewModel.updateAddressById( id!!, - userModel.mobile, + userModel.phone, split[0], split[1], split[2], diff --git a/app/src/main/java/com/casic/br/view/EditUserActivity.kt b/app/src/main/java/com/casic/br/view/EditUserActivity.kt index 3d8536d..71639b5 100644 --- a/app/src/main/java/com/casic/br/view/EditUserActivity.kt +++ b/app/src/main/java/com/casic/br/view/EditUserActivity.kt @@ -2,12 +2,18 @@ import android.graphics.Color import android.util.Log +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.br.R -import com.casic.br.extensions.compressImage -import com.casic.br.utils.DeserializeModel -import com.casic.br.utils.GlideLoadEngine -import com.casic.br.utils.LocaleConstant import com.casic.br.callback.OnImageCompressListener +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.compressImage +import com.casic.br.model.UserDetailModel +import com.casic.br.utils.* +import com.casic.br.vm.UploadFileViewModel +import com.casic.br.vm.UserViewModel +import com.github.gzuliyujiang.wheelpicker.BirthdayPicker import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.basic.PictureSelector import com.luck.picture.lib.config.SelectMimeType @@ -16,12 +22,11 @@ import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_edit_user.* -import kotlinx.android.synthetic.main.activity_edit_user.userNameView -import kotlinx.android.synthetic.main.activity_edit_user.userPhoneView -import kotlinx.android.synthetic.main.fragment_mine.* -import kotlinx.android.synthetic.main.include_base_title.* import java.io.File import java.util.* @@ -30,6 +35,9 @@ private val kTag = "EditUserActivity" private val context = this@EditUserActivity + private lateinit var uploadFileViewModel: UploadFileViewModel + private lateinit var userViewModel: UserViewModel + private lateinit var currentUser: UserDetailModel.DataModel override fun initLayoutView(): Int = R.layout.activity_edit_user @@ -38,24 +46,42 @@ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this)) leftBackView.setOnClickListener { finish() } - titleView.text = "个人中心" } override fun initData() { - val userModel = DeserializeModel.getUserModel() ?: return - userNameView.text = resources.getString(R.string.app_name) + - userModel.username.subSequence(10, 14) - userPhoneView.text = userModel.mobile -// genderView.text = userModel.mobile -// birthdayView.text = userModel.mobile - } + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] - override fun observeRequestState() { - + currentUser = DeserializeModel.getUserModel() ?: return + userViewModel.obtainUserDetail(currentUser.account) + userViewModel.userDetailResult.observe(this, { user -> + if (user.code == 200) { + SaveKeyValues.putValue(LocaleConstant.USER_MODEL, user.toJson()) + currentUser = user.data + if (currentUser.avatar == "") { + Glide.with(this) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } else { + Glide.with(this) + .load(currentUser.avatar) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } + userNameView.text = currentUser.name + userPhoneView.text = currentUser.phone + genderView.text = LocaleConstant.GENDER_ARRAY[currentUser.sex - 1] + birthdayView.text = currentUser.birthday + calculateCompleteValue() + } + }) } override fun initEvent() { - avatarLayout.setOnClickListener { + changeAvatarView.setOnClickListener { BottomActionSheet.Builder() .setContext(this) .setActionItemTitle(listOf("拍照", "相册")) @@ -108,12 +134,71 @@ }).build().show() } - userNameLayout.setOnClickListener { + uploadFileViewModel.resultModel.observe(this, { + if (it.code == 200) { + val url = it.data.toString() + if (url.isNotBlank()) { + Glide.with(this) + .load(url.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + currentUser.avatar = url + userViewModel.updateUserInfo(currentUser) + } + } + }) + userNameLayout.setOnClickListener { + AlertInputDialog.Builder() + .setContext(this) + .setTitle("修改用户名") + .setHintMessage("请输入您的名字、昵称") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertInputDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick(value: String) { + //更新名字 + currentUser.name = value + userViewModel.updateUserInfo(currentUser) + userNameView.text = value + calculateCompleteValue() + } + }) + .build().show() } userPhoneLayout.setOnClickListener { + AlertInputDialog.Builder() + .setContext(this) + .setTitle("修改登录手机号") + .setHintMessage("请输入您新的手机号") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertInputDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + } + + override fun onConfirmClick(value: String) { + //更新手机号 + if (value.isPhoneNumber()) { + currentUser.phone = value + userViewModel.updateUserInfo(currentUser) + userPhoneView.text = value + calculateCompleteValue() + } else { + "无效手机号,请检查".show(context) + } + } + }) + .build().show() } genderLayout.setOnClickListener { @@ -123,23 +208,80 @@ .setItemTextColor(Color.BLUE) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { - + //更新性别 + currentUser.sex = position + 1 + userViewModel.updateUserInfo(currentUser) + genderView.text = LocaleConstant.GENDER_ARRAY[position] + calculateCompleteValue() } }) .build().show() } birthdayLayout.setOnClickListener { - + val birthdayPicker = BirthdayPicker(this) + birthdayPicker.setDefaultValue(1991, 8, 3) + birthdayPicker.setOnDatePickedListener { year, month, day -> + val birthdayDate = String.format("%s年%s月%s日", year, month, day) + //更新生日 + currentUser.birthday = birthdayDate + userViewModel.updateUserInfo(currentUser) + birthdayView.text = currentUser.birthday + calculateCompleteValue() + } + val layout = birthdayPicker.wheelLayout + layout.setTextSize(14f.sp2px(context).toFloat()) + layout.setSelectedTextSize(16f.sp2px(context).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + birthdayPicker.show() } } + /** + * 计算个人信息完成度 + * */ + private fun calculateCompleteValue() { + var value = 0 + if (userNameView.text.toString().isNotBlank()) { + value += 25 + } + if (userPhoneView.text.toString().isNotBlank()) { + value += 25 + } + if (genderView.text.toString().isNotBlank()) { + value += 25 + } + if (birthdayView.text.toString().isNotBlank()) { + value += 25 + } + userCompleteView.text = "资料完成度${value}%" + } + + override fun observeRequestState() { + uploadFileViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "头像上传中") + else -> LoadingDialogHub.dismiss() + } + }) + + userViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "信息修改中") + else -> LoadingDialogHub.dismiss() + } + }) + } + private fun analyticalSelectResults(result: LocalMedia) { //压缩图片后上传 result.realPath.compressImage(this, object : OnImageCompressListener { override fun onSuccess(file: File) { Log.d(kTag, "onSuccess: " + file.absolutePath) //上传图片 + uploadFileViewModel.uploadImage(file) } override fun onError(e: Throwable) { 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 2c090a6..6f4088a 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -66,7 +66,7 @@ LoadingDialogHub.dismiss() "登录失败".show(context) } - loginWithTuya(userPhone, userPassword, user!!) + loginWithTuya(userPhone, userPassword) } override fun onError(code: String?, error: String?) { @@ -78,7 +78,7 @@ } } - private fun loginWithTuya(userPhone: String, userPassword: String, user: User) { + private fun loginWithTuya(userPhone: String, userPassword: String) { authenticateViewModel.obtainPublicKey() authenticateViewModel.keyModel.observe(this, { keyModel -> if (keyModel.code == 200) { @@ -95,12 +95,17 @@ userViewModel.enter(keyModel.data!!.sid!!, userPhone, dataByPublicKey) userViewModel.loginResult.observe(this, { if (it.code == 200) { - SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, true) - SaveKeyValues.putValue(LocaleConstant.USER_MODEL, user.toJson()) - AuthenticationHelper.saveToken(it.data!!.token!!) - LoadingDialogHub.dismiss() - PageNavigationManager.finishAllActivity() - navigatePageTo() + userViewModel.obtainUserDetail(userPhone) + userViewModel.userDetailResult.observe(this, { user -> + if (user.code == 200) { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, true) + SaveKeyValues.putValue(LocaleConstant.USER_MODEL, user.toJson()) + AuthenticationHelper.saveToken(it.data!!.token!!) + LoadingDialogHub.dismiss() + PageNavigationManager.finishAllActivity() + navigatePageTo() + } + }) } }) } diff --git a/app/src/main/java/com/casic/br/view/RegisterActivity.kt b/app/src/main/java/com/casic/br/view/RegisterActivity.kt index a314b46..38ee1f7 100644 --- a/app/src/main/java/com/casic/br/view/RegisterActivity.kt +++ b/app/src/main/java/com/casic/br/view/RegisterActivity.kt @@ -62,7 +62,7 @@ } //发送验证码 TuyaHomeSdk.getUserInstance().sendVerifyCodeWithUserName( - userPhoneView.text.toString(), "", "86", 1, + userPhoneView.text.toString(), "", LocaleConstant.COUNTRY_CODE, 1, object : IResultCallback { override fun onSuccess() { "发送验证码成功".show(context) @@ -121,6 +121,7 @@ "${userPhone}的家", aMapLocation.longitude, aMapLocation.latitude, aMapLocation.address, arrayListOf("1"), object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean?) { + registerWithTuya( userPhone, userPassword, 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 db3ffae..626ac5b 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -19,7 +19,6 @@ import com.casic.br.view.device.WaterHeaterActivity 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.pengxh.kt.lite.utils.WeakReferenceHandler import com.tuya.smart.home.sdk.TuyaHomeSdk @@ -82,6 +81,7 @@ super.onResume() val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String if (homeId == "") { + Log.e(kTag, "homeId is null") return } TuyaHomeSdk.newHomeInstance(homeId.toLong()) @@ -90,8 +90,6 @@ val deviceList: List = bean.deviceList val deviceModels = ArrayList() deviceList.forEach { - - Log.d(kTag, it.toJson()) val model = AddedDeviceModel() model.deviceId = it.devId when (it.deviceCategory) { diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt index 159070c..bfd488f 100644 --- a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt @@ -1,5 +1,6 @@ package com.casic.br.fragment +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions @@ -11,14 +12,20 @@ import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddressManagerActivity import com.casic.br.view.EditUserActivity +import com.casic.br.view.LoginActivity import com.casic.br.view.SettingsActivity +import com.casic.br.vm.UserViewModel 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 kotlinx.android.synthetic.main.fragment_mine.* import kotlinx.android.synthetic.main.include_main_title.* class MinePageFragment : KotlinBaseFragment() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.fragment_mine override fun setupTopBarLayout() { @@ -27,6 +34,7 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] val shopGridAdapter = IconTextGridAdapter( requireContext(), LocaleConstant.SHOP_IMAGE, @@ -80,9 +88,21 @@ 1 -> {} 2 -> {} //地址管理 - 3 -> requireContext().navigatePageTo() + 3 -> { + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } + } //系统设置 - 4 -> requireContext().navigatePageTo() + 4 -> { + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } + } } } }) @@ -94,7 +114,11 @@ override fun initEvent() { editUserView.setOnClickListener { - requireContext().navigatePageTo() + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } } } @@ -102,25 +126,28 @@ super.onResume() if (DeserializeModel.isLogin()) { val userModel = DeserializeModel.getUserModel()!! - if (userModel.headPic == "") { - Glide.with(this) - .load(R.mipmap.ic_launcher) - .apply(RequestOptions.circleCropTransform()) - .placeholder(R.mipmap.load_image_error) - .into(userAvatarView) - } else { - Glide.with(this) - .load(userModel.headPic) - .apply(RequestOptions.circleCropTransform()) - .placeholder(R.mipmap.load_image_error) - .into(userAvatarView) - } - userNameView.text = String.format( - "${requireContext().resources.getString(R.string.app_name)}${ - userModel.username.subSequence(10, 14) - }" - ) - userPhoneView.text = userModel.mobile + userViewModel.obtainUserDetail(userModel.account) + userViewModel.userDetailResult.observe(this, { user -> + if (user.code == 200) { + SaveKeyValues.putValue(LocaleConstant.USER_MODEL, user.toJson()) + val currentUser = user.data + if (currentUser.avatar == "") { + Glide.with(this) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } else { + Glide.with(this) + .load(currentUser.avatar) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } + userNameView.text = currentUser.name + userPhoneView.text = currentUser.phone + } + }) } else { Glide.with(this) .load(R.mipmap.ic_launcher) diff --git a/app/src/main/java/com/casic/br/model/UserDetailModel.java b/app/src/main/java/com/casic/br/model/UserDetailModel.java new file mode 100644 index 0000000..cca5690 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/UserDetailModel.java @@ -0,0 +1,341 @@ +package com.casic.br.model; + +public class UserDetailModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String account; + private String attr1; + private String avatar; + private String birthday; + private String createTime; + private String createUser; + private String delFlag; + private String deptId; + private String deptname; + private String devices; + private String email; + private String id; + private String isSync; + private String lastTime; + private String loginIp; + private String loginMac; + private String name; + private String operation; + private String password; + private String phone; + private String positionLat; + private String positionLng; + private String roleId; + private String salt; + private Integer sex; + private String status; + private String syncDeptid; + private String syncId; + private String syncName; + private String syncPwd; + private String updateTime; + private String updateUser; + private String version; + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + public String getAttr1() { + return attr1; + } + + public void setAttr1(String attr1) { + this.attr1 = attr1; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getBirthday() { + return birthday; + } + + public void setBirthday(String birthday) { + this.birthday = birthday; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getDelFlag() { + return delFlag; + } + + public void setDelFlag(String delFlag) { + this.delFlag = delFlag; + } + + public String getDeptId() { + return deptId; + } + + public void setDeptId(String deptId) { + this.deptId = deptId; + } + + public String getDeptname() { + return deptname; + } + + public void setDeptname(String deptname) { + this.deptname = deptname; + } + + public String getDevices() { + return devices; + } + + public void setDevices(String devices) { + this.devices = devices; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLastTime() { + return lastTime; + } + + public void setLastTime(String lastTime) { + this.lastTime = lastTime; + } + + public String getLoginIp() { + return loginIp; + } + + public void setLoginIp(String loginIp) { + this.loginIp = loginIp; + } + + public String getLoginMac() { + return loginMac; + } + + public void setLoginMac(String loginMac) { + this.loginMac = loginMac; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getOperation() { + return operation; + } + + public void setOperation(String operation) { + this.operation = operation; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getPositionLat() { + return positionLat; + } + + public void setPositionLat(String positionLat) { + this.positionLat = positionLat; + } + + public String getPositionLng() { + return positionLng; + } + + public void setPositionLng(String positionLng) { + this.positionLng = positionLng; + } + + public String getRoleId() { + return roleId; + } + + public void setRoleId(String roleId) { + this.roleId = roleId; + } + + public String getSalt() { + return salt; + } + + public void setSalt(String salt) { + this.salt = salt; + } + + public Integer getSex() { + return sex; + } + + public void setSex(Integer sex) { + this.sex = sex; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getSyncDeptid() { + return syncDeptid; + } + + public void setSyncDeptid(String syncDeptid) { + this.syncDeptid = syncDeptid; + } + + public String getSyncId() { + return syncId; + } + + public void setSyncId(String syncId) { + this.syncId = syncId; + } + + public String getSyncName() { + return syncName; + } + + public void setSyncName(String syncName) { + this.syncName = syncName; + } + + public String getSyncPwd() { + return syncPwd; + } + + public void setSyncPwd(String syncPwd) { + this.syncPwd = syncPwd; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getUpdateUser() { + return updateUser; + } + + public void setUpdateUser(String updateUser) { + this.updateUser = updateUser; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt index 9c3cccc..51c107c 100644 --- a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt +++ b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt @@ -1,6 +1,6 @@ package com.casic.br.utils -import com.casic.br.model.UserModel +import com.casic.br.model.UserDetailModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.utils.SaveKeyValues @@ -9,15 +9,27 @@ private val gson by lazy { Gson() } - fun getUserModel(): UserModel? { + fun getUserModel(): UserDetailModel.DataModel? { val userJson = SaveKeyValues.getValue(LocaleConstant.USER_MODEL, "") as String if (userJson == "") { return null } - return gson.fromJson(userJson, object : TypeToken() {}.type) + val userDetailModel = gson.fromJson( + userJson, object : TypeToken() {}.type + ) + return userDetailModel.data } fun isLogin(): Boolean { - return SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + val loginTime = SaveKeyValues.getValue(LocaleConstant.LOGIN_TIME, 0L) as Long + return if (loginTime == 0L) { + false + } else { + if (System.currentTimeMillis() - loginTime > 84600 * 1000L) { + false + } else { + SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + } + } } } \ 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 be1986d..0bc86c6 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -64,6 +64,7 @@ * */ const val PUSH_CLIENT_ID = "clientId" const val COUNTRY_CODE = "86" + const val LOGIN_TIME = "loginTime" const val USER_IS_LOGIN = "isLogin" const val HOME_ID = "homeId" const val USER_MODEL = "userModel" diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1360cca..6495d77 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -1,5 +1,6 @@ package com.casic.br.utils.retrofit +import okhttp3.MultipartBody import okhttp3.RequestBody import retrofit2.http.* @@ -32,8 +33,20 @@ /** * 获取用户信息 */ - @GET("/user/info") - suspend fun obtainUserDetail(@Header("token") token: String): String + @GET("/appUser/info") + suspend fun obtainUserDetail( + @Header("token") token: String, + @Query("account") account: String + ): String + + /** + * 获取用户信息 + */ + @POST("/appUser/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String /** * 新增地址 @@ -79,4 +92,16 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 上传图片 + * 系统路径static拼接图片返回路径 + * http://xx.com/static/2019-10/8050891248624f2bbefedcb196ce89cb.jpeg + */ + @Multipart + @POST("/file/uploadFile") + suspend fun uploadImage( + @Header("token") token: String, + @Part file: MultipartBody.Part + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 83784fc..344bd26 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -1,12 +1,17 @@ package com.casic.br.utils.retrofit +import com.casic.br.model.UserDetailModel import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant import com.pengxh.kt.lite.utils.RetrofitFactory.createRetrofit import com.pengxh.kt.lite.utils.SaveKeyValues import okhttp3.MediaType.Companion.toMediaType +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MultipartBody +import okhttp3.RequestBody import okhttp3.RequestBody.Companion.toRequestBody import org.json.JSONObject +import java.io.File object RetrofitServiceManager { @@ -83,8 +88,26 @@ /** * 获取用户信息 */ - suspend fun obtainUserDetail(): String { - return api.obtainUserDetail(AuthenticationHelper.token!!) + suspend fun obtainUserDetail(account: String): String { + return api.obtainUserDetail(AuthenticationHelper.token!!, account) + } + + /** + * 获取用户信息 + */ + suspend fun updateUserInfo(userData: UserDetailModel.DataModel): String { + val paramObject = JSONObject() + paramObject.put("id", userData.id) + paramObject.put("name", userData.name) + paramObject.put("birthday", userData.birthday) + paramObject.put("sex", userData.sex) + paramObject.put("email", userData.email) + paramObject.put("phone", userData.phone) + paramObject.put("avatar", userData.avatar) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.updateUserInfo(AuthenticationHelper.token!!, requestBody) } /** @@ -175,4 +198,13 @@ ) return api.obtainBanner(AuthenticationHelper.token!!, requestBody) } + + /** + * 上传图片 + */ + suspend fun uploadImage(image: File): String { + val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) + val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) + return api.uploadImage(AuthenticationHelper.token!!, imagePart) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressActivity.kt b/app/src/main/java/com/casic/br/view/AddressActivity.kt index 26303ad..5c47a8f 100644 --- a/app/src/main/java/com/casic/br/view/AddressActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressActivity.kt @@ -102,7 +102,7 @@ if (id == null) { //新增地址 addressViewModel.addAddress( - userModel.mobile, + userModel.phone, split[0], split[1], split[2], @@ -114,7 +114,7 @@ //修改地址 addressViewModel.updateAddressById( id!!, - userModel.mobile, + userModel.phone, split[0], split[1], split[2], diff --git a/app/src/main/java/com/casic/br/view/EditUserActivity.kt b/app/src/main/java/com/casic/br/view/EditUserActivity.kt index 3d8536d..71639b5 100644 --- a/app/src/main/java/com/casic/br/view/EditUserActivity.kt +++ b/app/src/main/java/com/casic/br/view/EditUserActivity.kt @@ -2,12 +2,18 @@ import android.graphics.Color import android.util.Log +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.br.R -import com.casic.br.extensions.compressImage -import com.casic.br.utils.DeserializeModel -import com.casic.br.utils.GlideLoadEngine -import com.casic.br.utils.LocaleConstant import com.casic.br.callback.OnImageCompressListener +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.compressImage +import com.casic.br.model.UserDetailModel +import com.casic.br.utils.* +import com.casic.br.vm.UploadFileViewModel +import com.casic.br.vm.UserViewModel +import com.github.gzuliyujiang.wheelpicker.BirthdayPicker import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.basic.PictureSelector import com.luck.picture.lib.config.SelectMimeType @@ -16,12 +22,11 @@ import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_edit_user.* -import kotlinx.android.synthetic.main.activity_edit_user.userNameView -import kotlinx.android.synthetic.main.activity_edit_user.userPhoneView -import kotlinx.android.synthetic.main.fragment_mine.* -import kotlinx.android.synthetic.main.include_base_title.* import java.io.File import java.util.* @@ -30,6 +35,9 @@ private val kTag = "EditUserActivity" private val context = this@EditUserActivity + private lateinit var uploadFileViewModel: UploadFileViewModel + private lateinit var userViewModel: UserViewModel + private lateinit var currentUser: UserDetailModel.DataModel override fun initLayoutView(): Int = R.layout.activity_edit_user @@ -38,24 +46,42 @@ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this)) leftBackView.setOnClickListener { finish() } - titleView.text = "个人中心" } override fun initData() { - val userModel = DeserializeModel.getUserModel() ?: return - userNameView.text = resources.getString(R.string.app_name) + - userModel.username.subSequence(10, 14) - userPhoneView.text = userModel.mobile -// genderView.text = userModel.mobile -// birthdayView.text = userModel.mobile - } + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] - override fun observeRequestState() { - + currentUser = DeserializeModel.getUserModel() ?: return + userViewModel.obtainUserDetail(currentUser.account) + userViewModel.userDetailResult.observe(this, { user -> + if (user.code == 200) { + SaveKeyValues.putValue(LocaleConstant.USER_MODEL, user.toJson()) + currentUser = user.data + if (currentUser.avatar == "") { + Glide.with(this) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } else { + Glide.with(this) + .load(currentUser.avatar) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } + userNameView.text = currentUser.name + userPhoneView.text = currentUser.phone + genderView.text = LocaleConstant.GENDER_ARRAY[currentUser.sex - 1] + birthdayView.text = currentUser.birthday + calculateCompleteValue() + } + }) } override fun initEvent() { - avatarLayout.setOnClickListener { + changeAvatarView.setOnClickListener { BottomActionSheet.Builder() .setContext(this) .setActionItemTitle(listOf("拍照", "相册")) @@ -108,12 +134,71 @@ }).build().show() } - userNameLayout.setOnClickListener { + uploadFileViewModel.resultModel.observe(this, { + if (it.code == 200) { + val url = it.data.toString() + if (url.isNotBlank()) { + Glide.with(this) + .load(url.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + currentUser.avatar = url + userViewModel.updateUserInfo(currentUser) + } + } + }) + userNameLayout.setOnClickListener { + AlertInputDialog.Builder() + .setContext(this) + .setTitle("修改用户名") + .setHintMessage("请输入您的名字、昵称") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertInputDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick(value: String) { + //更新名字 + currentUser.name = value + userViewModel.updateUserInfo(currentUser) + userNameView.text = value + calculateCompleteValue() + } + }) + .build().show() } userPhoneLayout.setOnClickListener { + AlertInputDialog.Builder() + .setContext(this) + .setTitle("修改登录手机号") + .setHintMessage("请输入您新的手机号") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertInputDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + } + + override fun onConfirmClick(value: String) { + //更新手机号 + if (value.isPhoneNumber()) { + currentUser.phone = value + userViewModel.updateUserInfo(currentUser) + userPhoneView.text = value + calculateCompleteValue() + } else { + "无效手机号,请检查".show(context) + } + } + }) + .build().show() } genderLayout.setOnClickListener { @@ -123,23 +208,80 @@ .setItemTextColor(Color.BLUE) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { - + //更新性别 + currentUser.sex = position + 1 + userViewModel.updateUserInfo(currentUser) + genderView.text = LocaleConstant.GENDER_ARRAY[position] + calculateCompleteValue() } }) .build().show() } birthdayLayout.setOnClickListener { - + val birthdayPicker = BirthdayPicker(this) + birthdayPicker.setDefaultValue(1991, 8, 3) + birthdayPicker.setOnDatePickedListener { year, month, day -> + val birthdayDate = String.format("%s年%s月%s日", year, month, day) + //更新生日 + currentUser.birthday = birthdayDate + userViewModel.updateUserInfo(currentUser) + birthdayView.text = currentUser.birthday + calculateCompleteValue() + } + val layout = birthdayPicker.wheelLayout + layout.setTextSize(14f.sp2px(context).toFloat()) + layout.setSelectedTextSize(16f.sp2px(context).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + birthdayPicker.show() } } + /** + * 计算个人信息完成度 + * */ + private fun calculateCompleteValue() { + var value = 0 + if (userNameView.text.toString().isNotBlank()) { + value += 25 + } + if (userPhoneView.text.toString().isNotBlank()) { + value += 25 + } + if (genderView.text.toString().isNotBlank()) { + value += 25 + } + if (birthdayView.text.toString().isNotBlank()) { + value += 25 + } + userCompleteView.text = "资料完成度${value}%" + } + + override fun observeRequestState() { + uploadFileViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "头像上传中") + else -> LoadingDialogHub.dismiss() + } + }) + + userViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "信息修改中") + else -> LoadingDialogHub.dismiss() + } + }) + } + private fun analyticalSelectResults(result: LocalMedia) { //压缩图片后上传 result.realPath.compressImage(this, object : OnImageCompressListener { override fun onSuccess(file: File) { Log.d(kTag, "onSuccess: " + file.absolutePath) //上传图片 + uploadFileViewModel.uploadImage(file) } override fun onError(e: Throwable) { 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 2c090a6..6f4088a 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -66,7 +66,7 @@ LoadingDialogHub.dismiss() "登录失败".show(context) } - loginWithTuya(userPhone, userPassword, user!!) + loginWithTuya(userPhone, userPassword) } override fun onError(code: String?, error: String?) { @@ -78,7 +78,7 @@ } } - private fun loginWithTuya(userPhone: String, userPassword: String, user: User) { + private fun loginWithTuya(userPhone: String, userPassword: String) { authenticateViewModel.obtainPublicKey() authenticateViewModel.keyModel.observe(this, { keyModel -> if (keyModel.code == 200) { @@ -95,12 +95,17 @@ userViewModel.enter(keyModel.data!!.sid!!, userPhone, dataByPublicKey) userViewModel.loginResult.observe(this, { if (it.code == 200) { - SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, true) - SaveKeyValues.putValue(LocaleConstant.USER_MODEL, user.toJson()) - AuthenticationHelper.saveToken(it.data!!.token!!) - LoadingDialogHub.dismiss() - PageNavigationManager.finishAllActivity() - navigatePageTo() + userViewModel.obtainUserDetail(userPhone) + userViewModel.userDetailResult.observe(this, { user -> + if (user.code == 200) { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, true) + SaveKeyValues.putValue(LocaleConstant.USER_MODEL, user.toJson()) + AuthenticationHelper.saveToken(it.data!!.token!!) + LoadingDialogHub.dismiss() + PageNavigationManager.finishAllActivity() + navigatePageTo() + } + }) } }) } diff --git a/app/src/main/java/com/casic/br/view/RegisterActivity.kt b/app/src/main/java/com/casic/br/view/RegisterActivity.kt index a314b46..38ee1f7 100644 --- a/app/src/main/java/com/casic/br/view/RegisterActivity.kt +++ b/app/src/main/java/com/casic/br/view/RegisterActivity.kt @@ -62,7 +62,7 @@ } //发送验证码 TuyaHomeSdk.getUserInstance().sendVerifyCodeWithUserName( - userPhoneView.text.toString(), "", "86", 1, + userPhoneView.text.toString(), "", LocaleConstant.COUNTRY_CODE, 1, object : IResultCallback { override fun onSuccess() { "发送验证码成功".show(context) @@ -121,6 +121,7 @@ "${userPhone}的家", aMapLocation.longitude, aMapLocation.latitude, aMapLocation.address, arrayListOf("1"), object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean?) { + registerWithTuya( userPhone, userPassword, diff --git a/app/src/main/java/com/casic/br/vm/UploadFileViewModel.kt b/app/src/main/java/com/casic/br/vm/UploadFileViewModel.kt new file mode 100644 index 0000000..6ed765d --- /dev/null +++ b/app/src/main/java/com/casic/br/vm/UploadFileViewModel.kt @@ -0,0 +1,39 @@ +package com.casic.br.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.br.base.BaseApplication +import com.casic.br.extensions.separateResponseCode +import com.casic.br.extensions.toErrorMessage +import com.casic.br.model.CommonResultModel +import com.casic.br.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState +import java.io.File + +class UploadFileViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val resultModel = MutableLiveData() + + fun uploadImage(image: File) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.uploadImage(image) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + resultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index db3ffae..626ac5b 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -19,7 +19,6 @@ import com.casic.br.view.device.WaterHeaterActivity 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.pengxh.kt.lite.utils.WeakReferenceHandler import com.tuya.smart.home.sdk.TuyaHomeSdk @@ -82,6 +81,7 @@ super.onResume() val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String if (homeId == "") { + Log.e(kTag, "homeId is null") return } TuyaHomeSdk.newHomeInstance(homeId.toLong()) @@ -90,8 +90,6 @@ val deviceList: List = bean.deviceList val deviceModels = ArrayList() deviceList.forEach { - - Log.d(kTag, it.toJson()) val model = AddedDeviceModel() model.deviceId = it.devId when (it.deviceCategory) { diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt index 159070c..bfd488f 100644 --- a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt @@ -1,5 +1,6 @@ package com.casic.br.fragment +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions @@ -11,14 +12,20 @@ import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddressManagerActivity import com.casic.br.view.EditUserActivity +import com.casic.br.view.LoginActivity import com.casic.br.view.SettingsActivity +import com.casic.br.vm.UserViewModel 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 kotlinx.android.synthetic.main.fragment_mine.* import kotlinx.android.synthetic.main.include_main_title.* class MinePageFragment : KotlinBaseFragment() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.fragment_mine override fun setupTopBarLayout() { @@ -27,6 +34,7 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] val shopGridAdapter = IconTextGridAdapter( requireContext(), LocaleConstant.SHOP_IMAGE, @@ -80,9 +88,21 @@ 1 -> {} 2 -> {} //地址管理 - 3 -> requireContext().navigatePageTo() + 3 -> { + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } + } //系统设置 - 4 -> requireContext().navigatePageTo() + 4 -> { + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } + } } } }) @@ -94,7 +114,11 @@ override fun initEvent() { editUserView.setOnClickListener { - requireContext().navigatePageTo() + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } } } @@ -102,25 +126,28 @@ super.onResume() if (DeserializeModel.isLogin()) { val userModel = DeserializeModel.getUserModel()!! - if (userModel.headPic == "") { - Glide.with(this) - .load(R.mipmap.ic_launcher) - .apply(RequestOptions.circleCropTransform()) - .placeholder(R.mipmap.load_image_error) - .into(userAvatarView) - } else { - Glide.with(this) - .load(userModel.headPic) - .apply(RequestOptions.circleCropTransform()) - .placeholder(R.mipmap.load_image_error) - .into(userAvatarView) - } - userNameView.text = String.format( - "${requireContext().resources.getString(R.string.app_name)}${ - userModel.username.subSequence(10, 14) - }" - ) - userPhoneView.text = userModel.mobile + userViewModel.obtainUserDetail(userModel.account) + userViewModel.userDetailResult.observe(this, { user -> + if (user.code == 200) { + SaveKeyValues.putValue(LocaleConstant.USER_MODEL, user.toJson()) + val currentUser = user.data + if (currentUser.avatar == "") { + Glide.with(this) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } else { + Glide.with(this) + .load(currentUser.avatar) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } + userNameView.text = currentUser.name + userPhoneView.text = currentUser.phone + } + }) } else { Glide.with(this) .load(R.mipmap.ic_launcher) diff --git a/app/src/main/java/com/casic/br/model/UserDetailModel.java b/app/src/main/java/com/casic/br/model/UserDetailModel.java new file mode 100644 index 0000000..cca5690 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/UserDetailModel.java @@ -0,0 +1,341 @@ +package com.casic.br.model; + +public class UserDetailModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String account; + private String attr1; + private String avatar; + private String birthday; + private String createTime; + private String createUser; + private String delFlag; + private String deptId; + private String deptname; + private String devices; + private String email; + private String id; + private String isSync; + private String lastTime; + private String loginIp; + private String loginMac; + private String name; + private String operation; + private String password; + private String phone; + private String positionLat; + private String positionLng; + private String roleId; + private String salt; + private Integer sex; + private String status; + private String syncDeptid; + private String syncId; + private String syncName; + private String syncPwd; + private String updateTime; + private String updateUser; + private String version; + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + public String getAttr1() { + return attr1; + } + + public void setAttr1(String attr1) { + this.attr1 = attr1; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getBirthday() { + return birthday; + } + + public void setBirthday(String birthday) { + this.birthday = birthday; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getDelFlag() { + return delFlag; + } + + public void setDelFlag(String delFlag) { + this.delFlag = delFlag; + } + + public String getDeptId() { + return deptId; + } + + public void setDeptId(String deptId) { + this.deptId = deptId; + } + + public String getDeptname() { + return deptname; + } + + public void setDeptname(String deptname) { + this.deptname = deptname; + } + + public String getDevices() { + return devices; + } + + public void setDevices(String devices) { + this.devices = devices; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLastTime() { + return lastTime; + } + + public void setLastTime(String lastTime) { + this.lastTime = lastTime; + } + + public String getLoginIp() { + return loginIp; + } + + public void setLoginIp(String loginIp) { + this.loginIp = loginIp; + } + + public String getLoginMac() { + return loginMac; + } + + public void setLoginMac(String loginMac) { + this.loginMac = loginMac; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getOperation() { + return operation; + } + + public void setOperation(String operation) { + this.operation = operation; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getPositionLat() { + return positionLat; + } + + public void setPositionLat(String positionLat) { + this.positionLat = positionLat; + } + + public String getPositionLng() { + return positionLng; + } + + public void setPositionLng(String positionLng) { + this.positionLng = positionLng; + } + + public String getRoleId() { + return roleId; + } + + public void setRoleId(String roleId) { + this.roleId = roleId; + } + + public String getSalt() { + return salt; + } + + public void setSalt(String salt) { + this.salt = salt; + } + + public Integer getSex() { + return sex; + } + + public void setSex(Integer sex) { + this.sex = sex; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getSyncDeptid() { + return syncDeptid; + } + + public void setSyncDeptid(String syncDeptid) { + this.syncDeptid = syncDeptid; + } + + public String getSyncId() { + return syncId; + } + + public void setSyncId(String syncId) { + this.syncId = syncId; + } + + public String getSyncName() { + return syncName; + } + + public void setSyncName(String syncName) { + this.syncName = syncName; + } + + public String getSyncPwd() { + return syncPwd; + } + + public void setSyncPwd(String syncPwd) { + this.syncPwd = syncPwd; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getUpdateUser() { + return updateUser; + } + + public void setUpdateUser(String updateUser) { + this.updateUser = updateUser; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt index 9c3cccc..51c107c 100644 --- a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt +++ b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt @@ -1,6 +1,6 @@ package com.casic.br.utils -import com.casic.br.model.UserModel +import com.casic.br.model.UserDetailModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.utils.SaveKeyValues @@ -9,15 +9,27 @@ private val gson by lazy { Gson() } - fun getUserModel(): UserModel? { + fun getUserModel(): UserDetailModel.DataModel? { val userJson = SaveKeyValues.getValue(LocaleConstant.USER_MODEL, "") as String if (userJson == "") { return null } - return gson.fromJson(userJson, object : TypeToken() {}.type) + val userDetailModel = gson.fromJson( + userJson, object : TypeToken() {}.type + ) + return userDetailModel.data } fun isLogin(): Boolean { - return SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + val loginTime = SaveKeyValues.getValue(LocaleConstant.LOGIN_TIME, 0L) as Long + return if (loginTime == 0L) { + false + } else { + if (System.currentTimeMillis() - loginTime > 84600 * 1000L) { + false + } else { + SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + } + } } } \ 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 be1986d..0bc86c6 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -64,6 +64,7 @@ * */ const val PUSH_CLIENT_ID = "clientId" const val COUNTRY_CODE = "86" + const val LOGIN_TIME = "loginTime" const val USER_IS_LOGIN = "isLogin" const val HOME_ID = "homeId" const val USER_MODEL = "userModel" diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1360cca..6495d77 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -1,5 +1,6 @@ package com.casic.br.utils.retrofit +import okhttp3.MultipartBody import okhttp3.RequestBody import retrofit2.http.* @@ -32,8 +33,20 @@ /** * 获取用户信息 */ - @GET("/user/info") - suspend fun obtainUserDetail(@Header("token") token: String): String + @GET("/appUser/info") + suspend fun obtainUserDetail( + @Header("token") token: String, + @Query("account") account: String + ): String + + /** + * 获取用户信息 + */ + @POST("/appUser/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String /** * 新增地址 @@ -79,4 +92,16 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 上传图片 + * 系统路径static拼接图片返回路径 + * http://xx.com/static/2019-10/8050891248624f2bbefedcb196ce89cb.jpeg + */ + @Multipart + @POST("/file/uploadFile") + suspend fun uploadImage( + @Header("token") token: String, + @Part file: MultipartBody.Part + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 83784fc..344bd26 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -1,12 +1,17 @@ package com.casic.br.utils.retrofit +import com.casic.br.model.UserDetailModel import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant import com.pengxh.kt.lite.utils.RetrofitFactory.createRetrofit import com.pengxh.kt.lite.utils.SaveKeyValues import okhttp3.MediaType.Companion.toMediaType +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MultipartBody +import okhttp3.RequestBody import okhttp3.RequestBody.Companion.toRequestBody import org.json.JSONObject +import java.io.File object RetrofitServiceManager { @@ -83,8 +88,26 @@ /** * 获取用户信息 */ - suspend fun obtainUserDetail(): String { - return api.obtainUserDetail(AuthenticationHelper.token!!) + suspend fun obtainUserDetail(account: String): String { + return api.obtainUserDetail(AuthenticationHelper.token!!, account) + } + + /** + * 获取用户信息 + */ + suspend fun updateUserInfo(userData: UserDetailModel.DataModel): String { + val paramObject = JSONObject() + paramObject.put("id", userData.id) + paramObject.put("name", userData.name) + paramObject.put("birthday", userData.birthday) + paramObject.put("sex", userData.sex) + paramObject.put("email", userData.email) + paramObject.put("phone", userData.phone) + paramObject.put("avatar", userData.avatar) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.updateUserInfo(AuthenticationHelper.token!!, requestBody) } /** @@ -175,4 +198,13 @@ ) return api.obtainBanner(AuthenticationHelper.token!!, requestBody) } + + /** + * 上传图片 + */ + suspend fun uploadImage(image: File): String { + val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) + val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) + return api.uploadImage(AuthenticationHelper.token!!, imagePart) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressActivity.kt b/app/src/main/java/com/casic/br/view/AddressActivity.kt index 26303ad..5c47a8f 100644 --- a/app/src/main/java/com/casic/br/view/AddressActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressActivity.kt @@ -102,7 +102,7 @@ if (id == null) { //新增地址 addressViewModel.addAddress( - userModel.mobile, + userModel.phone, split[0], split[1], split[2], @@ -114,7 +114,7 @@ //修改地址 addressViewModel.updateAddressById( id!!, - userModel.mobile, + userModel.phone, split[0], split[1], split[2], diff --git a/app/src/main/java/com/casic/br/view/EditUserActivity.kt b/app/src/main/java/com/casic/br/view/EditUserActivity.kt index 3d8536d..71639b5 100644 --- a/app/src/main/java/com/casic/br/view/EditUserActivity.kt +++ b/app/src/main/java/com/casic/br/view/EditUserActivity.kt @@ -2,12 +2,18 @@ import android.graphics.Color import android.util.Log +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.br.R -import com.casic.br.extensions.compressImage -import com.casic.br.utils.DeserializeModel -import com.casic.br.utils.GlideLoadEngine -import com.casic.br.utils.LocaleConstant import com.casic.br.callback.OnImageCompressListener +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.compressImage +import com.casic.br.model.UserDetailModel +import com.casic.br.utils.* +import com.casic.br.vm.UploadFileViewModel +import com.casic.br.vm.UserViewModel +import com.github.gzuliyujiang.wheelpicker.BirthdayPicker import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.basic.PictureSelector import com.luck.picture.lib.config.SelectMimeType @@ -16,12 +22,11 @@ import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_edit_user.* -import kotlinx.android.synthetic.main.activity_edit_user.userNameView -import kotlinx.android.synthetic.main.activity_edit_user.userPhoneView -import kotlinx.android.synthetic.main.fragment_mine.* -import kotlinx.android.synthetic.main.include_base_title.* import java.io.File import java.util.* @@ -30,6 +35,9 @@ private val kTag = "EditUserActivity" private val context = this@EditUserActivity + private lateinit var uploadFileViewModel: UploadFileViewModel + private lateinit var userViewModel: UserViewModel + private lateinit var currentUser: UserDetailModel.DataModel override fun initLayoutView(): Int = R.layout.activity_edit_user @@ -38,24 +46,42 @@ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this)) leftBackView.setOnClickListener { finish() } - titleView.text = "个人中心" } override fun initData() { - val userModel = DeserializeModel.getUserModel() ?: return - userNameView.text = resources.getString(R.string.app_name) + - userModel.username.subSequence(10, 14) - userPhoneView.text = userModel.mobile -// genderView.text = userModel.mobile -// birthdayView.text = userModel.mobile - } + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] - override fun observeRequestState() { - + currentUser = DeserializeModel.getUserModel() ?: return + userViewModel.obtainUserDetail(currentUser.account) + userViewModel.userDetailResult.observe(this, { user -> + if (user.code == 200) { + SaveKeyValues.putValue(LocaleConstant.USER_MODEL, user.toJson()) + currentUser = user.data + if (currentUser.avatar == "") { + Glide.with(this) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } else { + Glide.with(this) + .load(currentUser.avatar) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } + userNameView.text = currentUser.name + userPhoneView.text = currentUser.phone + genderView.text = LocaleConstant.GENDER_ARRAY[currentUser.sex - 1] + birthdayView.text = currentUser.birthday + calculateCompleteValue() + } + }) } override fun initEvent() { - avatarLayout.setOnClickListener { + changeAvatarView.setOnClickListener { BottomActionSheet.Builder() .setContext(this) .setActionItemTitle(listOf("拍照", "相册")) @@ -108,12 +134,71 @@ }).build().show() } - userNameLayout.setOnClickListener { + uploadFileViewModel.resultModel.observe(this, { + if (it.code == 200) { + val url = it.data.toString() + if (url.isNotBlank()) { + Glide.with(this) + .load(url.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + currentUser.avatar = url + userViewModel.updateUserInfo(currentUser) + } + } + }) + userNameLayout.setOnClickListener { + AlertInputDialog.Builder() + .setContext(this) + .setTitle("修改用户名") + .setHintMessage("请输入您的名字、昵称") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertInputDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick(value: String) { + //更新名字 + currentUser.name = value + userViewModel.updateUserInfo(currentUser) + userNameView.text = value + calculateCompleteValue() + } + }) + .build().show() } userPhoneLayout.setOnClickListener { + AlertInputDialog.Builder() + .setContext(this) + .setTitle("修改登录手机号") + .setHintMessage("请输入您新的手机号") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertInputDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + } + + override fun onConfirmClick(value: String) { + //更新手机号 + if (value.isPhoneNumber()) { + currentUser.phone = value + userViewModel.updateUserInfo(currentUser) + userPhoneView.text = value + calculateCompleteValue() + } else { + "无效手机号,请检查".show(context) + } + } + }) + .build().show() } genderLayout.setOnClickListener { @@ -123,23 +208,80 @@ .setItemTextColor(Color.BLUE) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { - + //更新性别 + currentUser.sex = position + 1 + userViewModel.updateUserInfo(currentUser) + genderView.text = LocaleConstant.GENDER_ARRAY[position] + calculateCompleteValue() } }) .build().show() } birthdayLayout.setOnClickListener { - + val birthdayPicker = BirthdayPicker(this) + birthdayPicker.setDefaultValue(1991, 8, 3) + birthdayPicker.setOnDatePickedListener { year, month, day -> + val birthdayDate = String.format("%s年%s月%s日", year, month, day) + //更新生日 + currentUser.birthday = birthdayDate + userViewModel.updateUserInfo(currentUser) + birthdayView.text = currentUser.birthday + calculateCompleteValue() + } + val layout = birthdayPicker.wheelLayout + layout.setTextSize(14f.sp2px(context).toFloat()) + layout.setSelectedTextSize(16f.sp2px(context).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + birthdayPicker.show() } } + /** + * 计算个人信息完成度 + * */ + private fun calculateCompleteValue() { + var value = 0 + if (userNameView.text.toString().isNotBlank()) { + value += 25 + } + if (userPhoneView.text.toString().isNotBlank()) { + value += 25 + } + if (genderView.text.toString().isNotBlank()) { + value += 25 + } + if (birthdayView.text.toString().isNotBlank()) { + value += 25 + } + userCompleteView.text = "资料完成度${value}%" + } + + override fun observeRequestState() { + uploadFileViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "头像上传中") + else -> LoadingDialogHub.dismiss() + } + }) + + userViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "信息修改中") + else -> LoadingDialogHub.dismiss() + } + }) + } + private fun analyticalSelectResults(result: LocalMedia) { //压缩图片后上传 result.realPath.compressImage(this, object : OnImageCompressListener { override fun onSuccess(file: File) { Log.d(kTag, "onSuccess: " + file.absolutePath) //上传图片 + uploadFileViewModel.uploadImage(file) } override fun onError(e: Throwable) { 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 2c090a6..6f4088a 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -66,7 +66,7 @@ LoadingDialogHub.dismiss() "登录失败".show(context) } - loginWithTuya(userPhone, userPassword, user!!) + loginWithTuya(userPhone, userPassword) } override fun onError(code: String?, error: String?) { @@ -78,7 +78,7 @@ } } - private fun loginWithTuya(userPhone: String, userPassword: String, user: User) { + private fun loginWithTuya(userPhone: String, userPassword: String) { authenticateViewModel.obtainPublicKey() authenticateViewModel.keyModel.observe(this, { keyModel -> if (keyModel.code == 200) { @@ -95,12 +95,17 @@ userViewModel.enter(keyModel.data!!.sid!!, userPhone, dataByPublicKey) userViewModel.loginResult.observe(this, { if (it.code == 200) { - SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, true) - SaveKeyValues.putValue(LocaleConstant.USER_MODEL, user.toJson()) - AuthenticationHelper.saveToken(it.data!!.token!!) - LoadingDialogHub.dismiss() - PageNavigationManager.finishAllActivity() - navigatePageTo() + userViewModel.obtainUserDetail(userPhone) + userViewModel.userDetailResult.observe(this, { user -> + if (user.code == 200) { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, true) + SaveKeyValues.putValue(LocaleConstant.USER_MODEL, user.toJson()) + AuthenticationHelper.saveToken(it.data!!.token!!) + LoadingDialogHub.dismiss() + PageNavigationManager.finishAllActivity() + navigatePageTo() + } + }) } }) } diff --git a/app/src/main/java/com/casic/br/view/RegisterActivity.kt b/app/src/main/java/com/casic/br/view/RegisterActivity.kt index a314b46..38ee1f7 100644 --- a/app/src/main/java/com/casic/br/view/RegisterActivity.kt +++ b/app/src/main/java/com/casic/br/view/RegisterActivity.kt @@ -62,7 +62,7 @@ } //发送验证码 TuyaHomeSdk.getUserInstance().sendVerifyCodeWithUserName( - userPhoneView.text.toString(), "", "86", 1, + userPhoneView.text.toString(), "", LocaleConstant.COUNTRY_CODE, 1, object : IResultCallback { override fun onSuccess() { "发送验证码成功".show(context) @@ -121,6 +121,7 @@ "${userPhone}的家", aMapLocation.longitude, aMapLocation.latitude, aMapLocation.address, arrayListOf("1"), object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean?) { + registerWithTuya( userPhone, userPassword, diff --git a/app/src/main/java/com/casic/br/vm/UploadFileViewModel.kt b/app/src/main/java/com/casic/br/vm/UploadFileViewModel.kt new file mode 100644 index 0000000..6ed765d --- /dev/null +++ b/app/src/main/java/com/casic/br/vm/UploadFileViewModel.kt @@ -0,0 +1,39 @@ +package com.casic.br.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.br.base.BaseApplication +import com.casic.br.extensions.separateResponseCode +import com.casic.br.extensions.toErrorMessage +import com.casic.br.model.CommonResultModel +import com.casic.br.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState +import java.io.File + +class UploadFileViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val resultModel = MutableLiveData() + + fun uploadImage(image: File) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.uploadImage(image) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + resultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/vm/UserViewModel.kt b/app/src/main/java/com/casic/br/vm/UserViewModel.kt index feb0db2..5949d56 100644 --- a/app/src/main/java/com/casic/br/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/br/vm/UserViewModel.kt @@ -6,11 +6,14 @@ import com.casic.br.extensions.toErrorMessage import com.casic.br.model.CommonResultModel import com.casic.br.model.LoginResultModel +import com.casic.br.model.UserDetailModel +import com.casic.br.utils.LocaleConstant import com.casic.br.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState @@ -19,6 +22,7 @@ private val gson by lazy { Gson() } val registerResult = MutableLiveData() val loginResult = MutableLiveData() + val userDetailResult = MutableLiveData() fun register( account: String, @@ -48,6 +52,8 @@ }) fun enter(sid: String, account: String, secretKey: String) = launch({ + //记录登录时间,用于判断token失效 + SaveKeyValues.putValue(LocaleConstant.LOGIN_TIME, System.currentTimeMillis()) val response = RetrofitServiceManager.login(sid, account, secretKey) val responseCode = response.separateResponseCode() if (responseCode == 200) { @@ -63,4 +69,31 @@ loadState.value = LoadState.Fail it.printStackTrace() }) + + fun obtainUserDetail(account: String) = launch({ + val response = RetrofitServiceManager.obtainUserDetail(account) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + userDetailResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.printStackTrace() + }) + + fun updateUserInfo(userData: UserDetailModel.DataModel) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateUserInfo(userData) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt index db3ffae..626ac5b 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -19,7 +19,6 @@ import com.casic.br.view.device.WaterHeaterActivity 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.pengxh.kt.lite.utils.WeakReferenceHandler import com.tuya.smart.home.sdk.TuyaHomeSdk @@ -82,6 +81,7 @@ super.onResume() val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String if (homeId == "") { + Log.e(kTag, "homeId is null") return } TuyaHomeSdk.newHomeInstance(homeId.toLong()) @@ -90,8 +90,6 @@ val deviceList: List = bean.deviceList val deviceModels = ArrayList() deviceList.forEach { - - Log.d(kTag, it.toJson()) val model = AddedDeviceModel() model.deviceId = it.devId when (it.deviceCategory) { diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt index 159070c..bfd488f 100644 --- a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt @@ -1,5 +1,6 @@ package com.casic.br.fragment +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions @@ -11,14 +12,20 @@ import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddressManagerActivity import com.casic.br.view.EditUserActivity +import com.casic.br.view.LoginActivity import com.casic.br.view.SettingsActivity +import com.casic.br.vm.UserViewModel 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 kotlinx.android.synthetic.main.fragment_mine.* import kotlinx.android.synthetic.main.include_main_title.* class MinePageFragment : KotlinBaseFragment() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.fragment_mine override fun setupTopBarLayout() { @@ -27,6 +34,7 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] val shopGridAdapter = IconTextGridAdapter( requireContext(), LocaleConstant.SHOP_IMAGE, @@ -80,9 +88,21 @@ 1 -> {} 2 -> {} //地址管理 - 3 -> requireContext().navigatePageTo() + 3 -> { + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } + } //系统设置 - 4 -> requireContext().navigatePageTo() + 4 -> { + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } + } } } }) @@ -94,7 +114,11 @@ override fun initEvent() { editUserView.setOnClickListener { - requireContext().navigatePageTo() + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } } } @@ -102,25 +126,28 @@ super.onResume() if (DeserializeModel.isLogin()) { val userModel = DeserializeModel.getUserModel()!! - if (userModel.headPic == "") { - Glide.with(this) - .load(R.mipmap.ic_launcher) - .apply(RequestOptions.circleCropTransform()) - .placeholder(R.mipmap.load_image_error) - .into(userAvatarView) - } else { - Glide.with(this) - .load(userModel.headPic) - .apply(RequestOptions.circleCropTransform()) - .placeholder(R.mipmap.load_image_error) - .into(userAvatarView) - } - userNameView.text = String.format( - "${requireContext().resources.getString(R.string.app_name)}${ - userModel.username.subSequence(10, 14) - }" - ) - userPhoneView.text = userModel.mobile + userViewModel.obtainUserDetail(userModel.account) + userViewModel.userDetailResult.observe(this, { user -> + if (user.code == 200) { + SaveKeyValues.putValue(LocaleConstant.USER_MODEL, user.toJson()) + val currentUser = user.data + if (currentUser.avatar == "") { + Glide.with(this) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } else { + Glide.with(this) + .load(currentUser.avatar) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } + userNameView.text = currentUser.name + userPhoneView.text = currentUser.phone + } + }) } else { Glide.with(this) .load(R.mipmap.ic_launcher) diff --git a/app/src/main/java/com/casic/br/model/UserDetailModel.java b/app/src/main/java/com/casic/br/model/UserDetailModel.java new file mode 100644 index 0000000..cca5690 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/UserDetailModel.java @@ -0,0 +1,341 @@ +package com.casic.br.model; + +public class UserDetailModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String account; + private String attr1; + private String avatar; + private String birthday; + private String createTime; + private String createUser; + private String delFlag; + private String deptId; + private String deptname; + private String devices; + private String email; + private String id; + private String isSync; + private String lastTime; + private String loginIp; + private String loginMac; + private String name; + private String operation; + private String password; + private String phone; + private String positionLat; + private String positionLng; + private String roleId; + private String salt; + private Integer sex; + private String status; + private String syncDeptid; + private String syncId; + private String syncName; + private String syncPwd; + private String updateTime; + private String updateUser; + private String version; + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + public String getAttr1() { + return attr1; + } + + public void setAttr1(String attr1) { + this.attr1 = attr1; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getBirthday() { + return birthday; + } + + public void setBirthday(String birthday) { + this.birthday = birthday; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getDelFlag() { + return delFlag; + } + + public void setDelFlag(String delFlag) { + this.delFlag = delFlag; + } + + public String getDeptId() { + return deptId; + } + + public void setDeptId(String deptId) { + this.deptId = deptId; + } + + public String getDeptname() { + return deptname; + } + + public void setDeptname(String deptname) { + this.deptname = deptname; + } + + public String getDevices() { + return devices; + } + + public void setDevices(String devices) { + this.devices = devices; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLastTime() { + return lastTime; + } + + public void setLastTime(String lastTime) { + this.lastTime = lastTime; + } + + public String getLoginIp() { + return loginIp; + } + + public void setLoginIp(String loginIp) { + this.loginIp = loginIp; + } + + public String getLoginMac() { + return loginMac; + } + + public void setLoginMac(String loginMac) { + this.loginMac = loginMac; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getOperation() { + return operation; + } + + public void setOperation(String operation) { + this.operation = operation; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getPositionLat() { + return positionLat; + } + + public void setPositionLat(String positionLat) { + this.positionLat = positionLat; + } + + public String getPositionLng() { + return positionLng; + } + + public void setPositionLng(String positionLng) { + this.positionLng = positionLng; + } + + public String getRoleId() { + return roleId; + } + + public void setRoleId(String roleId) { + this.roleId = roleId; + } + + public String getSalt() { + return salt; + } + + public void setSalt(String salt) { + this.salt = salt; + } + + public Integer getSex() { + return sex; + } + + public void setSex(Integer sex) { + this.sex = sex; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getSyncDeptid() { + return syncDeptid; + } + + public void setSyncDeptid(String syncDeptid) { + this.syncDeptid = syncDeptid; + } + + public String getSyncId() { + return syncId; + } + + public void setSyncId(String syncId) { + this.syncId = syncId; + } + + public String getSyncName() { + return syncName; + } + + public void setSyncName(String syncName) { + this.syncName = syncName; + } + + public String getSyncPwd() { + return syncPwd; + } + + public void setSyncPwd(String syncPwd) { + this.syncPwd = syncPwd; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getUpdateUser() { + return updateUser; + } + + public void setUpdateUser(String updateUser) { + this.updateUser = updateUser; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt index 9c3cccc..51c107c 100644 --- a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt +++ b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt @@ -1,6 +1,6 @@ package com.casic.br.utils -import com.casic.br.model.UserModel +import com.casic.br.model.UserDetailModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.utils.SaveKeyValues @@ -9,15 +9,27 @@ private val gson by lazy { Gson() } - fun getUserModel(): UserModel? { + fun getUserModel(): UserDetailModel.DataModel? { val userJson = SaveKeyValues.getValue(LocaleConstant.USER_MODEL, "") as String if (userJson == "") { return null } - return gson.fromJson(userJson, object : TypeToken() {}.type) + val userDetailModel = gson.fromJson( + userJson, object : TypeToken() {}.type + ) + return userDetailModel.data } fun isLogin(): Boolean { - return SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + val loginTime = SaveKeyValues.getValue(LocaleConstant.LOGIN_TIME, 0L) as Long + return if (loginTime == 0L) { + false + } else { + if (System.currentTimeMillis() - loginTime > 84600 * 1000L) { + false + } else { + SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + } + } } } \ 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 be1986d..0bc86c6 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -64,6 +64,7 @@ * */ const val PUSH_CLIENT_ID = "clientId" const val COUNTRY_CODE = "86" + const val LOGIN_TIME = "loginTime" const val USER_IS_LOGIN = "isLogin" const val HOME_ID = "homeId" const val USER_MODEL = "userModel" diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1360cca..6495d77 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -1,5 +1,6 @@ package com.casic.br.utils.retrofit +import okhttp3.MultipartBody import okhttp3.RequestBody import retrofit2.http.* @@ -32,8 +33,20 @@ /** * 获取用户信息 */ - @GET("/user/info") - suspend fun obtainUserDetail(@Header("token") token: String): String + @GET("/appUser/info") + suspend fun obtainUserDetail( + @Header("token") token: String, + @Query("account") account: String + ): String + + /** + * 获取用户信息 + */ + @POST("/appUser/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String /** * 新增地址 @@ -79,4 +92,16 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 上传图片 + * 系统路径static拼接图片返回路径 + * http://xx.com/static/2019-10/8050891248624f2bbefedcb196ce89cb.jpeg + */ + @Multipart + @POST("/file/uploadFile") + suspend fun uploadImage( + @Header("token") token: String, + @Part file: MultipartBody.Part + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 83784fc..344bd26 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -1,12 +1,17 @@ package com.casic.br.utils.retrofit +import com.casic.br.model.UserDetailModel import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant import com.pengxh.kt.lite.utils.RetrofitFactory.createRetrofit import com.pengxh.kt.lite.utils.SaveKeyValues import okhttp3.MediaType.Companion.toMediaType +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MultipartBody +import okhttp3.RequestBody import okhttp3.RequestBody.Companion.toRequestBody import org.json.JSONObject +import java.io.File object RetrofitServiceManager { @@ -83,8 +88,26 @@ /** * 获取用户信息 */ - suspend fun obtainUserDetail(): String { - return api.obtainUserDetail(AuthenticationHelper.token!!) + suspend fun obtainUserDetail(account: String): String { + return api.obtainUserDetail(AuthenticationHelper.token!!, account) + } + + /** + * 获取用户信息 + */ + suspend fun updateUserInfo(userData: UserDetailModel.DataModel): String { + val paramObject = JSONObject() + paramObject.put("id", userData.id) + paramObject.put("name", userData.name) + paramObject.put("birthday", userData.birthday) + paramObject.put("sex", userData.sex) + paramObject.put("email", userData.email) + paramObject.put("phone", userData.phone) + paramObject.put("avatar", userData.avatar) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.updateUserInfo(AuthenticationHelper.token!!, requestBody) } /** @@ -175,4 +198,13 @@ ) return api.obtainBanner(AuthenticationHelper.token!!, requestBody) } + + /** + * 上传图片 + */ + suspend fun uploadImage(image: File): String { + val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) + val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) + return api.uploadImage(AuthenticationHelper.token!!, imagePart) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressActivity.kt b/app/src/main/java/com/casic/br/view/AddressActivity.kt index 26303ad..5c47a8f 100644 --- a/app/src/main/java/com/casic/br/view/AddressActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressActivity.kt @@ -102,7 +102,7 @@ if (id == null) { //新增地址 addressViewModel.addAddress( - userModel.mobile, + userModel.phone, split[0], split[1], split[2], @@ -114,7 +114,7 @@ //修改地址 addressViewModel.updateAddressById( id!!, - userModel.mobile, + userModel.phone, split[0], split[1], split[2], diff --git a/app/src/main/java/com/casic/br/view/EditUserActivity.kt b/app/src/main/java/com/casic/br/view/EditUserActivity.kt index 3d8536d..71639b5 100644 --- a/app/src/main/java/com/casic/br/view/EditUserActivity.kt +++ b/app/src/main/java/com/casic/br/view/EditUserActivity.kt @@ -2,12 +2,18 @@ import android.graphics.Color import android.util.Log +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.br.R -import com.casic.br.extensions.compressImage -import com.casic.br.utils.DeserializeModel -import com.casic.br.utils.GlideLoadEngine -import com.casic.br.utils.LocaleConstant import com.casic.br.callback.OnImageCompressListener +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.compressImage +import com.casic.br.model.UserDetailModel +import com.casic.br.utils.* +import com.casic.br.vm.UploadFileViewModel +import com.casic.br.vm.UserViewModel +import com.github.gzuliyujiang.wheelpicker.BirthdayPicker import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.basic.PictureSelector import com.luck.picture.lib.config.SelectMimeType @@ -16,12 +22,11 @@ import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_edit_user.* -import kotlinx.android.synthetic.main.activity_edit_user.userNameView -import kotlinx.android.synthetic.main.activity_edit_user.userPhoneView -import kotlinx.android.synthetic.main.fragment_mine.* -import kotlinx.android.synthetic.main.include_base_title.* import java.io.File import java.util.* @@ -30,6 +35,9 @@ private val kTag = "EditUserActivity" private val context = this@EditUserActivity + private lateinit var uploadFileViewModel: UploadFileViewModel + private lateinit var userViewModel: UserViewModel + private lateinit var currentUser: UserDetailModel.DataModel override fun initLayoutView(): Int = R.layout.activity_edit_user @@ -38,24 +46,42 @@ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this)) leftBackView.setOnClickListener { finish() } - titleView.text = "个人中心" } override fun initData() { - val userModel = DeserializeModel.getUserModel() ?: return - userNameView.text = resources.getString(R.string.app_name) + - userModel.username.subSequence(10, 14) - userPhoneView.text = userModel.mobile -// genderView.text = userModel.mobile -// birthdayView.text = userModel.mobile - } + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] - override fun observeRequestState() { - + currentUser = DeserializeModel.getUserModel() ?: return + userViewModel.obtainUserDetail(currentUser.account) + userViewModel.userDetailResult.observe(this, { user -> + if (user.code == 200) { + SaveKeyValues.putValue(LocaleConstant.USER_MODEL, user.toJson()) + currentUser = user.data + if (currentUser.avatar == "") { + Glide.with(this) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } else { + Glide.with(this) + .load(currentUser.avatar) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } + userNameView.text = currentUser.name + userPhoneView.text = currentUser.phone + genderView.text = LocaleConstant.GENDER_ARRAY[currentUser.sex - 1] + birthdayView.text = currentUser.birthday + calculateCompleteValue() + } + }) } override fun initEvent() { - avatarLayout.setOnClickListener { + changeAvatarView.setOnClickListener { BottomActionSheet.Builder() .setContext(this) .setActionItemTitle(listOf("拍照", "相册")) @@ -108,12 +134,71 @@ }).build().show() } - userNameLayout.setOnClickListener { + uploadFileViewModel.resultModel.observe(this, { + if (it.code == 200) { + val url = it.data.toString() + if (url.isNotBlank()) { + Glide.with(this) + .load(url.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + currentUser.avatar = url + userViewModel.updateUserInfo(currentUser) + } + } + }) + userNameLayout.setOnClickListener { + AlertInputDialog.Builder() + .setContext(this) + .setTitle("修改用户名") + .setHintMessage("请输入您的名字、昵称") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertInputDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick(value: String) { + //更新名字 + currentUser.name = value + userViewModel.updateUserInfo(currentUser) + userNameView.text = value + calculateCompleteValue() + } + }) + .build().show() } userPhoneLayout.setOnClickListener { + AlertInputDialog.Builder() + .setContext(this) + .setTitle("修改登录手机号") + .setHintMessage("请输入您新的手机号") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertInputDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + } + + override fun onConfirmClick(value: String) { + //更新手机号 + if (value.isPhoneNumber()) { + currentUser.phone = value + userViewModel.updateUserInfo(currentUser) + userPhoneView.text = value + calculateCompleteValue() + } else { + "无效手机号,请检查".show(context) + } + } + }) + .build().show() } genderLayout.setOnClickListener { @@ -123,23 +208,80 @@ .setItemTextColor(Color.BLUE) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { - + //更新性别 + currentUser.sex = position + 1 + userViewModel.updateUserInfo(currentUser) + genderView.text = LocaleConstant.GENDER_ARRAY[position] + calculateCompleteValue() } }) .build().show() } birthdayLayout.setOnClickListener { - + val birthdayPicker = BirthdayPicker(this) + birthdayPicker.setDefaultValue(1991, 8, 3) + birthdayPicker.setOnDatePickedListener { year, month, day -> + val birthdayDate = String.format("%s年%s月%s日", year, month, day) + //更新生日 + currentUser.birthday = birthdayDate + userViewModel.updateUserInfo(currentUser) + birthdayView.text = currentUser.birthday + calculateCompleteValue() + } + val layout = birthdayPicker.wheelLayout + layout.setTextSize(14f.sp2px(context).toFloat()) + layout.setSelectedTextSize(16f.sp2px(context).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + birthdayPicker.show() } } + /** + * 计算个人信息完成度 + * */ + private fun calculateCompleteValue() { + var value = 0 + if (userNameView.text.toString().isNotBlank()) { + value += 25 + } + if (userPhoneView.text.toString().isNotBlank()) { + value += 25 + } + if (genderView.text.toString().isNotBlank()) { + value += 25 + } + if (birthdayView.text.toString().isNotBlank()) { + value += 25 + } + userCompleteView.text = "资料完成度${value}%" + } + + override fun observeRequestState() { + uploadFileViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "头像上传中") + else -> LoadingDialogHub.dismiss() + } + }) + + userViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "信息修改中") + else -> LoadingDialogHub.dismiss() + } + }) + } + private fun analyticalSelectResults(result: LocalMedia) { //压缩图片后上传 result.realPath.compressImage(this, object : OnImageCompressListener { override fun onSuccess(file: File) { Log.d(kTag, "onSuccess: " + file.absolutePath) //上传图片 + uploadFileViewModel.uploadImage(file) } override fun onError(e: Throwable) { 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 2c090a6..6f4088a 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -66,7 +66,7 @@ LoadingDialogHub.dismiss() "登录失败".show(context) } - loginWithTuya(userPhone, userPassword, user!!) + loginWithTuya(userPhone, userPassword) } override fun onError(code: String?, error: String?) { @@ -78,7 +78,7 @@ } } - private fun loginWithTuya(userPhone: String, userPassword: String, user: User) { + private fun loginWithTuya(userPhone: String, userPassword: String) { authenticateViewModel.obtainPublicKey() authenticateViewModel.keyModel.observe(this, { keyModel -> if (keyModel.code == 200) { @@ -95,12 +95,17 @@ userViewModel.enter(keyModel.data!!.sid!!, userPhone, dataByPublicKey) userViewModel.loginResult.observe(this, { if (it.code == 200) { - SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, true) - SaveKeyValues.putValue(LocaleConstant.USER_MODEL, user.toJson()) - AuthenticationHelper.saveToken(it.data!!.token!!) - LoadingDialogHub.dismiss() - PageNavigationManager.finishAllActivity() - navigatePageTo() + userViewModel.obtainUserDetail(userPhone) + userViewModel.userDetailResult.observe(this, { user -> + if (user.code == 200) { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, true) + SaveKeyValues.putValue(LocaleConstant.USER_MODEL, user.toJson()) + AuthenticationHelper.saveToken(it.data!!.token!!) + LoadingDialogHub.dismiss() + PageNavigationManager.finishAllActivity() + navigatePageTo() + } + }) } }) } diff --git a/app/src/main/java/com/casic/br/view/RegisterActivity.kt b/app/src/main/java/com/casic/br/view/RegisterActivity.kt index a314b46..38ee1f7 100644 --- a/app/src/main/java/com/casic/br/view/RegisterActivity.kt +++ b/app/src/main/java/com/casic/br/view/RegisterActivity.kt @@ -62,7 +62,7 @@ } //发送验证码 TuyaHomeSdk.getUserInstance().sendVerifyCodeWithUserName( - userPhoneView.text.toString(), "", "86", 1, + userPhoneView.text.toString(), "", LocaleConstant.COUNTRY_CODE, 1, object : IResultCallback { override fun onSuccess() { "发送验证码成功".show(context) @@ -121,6 +121,7 @@ "${userPhone}的家", aMapLocation.longitude, aMapLocation.latitude, aMapLocation.address, arrayListOf("1"), object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean?) { + registerWithTuya( userPhone, userPassword, diff --git a/app/src/main/java/com/casic/br/vm/UploadFileViewModel.kt b/app/src/main/java/com/casic/br/vm/UploadFileViewModel.kt new file mode 100644 index 0000000..6ed765d --- /dev/null +++ b/app/src/main/java/com/casic/br/vm/UploadFileViewModel.kt @@ -0,0 +1,39 @@ +package com.casic.br.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.br.base.BaseApplication +import com.casic.br.extensions.separateResponseCode +import com.casic.br.extensions.toErrorMessage +import com.casic.br.model.CommonResultModel +import com.casic.br.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState +import java.io.File + +class UploadFileViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val resultModel = MutableLiveData() + + fun uploadImage(image: File) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.uploadImage(image) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + resultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/vm/UserViewModel.kt b/app/src/main/java/com/casic/br/vm/UserViewModel.kt index feb0db2..5949d56 100644 --- a/app/src/main/java/com/casic/br/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/br/vm/UserViewModel.kt @@ -6,11 +6,14 @@ import com.casic.br.extensions.toErrorMessage import com.casic.br.model.CommonResultModel import com.casic.br.model.LoginResultModel +import com.casic.br.model.UserDetailModel +import com.casic.br.utils.LocaleConstant import com.casic.br.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState @@ -19,6 +22,7 @@ private val gson by lazy { Gson() } val registerResult = MutableLiveData() val loginResult = MutableLiveData() + val userDetailResult = MutableLiveData() fun register( account: String, @@ -48,6 +52,8 @@ }) fun enter(sid: String, account: String, secretKey: String) = launch({ + //记录登录时间,用于判断token失效 + SaveKeyValues.putValue(LocaleConstant.LOGIN_TIME, System.currentTimeMillis()) val response = RetrofitServiceManager.login(sid, account, secretKey) val responseCode = response.separateResponseCode() if (responseCode == 200) { @@ -63,4 +69,31 @@ loadState.value = LoadState.Fail it.printStackTrace() }) + + fun obtainUserDetail(account: String) = launch({ + val response = RetrofitServiceManager.obtainUserDetail(account) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + userDetailResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.printStackTrace() + }) + + fun updateUserInfo(userData: UserDetailModel.DataModel) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateUserInfo(userData) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_gray_radius_7.xml b/app/src/main/res/drawable/bg_solid_layout_gray_radius_7.xml new file mode 100644 index 0000000..10bc801 --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_gray_radius_7.xml @@ -0,0 +1,8 @@ + + + + + + + \ 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 db3ffae..626ac5b 100644 --- a/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/DevicePageFragment.kt @@ -19,7 +19,6 @@ import com.casic.br.view.device.WaterHeaterActivity 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.pengxh.kt.lite.utils.WeakReferenceHandler import com.tuya.smart.home.sdk.TuyaHomeSdk @@ -82,6 +81,7 @@ super.onResume() val homeId = SaveKeyValues.getValue(LocaleConstant.HOME_ID, "") as String if (homeId == "") { + Log.e(kTag, "homeId is null") return } TuyaHomeSdk.newHomeInstance(homeId.toLong()) @@ -90,8 +90,6 @@ val deviceList: List = bean.deviceList val deviceModels = ArrayList() deviceList.forEach { - - Log.d(kTag, it.toJson()) val model = AddedDeviceModel() model.deviceId = it.devId when (it.deviceCategory) { diff --git a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt index 159070c..bfd488f 100644 --- a/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt +++ b/app/src/main/java/com/casic/br/fragment/MinePageFragment.kt @@ -1,5 +1,6 @@ package com.casic.br.fragment +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DividerItemDecoration import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions @@ -11,14 +12,20 @@ import com.casic.br.utils.LocaleConstant import com.casic.br.view.AddressManagerActivity import com.casic.br.view.EditUserActivity +import com.casic.br.view.LoginActivity import com.casic.br.view.SettingsActivity +import com.casic.br.vm.UserViewModel 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 kotlinx.android.synthetic.main.fragment_mine.* import kotlinx.android.synthetic.main.include_main_title.* class MinePageFragment : KotlinBaseFragment() { + private lateinit var userViewModel: UserViewModel + override fun initLayoutView(): Int = R.layout.fragment_mine override fun setupTopBarLayout() { @@ -27,6 +34,7 @@ } override fun initData() { + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] val shopGridAdapter = IconTextGridAdapter( requireContext(), LocaleConstant.SHOP_IMAGE, @@ -80,9 +88,21 @@ 1 -> {} 2 -> {} //地址管理 - 3 -> requireContext().navigatePageTo() + 3 -> { + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } + } //系统设置 - 4 -> requireContext().navigatePageTo() + 4 -> { + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } + } } } }) @@ -94,7 +114,11 @@ override fun initEvent() { editUserView.setOnClickListener { - requireContext().navigatePageTo() + if (DeserializeModel.isLogin()) { + requireContext().navigatePageTo() + } else { + requireContext().navigatePageTo() + } } } @@ -102,25 +126,28 @@ super.onResume() if (DeserializeModel.isLogin()) { val userModel = DeserializeModel.getUserModel()!! - if (userModel.headPic == "") { - Glide.with(this) - .load(R.mipmap.ic_launcher) - .apply(RequestOptions.circleCropTransform()) - .placeholder(R.mipmap.load_image_error) - .into(userAvatarView) - } else { - Glide.with(this) - .load(userModel.headPic) - .apply(RequestOptions.circleCropTransform()) - .placeholder(R.mipmap.load_image_error) - .into(userAvatarView) - } - userNameView.text = String.format( - "${requireContext().resources.getString(R.string.app_name)}${ - userModel.username.subSequence(10, 14) - }" - ) - userPhoneView.text = userModel.mobile + userViewModel.obtainUserDetail(userModel.account) + userViewModel.userDetailResult.observe(this, { user -> + if (user.code == 200) { + SaveKeyValues.putValue(LocaleConstant.USER_MODEL, user.toJson()) + val currentUser = user.data + if (currentUser.avatar == "") { + Glide.with(this) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } else { + Glide.with(this) + .load(currentUser.avatar) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } + userNameView.text = currentUser.name + userPhoneView.text = currentUser.phone + } + }) } else { Glide.with(this) .load(R.mipmap.ic_launcher) diff --git a/app/src/main/java/com/casic/br/model/UserDetailModel.java b/app/src/main/java/com/casic/br/model/UserDetailModel.java new file mode 100644 index 0000000..cca5690 --- /dev/null +++ b/app/src/main/java/com/casic/br/model/UserDetailModel.java @@ -0,0 +1,341 @@ +package com.casic.br.model; + +public class UserDetailModel { + + private int code; + private DataModel data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataModel { + private String account; + private String attr1; + private String avatar; + private String birthday; + private String createTime; + private String createUser; + private String delFlag; + private String deptId; + private String deptname; + private String devices; + private String email; + private String id; + private String isSync; + private String lastTime; + private String loginIp; + private String loginMac; + private String name; + private String operation; + private String password; + private String phone; + private String positionLat; + private String positionLng; + private String roleId; + private String salt; + private Integer sex; + private String status; + private String syncDeptid; + private String syncId; + private String syncName; + private String syncPwd; + private String updateTime; + private String updateUser; + private String version; + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + public String getAttr1() { + return attr1; + } + + public void setAttr1(String attr1) { + this.attr1 = attr1; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getBirthday() { + return birthday; + } + + public void setBirthday(String birthday) { + this.birthday = birthday; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getDelFlag() { + return delFlag; + } + + public void setDelFlag(String delFlag) { + this.delFlag = delFlag; + } + + public String getDeptId() { + return deptId; + } + + public void setDeptId(String deptId) { + this.deptId = deptId; + } + + public String getDeptname() { + return deptname; + } + + public void setDeptname(String deptname) { + this.deptname = deptname; + } + + public String getDevices() { + return devices; + } + + public void setDevices(String devices) { + this.devices = devices; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsSync() { + return isSync; + } + + public void setIsSync(String isSync) { + this.isSync = isSync; + } + + public String getLastTime() { + return lastTime; + } + + public void setLastTime(String lastTime) { + this.lastTime = lastTime; + } + + public String getLoginIp() { + return loginIp; + } + + public void setLoginIp(String loginIp) { + this.loginIp = loginIp; + } + + public String getLoginMac() { + return loginMac; + } + + public void setLoginMac(String loginMac) { + this.loginMac = loginMac; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getOperation() { + return operation; + } + + public void setOperation(String operation) { + this.operation = operation; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getPositionLat() { + return positionLat; + } + + public void setPositionLat(String positionLat) { + this.positionLat = positionLat; + } + + public String getPositionLng() { + return positionLng; + } + + public void setPositionLng(String positionLng) { + this.positionLng = positionLng; + } + + public String getRoleId() { + return roleId; + } + + public void setRoleId(String roleId) { + this.roleId = roleId; + } + + public String getSalt() { + return salt; + } + + public void setSalt(String salt) { + this.salt = salt; + } + + public Integer getSex() { + return sex; + } + + public void setSex(Integer sex) { + this.sex = sex; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getSyncDeptid() { + return syncDeptid; + } + + public void setSyncDeptid(String syncDeptid) { + this.syncDeptid = syncDeptid; + } + + public String getSyncId() { + return syncId; + } + + public void setSyncId(String syncId) { + this.syncId = syncId; + } + + public String getSyncName() { + return syncName; + } + + public void setSyncName(String syncName) { + this.syncName = syncName; + } + + public String getSyncPwd() { + return syncPwd; + } + + public void setSyncPwd(String syncPwd) { + this.syncPwd = syncPwd; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getUpdateUser() { + return updateUser; + } + + public void setUpdateUser(String updateUser) { + this.updateUser = updateUser; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + } +} diff --git a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt index 9c3cccc..51c107c 100644 --- a/app/src/main/java/com/casic/br/utils/DeserializeModel.kt +++ b/app/src/main/java/com/casic/br/utils/DeserializeModel.kt @@ -1,6 +1,6 @@ package com.casic.br.utils -import com.casic.br.model.UserModel +import com.casic.br.model.UserDetailModel import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.utils.SaveKeyValues @@ -9,15 +9,27 @@ private val gson by lazy { Gson() } - fun getUserModel(): UserModel? { + fun getUserModel(): UserDetailModel.DataModel? { val userJson = SaveKeyValues.getValue(LocaleConstant.USER_MODEL, "") as String if (userJson == "") { return null } - return gson.fromJson(userJson, object : TypeToken() {}.type) + val userDetailModel = gson.fromJson( + userJson, object : TypeToken() {}.type + ) + return userDetailModel.data } fun isLogin(): Boolean { - return SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + val loginTime = SaveKeyValues.getValue(LocaleConstant.LOGIN_TIME, 0L) as Long + return if (loginTime == 0L) { + false + } else { + if (System.currentTimeMillis() - loginTime > 84600 * 1000L) { + false + } else { + SaveKeyValues.getValue(LocaleConstant.USER_IS_LOGIN, false) as Boolean + } + } } } \ 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 be1986d..0bc86c6 100644 --- a/app/src/main/java/com/casic/br/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/br/utils/LocaleConstant.kt @@ -64,6 +64,7 @@ * */ const val PUSH_CLIENT_ID = "clientId" const val COUNTRY_CODE = "86" + const val LOGIN_TIME = "loginTime" const val USER_IS_LOGIN = "isLogin" const val HOME_ID = "homeId" const val USER_MODEL = "userModel" diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt index 1360cca..6495d77 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitService.kt @@ -1,5 +1,6 @@ package com.casic.br.utils.retrofit +import okhttp3.MultipartBody import okhttp3.RequestBody import retrofit2.http.* @@ -32,8 +33,20 @@ /** * 获取用户信息 */ - @GET("/user/info") - suspend fun obtainUserDetail(@Header("token") token: String): String + @GET("/appUser/info") + suspend fun obtainUserDetail( + @Header("token") token: String, + @Query("account") account: String + ): String + + /** + * 获取用户信息 + */ + @POST("/appUser/update") + suspend fun updateUserInfo( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String /** * 新增地址 @@ -79,4 +92,16 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 上传图片 + * 系统路径static拼接图片返回路径 + * http://xx.com/static/2019-10/8050891248624f2bbefedcb196ce89cb.jpeg + */ + @Multipart + @POST("/file/uploadFile") + suspend fun uploadImage( + @Header("token") token: String, + @Part file: MultipartBody.Part + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt index 83784fc..344bd26 100644 --- a/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/utils/retrofit/RetrofitServiceManager.kt @@ -1,12 +1,17 @@ package com.casic.br.utils.retrofit +import com.casic.br.model.UserDetailModel import com.casic.br.utils.AuthenticationHelper import com.casic.br.utils.LocaleConstant import com.pengxh.kt.lite.utils.RetrofitFactory.createRetrofit import com.pengxh.kt.lite.utils.SaveKeyValues import okhttp3.MediaType.Companion.toMediaType +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MultipartBody +import okhttp3.RequestBody import okhttp3.RequestBody.Companion.toRequestBody import org.json.JSONObject +import java.io.File object RetrofitServiceManager { @@ -83,8 +88,26 @@ /** * 获取用户信息 */ - suspend fun obtainUserDetail(): String { - return api.obtainUserDetail(AuthenticationHelper.token!!) + suspend fun obtainUserDetail(account: String): String { + return api.obtainUserDetail(AuthenticationHelper.token!!, account) + } + + /** + * 获取用户信息 + */ + suspend fun updateUserInfo(userData: UserDetailModel.DataModel): String { + val paramObject = JSONObject() + paramObject.put("id", userData.id) + paramObject.put("name", userData.name) + paramObject.put("birthday", userData.birthday) + paramObject.put("sex", userData.sex) + paramObject.put("email", userData.email) + paramObject.put("phone", userData.phone) + paramObject.put("avatar", userData.avatar) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.updateUserInfo(AuthenticationHelper.token!!, requestBody) } /** @@ -175,4 +198,13 @@ ) return api.obtainBanner(AuthenticationHelper.token!!, requestBody) } + + /** + * 上传图片 + */ + suspend fun uploadImage(image: File): String { + val requestBody = RequestBody.create("image/png".toMediaTypeOrNull(), image) + val imagePart = MultipartBody.Part.createFormData("file", image.name, requestBody) + return api.uploadImage(AuthenticationHelper.token!!, imagePart) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/view/AddressActivity.kt b/app/src/main/java/com/casic/br/view/AddressActivity.kt index 26303ad..5c47a8f 100644 --- a/app/src/main/java/com/casic/br/view/AddressActivity.kt +++ b/app/src/main/java/com/casic/br/view/AddressActivity.kt @@ -102,7 +102,7 @@ if (id == null) { //新增地址 addressViewModel.addAddress( - userModel.mobile, + userModel.phone, split[0], split[1], split[2], @@ -114,7 +114,7 @@ //修改地址 addressViewModel.updateAddressById( id!!, - userModel.mobile, + userModel.phone, split[0], split[1], split[2], diff --git a/app/src/main/java/com/casic/br/view/EditUserActivity.kt b/app/src/main/java/com/casic/br/view/EditUserActivity.kt index 3d8536d..71639b5 100644 --- a/app/src/main/java/com/casic/br/view/EditUserActivity.kt +++ b/app/src/main/java/com/casic/br/view/EditUserActivity.kt @@ -2,12 +2,18 @@ import android.graphics.Color import android.util.Log +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.br.R -import com.casic.br.extensions.compressImage -import com.casic.br.utils.DeserializeModel -import com.casic.br.utils.GlideLoadEngine -import com.casic.br.utils.LocaleConstant import com.casic.br.callback.OnImageCompressListener +import com.casic.br.extensions.combineImagePath +import com.casic.br.extensions.compressImage +import com.casic.br.model.UserDetailModel +import com.casic.br.utils.* +import com.casic.br.vm.UploadFileViewModel +import com.casic.br.vm.UserViewModel +import com.github.gzuliyujiang.wheelpicker.BirthdayPicker import com.gyf.immersionbar.ImmersionBar import com.luck.picture.lib.basic.PictureSelector import com.luck.picture.lib.config.SelectMimeType @@ -16,12 +22,11 @@ import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.vm.LoadState +import com.pengxh.kt.lite.widget.dialog.AlertInputDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.activity_edit_user.* -import kotlinx.android.synthetic.main.activity_edit_user.userNameView -import kotlinx.android.synthetic.main.activity_edit_user.userPhoneView -import kotlinx.android.synthetic.main.fragment_mine.* -import kotlinx.android.synthetic.main.include_base_title.* import java.io.File import java.util.* @@ -30,6 +35,9 @@ private val kTag = "EditUserActivity" private val context = this@EditUserActivity + private lateinit var uploadFileViewModel: UploadFileViewModel + private lateinit var userViewModel: UserViewModel + private lateinit var currentUser: UserDetailModel.DataModel override fun initLayoutView(): Int = R.layout.activity_edit_user @@ -38,24 +46,42 @@ ImmerseStatusBarUtil.setColor(this, R.color.white.convertColor(this)) leftBackView.setOnClickListener { finish() } - titleView.text = "个人中心" } override fun initData() { - val userModel = DeserializeModel.getUserModel() ?: return - userNameView.text = resources.getString(R.string.app_name) + - userModel.username.subSequence(10, 14) - userPhoneView.text = userModel.mobile -// genderView.text = userModel.mobile -// birthdayView.text = userModel.mobile - } + uploadFileViewModel = ViewModelProvider(this)[UploadFileViewModel::class.java] + userViewModel = ViewModelProvider(this)[UserViewModel::class.java] - override fun observeRequestState() { - + currentUser = DeserializeModel.getUserModel() ?: return + userViewModel.obtainUserDetail(currentUser.account) + userViewModel.userDetailResult.observe(this, { user -> + if (user.code == 200) { + SaveKeyValues.putValue(LocaleConstant.USER_MODEL, user.toJson()) + currentUser = user.data + if (currentUser.avatar == "") { + Glide.with(this) + .load(R.mipmap.ic_launcher) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } else { + Glide.with(this) + .load(currentUser.avatar) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + } + userNameView.text = currentUser.name + userPhoneView.text = currentUser.phone + genderView.text = LocaleConstant.GENDER_ARRAY[currentUser.sex - 1] + birthdayView.text = currentUser.birthday + calculateCompleteValue() + } + }) } override fun initEvent() { - avatarLayout.setOnClickListener { + changeAvatarView.setOnClickListener { BottomActionSheet.Builder() .setContext(this) .setActionItemTitle(listOf("拍照", "相册")) @@ -108,12 +134,71 @@ }).build().show() } - userNameLayout.setOnClickListener { + uploadFileViewModel.resultModel.observe(this, { + if (it.code == 200) { + val url = it.data.toString() + if (url.isNotBlank()) { + Glide.with(this) + .load(url.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .placeholder(R.mipmap.load_image_error) + .into(userAvatarView) + currentUser.avatar = url + userViewModel.updateUserInfo(currentUser) + } + } + }) + userNameLayout.setOnClickListener { + AlertInputDialog.Builder() + .setContext(this) + .setTitle("修改用户名") + .setHintMessage("请输入您的名字、昵称") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertInputDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + + } + + override fun onConfirmClick(value: String) { + //更新名字 + currentUser.name = value + userViewModel.updateUserInfo(currentUser) + userNameView.text = value + calculateCompleteValue() + } + }) + .build().show() } userPhoneLayout.setOnClickListener { + AlertInputDialog.Builder() + .setContext(this) + .setTitle("修改登录手机号") + .setHintMessage("请输入您新的手机号") + .setNegativeButton("取消") + .setPositiveButton("确定") + .setOnDialogButtonClickListener(object : + AlertInputDialog.OnDialogButtonClickListener { + override fun onCancelClick() { + } + + override fun onConfirmClick(value: String) { + //更新手机号 + if (value.isPhoneNumber()) { + currentUser.phone = value + userViewModel.updateUserInfo(currentUser) + userPhoneView.text = value + calculateCompleteValue() + } else { + "无效手机号,请检查".show(context) + } + } + }) + .build().show() } genderLayout.setOnClickListener { @@ -123,23 +208,80 @@ .setItemTextColor(Color.BLUE) .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { override fun onActionItemClick(position: Int) { - + //更新性别 + currentUser.sex = position + 1 + userViewModel.updateUserInfo(currentUser) + genderView.text = LocaleConstant.GENDER_ARRAY[position] + calculateCompleteValue() } }) .build().show() } birthdayLayout.setOnClickListener { - + val birthdayPicker = BirthdayPicker(this) + birthdayPicker.setDefaultValue(1991, 8, 3) + birthdayPicker.setOnDatePickedListener { year, month, day -> + val birthdayDate = String.format("%s年%s月%s日", year, month, day) + //更新生日 + currentUser.birthday = birthdayDate + userViewModel.updateUserInfo(currentUser) + birthdayView.text = currentUser.birthday + calculateCompleteValue() + } + val layout = birthdayPicker.wheelLayout + layout.setTextSize(14f.sp2px(context).toFloat()) + layout.setSelectedTextSize(16f.sp2px(context).toFloat()) + layout.setSelectedTextColor(R.color.mainThemeColor.convertColor(this)) + layout.setSelectedTextBold(true) + layout.setResetWhenLinkage(false) + birthdayPicker.show() } } + /** + * 计算个人信息完成度 + * */ + private fun calculateCompleteValue() { + var value = 0 + if (userNameView.text.toString().isNotBlank()) { + value += 25 + } + if (userPhoneView.text.toString().isNotBlank()) { + value += 25 + } + if (genderView.text.toString().isNotBlank()) { + value += 25 + } + if (birthdayView.text.toString().isNotBlank()) { + value += 25 + } + userCompleteView.text = "资料完成度${value}%" + } + + override fun observeRequestState() { + uploadFileViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "头像上传中") + else -> LoadingDialogHub.dismiss() + } + }) + + userViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "信息修改中") + else -> LoadingDialogHub.dismiss() + } + }) + } + private fun analyticalSelectResults(result: LocalMedia) { //压缩图片后上传 result.realPath.compressImage(this, object : OnImageCompressListener { override fun onSuccess(file: File) { Log.d(kTag, "onSuccess: " + file.absolutePath) //上传图片 + uploadFileViewModel.uploadImage(file) } override fun onError(e: Throwable) { 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 2c090a6..6f4088a 100644 --- a/app/src/main/java/com/casic/br/view/LoginActivity.kt +++ b/app/src/main/java/com/casic/br/view/LoginActivity.kt @@ -66,7 +66,7 @@ LoadingDialogHub.dismiss() "登录失败".show(context) } - loginWithTuya(userPhone, userPassword, user!!) + loginWithTuya(userPhone, userPassword) } override fun onError(code: String?, error: String?) { @@ -78,7 +78,7 @@ } } - private fun loginWithTuya(userPhone: String, userPassword: String, user: User) { + private fun loginWithTuya(userPhone: String, userPassword: String) { authenticateViewModel.obtainPublicKey() authenticateViewModel.keyModel.observe(this, { keyModel -> if (keyModel.code == 200) { @@ -95,12 +95,17 @@ userViewModel.enter(keyModel.data!!.sid!!, userPhone, dataByPublicKey) userViewModel.loginResult.observe(this, { if (it.code == 200) { - SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, true) - SaveKeyValues.putValue(LocaleConstant.USER_MODEL, user.toJson()) - AuthenticationHelper.saveToken(it.data!!.token!!) - LoadingDialogHub.dismiss() - PageNavigationManager.finishAllActivity() - navigatePageTo() + userViewModel.obtainUserDetail(userPhone) + userViewModel.userDetailResult.observe(this, { user -> + if (user.code == 200) { + SaveKeyValues.putValue(LocaleConstant.USER_IS_LOGIN, true) + SaveKeyValues.putValue(LocaleConstant.USER_MODEL, user.toJson()) + AuthenticationHelper.saveToken(it.data!!.token!!) + LoadingDialogHub.dismiss() + PageNavigationManager.finishAllActivity() + navigatePageTo() + } + }) } }) } diff --git a/app/src/main/java/com/casic/br/view/RegisterActivity.kt b/app/src/main/java/com/casic/br/view/RegisterActivity.kt index a314b46..38ee1f7 100644 --- a/app/src/main/java/com/casic/br/view/RegisterActivity.kt +++ b/app/src/main/java/com/casic/br/view/RegisterActivity.kt @@ -62,7 +62,7 @@ } //发送验证码 TuyaHomeSdk.getUserInstance().sendVerifyCodeWithUserName( - userPhoneView.text.toString(), "", "86", 1, + userPhoneView.text.toString(), "", LocaleConstant.COUNTRY_CODE, 1, object : IResultCallback { override fun onSuccess() { "发送验证码成功".show(context) @@ -121,6 +121,7 @@ "${userPhone}的家", aMapLocation.longitude, aMapLocation.latitude, aMapLocation.address, arrayListOf("1"), object : ITuyaHomeResultCallback { override fun onSuccess(bean: HomeBean?) { + registerWithTuya( userPhone, userPassword, diff --git a/app/src/main/java/com/casic/br/vm/UploadFileViewModel.kt b/app/src/main/java/com/casic/br/vm/UploadFileViewModel.kt new file mode 100644 index 0000000..6ed765d --- /dev/null +++ b/app/src/main/java/com/casic/br/vm/UploadFileViewModel.kt @@ -0,0 +1,39 @@ +package com.casic.br.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.br.base.BaseApplication +import com.casic.br.extensions.separateResponseCode +import com.casic.br.extensions.toErrorMessage +import com.casic.br.model.CommonResultModel +import com.casic.br.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState +import java.io.File + +class UploadFileViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val resultModel = MutableLiveData() + + fun uploadImage(image: File) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.uploadImage(image) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + resultModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/vm/UserViewModel.kt b/app/src/main/java/com/casic/br/vm/UserViewModel.kt index feb0db2..5949d56 100644 --- a/app/src/main/java/com/casic/br/vm/UserViewModel.kt +++ b/app/src/main/java/com/casic/br/vm/UserViewModel.kt @@ -6,11 +6,14 @@ import com.casic.br.extensions.toErrorMessage import com.casic.br.model.CommonResultModel import com.casic.br.model.LoginResultModel +import com.casic.br.model.UserDetailModel +import com.casic.br.utils.LocaleConstant import com.casic.br.utils.retrofit.RetrofitServiceManager import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.vm.BaseViewModel import com.pengxh.kt.lite.vm.LoadState @@ -19,6 +22,7 @@ private val gson by lazy { Gson() } val registerResult = MutableLiveData() val loginResult = MutableLiveData() + val userDetailResult = MutableLiveData() fun register( account: String, @@ -48,6 +52,8 @@ }) fun enter(sid: String, account: String, secretKey: String) = launch({ + //记录登录时间,用于判断token失效 + SaveKeyValues.putValue(LocaleConstant.LOGIN_TIME, System.currentTimeMillis()) val response = RetrofitServiceManager.login(sid, account, secretKey) val responseCode = response.separateResponseCode() if (responseCode == 200) { @@ -63,4 +69,31 @@ loadState.value = LoadState.Fail it.printStackTrace() }) + + fun obtainUserDetail(account: String) = launch({ + val response = RetrofitServiceManager.obtainUserDetail(account) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + userDetailResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } + }, { + it.printStackTrace() + }) + + fun updateUserInfo(userData: UserDetailModel.DataModel) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.updateUserInfo(userData) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_solid_layout_gray_radius_7.xml b/app/src/main/res/drawable/bg_solid_layout_gray_radius_7.xml new file mode 100644 index 0000000..10bc801 --- /dev/null +++ b/app/src/main/res/drawable/bg_solid_layout_gray_radius_7.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_edit_user.xml b/app/src/main/res/layout/activity_edit_user.xml index 0818a49..2e02b12 100644 --- a/app/src/main/res/layout/activity_edit_user.xml +++ b/app/src/main/res/layout/activity_edit_user.xml @@ -5,106 +5,161 @@ android:background="@color/white" android:orientation="vertical"> - + + + + + + + + + + + + + - + + + + android:id="@+id/changeAvatarView" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/dp_10" + android:gravity="center" + android:text="点击更换头像" + android:textColor="@color/mainTextColor" + android:textSize="@dimen/sp_16" /> + - + - - + - + - + - + + - + - - + - + - + - + + - + - - + - + - + - + + - + - - + - + - + - + + - - - - - - + + \ No newline at end of file