Commit 47267ca3 authored by shohboz's avatar shohboz

[UPD] MUS-136 Feature, forget password updated and success and some changes

parent a7cfcb82
......@@ -54,6 +54,7 @@
<entry key="app/src/main/res/layout/item_pin.xml" value="0.23497267759562843" />
<entry key="app/src/main/res/layout/layout_ask_create_task.xml" value="0.22643442622950818" />
<entry key="app/src/main/res/layout/layout_exit.xml" value="0.25625" />
<entry key="app/src/main/res/layout/layout_sender.xml" value="0.25625" />
<entry key="app/src/main/res/layout/motion_layout.xml" value="0.266796875" />
<entry key="app/src/main/res/menu/bottom_nav_menu.xml" value="0.3416666666666667" />
<entry key="app/src/main/res/xml/layout_description.xml" value="0.25625" />
......
......@@ -4,11 +4,10 @@ import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.navigation.NavController
import androidx.navigation.findNavController
import androidx.navigation.fragment.NavHostFragment
import dagger.hilt.android.AndroidEntryPoint
import uz.ssd.mobiuz.databinding.ActivityAuthBinding
import uz.ssd.mobiuz.utils.CONSTANTS
import uz.ssd.mobiuz.ui.global.CONSTANTS
import uz.ssd.mobiuz.utils.Utils
@AndroidEntryPoint
......
......@@ -7,7 +7,7 @@ import androidx.appcompat.app.AppCompatActivity
import dagger.hilt.android.AndroidEntryPoint
import uz.ssd.mobiuz.databinding.ActivityLanguageBinding
import uz.ssd.mobiuz.model.SharedPref
import uz.ssd.mobiuz.utils.CONSTANTS
import uz.ssd.mobiuz.ui.global.CONSTANTS
import javax.inject.Inject
@AndroidEntryPoint
......
package uz.ssd.mobiuz
import android.content.Intent
import android.graphics.Color
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContentProviderCompat.requireContext
import androidx.lifecycle.LiveData
import androidx.navigation.NavController
import com.google.android.material.bottomnavigation.BottomNavigationView
import dagger.hilt.android.AndroidEntryPoint
import uz.ssd.mobiuz.databinding.ActivityMainBinding
import uz.ssd.mobiuz.model.SharedPref
import uz.ssd.mobiuz.ui.auth.FullScreenDialog
import uz.ssd.mobiuz.utils.CONSTANTS
import uz.ssd.mobiuz.ui.global.FullScreenDialog
import uz.ssd.mobiuz.ui.global.CONSTANTS
import uz.ssd.mobiuz.utils.extensions.customLog
import uz.ssd.mobiuz.utils.extensions.setupWithNavController
import javax.inject.Inject
......@@ -43,7 +45,15 @@ class MainActivity : AppCompatActivity() {
val arg = it.getStringExtra(CONSTANTS.FIRST) ?: ""
if (arg.isEmpty()) {
val dialog = FullScreenDialog()
dialog.setOnPinDoneListener { }
dialog.setOnPinDoneListener {
pref.setUserToken("")
pref.isRegistered = false
pref.pin_code = ""
val intent = Intent(this, AuthActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_TASK_ON_HOME
startActivity(intent)
finish()
}
dialog.show(supportFragmentManager, "tag")
}
}
......
......@@ -8,7 +8,7 @@ import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.delay
import uz.ssd.mobiuz.databinding.ActivitySplashBinding
import uz.ssd.mobiuz.model.SharedPref
import uz.ssd.mobiuz.utils.CONSTANTS
import uz.ssd.mobiuz.ui.global.CONSTANTS
import javax.inject.Inject
@AndroidEntryPoint
......@@ -37,7 +37,7 @@ class SplashActivity : AppCompatActivity() {
}
pref.pin_code.isEmpty() -> {
startActivity(Intent(this@SplashActivity, AuthActivity::class.java).putExtra(CONSTANTS.TYPE_AUTH,CONSTANTS.PIN_CODE))
startActivity(Intent(this@SplashActivity, AuthActivity::class.java).putExtra(CONSTANTS.TYPE_AUTH, CONSTANTS.PIN_CODE))
}
else -> {
......
package uz.ssd.mobiuz.di
import android.content.Context
import android.os.Build
import com.readystatesoftware.chuck.ChuckInterceptor
import dagger.Module
import dagger.Provides
......@@ -14,12 +13,10 @@ import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
import retrofit2.adapter.rxjava3.RxJava3CallAdapterFactory
import retrofit2.converter.gson.GsonConverterFactory
import uz.ssd.mobiuz.BuildConfig
import uz.ssd.mobiuz.model.SharedPref
import uz.ssd.mobiuz.network.api.ApiService
import uz.ssd.mobiuz.utils.CONSTANTS
import uz.ssd.mobiuz.ui.global.CONSTANTS
import uz.ssd.mobiuz.utils.Utils
import java.util.*
import javax.inject.Singleton
@Module
......
......@@ -30,4 +30,19 @@ interface ApiService {
@POST("main/index")
suspend fun mainIndex(): ResponseObject<Customer>
@POST("customer/forget-password")
suspend fun forgetPassword(
@Body req: UserAuth
): ResponseList<Any>
@POST("customer/check-reset-code")
suspend fun checkResetCode(
@Body req: UserAuth
): ResponseList<Any>
@POST("customer/reset-password")
suspend fun resetPassword(
@Body req: UserAuth
): ResponseObject<GenerateToken>
}
\ No newline at end of file
package uz.ssd.mobiuz.network.model
data class Customer(
var customer: CustomerData
var customer: CustomerData?
)
data class CustomerData(
var info: CustomerInfo,
var info: CustomerInfo?,
var name: String
)
data class CustomerInfo(
var balance: CustomerInfoBalance,
var counters: CustomerInfoCounters
var balance: CustomerInfoBalance?,
var counters: CustomerInfoCounters?
)
data class CustomerInfoBalance(
......@@ -20,13 +20,13 @@ data class CustomerInfoBalance(
)
data class CustomerInfoCounters(
var BYTE: CodeValueUnit,
var ITEM: CodeValueUnit,
var SECOND: CodeValueUnit
var BYTE: CodeValueUnit?,
var ITEM: CodeValueUnit?,
var SECOND: CodeValueUnit?
)
data class CodeValueUnit(
var code: String,
var value: Int,
var unit: String,
var code: String?,
var value: Int?,
var unit: String?,
)
\ No newline at end of file
......@@ -7,6 +7,7 @@ import uz.ssd.mobiuz.model.UserAuth
import uz.ssd.mobiuz.network.api.ApiService
import uz.ssd.mobiuz.network.model.Action
import uz.ssd.mobiuz.network.model.Customer
import uz.ssd.mobiuz.network.model.GenerateToken
import uz.ssd.mobiuz.network.model.UiStateObject
import uz.ssd.mobiuz.utils.extensions.userMessage
import javax.inject.Inject
......@@ -30,7 +31,6 @@ class AuthRepository @Inject constructor(
else -> UiStateObject.ERROR(res.message)
}
} catch (e: Exception) {
UiStateObject.ERROR(e.userMessage(context))
}
......@@ -108,4 +108,59 @@ class AuthRepository @Inject constructor(
}
}
suspend fun checkResetCode(data: UserAuth): UiStateObject<String> {
return try {
val res = apiService.checkResetCode(data)
when {
res.status -> {
UiStateObject.SUCCESS(res.message)
}
res.errors.isNotEmpty() -> {
UiStateObject.ERRORS(res.errors)
}
else -> UiStateObject.ERROR(res.message)
}
} catch (e: Exception) {
UiStateObject.ERROR(e.userMessage(context))
}
}
suspend fun resetPassword(data: UserAuth): UiStateObject<String> {
return try {
val res = apiService.resetPassword(data)
when {
res.status -> {
pref.setUserToken(res.data?.token)
UiStateObject.SUCCESS(res.message)
}
res.errors.isNotEmpty() -> {
UiStateObject.ERRORS(res.errors)
}
else -> UiStateObject.ERROR(res.message)
}
} catch (e: Exception) {
UiStateObject.ERROR(e.userMessage(context))
}
}
suspend fun forgetPassword(data: UserAuth): UiStateObject<String> {
return try {
val res = apiService.forgetPassword(data)
when {
res.status -> {
UiStateObject.SUCCESS(res.message)
}
res.errors.isNotEmpty() -> {
UiStateObject.ERRORS(res.errors)
}
else -> UiStateObject.ERROR(res.message)
}
} catch (e: Exception) {
UiStateObject.ERROR(e.userMessage(context))
}
}
}
\ No newline at end of file
......@@ -52,4 +52,31 @@ class AuthViewModel @Inject constructor(
_loginUiState.value = repository.loginUser(data)
_loginUiState.value = UiStateObject.EMPTY
}
private val _forgetPasswordUiState = MutableStateFlow<UiStateObject<String>>(UiStateObject.EMPTY)
val forgetPasswordUiState: StateFlow<UiStateObject<String>> = _forgetPasswordUiState
fun forgetPassword(data: UserAuth) = viewModelScope.launch {
_forgetPasswordUiState.value = UiStateObject.LOADING
_forgetPasswordUiState.value = repository.forgetPassword(data)
_forgetPasswordUiState.value = UiStateObject.EMPTY
}
private val _checkResetCodeUiState = MutableStateFlow<UiStateObject<String>>(UiStateObject.EMPTY)
val checkResetCodeUiState: StateFlow<UiStateObject<String>> = _checkResetCodeUiState
fun checkResetCode(data: UserAuth) = viewModelScope.launch {
_checkResetCodeUiState.value = UiStateObject.LOADING
_checkResetCodeUiState.value = repository.checkResetCode(data)
_checkResetCodeUiState.value = UiStateObject.EMPTY
}
private val _resetPasswordUiState = MutableStateFlow<UiStateObject<String>>(UiStateObject.EMPTY)
val resetPasswordUiState: StateFlow<UiStateObject<String>> = _resetPasswordUiState
fun resetPassword(data: UserAuth) = viewModelScope.launch {
_resetPasswordUiState.value = UiStateObject.LOADING
_resetPasswordUiState.value = repository.resetPassword(data)
_resetPasswordUiState.value = UiStateObject.EMPTY
}
}
\ No newline at end of file
package uz.ssd.mobiuz.ui.auth
import android.app.AlertDialog
import android.content.Context
import android.view.LayoutInflater
import android.view.animation.AnimationUtils
import android.widget.TextView
import androidx.core.view.isVisible
import androidx.recyclerview.widget.LinearLayoutManager
import uz.ssd.mobiuz.R
import uz.ssd.mobiuz.databinding.FragmentPinDialogBinding
import uz.ssd.mobiuz.model.PinData
import uz.ssd.mobiuz.model.SharedPref
import uz.ssd.mobiuz.utils.extensions.SingleBlock
class PinDialogFragment(context: Context) : AlertDialog(context,R.style.FullScreenDialog) {
lateinit var pref: SharedPref
private var _bn: FragmentPinDialogBinding? = null
private val bn get() = _bn ?: throw NullPointerException("cannot inflate")
private val data = ArrayList<PinData>()
private val pinAdapter = PinAdapter()
private var listener: SingleBlock<Unit>? = null
init {
_bn = FragmentPinDialogBinding.inflate(LayoutInflater.from(context))
pref = SharedPref(context)
setView(bn.root)
setCancelable(false)
setUpUI()
}
fun setUpUI() {
bn.apply {
loadData()
rvPin.layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
rvPin.setHasFixedSize(true)
rvPin.adapter = pinAdapter
txtNotPin.isVisible = false
pinAdapter.setOnDoneListener {
if (pref.pin_code == it) {
listener?.invoke(Unit)
txtNotPin.isVisible = false
dismiss()
} else {
cardPin.startAnimation(AnimationUtils.loadAnimation(context, R.anim.shake))
txtNotPin.isVisible = true
}
}
for (i in 0 until btnViewGroup.childCount) {
btnViewGroup.getChildAt(i).setOnClickListener {
if (it.id == R.id.btn_remove) {
pinAdapter.removeItem()
txtNotPin.isVisible = false
} else {
val text = it as TextView
pinAdapter.addItem(text.text.toString().toInt())
}
}
}
}
}
fun setOnPinDoneListener(block: SingleBlock<Unit>) {
listener = block
}
private fun loadData() {
data.clear()
for (i in 0..3) {
data.add(PinData(-1))
}
pinAdapter.submitList(data)
}
}
\ No newline at end of file
package uz.ssd.mobiuz.ui.auth
package uz.ssd.mobiuz.ui.auth.biometric
import android.Manifest
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.os.Build
import android.os.Bundle
import android.view.View
import androidx.core.app.ActivityCompat
import androidx.core.app.ActivityCompat.requestPermissions
import androidx.core.content.ContextCompat
import androidx.core.os.bundleOf
import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavController
import androidx.navigation.fragment.NavHostFragment
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.collect
import uz.ssd.mobiuz.BuildConfig
import uz.ssd.mobiuz.MainActivity
import uz.ssd.mobiuz.R
import uz.ssd.mobiuz.databinding.FragmentBiometricBinding
import uz.ssd.mobiuz.network.model.UiStateObject
import uz.ssd.mobiuz.ui.base.BaseFragment
import uz.ssd.mobiuz.utils.ButtonClick
import uz.ssd.mobiuz.utils.CONSTANTS
import uz.ssd.mobiuz.utils.Utils
import uz.ssd.mobiuz.utils.extensions.showMessage
import uz.ssd.mobiuz.ui.global.ButtonClick
import uz.ssd.mobiuz.ui.global.CONSTANTS
@AndroidEntryPoint
class BiometricFragment : BaseFragment(R.layout.fragment_biometric) {
......@@ -86,7 +77,7 @@ class BiometricFragment : BaseFragment(R.layout.fragment_biometric) {
private fun navigate() {
val intent = Intent(requireContext(), MainActivity::class.java)
intent.putExtra(CONSTANTS.FIRST,CONSTANTS.FIRST)
intent.putExtra(CONSTANTS.FIRST, CONSTANTS.FIRST)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_TASK_ON_HOME
startActivity(intent)
requireActivity().finish()
......
package uz.ssd.mobiuz.ui.auth
package uz.ssd.mobiuz.ui.auth.check
import android.os.Bundle
import android.view.View
......@@ -15,13 +15,14 @@ import uz.ssd.mobiuz.R
import uz.ssd.mobiuz.databinding.FragmentCheckPhoneBinding
import uz.ssd.mobiuz.model.UserAuth
import uz.ssd.mobiuz.network.model.UiStateObject
import uz.ssd.mobiuz.ui.auth.AuthViewModel
import uz.ssd.mobiuz.ui.base.BaseFragment
import uz.ssd.mobiuz.ui.global.TextWatcherWrapper
import uz.ssd.mobiuz.utils.ButtonClick
import uz.ssd.mobiuz.utils.CONSTANTS
import uz.ssd.mobiuz.ui.global.ButtonClick
import uz.ssd.mobiuz.ui.global.CONSTANTS
import uz.ssd.mobiuz.utils.Utils
import uz.ssd.mobiuz.utils.extensions.customLog
import uz.ssd.mobiuz.utils.extensions.showMessage
import uz.ssd.mobiuz.utils.extensions.showCustomDialog
@AndroidEntryPoint
class CheckPhoneFragment : BaseFragment(R.layout.fragment_check_phone) {
......@@ -89,7 +90,7 @@ class CheckPhoneFragment : BaseFragment(R.layout.fragment_check_phone) {
is UiStateObject.ERROR -> {
bn.helperPhone.isVisible = false
showProgressDialog(false)
showMessage(it.message)
showCustomDialog(it.message,false){}
}
is UiStateObject.ERRORS -> {
......
package uz.ssd.mobiuz.ui.auth
package uz.ssd.mobiuz.ui.auth.login
import android.os.Bundle
import android.view.View
......@@ -14,12 +14,13 @@ import uz.ssd.mobiuz.R
import uz.ssd.mobiuz.databinding.FragmentLoginBinding
import uz.ssd.mobiuz.model.UserAuth
import uz.ssd.mobiuz.network.model.UiStateObject
import uz.ssd.mobiuz.ui.auth.AuthViewModel
import uz.ssd.mobiuz.ui.base.BaseFragment
import uz.ssd.mobiuz.ui.global.TextWatcherWrapper
import uz.ssd.mobiuz.utils.ButtonClick
import uz.ssd.mobiuz.utils.CONSTANTS
import uz.ssd.mobiuz.ui.global.ButtonClick
import uz.ssd.mobiuz.ui.global.CONSTANTS
import uz.ssd.mobiuz.utils.Utils
import uz.ssd.mobiuz.utils.extensions.showMessage
import uz.ssd.mobiuz.utils.extensions.showCustomDialog
@AndroidEntryPoint
class LoginFragment : BaseFragment(R.layout.fragment_login) {
......@@ -52,7 +53,7 @@ class LoginFragment : BaseFragment(R.layout.fragment_login) {
txtForgetPassword.setOnClickListener(object : ButtonClick() {
override fun onSingleClick(v: View?) {
navController.navigate(R.id.forgetVerificationFragment, bundleOf(CONSTANTS.PHONE to phone), Utils.navOptions())
viewModel.forgetPassword(UserAuth(phone.replace(" ", "").replace("+", "")))
}
})
......@@ -104,7 +105,7 @@ class LoginFragment : BaseFragment(R.layout.fragment_login) {
}
is UiStateObject.ERROR -> {
showProgressDialog(false)
showMessage(it.message)
showCustomDialog(it.message,false){}
bn.helperPassword.isVisible = false
bn.helperPhone.isVisible = false
}
......@@ -135,6 +136,33 @@ class LoginFragment : BaseFragment(R.layout.fragment_login) {
}
}
}
viewLifecycleOwner.lifecycleScope.launchWhenStarted {
viewModel.forgetPasswordUiState.collect {
when (it) {
is UiStateObject.SUCCESS -> {
showProgressDialog(false)
navController.navigate(R.id.verificationFragment,
bundleOf(
CONSTANTS.PHONE to phone,
CONSTANTS.TYPE_VERIFICATION to CONSTANTS.TYPE_FORGET
),
Utils.navOptions())
}
is UiStateObject.ERROR -> {
showProgressDialog(false)
showCustomDialog(it.message,false){}
}
is UiStateObject.ERRORS -> {
showProgressDialog(false)
}
is UiStateObject.LOADING -> {
showProgressDialog(true)
}
else -> Unit
}
}
}
}
override fun onDestroy() {
......
package uz.ssd.mobiuz.ui.auth
package uz.ssd.mobiuz.ui.auth.pin
import android.content.Intent
import android.os.Bundle
......@@ -7,7 +7,6 @@ import android.view.animation.AnimationUtils
import android.widget.TextView
import androidx.core.hardware.fingerprint.FingerprintManagerCompat
import androidx.core.view.isVisible
import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavController
import androidx.navigation.fragment.NavHostFragment
......@@ -20,7 +19,7 @@ import uz.ssd.mobiuz.databinding.FragmentPinBinding
import uz.ssd.mobiuz.model.PinData
import uz.ssd.mobiuz.model.SharedPref
import uz.ssd.mobiuz.ui.base.BaseFragment
import uz.ssd.mobiuz.utils.CONSTANTS
import uz.ssd.mobiuz.ui.global.CONSTANTS
import uz.ssd.mobiuz.utils.Utils
import javax.inject.Inject
......@@ -36,8 +35,6 @@ class ConfirmPinFragment : BaseFragment(R.layout.fragment_pin) {
private val data = ArrayList<PinData>()
private val pinAdapter = PinAdapter()
private val viewModel: AuthViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
......@@ -65,7 +62,7 @@ class ConfirmPinFragment : BaseFragment(R.layout.fragment_pin) {
txtNotPin.isVisible = false
pinAdapter.setOnDoneListener {
lifecycleScope.launchWhenCreated {
delay(500)
delay(200)
if (pinCode == it) {
pref.pin_code = pinCode
txtNotPin.isVisible = false
......@@ -104,7 +101,7 @@ class ConfirmPinFragment : BaseFragment(R.layout.fragment_pin) {
if (isEnabled) {
navController.navigate(R.id.biometricFragment, null, Utils.navOptions())
} else {
startActivity(Intent(requireContext(), MainActivity::class.java).putExtra(CONSTANTS.FIRST,CONSTANTS.FIRST))
startActivity(Intent(requireContext(), MainActivity::class.java).putExtra(CONSTANTS.FIRST, CONSTANTS.FIRST))
requireActivity().finish()
}
}
......
package uz.ssd.mobiuz.ui.auth
package uz.ssd.mobiuz.ui.auth.register
import android.os.Bundle
import android.view.View
......@@ -14,12 +14,13 @@ import uz.ssd.mobiuz.R
import uz.ssd.mobiuz.databinding.FragmentRegisterBinding
import uz.ssd.mobiuz.model.UserAuth
import uz.ssd.mobiuz.network.model.UiStateObject
import uz.ssd.mobiuz.ui.auth.AuthViewModel
import uz.ssd.mobiuz.ui.base.BaseFragment
import uz.ssd.mobiuz.ui.global.ButtonClick
import uz.ssd.mobiuz.ui.global.CONSTANTS
import uz.ssd.mobiuz.ui.global.TextWatcherWrapper
import uz.ssd.mobiuz.utils.ButtonClick
import uz.ssd.mobiuz.utils.CONSTANTS
import uz.ssd.mobiuz.utils.Utils
import uz.ssd.mobiuz.utils.extensions.showMessage
import uz.ssd.mobiuz.utils.extensions.showCustomDialog
@AndroidEntryPoint
class RegisterFragment : BaseFragment(R.layout.fragment_register) {
......@@ -30,11 +31,15 @@ class RegisterFragment : BaseFragment(R.layout.fragment_register) {
private val viewModel: AuthViewModel by viewModels()
private var phone = ""
private var type = ""
private var code = ""
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
phone = it.getString(CONSTANTS.PHONE) ?: ""
type = it.getString(CONSTANTS.TYPE_VERIFICATION) ?: ""
code = it.getString(CONSTANTS.PIN_CODE) ?: ""
}
}
......@@ -52,7 +57,7 @@ class RegisterFragment : BaseFragment(R.layout.fragment_register) {
super.onTextChanged(s, start, before, count)
txtCheckPassword.isVisible = (s.toString().length < 5)
val confirmText = inputConfirm.text.toString().trim()
if(confirmText.isNotEmpty()){
if (confirmText.isNotEmpty()) {
if (s.toString() == confirmText) {
imageCheck.setImageResource(R.drawable.ic_baseline_check_circle)
txtCheckConfirm.text = getString(R.string.password_same)
......@@ -66,7 +71,7 @@ class RegisterFragment : BaseFragment(R.layout.fragment_register) {
}
imageCheck.isVisible = true
txtCheckConfirm.isVisible = true
}else{
} else {
imageCheck.isVisible = false
txtCheckConfirm.isVisible = false
}
......@@ -101,10 +106,14 @@ class RegisterFragment : BaseFragment(R.layout.fragment_register) {
when {
password.length < 5 || password != confirm -> {
// 0700224 50 gaz
}
else -> {
viewModel.register(UserAuth(phone.replace(" ", "").replace("+", ""), password))
if (type == CONSTANTS.TYPE_FORGET) {
viewModel.resetPassword(UserAuth(phone.replace(" ", "").replace("+", ""), password,code))
} else {
viewModel.register(UserAuth(phone.replace(" ", "").replace("+", ""), password))
}
}
}
......@@ -127,7 +136,39 @@ class RegisterFragment : BaseFragment(R.layout.fragment_register) {
}
is UiStateObject.ERROR -> {
showProgressDialog(false)
showMessage(it.message)
showCustomDialog(it.message, false) {}
}
is UiStateObject.ERRORS -> {
showProgressDialog(false)
var message = ""
it.errors.forEach {
message += it.message
}
// 97 756 5078
showCustomDialog(message, false) {}
}
is UiStateObject.LOADING -> {
showProgressDialog(true)
}
else -> Unit
}
}
}
viewLifecycleOwner.lifecycleScope.launchWhenStarted {
viewModel.resetPasswordUiState.collect {
when (it) {
is UiStateObject.SUCCESS -> {
showProgressDialog(false)
showCustomDialog("Password successfully updated", true) {
navController.popBackStack()
navController.navigate(R.id.pinFragment,null,Utils.navOptions())
}
}
is UiStateObject.ERROR -> {
showProgressDialog(false)
showCustomDialog(it.message, false) {}
}
is UiStateObject.ERRORS -> {
......@@ -137,7 +178,7 @@ class RegisterFragment : BaseFragment(R.layout.fragment_register) {
message += it.message
}
// 97 756 5078
showMessage(message)
showCustomDialog(message, false) {}
}
is UiStateObject.LOADING -> {
showProgressDialog(true)
......
package uz.ssd.mobiuz.ui.auth
package uz.ssd.mobiuz.ui.auth.verification
import android.os.Bundle
import android.view.View
import android.view.animation.AnimationUtils
import androidx.core.os.bundleOf
import androidx.core.view.isVisible
import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
......@@ -15,13 +16,14 @@ import uz.ssd.mobiuz.databinding.FragmentVerificationBinding
import uz.ssd.mobiuz.model.SharedPref
import uz.ssd.mobiuz.model.UserAuth
import uz.ssd.mobiuz.network.model.UiStateObject
import uz.ssd.mobiuz.ui.auth.AuthViewModel
import uz.ssd.mobiuz.ui.base.BaseFragment
import uz.ssd.mobiuz.ui.global.TextWatcherWrapper
import uz.ssd.mobiuz.utils.ButtonClick
import uz.ssd.mobiuz.utils.CONSTANTS
import uz.ssd.mobiuz.ui.global.ButtonClick
import uz.ssd.mobiuz.ui.global.CONSTANTS
import uz.ssd.mobiuz.utils.Utils
import uz.ssd.mobiuz.utils.extensions.hideKeyboard
import uz.ssd.mobiuz.utils.extensions.showMessage
import uz.ssd.mobiuz.utils.hideKeyboard
import uz.ssd.mobiuz.utils.extensions.showCustomDialog
import javax.inject.Inject
@AndroidEntryPoint
......@@ -38,11 +40,13 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) {
private var phone = ""
private var type = ""
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
phone = it.getString(CONSTANTS.PHONE) ?: ""
type = it.getString(CONSTANTS.TYPE_VERIFICATION) ?: ""
}
}
......@@ -77,9 +81,13 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) {
btnLogin.setOnClickListener(object : ButtonClick() {
override fun onSingleClick(v: View?) {
getLinePinCodes()
if (code.length == 6) {
viewModel.verification(UserAuth(phone.replace("+", "").replace(" ", ""), null, code))
val auth = UserAuth(phone.replace("+", "").replace(" ", ""), null, code)
if(type == CONSTANTS.TYPE_FORGET){
viewModel.checkResetCode(auth)
}else{
viewModel.verification(auth)
}
}
})
......@@ -110,7 +118,46 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) {
showProgressDialog(false)
bn.lineField.startAnimation(AnimationUtils.loadAnimation(requireContext(), R.anim.shake))
bn.helperLineField.isVisible = false
showMessage(it.message)
showCustomDialog(it.message,false){}
}
is UiStateObject.ERRORS -> {
showProgressDialog(false)
it.errors.forEach {
if (it.key == "code") {
bn.helperLineField.isVisible = true
bn.helperLineField.text = it.message
} else bn.helperLineField.isVisible = false
}
bn.lineField.startAnimation(AnimationUtils.loadAnimation(requireContext(), R.anim.shake))
}
is UiStateObject.LOADING -> {
bn.helperLineField.isVisible = false
showProgressDialog(true)
}
else -> Unit
}
}
}
viewLifecycleOwner.lifecycleScope.launchWhenStarted {
viewModel.checkResetCodeUiState.collect {
when (it) {
is UiStateObject.SUCCESS -> {
showProgressDialog(false)
bn.helperLineField.isVisible = false
pref.userPhone = phone
navController.navigate(R.id.registerFragment,
bundleOf(
CONSTANTS.PHONE to phone,
CONSTANTS.TYPE_VERIFICATION to CONSTANTS.TYPE_FORGET,
CONSTANTS.PIN_CODE to code,
),
Utils.navOptions())
}
is UiStateObject.ERROR -> {
showProgressDialog(false)
bn.lineField.startAnimation(AnimationUtils.loadAnimation(requireContext(), R.anim.shake))
bn.helperLineField.isVisible = false
showCustomDialog(it.message,false){}
}
is UiStateObject.ERRORS -> {
showProgressDialog(false)
......@@ -121,7 +168,6 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) {
} else bn.helperLineField.isVisible = false
}
bn.lineField.startAnimation(AnimationUtils.loadAnimation(requireContext(), R.anim.shake))
// showMessage(it.message)
}
is UiStateObject.LOADING -> {
bn.helperLineField.isVisible = false
......
package uz.ssd.mobiuz.ui.forget
import android.os.Bundle
import android.view.View
import androidx.core.view.isVisible
import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavController
import androidx.navigation.fragment.NavHostFragment
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.collect
import uz.ssd.mobiuz.R
import uz.ssd.mobiuz.databinding.FragmentRegisterBinding
import uz.ssd.mobiuz.model.UserAuth
import uz.ssd.mobiuz.network.model.UiStateObject
import uz.ssd.mobiuz.ui.auth.AuthViewModel
import uz.ssd.mobiuz.ui.base.BaseFragment
import uz.ssd.mobiuz.ui.global.TextWatcherWrapper
import uz.ssd.mobiuz.utils.ButtonClick
import uz.ssd.mobiuz.utils.Utils
import uz.ssd.mobiuz.utils.extensions.showMessage
@AndroidEntryPoint
class ForgetPasswordFragment : BaseFragment(R.layout.fragment_register) {
private var _bn: FragmentRegisterBinding? = null
private val bn get() = _bn ?: throw NullPointerException("cannot inflate")
private val navController: NavController by lazy(LazyThreadSafetyMode.NONE) { NavHostFragment.findNavController(this) }
private val viewModel: AuthViewModel by viewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_bn = FragmentRegisterBinding.bind(view)
setUpUI()
collects()
}
override fun setUpUI() {
bn.apply {
inputPassword.addTextChangedListener(object : TextWatcherWrapper() {
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
super.onTextChanged(s, start, before, count)
txtCheckPassword.isVisible = (s.toString().length < 6)
}
})
inputConfirm.addTextChangedListener(object : TextWatcherWrapper() {
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
super.onTextChanged(s, start, before, count)
if (s.toString().length > 5 && s.toString() == inputPassword.text.toString().trim()) {
imageCheck.setImageResource(R.drawable.ic_baseline_check_circle)
txtCheckConfirm.text = getString(R.string.password_same)
txtCheckConfirm.setTextColor(requireActivity().resources.getColor(R.color.green))
btnLogin.isEnabled = true
} else {
imageCheck.setImageResource(R.drawable.ic_vector_error)
txtCheckConfirm.text = getString(R.string.password_not_same)
btnLogin.isEnabled = true
txtCheckConfirm.setTextColor(requireActivity().resources.getColor(R.color.red))
}
imageCheck.isVisible = true
txtCheckConfirm.isVisible = true
}
})
btnLogin.setOnClickListener(object : ButtonClick() {
override fun onSingleClick(v: View?) {
val phone = inputPassword.text.toString().trim()
viewModel.login(UserAuth("phone", phone))
}
})
toolbar.setNavigationOnClickListener {
navController.navigateUp()
}
}
}
override fun collects() {
viewLifecycleOwner.lifecycleScope.launchWhenStarted {
viewModel.loginUiState.collect {
when (it) {
is UiStateObject.SUCCESS -> {
showProgressDialog(false)
navController.navigate(R.id.pinFragment, null, Utils.navOptions())
}
is UiStateObject.ERROR -> {
showProgressDialog(false)
showMessage(it.message)
}
is UiStateObject.LOADING -> {
showProgressDialog(true)
}
else -> Unit
}
}
}
}
override fun onDestroy() {
_bn = null
super.onDestroy()
}
}
\ No newline at end of file
package uz.ssd.mobiuz.ui.forget
import android.graphics.Color
import android.os.Bundle
import android.view.View
import androidx.core.view.isVisible
import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavController
import androidx.navigation.fragment.NavHostFragment
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.collect
import uz.ssd.mobiuz.R
import uz.ssd.mobiuz.databinding.FragmentVerificationBinding
import uz.ssd.mobiuz.model.UserAuth
import uz.ssd.mobiuz.network.model.UiStateObject
import uz.ssd.mobiuz.ui.auth.AuthViewModel
import uz.ssd.mobiuz.ui.base.BaseFragment
import uz.ssd.mobiuz.utils.ButtonClick
import uz.ssd.mobiuz.utils.CONSTANTS
import uz.ssd.mobiuz.utils.Utils
import uz.ssd.mobiuz.utils.extensions.hideKeyboard
import uz.ssd.mobiuz.utils.extensions.showMessage
@AndroidEntryPoint
class ForgetVerificationFragment : BaseFragment(R.layout.fragment_verification) {
private var _bn: FragmentVerificationBinding? = null
private val bn get() = _bn ?: throw NullPointerException("cannot inflate")
private val viewModel: AuthViewModel by viewModels()
private val navController: NavController by lazy(LazyThreadSafetyMode.NONE) { NavHostFragment.findNavController(this) }
var code = ""
private var phone = ""
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
phone = it.getString(CONSTANTS.PHONE) ?: ""
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_bn = FragmentVerificationBinding.bind(view)
setUpUI()
count(true)
collects()
}
override fun setUpUI() {
bn.apply {
toolbar.setNavigationOnClickListener {
navController.navigateUp()
}
viewGroup.setOnClickListener(object : ButtonClick(){
override fun onSingleClick(v: View?) {
v?.hideKeyboard()
}
})
loadEdited()
btnLogin.setOnClickListener(object : ButtonClick() {
override fun onSingleClick(v: View?) {
getLinePinCodes()
if(code.length == 6){
viewModel.login(UserAuth("phone", "password"))
}else{
clearPins()
}
}
})
countWaitText.setTextColor(Color.parseColor("#97ADB6"))
sentCodeAgain.setTextColor(Color.parseColor("#FF9500"))
sentCodeAgain.setOnClickListener {
count(true)
}
coutdownView.setOnCountdownEndListener {
count(false)
}
}
}
private fun loadEdited() {
}
private fun getLinePinCodes() {
}
private fun clearPins() {
}
override fun collects() {
viewLifecycleOwner.lifecycleScope.launchWhenStarted {
viewModel.loginUiState.collect {
when (it) {
is UiStateObject.SUCCESS -> {
showProgressDialog(false)
navController.navigate(R.id.forgetPasswordFragment, null, Utils.navOptions())
}
is UiStateObject.ERROR -> {
showProgressDialog(false)
showMessage(it.message)
}
is UiStateObject.LOADING -> {
showProgressDialog(true)
}
else -> Unit
}
}
}
}
private fun count(status: Boolean) {
bn.apply {
sentCodeAgain.isVisible = !status
countWaitText.isVisible = status
coutdownView.isVisible = status
if (status) coutdownView.start(60000)
}
}
override fun onDestroy() {
_bn = null
super.onDestroy()
}
}
package uz.ssd.mobiuz.utils
package uz.ssd.mobiuz.ui.global
import android.os.SystemClock
import android.view.View
......
package uz.ssd.mobiuz.utils
package uz.ssd.mobiuz.ui.global
object CONSTANTS {
const val BASE_URL = "http://10.160.45.60/api/v1/"
......@@ -9,6 +9,8 @@ object CONSTANTS {
const val PHONE = "phone"
const val PIN_CODE = "pin_code"
const val TYPE_AUTH = "type_auth"
const val TYPE_VERIFICATION = "type_verification"
const val TYPE_FORGET = "type_forget"
const val FIRST = "first"
const val LONGITUDE = 69.2602108116081
......
package uz.ssd.mobiuz.ui.base
package uz.ssd.mobiuz.ui.global
import android.os.Bundle
import android.view.LayoutInflater
......
package uz.ssd.mobiuz.ui.auth
package uz.ssd.mobiuz.ui.global
import android.os.Bundle
import android.view.View
......@@ -14,6 +14,7 @@ import uz.ssd.mobiuz.R
import uz.ssd.mobiuz.databinding.FragmentPinDialogBinding
import uz.ssd.mobiuz.model.PinData
import uz.ssd.mobiuz.model.SharedPref
import uz.ssd.mobiuz.ui.auth.pin.PinAdapter
import uz.ssd.mobiuz.utils.extensions.SingleBlock
import javax.inject.Inject
......@@ -37,6 +38,7 @@ class FullScreenDialog : DialogFragment(R.layout.fragment_pin_dialog) {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_bn = FragmentPinDialogBinding.bind(view)
isCancelable = false
setUpUI()
}
......@@ -46,13 +48,17 @@ class FullScreenDialog : DialogFragment(R.layout.fragment_pin_dialog) {
loadData()
rvPin.layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)
withPassword.setOnClickListener(object : ButtonClick(){
override fun onSingleClick(v: View?) {
listener?.invoke(Unit)
}
})
rvPin.adapter = pinAdapter
txtNotPin.isVisible = false
pinAdapter.setOnDoneListener {
lifecycleScope.launchWhenCreated {
delay(200)
if (pref.pin_code == it) {
listener?.invoke(Unit)
txtNotPin.isVisible = false
dismiss()
} else {
......
package uz.ssd.mobiuz.ui.global
import android.graphics.Color
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.DialogFragment
import uz.ssd.mobiuz.R
import uz.ssd.mobiuz.databinding.LayoutSenderBinding
import uz.ssd.mobiuz.utils.extensions.SingleBlock
class SenderDialog(
private val txtDescription: String,
private val status: Boolean
) : DialogFragment() {
private var listener: SingleBlock<Unit>? = null
private var _bn: LayoutSenderBinding? = null
private val bn get() = _bn!!
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setStyle(STYLE_NO_TITLE, R.style.CustomDialog)
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_bn = LayoutSenderBinding.inflate(inflater, container, false)
return bn.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
isCancelable = false
bn.apply {
if (!status) {
title.text = getString(R.string.error_data)
description.setTextColor(Color.RED)
title.setTextColor(Color.RED)
lottie.setAnimation(R.raw.error_lottie)
}
description.text = txtDescription
btnOk.setOnClickListener {
listener?.invoke(Unit)
dismiss()
}
}
}
fun setOnClickListener(block: SingleBlock<Unit>) {
listener = block
}
override fun onDestroy() {
super.onDestroy()
_bn = null
}
}
......@@ -4,26 +4,19 @@ import android.annotation.SuppressLint
import android.content.Intent
import android.os.Bundle
import android.view.View
import androidx.core.os.bundleOf
import androidx.core.view.isVisible
import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.collect
import uz.ssd.mobiuz.AuthActivity
import uz.ssd.mobiuz.MainActivity
import uz.ssd.mobiuz.R
import uz.ssd.mobiuz.databinding.FragmentHomeBinding
import uz.ssd.mobiuz.model.SharedPref
import uz.ssd.mobiuz.network.model.Customer
import uz.ssd.mobiuz.network.model.UiStateObject
import uz.ssd.mobiuz.ui.base.BaseFragment
import uz.ssd.mobiuz.utils.ButtonClick
import uz.ssd.mobiuz.utils.CONSTANTS
import uz.ssd.mobiuz.utils.Utils
import uz.ssd.mobiuz.utils.extensions.showCustomExitDialog
import uz.ssd.mobiuz.utils.extensions.showMessage
import uz.ssd.mobiuz.utils.extensions.toMoneyFormat
import uz.ssd.mobiuz.ui.global.ButtonClick
import uz.ssd.mobiuz.utils.extensions.*
import javax.inject.Inject
......@@ -86,7 +79,7 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) {
}
is UiStateObject.ERROR -> {
showProgressDialog(false)
showMessage(it.message)
// showCustomDialog(it.message,false){}
}
is UiStateObject.ERRORS -> {
......@@ -103,23 +96,29 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) {
@SuppressLint("SetTextI18n")
private fun loadData() {
customer?.customer?.info?.let {
bn.apply {
txtBalance.text = "${it.balance.amount.toMoneyFormat()} ${it.balance.currency}"
it.counters.let {
txtCountMb.text = it.BYTE.value.toMoneyFormat()
txtTypeMb.text = it.BYTE.unit
txtCountMinut.text = it.SECOND.value.toMoneyFormat()
txtTypeMinut.text = it.SECOND.unit
txtCountSms.text = it.ITEM.value.toMoneyFormat()
txtTypeSms.text = it.ITEM.unit
try {
customLog("customer:$customer")
customer?.customer?.info?.let {
bn.apply {
txtBalance.text = "${it.balance?.amount?.toMoneyFormat()} ${it.balance?.currency}"
it.counters.let {
txtCountMb.text = it?.BYTE?.value?.toMoneyFormat() ?: "0"
txtTypeMb.text = it?.BYTE?.unit ?: "mb"
txtCountMinut.text = it?.SECOND?.value?.toMoneyFormat() ?: "0"
txtTypeMinut.text = it?.SECOND?.unit ?: "min"
txtCountSms.text = it?.ITEM?.value?.toMoneyFormat() ?: "0"
txtTypeSms.text = it?.ITEM?.unit ?: "sms"
}
txtMyNumber.text = pref.userPhone
}
txtMyNumber.text = pref.userPhone
}
}catch (e:Exception){
showCustomDialog(e.userMessage(requireContext()),false){}
}
}
override fun onDestroy() {
......
package uz.ssd.mobiuz.utils.extensions
package uz.ssd.mobiuz.utils
import android.content.Context
import android.view.View
......
......@@ -5,11 +5,13 @@ import android.content.Context
import android.util.Log
import android.widget.Toast
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import androidx.recyclerview.widget.RecyclerView
import com.google.gson.JsonSyntaxException
import retrofit2.HttpException
import uz.ssd.mobiuz.R
import uz.ssd.mobiuz.ui.base.ExitDialog
import uz.ssd.mobiuz.ui.global.ExitDialog
import uz.ssd.mobiuz.ui.global.SenderDialog
import java.io.IOException
import java.net.ConnectException
......@@ -68,6 +70,22 @@ fun Fragment.showCustomExitDialog(block: () -> Unit) {
dialog.show(childFragmentManager, "childFragmentManager")
}
fun Fragment.showCustomDialog(string: String, status: Boolean, block: () -> Unit) {
val dialog = SenderDialog(string, status)
dialog.setOnClickListener {
block()
}
dialog.show(childFragmentManager, "childFragmentManager")
}
fun FragmentActivity.showCustomDialog(string: String, status: Boolean, block: () -> Unit) {
val dialog = SenderDialog(string, status)
dialog.setOnClickListener {
block()
}
dialog.show(supportFragmentManager, "supportFragmentManager")
}
typealias SingleBlock<T> = (T) -> Unit
typealias MultiBlock<T, K> = (T, K) -> Unit
typealias ThreeBlock<T, K, M> = (T, K, M) -> Unit
......@@ -6,7 +6,7 @@
android:layout_height="match_parent"
android:background="@drawable/gradient"
android:orientation="vertical"
tools:context=".ui.auth.BiometricFragment">
tools:context=".ui.auth.biometric.BiometricFragment">
<FrameLayout
android:layout_width="match_parent"
......
......@@ -93,7 +93,7 @@
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="24 350 UZS"
android:text="0 UZS"
android:id="@+id/txt_balance"
android:textColor="@color/white"
android:textSize="20sp"
......@@ -133,7 +133,7 @@
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Mobi 50"
android:text="My tarif"
android:textSize="20sp"
android:textStyle="bold" />
......@@ -141,7 +141,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:text="50 000 Сум/мес"
android:text="0 Сум/мес"
android:textColor="@color/light" />
</FrameLayout>
......@@ -181,7 +181,7 @@
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginVertical="6dp"
tools:text="4,5"
android:text="0"
android:id="@+id/txt_count_mb"
android:textSize="20sp"
android:textStyle="bold" />
......@@ -190,7 +190,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
tools:text="гигабайт"
android:text="mb"
android:id="@+id/txt_type_mb"
android:textColor="@color/light_dark" />
</LinearLayout>
......@@ -212,7 +212,7 @@
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginVertical="6dp"
tools:text="234"
android:text="0"
android:id="@+id/txt_count_minut"
android:textSize="20sp"
android:textStyle="bold" />
......@@ -221,7 +221,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
tools:text="минут"
android:text="min"
android:id="@+id/txt_type_minut"
android:textColor="@color/light_dark" />
</LinearLayout>
......@@ -243,7 +243,7 @@
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginVertical="6dp"
tools:text="500"
android:text="0"
android:id="@+id/txt_count_sms"
android:textSize="20sp"
android:textStyle="bold" />
......@@ -252,7 +252,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
tools:text="SMS"
android:text="SMS"
android:id="@+id/txt_type_sms"
android:textColor="@color/light_dark" />
</LinearLayout>
......@@ -282,7 +282,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:text="22 Декабря"
tools:text="22 Декабря"
android:textColor="@color/light_dark"
android:textStyle="bold" />
</FrameLayout>
......
......@@ -147,6 +147,20 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/layout_input_confirm" />
<TextView
android:id="@+id/txt_helper_mobiuz"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/_6sdp"
android:text="@string/helper_mobiuz"
android:background="?android:selectableItemBackground"
android:textColor="@color/light_dark"
android:textStyle="bold"
android:layout_marginTop="@dimen/_6sdp"
android:layout_marginHorizontal="@dimen/_10sdp"
app:layout_constraintStart_toStartOf="@id/layout_input_password"
app:layout_constraintTop_toBottomOf="@id/txt_forget_password" />
<Button
android:id="@+id/btn_login"
android:layout_width="match_parent"
......
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
<com.google.android.material.card.MaterialCardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
app:cardCornerRadius="@dimen/_10sdp"
app:cardUseCompatPadding="true"
android:layout_height="wrap_content"
android:padding="18dp">
......@@ -17,5 +19,5 @@
app:lottie_speed="1"
tools:ignore="ContentDescription" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
......@@ -135,6 +135,20 @@
app:layout_constraintStart_toEndOf="@id/image_check"
app:layout_constraintTop_toBottomOf="@id/layout_input_confirm" />
<TextView
android:id="@+id/txt_helper_mobiuz"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/_6sdp"
android:text="@string/helper_mobiuz"
android:background="?android:selectableItemBackground"
android:textColor="@color/light_dark"
android:textStyle="bold"
android:layout_marginTop="@dimen/_6sdp"
android:layout_marginHorizontal="@dimen/_10sdp"
app:layout_constraintStart_toStartOf="@id/layout_input_password"
app:layout_constraintTop_toBottomOf="@id/txt_check_confirm" />
<Button
android:id="@+id/btn_login"
android:layout_width="match_parent"
......
......@@ -28,14 +28,14 @@
<com.poovam.pinedittextfield.SquarePinField
android:id="@+id/line_field"
android:layout_width="wrap_content"
android:layout_width="@dimen/_220sdp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="@dimen/_12sdp"
android:paddingHorizontal="@dimen/_14sdp"
android:layout_marginTop="@dimen/_80sdp"
android:hint="******"
android:orientation="horizontal"
android:textColorHint="@color/black"
android:textSize="@dimen/_14sdp"
android:textSize="@dimen/_16sdp"
android:textStyle="bold"
android:textSelectHandle="@drawable/text_handle"
android:inputType="number"
......
......@@ -3,6 +3,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:cardUseCompatPadding="true"
app:cardBackgroundColor="@color/white"
app:cardCornerRadius="12dp">
......
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:cardCornerRadius="12dp"
app:cardUseCompatPadding="true"
app:cardBackgroundColor="@color/white"
xmlns:tools="http://schemas.android.com/tools"
android:layout_height="wrap_content">
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="wrap_content"
android:orientation="vertical"
android:clickable="true"
android:minWidth="@dimen/_200sdp"
android:focusable="true"
android:layout_height="wrap_content">
<com.airbnb.lottie.LottieAnimationView
android:layout_width="80dp"
android:id="@+id/lottie"
android:layout_height="80dp"
android:adjustViewBounds="true"
app:lottie_autoPlay="true"
android:layout_gravity="center"
app:lottie_loop="true"
android:layout_marginTop="16dp"
app:lottie_rawRes="@raw/success_lottie"
app:lottie_speed="1"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:textSize="16sp"
android:id="@+id/title"
android:textStyle="bold"
android:layout_marginHorizontal="26dp"
android:text="@string/successfully"
android:layout_height="wrap_content"/>
<TextView
android:layout_width="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:textSize="16sp"
android:layout_marginTop="10dp"
android:layout_marginBottom="20dp"
android:id="@+id/description"
android:layout_marginHorizontal="26dp"
android:text="description"
android:layout_height="wrap_content"/>
<View
android:layout_width="match_parent"
android:background="@color/light"
android:layout_height="1dp"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:id="@+id/btn_ok"
android:textSize="14sp"
android:textStyle="bold"
android:elevation="2dp"
android:paddingVertical="16dp"
android:gravity="center"
android:text="@string/ok"/>
</androidx.appcompat.widget.LinearLayoutCompat>
</com.google.android.material.card.MaterialCardView>
\ No newline at end of file
......@@ -7,49 +7,40 @@
<fragment
android:id="@+id/checkPhoneFragment"
android:name="uz.ssd.mobiuz.ui.auth.CheckPhoneFragment"
android:name="uz.ssd.mobiuz.ui.auth.check.CheckPhoneFragment"
android:label="fragment_login"
tools:layout="@layout/fragment_check_phone" />
<fragment
android:id="@+id/verificationFragment"
android:name="uz.ssd.mobiuz.ui.auth.VerificationFragment"
android:name="uz.ssd.mobiuz.ui.auth.verification.VerificationFragment"
android:label="fragment_verification"
tools:layout="@layout/fragment_verification" />
<fragment
android:id="@+id/registerFragment"
android:name="uz.ssd.mobiuz.ui.auth.RegisterFragment"
android:name="uz.ssd.mobiuz.ui.auth.register.RegisterFragment"
android:label="EnterPasswordFragment"
tools:layout="@layout/fragment_register" />
<fragment
android:id="@+id/loginFragment"
android:name="uz.ssd.mobiuz.ui.auth.LoginFragment"
android:name="uz.ssd.mobiuz.ui.auth.login.LoginFragment"
android:label="fragment_password"
tools:layout="@layout/fragment_login" />
<fragment
android:id="@+id/forgetPasswordFragment"
android:name="uz.ssd.mobiuz.ui.forget.ForgetPasswordFragment"
android:label="ForgetPasswordFragment"
tools:layout="@layout/fragment_forget_password" />
<fragment
android:id="@+id/pinFragment"
android:name="uz.ssd.mobiuz.ui.auth.PinFragment"
android:name="uz.ssd.mobiuz.ui.auth.pin.PinFragment"
android:label="PinFragment"
tools:layout="@layout/fragment_pin" />
<fragment
android:id="@+id/biometricFragment"
android:name="uz.ssd.mobiuz.ui.auth.BiometricFragment"
android:name="uz.ssd.mobiuz.ui.auth.biometric.BiometricFragment"
android:label="fragment_biometric"
tools:layout="@layout/fragment_biometric" />
<fragment
android:id="@+id/forgetVerificationFragment"
android:name="uz.ssd.mobiuz.ui.forget.ForgetVerificationFragment"
android:label="ForgetPinFragment"
tools:layout="@layout/fragment_pin" />
<fragment
android:id="@+id/confirmPinFragment"
android:name="uz.ssd.mobiuz.ui.auth.ConfirmPinFragment"
android:name="uz.ssd.mobiuz.ui.auth.pin.ConfirmPinFragment"
android:label="ConfirmPinFragment"
tools:layout="@layout/fragment_pin" />
</navigation>
\ No newline at end of file
......@@ -73,5 +73,9 @@
<string name="are_you_sure">Do you want to exit?</string>
<string name="no">No</string>
<string name="yes">Yes</string>
<string name="successfully">Successfully</string>
<string name="ok">Ok</string>
<string name="error_data">Error</string>
<string name="helper_mobiuz">Для входа вы можете использовать пароль от интернет-помощника www.mobi.uz</string>
</resources>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment