获取邀请人信息和扫一扫加入xxx家庭
This commit is contained in:
@@ -0,0 +1,7 @@
|
|||||||
|
package com.ckkj.defense_device.bean
|
||||||
|
|
||||||
|
|
||||||
|
data class JoinTheFamilyBean(
|
||||||
|
val parentId: String,
|
||||||
|
val inviteCode: String,
|
||||||
|
)
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
package com.ckkj.defense_device.bean
|
||||||
|
|
||||||
|
data class SelectInviterInfoBean(
|
||||||
|
val code: String
|
||||||
|
)
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.ckkj.defense_device.home
|
package com.ckkj.defense_device.home
|
||||||
|
|
||||||
|
import android.content.Intent
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import com.ckkj.defense_device.R
|
import com.ckkj.defense_device.R
|
||||||
@@ -7,6 +8,10 @@ import com.ckkj.defense_device.base.BaseActivity
|
|||||||
import com.ckkj.defense_device.databinding.HomeActivityBinding
|
import com.ckkj.defense_device.databinding.HomeActivityBinding
|
||||||
|
|
||||||
class HomeActivity : BaseActivity() {
|
class HomeActivity : BaseActivity() {
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
const val EXTRA_REFRESH = "extra_refresh"
|
||||||
|
}
|
||||||
// ViewBinding 核心对象
|
// ViewBinding 核心对象
|
||||||
private lateinit var binding: HomeActivityBinding
|
private lateinit var binding: HomeActivityBinding
|
||||||
|
|
||||||
@@ -49,6 +54,28 @@ class HomeActivity : BaseActivity() {
|
|||||||
binding.ivProfile.setImageResource(R.mipmap.profile_checked)
|
binding.ivProfile.setImageResource(R.mipmap.profile_checked)
|
||||||
binding.tvProfile.setTextColor(resources.getColor(R.color.ic_selected))
|
binding.tvProfile.setTextColor(resources.getColor(R.color.ic_selected))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
handleRefreshIntent(intent)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onNewIntent(intent: Intent?) {
|
||||||
|
super.onNewIntent(intent)
|
||||||
|
if (intent != null) {
|
||||||
|
setIntent(intent)
|
||||||
|
handleRefreshIntent(intent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun handleRefreshIntent(intent: Intent) {
|
||||||
|
if (intent.getBooleanExtra(EXTRA_REFRESH, false)) {
|
||||||
|
intent.removeExtra(EXTRA_REFRESH)
|
||||||
|
switchFragment(homeMenuFragment)
|
||||||
|
binding.ivHome.setImageResource(R.mipmap.home_checked)
|
||||||
|
binding.tvHome.setTextColor(resources.getColor(R.color.ic_selected))
|
||||||
|
binding.ivProfile.setImageResource(R.mipmap.profile)
|
||||||
|
binding.tvProfile.setTextColor(resources.getColor(R.color.ic_normal))
|
||||||
|
homeMenuFragment.refreshHomeData()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -27,8 +27,10 @@ import com.ckkj.defense_device.adapter.FamilyAdapter
|
|||||||
import com.ckkj.defense_device.bean.DeviceBean
|
import com.ckkj.defense_device.bean.DeviceBean
|
||||||
import com.ckkj.defense_device.bean.FamilyBean
|
import com.ckkj.defense_device.bean.FamilyBean
|
||||||
import com.ckkj.defense_device.bean.SwitchFamilyRequest
|
import com.ckkj.defense_device.bean.SwitchFamilyRequest
|
||||||
|
import com.ckkj.defense_device.bean.SelectInviterInfoBean
|
||||||
import com.ckkj.defense_device.databinding.HomeMenuFragmentBinding
|
import com.ckkj.defense_device.databinding.HomeMenuFragmentBinding
|
||||||
import com.ckkj.defense_device.liveVideo.LiveVideoActivity
|
import com.ckkj.defense_device.liveVideo.LiveVideoActivity
|
||||||
|
import com.ckkj.defense_device.personal.JoinFamilyInviteActivity
|
||||||
import com.ckkj.defense_device.utils.DeviceIdEvent
|
import com.ckkj.defense_device.utils.DeviceIdEvent
|
||||||
import com.ckkj.defense_device.utils.DeviceUpdateEvent
|
import com.ckkj.defense_device.utils.DeviceUpdateEvent
|
||||||
import com.ckkj.defense_device.utils.FamilySwitchEvent
|
import com.ckkj.defense_device.utils.FamilySwitchEvent
|
||||||
@@ -36,6 +38,7 @@ import com.ckkj.defense_device.utils.MessageStatusManager
|
|||||||
import com.ckkj.defense_device.utils.RetrofitNetwork
|
import com.ckkj.defense_device.utils.RetrofitNetwork
|
||||||
import com.ckkj.defense_device.utils.UserinfoUtil
|
import com.ckkj.defense_device.utils.UserinfoUtil
|
||||||
import com.ckkj.defense_device.view.DefenseDialogs
|
import com.ckkj.defense_device.view.DefenseDialogs
|
||||||
|
import com.ckkj.defense_device.view.LoadingDialog
|
||||||
import com.ckkj.defense_device.view.showDefenseDialog
|
import com.ckkj.defense_device.view.showDefenseDialog
|
||||||
import com.gyf.immersionbar.ImmersionBar
|
import com.gyf.immersionbar.ImmersionBar
|
||||||
import com.maning.mlkitscanner.scan.MNScanManager
|
import com.maning.mlkitscanner.scan.MNScanManager
|
||||||
@@ -44,6 +47,7 @@ import kotlinx.coroutines.CoroutineScope
|
|||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
|
import org.json.JSONObject
|
||||||
//主页碎片
|
//主页碎片
|
||||||
class HomeMenuFragment : Fragment() {
|
class HomeMenuFragment : Fragment() {
|
||||||
// ViewBinding
|
// ViewBinding
|
||||||
@@ -63,13 +67,13 @@ class HomeMenuFragment : Fragment() {
|
|||||||
ActivityResultContracts.RequestMultiplePermissions()
|
ActivityResultContracts.RequestMultiplePermissions()
|
||||||
) { permissions ->
|
) { permissions ->
|
||||||
val cameraGranted = permissions[Manifest.permission.CAMERA] ?: false
|
val cameraGranted = permissions[Manifest.permission.CAMERA] ?: false
|
||||||
|
|
||||||
val storageGranted = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
val storageGranted = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
||||||
permissions[Manifest.permission.READ_MEDIA_IMAGES] ?: false
|
permissions[Manifest.permission.READ_MEDIA_IMAGES] ?: false
|
||||||
} else {
|
} else {
|
||||||
permissions[Manifest.permission.READ_EXTERNAL_STORAGE] ?: false
|
permissions[Manifest.permission.READ_EXTERNAL_STORAGE] ?: false
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cameraGranted && storageGranted) {
|
if (cameraGranted && storageGranted) {
|
||||||
startScan()
|
startScan()
|
||||||
} else {
|
} else {
|
||||||
@@ -82,7 +86,7 @@ class HomeMenuFragment : Fragment() {
|
|||||||
requireContext(),
|
requireContext(),
|
||||||
Manifest.permission.CAMERA
|
Manifest.permission.CAMERA
|
||||||
)
|
)
|
||||||
|
|
||||||
val storagePermission = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
val storagePermission = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
||||||
ContextCompat.checkSelfPermission(
|
ContextCompat.checkSelfPermission(
|
||||||
requireContext(),
|
requireContext(),
|
||||||
@@ -95,7 +99,7 @@ class HomeMenuFragment : Fragment() {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cameraPermission == PackageManager.PERMISSION_GRANTED &&
|
if (cameraPermission == PackageManager.PERMISSION_GRANTED &&
|
||||||
storagePermission == PackageManager.PERMISSION_GRANTED) {
|
storagePermission == PackageManager.PERMISSION_GRANTED) {
|
||||||
startScan()
|
startScan()
|
||||||
} else {
|
} else {
|
||||||
@@ -121,23 +125,86 @@ class HomeMenuFragment : Fragment() {
|
|||||||
MNScanManager.RESULT_SUCCESS -> {
|
MNScanManager.RESULT_SUCCESS -> {
|
||||||
val result = data?.getStringArrayListExtra(MNScanManager.INTENT_KEY_RESULT_SUCCESS)
|
val result = data?.getStringArrayListExtra(MNScanManager.INTENT_KEY_RESULT_SUCCESS)
|
||||||
if (!result.isNullOrEmpty()) {
|
if (!result.isNullOrEmpty()) {
|
||||||
ToastUtils.showToast(requireContext(), "扫码成功: $result")
|
val inviteCode = parseInviteCode(result[0])
|
||||||
|
if (inviteCode.isNullOrEmpty()) {
|
||||||
|
Toast.makeText(requireContext(), "无效的邀请码", Toast.LENGTH_SHORT).show()
|
||||||
|
} else {
|
||||||
|
fetchInviterInfo(inviteCode)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
ToastUtils.showToast(requireContext(), "扫码结果为空")
|
Toast.makeText(requireContext(), "扫码结果为空", Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
MNScanManager.RESULT_FAIL -> {
|
MNScanManager.RESULT_FAIL -> {
|
||||||
val error = data?.getStringExtra(MNScanManager.INTENT_KEY_RESULT_ERROR)
|
val error = data?.getStringExtra(MNScanManager.INTENT_KEY_RESULT_ERROR)
|
||||||
ToastUtils.showToast(requireContext(), "扫码失败: $error")
|
Toast.makeText(requireContext(), "扫码失败: $error", Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
MNScanManager.RESULT_CANCLE -> {
|
MNScanManager.RESULT_CANCLE -> {
|
||||||
ToastUtils.showToast(requireContext(), "扫码取消")
|
Toast.makeText(requireContext(), "扫码取消", Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun parseInviteCode(scanResult: String): String? {
|
||||||
|
val trimmed = scanResult.trim()
|
||||||
|
if (trimmed.isEmpty()) return null
|
||||||
|
return try {
|
||||||
|
if (trimmed.startsWith("{")) {
|
||||||
|
JSONObject(trimmed).optString("code").takeIf { it.isNotEmpty() }
|
||||||
|
} else {
|
||||||
|
trimmed
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
trimmed
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun fetchInviterInfo(inviteCode: String) {
|
||||||
|
val loadingDialog = LoadingDialog(requireActivity()).apply { show() }
|
||||||
|
CoroutineScope(Dispatchers.IO).launch {
|
||||||
|
try {
|
||||||
|
val response = RetrofitNetwork.getNetworkService()
|
||||||
|
.selectInviterInfo(SelectInviterInfoBean(code = inviteCode))
|
||||||
|
withContext(Dispatchers.Main) {
|
||||||
|
loadingDialog.dismiss()
|
||||||
|
if (response.code == 200 && response.data != null) {
|
||||||
|
val inviter = response.data
|
||||||
|
val parentId = inviter.resolveParentId()
|
||||||
|
if (parentId.isNullOrEmpty()) {
|
||||||
|
Toast.makeText(
|
||||||
|
requireContext(),
|
||||||
|
getString(R.string.network_error),
|
||||||
|
Toast.LENGTH_SHORT
|
||||||
|
).show()
|
||||||
|
return@withContext
|
||||||
|
}
|
||||||
|
val intent = Intent(requireContext(), JoinFamilyInviteActivity::class.java).apply {
|
||||||
|
putExtra(JoinFamilyInviteActivity.EXTRA_INVITE_CODE, inviteCode)
|
||||||
|
putExtra(JoinFamilyInviteActivity.EXTRA_NICK_NAME, inviter.nickName)
|
||||||
|
putExtra(JoinFamilyInviteActivity.EXTRA_AVATAR, inviter.avatar)
|
||||||
|
putExtra(JoinFamilyInviteActivity.EXTRA_PARENT_ID, parentId)
|
||||||
|
putExtra(JoinFamilyInviteActivity.EXTRA_USER_ID, inviter.userId)
|
||||||
|
}
|
||||||
|
startActivity(intent)
|
||||||
|
} else {
|
||||||
|
Toast.makeText(
|
||||||
|
requireContext(),
|
||||||
|
response.msg.ifBlank { getString(R.string.network_error) },
|
||||||
|
Toast.LENGTH_SHORT
|
||||||
|
).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
withContext(Dispatchers.Main) {
|
||||||
|
loadingDialog.dismiss()
|
||||||
|
Toast.makeText(requireContext(), R.string.network_error, Toast.LENGTH_SHORT).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private val unreadCountChangeListener = object : MessageStatusManager.UnreadCountChangeListener {
|
private val unreadCountChangeListener = object : MessageStatusManager.UnreadCountChangeListener {
|
||||||
override fun onUnreadCountChanged(count: Int) {
|
override fun onUnreadCountChanged(count: Int) {
|
||||||
updateUnreadCountUI(count)
|
updateUnreadCountUI(count)
|
||||||
@@ -202,7 +269,7 @@ class HomeMenuFragment : Fragment() {
|
|||||||
startColor = resources.getColor(R.color.gradientLayout1),
|
startColor = resources.getColor(R.color.gradientLayout1),
|
||||||
endColor = resources.getColor(R.color.gradientLayout2)
|
endColor = resources.getColor(R.color.gradientLayout2)
|
||||||
)
|
)
|
||||||
binding.message.setOnClickListener {
|
binding.message.setOnClickListener {
|
||||||
val intent = Intent(requireContext(), MessageActivity::class.java)
|
val intent = Intent(requireContext(), MessageActivity::class.java)
|
||||||
startActivity(intent)
|
startActivity(intent)
|
||||||
}
|
}
|
||||||
@@ -284,6 +351,10 @@ class HomeMenuFragment : Fragment() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun refreshHomeData() {
|
||||||
|
fetchFamilyList()
|
||||||
|
}
|
||||||
|
|
||||||
private fun fetchFamilyList() {
|
private fun fetchFamilyList() {
|
||||||
CoroutineScope(Dispatchers.IO).launch {
|
CoroutineScope(Dispatchers.IO).launch {
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import bean.ForgotRequest
|
|||||||
import com.ckkj.defense_device.R
|
import com.ckkj.defense_device.R
|
||||||
import com.ckkj.defense_device.databinding.ForgetPasswordActivityBinding
|
import com.ckkj.defense_device.databinding.ForgetPasswordActivityBinding
|
||||||
import com.ckkj.defense_device.utils.RetrofitNetwork
|
import com.ckkj.defense_device.utils.RetrofitNetwork
|
||||||
|
import com.ckkj.defense_device.view.LoadingDialog
|
||||||
import com.google.firebase.crashlytics.buildtools.reloc.org.apache.http.util.TextUtils
|
import com.google.firebase.crashlytics.buildtools.reloc.org.apache.http.util.TextUtils
|
||||||
import com.gyf.immersionbar.ImmersionBar
|
import com.gyf.immersionbar.ImmersionBar
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
@@ -20,6 +21,7 @@ import java.util.regex.Pattern
|
|||||||
|
|
||||||
class ForgetPasswordActivity : AppCompatActivity() {
|
class ForgetPasswordActivity : AppCompatActivity() {
|
||||||
private lateinit var binding: ForgetPasswordActivityBinding
|
private lateinit var binding: ForgetPasswordActivityBinding
|
||||||
|
private var isLoading = false
|
||||||
private var countDownTimer: CountDownTimer? = null
|
private var countDownTimer: CountDownTimer? = null
|
||||||
private var isSendingCode = false
|
private var isSendingCode = false
|
||||||
|
|
||||||
@@ -63,7 +65,9 @@ class ForgetPasswordActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
binding.btnNext.setOnClickListener {
|
binding.btnNext.setOnClickListener {
|
||||||
performResetPassword()
|
if (!isLoading) {
|
||||||
|
performResetPassword()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -163,8 +167,11 @@ class ForgetPasswordActivity : AppCompatActivity() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
isLoading = true
|
||||||
binding.btnNext.isEnabled = false
|
binding.btnNext.isEnabled = false
|
||||||
binding.btnNext.text = "重置中..."
|
val loadingDialog = LoadingDialog(this)
|
||||||
|
.setMessage(getString(R.string.resetting))
|
||||||
|
.apply { show() }
|
||||||
|
|
||||||
CoroutineScope(Dispatchers.IO).launch {
|
CoroutineScope(Dispatchers.IO).launch {
|
||||||
try {
|
try {
|
||||||
@@ -175,8 +182,9 @@ class ForgetPasswordActivity : AppCompatActivity() {
|
|||||||
)
|
)
|
||||||
val response = RetrofitNetwork.getNetworkService().forgotPassword(forgotRequest)
|
val response = RetrofitNetwork.getNetworkService().forgotPassword(forgotRequest)
|
||||||
withContext(Dispatchers.Main) {
|
withContext(Dispatchers.Main) {
|
||||||
|
isLoading = false
|
||||||
|
loadingDialog.dismiss()
|
||||||
binding.btnNext.isEnabled = true
|
binding.btnNext.isEnabled = true
|
||||||
binding.btnNext.text = "确定"
|
|
||||||
|
|
||||||
if (response.code == 200) {
|
if (response.code == 200) {
|
||||||
Toast.makeText(this@ForgetPasswordActivity, R.string.reset_success, Toast.LENGTH_SHORT).show()
|
Toast.makeText(this@ForgetPasswordActivity, R.string.reset_success, Toast.LENGTH_SHORT).show()
|
||||||
@@ -187,8 +195,9 @@ class ForgetPasswordActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
withContext(Dispatchers.Main) {
|
withContext(Dispatchers.Main) {
|
||||||
|
isLoading = false
|
||||||
|
loadingDialog.dismiss()
|
||||||
binding.btnNext.isEnabled = true
|
binding.btnNext.isEnabled = true
|
||||||
binding.btnNext.text = "确定"
|
|
||||||
Toast.makeText(this@ForgetPasswordActivity, R.string.network_error, Toast.LENGTH_SHORT).show()
|
Toast.makeText(this@ForgetPasswordActivity, R.string.network_error, Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import bean.RegisterRequest
|
|||||||
import com.ckkj.defense_device.R
|
import com.ckkj.defense_device.R
|
||||||
import com.ckkj.defense_device.databinding.RegisterActivityBinding
|
import com.ckkj.defense_device.databinding.RegisterActivityBinding
|
||||||
import com.ckkj.defense_device.utils.RetrofitNetwork
|
import com.ckkj.defense_device.utils.RetrofitNetwork
|
||||||
|
import com.ckkj.defense_device.view.LoadingDialog
|
||||||
import com.gyf.immersionbar.ImmersionBar
|
import com.gyf.immersionbar.ImmersionBar
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
@@ -158,7 +159,9 @@ class RegisterActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
isLoading = true
|
isLoading = true
|
||||||
binding.btnNext.isEnabled = false
|
binding.btnNext.isEnabled = false
|
||||||
binding.btnNext.text = getString(R.string.registering)
|
val loadingDialog = LoadingDialog(this)
|
||||||
|
.setMessage(getString(R.string.registering))
|
||||||
|
.apply { show() }
|
||||||
|
|
||||||
CoroutineScope(Dispatchers.IO).launch {
|
CoroutineScope(Dispatchers.IO).launch {
|
||||||
try {
|
try {
|
||||||
@@ -174,8 +177,8 @@ class RegisterActivity : AppCompatActivity() {
|
|||||||
val response = RetrofitNetwork.getNetworkService().register(registerRequest)
|
val response = RetrofitNetwork.getNetworkService().register(registerRequest)
|
||||||
withContext(Dispatchers.Main) {
|
withContext(Dispatchers.Main) {
|
||||||
isLoading = false
|
isLoading = false
|
||||||
|
loadingDialog.dismiss()
|
||||||
binding.btnNext.isEnabled = true
|
binding.btnNext.isEnabled = true
|
||||||
binding.btnNext.text = getString(R.string.next_step)
|
|
||||||
|
|
||||||
if (response.code == 200) {
|
if (response.code == 200) {
|
||||||
Toast.makeText(this@RegisterActivity, R.string.register_success, Toast.LENGTH_SHORT).show()
|
Toast.makeText(this@RegisterActivity, R.string.register_success, Toast.LENGTH_SHORT).show()
|
||||||
@@ -190,8 +193,8 @@ class RegisterActivity : AppCompatActivity() {
|
|||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
withContext(Dispatchers.Main) {
|
withContext(Dispatchers.Main) {
|
||||||
isLoading = false
|
isLoading = false
|
||||||
|
loadingDialog.dismiss()
|
||||||
binding.btnNext.isEnabled = true
|
binding.btnNext.isEnabled = true
|
||||||
binding.btnNext.text = getString(R.string.next_step)
|
|
||||||
Toast.makeText(this@RegisterActivity, R.string.network_error, Toast.LENGTH_SHORT).show()
|
Toast.makeText(this@RegisterActivity, R.string.network_error, Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import com.google.android.material.bottomsheet.BottomSheetDialog
|
|||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
import com.ckkj.defense_device.R
|
import com.ckkj.defense_device.R
|
||||||
import com.ckkj.defense_device.bean.RecommendationCodeBean
|
import com.ckkj.defense_device.bean.RecommendationCodeBean
|
||||||
|
import com.ckkj.defense_device.bean.SelectInviterInfoBean
|
||||||
import com.ckkj.defense_device.bean.VerifyOptionPasswordRequest
|
import com.ckkj.defense_device.bean.VerifyOptionPasswordRequest
|
||||||
import com.ckkj.defense_device.databinding.DialogExpireTimeBinding
|
import com.ckkj.defense_device.databinding.DialogExpireTimeBinding
|
||||||
import com.ckkj.defense_device.databinding.InvitationCodeActivityBinding
|
import com.ckkj.defense_device.databinding.InvitationCodeActivityBinding
|
||||||
@@ -38,6 +39,7 @@ import kotlinx.coroutines.CoroutineScope
|
|||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
|
import org.json.JSONObject
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.FileOutputStream
|
import java.io.FileOutputStream
|
||||||
import java.util.Hashtable
|
import java.util.Hashtable
|
||||||
@@ -172,23 +174,86 @@ class InvitationCodeActivity : AppCompatActivity() {
|
|||||||
MNScanManager.RESULT_SUCCESS -> {
|
MNScanManager.RESULT_SUCCESS -> {
|
||||||
val result = data?.getStringArrayListExtra(MNScanManager.INTENT_KEY_RESULT_SUCCESS)
|
val result = data?.getStringArrayListExtra(MNScanManager.INTENT_KEY_RESULT_SUCCESS)
|
||||||
if (!result.isNullOrEmpty()) {
|
if (!result.isNullOrEmpty()) {
|
||||||
ToastUtils.showToast(this@InvitationCodeActivity, "扫码成功: $result")
|
val inviteCode = parseInviteCode(result[0])
|
||||||
|
if (inviteCode.isNullOrEmpty()) {
|
||||||
|
Toast.makeText(this@InvitationCodeActivity, "无效的邀请码", Toast.LENGTH_SHORT).show()
|
||||||
|
} else {
|
||||||
|
fetchInviterInfo(inviteCode)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
ToastUtils.showToast(this@InvitationCodeActivity, "扫码结果为空")
|
Toast.makeText(this@InvitationCodeActivity, "扫码结果为空", Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
MNScanManager.RESULT_FAIL -> {
|
MNScanManager.RESULT_FAIL -> {
|
||||||
val error = data?.getStringExtra(MNScanManager.INTENT_KEY_RESULT_ERROR)
|
val error = data?.getStringExtra(MNScanManager.INTENT_KEY_RESULT_ERROR)
|
||||||
ToastUtils.showToast(this@InvitationCodeActivity, "扫码失败: $error")
|
Toast.makeText(this@InvitationCodeActivity, "扫码失败: $error", Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
MNScanManager.RESULT_CANCLE -> {
|
MNScanManager.RESULT_CANCLE -> {
|
||||||
ToastUtils.showToast(this@InvitationCodeActivity, "扫码取消")
|
Toast.makeText(this@InvitationCodeActivity, "扫码取消", Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun parseInviteCode(scanResult: String): String? {
|
||||||
|
val trimmed = scanResult.trim()
|
||||||
|
if (trimmed.isEmpty()) return null
|
||||||
|
return try {
|
||||||
|
if (trimmed.startsWith("{")) {
|
||||||
|
JSONObject(trimmed).optString("code").takeIf { it.isNotEmpty() }
|
||||||
|
} else {
|
||||||
|
trimmed
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
trimmed
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun fetchInviterInfo(inviteCode: String) {
|
||||||
|
val loadingDialog = LoadingDialog(this).apply { show() }
|
||||||
|
CoroutineScope(Dispatchers.IO).launch {
|
||||||
|
try {
|
||||||
|
val response = RetrofitNetwork.getNetworkService()
|
||||||
|
.selectInviterInfo(SelectInviterInfoBean(code = inviteCode))
|
||||||
|
withContext(Dispatchers.Main) {
|
||||||
|
loadingDialog.dismiss()
|
||||||
|
if (response.code == 200 && response.data != null) {
|
||||||
|
val inviter = response.data
|
||||||
|
val parentId = inviter.resolveParentId()
|
||||||
|
if (parentId.isNullOrEmpty()) {
|
||||||
|
Toast.makeText(
|
||||||
|
this@InvitationCodeActivity,
|
||||||
|
getString(R.string.network_error),
|
||||||
|
Toast.LENGTH_SHORT
|
||||||
|
).show()
|
||||||
|
return@withContext
|
||||||
|
}
|
||||||
|
val intent = Intent(this@InvitationCodeActivity, JoinFamilyInviteActivity::class.java).apply {
|
||||||
|
putExtra(JoinFamilyInviteActivity.EXTRA_INVITE_CODE, inviteCode)
|
||||||
|
putExtra(JoinFamilyInviteActivity.EXTRA_NICK_NAME, inviter.nickName)
|
||||||
|
putExtra(JoinFamilyInviteActivity.EXTRA_AVATAR, inviter.avatar)
|
||||||
|
putExtra(JoinFamilyInviteActivity.EXTRA_PARENT_ID, parentId)
|
||||||
|
putExtra(JoinFamilyInviteActivity.EXTRA_USER_ID, inviter.userId)
|
||||||
|
}
|
||||||
|
startActivity(intent)
|
||||||
|
} else {
|
||||||
|
Toast.makeText(
|
||||||
|
this@InvitationCodeActivity,
|
||||||
|
response.msg.ifBlank { getString(R.string.network_error) },
|
||||||
|
Toast.LENGTH_SHORT
|
||||||
|
).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
withContext(Dispatchers.Main) {
|
||||||
|
loadingDialog.dismiss()
|
||||||
|
Toast.makeText(this@InvitationCodeActivity, R.string.network_error, Toast.LENGTH_SHORT).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 生成或重新生成邀请码
|
* 生成或重新生成邀请码
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -1,14 +1,29 @@
|
|||||||
package com.ckkj.defense_device.personal
|
package com.ckkj.defense_device.personal
|
||||||
|
|
||||||
|
import android.content.Intent
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
|
import android.util.Log
|
||||||
|
import android.widget.Toast
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
|
import com.bumptech.glide.Glide
|
||||||
|
import com.bumptech.glide.request.RequestOptions
|
||||||
|
import com.ckkj.defense_device.R
|
||||||
|
import com.ckkj.defense_device.bean.JoinTheFamilyBean
|
||||||
import com.ckkj.defense_device.databinding.JoinFamilyInviteActivityBinding
|
import com.ckkj.defense_device.databinding.JoinFamilyInviteActivityBinding
|
||||||
|
import com.ckkj.defense_device.home.HomeActivity
|
||||||
|
import com.ckkj.defense_device.utils.RetrofitNetwork
|
||||||
|
import com.ckkj.defense_device.view.LoadingDialog
|
||||||
import com.gyf.immersionbar.ImmersionBar
|
import com.gyf.immersionbar.ImmersionBar
|
||||||
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
|
import kotlinx.coroutines.withContext
|
||||||
|
|
||||||
// 邀请加入家庭
|
// 邀请加入家庭
|
||||||
class JoinFamilyInviteActivity : AppCompatActivity() {
|
class JoinFamilyInviteActivity : AppCompatActivity() {
|
||||||
|
|
||||||
private lateinit var binding: JoinFamilyInviteActivityBinding
|
private lateinit var binding: JoinFamilyInviteActivityBinding
|
||||||
|
private var isLoading = false
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
@@ -21,5 +36,88 @@ class JoinFamilyInviteActivity : AppCompatActivity() {
|
|||||||
.init()
|
.init()
|
||||||
|
|
||||||
binding.ivBack.setOnClickListener { finish() }
|
binding.ivBack.setOnClickListener { finish() }
|
||||||
|
binding.btnJoinNow.setOnClickListener { joinFamily() }
|
||||||
|
displayInviterInfo()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun joinFamily() {
|
||||||
|
if (isLoading) return
|
||||||
|
|
||||||
|
val parentId = intent.getStringExtra(EXTRA_USER_ID).orEmpty()
|
||||||
|
val inviteCode = intent.getStringExtra(EXTRA_INVITE_CODE).orEmpty()
|
||||||
|
if (parentId.isEmpty() || inviteCode.isEmpty()) {
|
||||||
|
Log.e(TAG, "加入家庭参数无效: parentId=$parentId, inviteCode=$inviteCode")
|
||||||
|
Toast.makeText(this, R.string.network_error, Toast.LENGTH_SHORT).show()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
Log.e(TAG, "加入家庭请求: parentId=$parentId, inviteCode=$inviteCode")
|
||||||
|
isLoading = true
|
||||||
|
val loadingDialog = LoadingDialog(this).apply { show() }
|
||||||
|
CoroutineScope(Dispatchers.IO).launch {
|
||||||
|
try {
|
||||||
|
val response = RetrofitNetwork.getNetworkService()
|
||||||
|
.joinTheFamily(JoinTheFamilyBean(parentId = parentId, inviteCode = inviteCode))
|
||||||
|
Log.e(TAG, "加入家庭响应: code=${response.code}, msg=${response.msg}, data=${response.data}")
|
||||||
|
withContext(Dispatchers.Main) {
|
||||||
|
isLoading = false
|
||||||
|
loadingDialog.dismiss()
|
||||||
|
if (response.code == 200) {
|
||||||
|
Log.e(TAG, "加入家庭成功,返回首页刷新")
|
||||||
|
ToastUtils.showSuccess(this@JoinFamilyInviteActivity, getString(R.string.operation_success))
|
||||||
|
val homeIntent = Intent(this@JoinFamilyInviteActivity, HomeActivity::class.java).apply {
|
||||||
|
flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP
|
||||||
|
putExtra(HomeActivity.EXTRA_REFRESH, true)
|
||||||
|
}
|
||||||
|
startActivity(homeIntent)
|
||||||
|
finish()
|
||||||
|
} else {
|
||||||
|
Log.e(TAG, "加入家庭失败: code=${response.code}, msg=${response.msg}")
|
||||||
|
Toast.makeText(
|
||||||
|
this@JoinFamilyInviteActivity,
|
||||||
|
response.msg.ifBlank { getString(R.string.network_error) },
|
||||||
|
Toast.LENGTH_SHORT
|
||||||
|
).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Log.e(TAG, "加入家庭请求异常", e)
|
||||||
|
withContext(Dispatchers.Main) {
|
||||||
|
isLoading = false
|
||||||
|
loadingDialog.dismiss()
|
||||||
|
Toast.makeText(this@JoinFamilyInviteActivity, R.string.network_error, Toast.LENGTH_SHORT).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun displayInviterInfo() {
|
||||||
|
val nickName = intent.getStringExtra(EXTRA_NICK_NAME).orEmpty()
|
||||||
|
val avatar = intent.getStringExtra(EXTRA_AVATAR)
|
||||||
|
|
||||||
|
binding.tvNickname.text = nickName.ifEmpty { getString(R.string.nickname_placeholder) }
|
||||||
|
binding.tvInviteMessage.text = getString(
|
||||||
|
R.string.invite_join_family_message,
|
||||||
|
nickName.ifEmpty { getString(R.string.nickname_placeholder) }
|
||||||
|
)
|
||||||
|
|
||||||
|
val requestOptions = RequestOptions()
|
||||||
|
.placeholder(R.mipmap.img)
|
||||||
|
.error(R.mipmap.img)
|
||||||
|
|
||||||
|
Glide.with(this)
|
||||||
|
.load(avatar)
|
||||||
|
.apply(requestOptions)
|
||||||
|
.circleCrop()
|
||||||
|
.into(binding.ivAvatar)
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private const val TAG = "JoinFamilyInviteActivity"
|
||||||
|
const val EXTRA_INVITE_CODE = "invite_code"
|
||||||
|
const val EXTRA_NICK_NAME = "nick_name"
|
||||||
|
const val EXTRA_AVATAR = "avatar"
|
||||||
|
const val EXTRA_PARENT_ID = "parent_id"
|
||||||
|
const val EXTRA_USER_ID = "user_id"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,10 +14,13 @@ import com.ckkj.defense_device.bean.DeleteBean
|
|||||||
import com.ckkj.defense_device.bean.DeleteDeviceUserRequest
|
import com.ckkj.defense_device.bean.DeleteDeviceUserRequest
|
||||||
import com.ckkj.defense_device.bean.DeviceAlarmResponse
|
import com.ckkj.defense_device.bean.DeviceAlarmResponse
|
||||||
import com.ckkj.defense_device.bean.FamilyMembersBean
|
import com.ckkj.defense_device.bean.FamilyMembersBean
|
||||||
|
import com.ckkj.defense_device.bean.InviterInfoBean
|
||||||
|
import com.ckkj.defense_device.bean.JoinTheFamilyBean
|
||||||
import com.ckkj.defense_device.bean.MessageBean
|
import com.ckkj.defense_device.bean.MessageBean
|
||||||
import com.ckkj.defense_device.bean.MessageListResponse
|
import com.ckkj.defense_device.bean.MessageListResponse
|
||||||
import com.ckkj.defense_device.bean.ObtainInviterInformationBean
|
import com.ckkj.defense_device.bean.ObtainInviterInformationBean
|
||||||
import com.ckkj.defense_device.bean.ObtainInviterInformationRequest
|
import com.ckkj.defense_device.bean.ObtainInviterInformationRequest
|
||||||
|
import com.ckkj.defense_device.bean.SelectInviterInfoBean
|
||||||
import com.ckkj.defense_device.bean.SwitchFamilyRequest
|
import com.ckkj.defense_device.bean.SwitchFamilyRequest
|
||||||
import com.ckkj.defense_device.bean.UpdateFamilyUserRequest
|
import com.ckkj.defense_device.bean.UpdateFamilyUserRequest
|
||||||
import com.ckkj.defense_device.bean.UpdatePassword
|
import com.ckkj.defense_device.bean.UpdatePassword
|
||||||
@@ -192,7 +195,7 @@ interface ApiService {
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取邀请人信息
|
* 获取家庭成员信息
|
||||||
*/
|
*/
|
||||||
@POST("/app/obtainInviterInformation")
|
@POST("/app/obtainInviterInformation")
|
||||||
suspend fun obtainInviterInformation(@Body request: ObtainInviterInformationRequest): GetCodeBean<ObtainInviterInformationBean>
|
suspend fun obtainInviterInformation(@Body request: ObtainInviterInformationRequest): GetCodeBean<ObtainInviterInformationBean>
|
||||||
@@ -255,5 +258,18 @@ interface ApiService {
|
|||||||
suspend fun updateFamilyUser(@Body request: UpdateFamilyUserRequest): GetCodeBean<Any>
|
suspend fun updateFamilyUser(@Body request: UpdateFamilyUserRequest): GetCodeBean<Any>
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取邀请人信息
|
||||||
|
*/
|
||||||
|
@POST("/app/selectInviterInfo")
|
||||||
|
suspend fun selectInviterInfo(@Body request: SelectInviterInfoBean): GetCodeBean<InviterInfoBean>
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 加入xxx家庭
|
||||||
|
*/
|
||||||
|
@POST("/app/joinTheFamily")
|
||||||
|
suspend fun joinTheFamily(@Body request: JoinTheFamilyBean): GetCodeBean<Any>
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,8 +12,8 @@ import java.util.concurrent.TimeUnit
|
|||||||
object RetrofitNetwork {
|
object RetrofitNetwork {
|
||||||
|
|
||||||
private const val DEFAULT_TIMEOUT = 30L
|
private const val DEFAULT_TIMEOUT = 30L
|
||||||
//const val BASE_URL = "https://stem-boozy-margarine.ngrok-free.dev"
|
const val BASE_URL = "https://stem-boozy-margarine.ngrok-free.dev"
|
||||||
const val BASE_URL = "http://service.reinkun.com:8001"
|
//const val BASE_URL = "http://service.reinkun.com:8001"
|
||||||
|
|
||||||
private var retrofit: Retrofit? = null
|
private var retrofit: Retrofit? = null
|
||||||
private val gson = Gson()
|
private val gson = Gson()
|
||||||
|
|||||||
@@ -48,6 +48,7 @@
|
|||||||
<string name="reset_password">重置密码</string>
|
<string name="reset_password">重置密码</string>
|
||||||
<string name="new_password">新密码</string>
|
<string name="new_password">新密码</string>
|
||||||
<string name="reset_success">密码重置成功</string>
|
<string name="reset_success">密码重置成功</string>
|
||||||
|
<string name="resetting">重置中...</string>
|
||||||
|
|
||||||
<!-- Face Login/Verification -->
|
<!-- Face Login/Verification -->
|
||||||
<string name="face_login">人脸登录</string>
|
<string name="face_login">人脸登录</string>
|
||||||
|
|||||||
@@ -44,6 +44,7 @@
|
|||||||
<string name="reset_password">Reset Password</string>
|
<string name="reset_password">Reset Password</string>
|
||||||
<string name="new_password">New Password</string>
|
<string name="new_password">New Password</string>
|
||||||
<string name="reset_success">Password reset successful</string>
|
<string name="reset_success">Password reset successful</string>
|
||||||
|
<string name="resetting">Resetting...</string>
|
||||||
|
|
||||||
<!-- Face Login/Verification -->
|
<!-- Face Login/Verification -->
|
||||||
<string name="face_capture_hint">Please align your face within the frame</string>
|
<string name="face_capture_hint">Please align your face within the frame</string>
|
||||||
|
|||||||
Reference in New Issue
Block a user