Commit a714b180 authored by shohboz's avatar shohboz

[ADD] MUS-125 Feature, add registration api and server connection

parent 9212468a
......@@ -4,6 +4,8 @@
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.USE_BIOMETRIC" />
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
<uses-permission android:name="android.permission.INTERNET" />
<application
android:name=".app.App"
......@@ -16,14 +18,20 @@
android:usesCleartextTraffic="true">
<activity
android:name=".LanguageActivity"
android:screenOrientation="portrait"
android:configChanges="orientation"
android:windowSoftInputMode="adjustResize"
android:exported="false" />
<activity
android:name=".MainActivity"
android:screenOrientation="portrait"
android:configChanges="orientation"
android:windowSoftInputMode="adjustResize"
android:exported="false" />
<activity
android:name=".AuthActivity"
android:screenOrientation="portrait"
android:configChanges="orientation"
android:windowSoftInputMode="adjustResize"
android:exported="false" />
<activity
......
......@@ -3,8 +3,12 @@ package uz.ssd.mobiuz
import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.biometric.BiometricManager
import androidx.biometric.BiometricPrompt
import androidx.core.hardware.fingerprint.FingerprintManagerCompat
import dagger.hilt.android.AndroidEntryPoint
import uz.ssd.mobiuz.databinding.ActivityAuthBinding
import uz.ssd.mobiuz.utils.extensions.customLog
@AndroidEntryPoint
class AuthActivity : AppCompatActivity() {
......@@ -18,6 +22,10 @@ class AuthActivity : AppCompatActivity() {
setContentView(bn.root)
window.decorView.systemUiVisibility = window.decorView.systemUiVisibility or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
// val bio = BiometricManager.from(this).canAuthenticate()
// val man = FingerprintManagerCompat.from(this)
// val manager = man.isHardwareDetected && man.hasEnrolledFingerprints()
// customLog("bio:$bio $manager")
}
override fun onDestroy() {
......
package uz.ssd.mobiuz
import android.os.Bundle
import android.view.View
import androidx.fragment.app.viewModels
import dagger.hilt.android.AndroidEntryPoint
import uz.ssd.mobiuz.databinding.FragmentBlankBinding
import uz.ssd.mobiuz.ui.auth.AuthViewModel
import uz.ssd.mobiuz.ui.base.BaseFragment
@AndroidEntryPoint
class BlankFragment : BaseFragment(R.layout.fragment_blank) {
private var _bn: FragmentBlankBinding? = null
private val bn get() = _bn ?: throw NullPointerException("cannot inflate")
private val viewModel: AuthViewModel by viewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_bn = FragmentBlankBinding.bind(view)
setUpUI()
collects()
}
override fun setUpUI() {
}
override fun collects() {
}
override fun onDestroy() {
_bn = null
super.onDestroy()
}
}
\ No newline at end of file
......@@ -25,11 +25,6 @@ class LanguageActivity : AppCompatActivity() {
setContentView(bn.root)
window.decorView.systemUiVisibility = window.decorView.systemUiVisibility or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
// window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
// window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
// window.setTitleColor(Color.BLACK)
bn.apply {
uzbekLang.setOnClickListener {
setLangAndNavigate(CONSTANTS.UZ)
......
......@@ -25,8 +25,6 @@ class PinActivity : AppCompatActivity() {
_bn = ActivityPinBinding.inflate(layoutInflater)
setContentView(bn.root)
executor = ContextCompat.getMainExecutor(this)
biometricPrompt = BiometricPrompt(this, executor,
object : BiometricPrompt.AuthenticationCallback() {
......
package uz.ssd.mobiuz
import android.os.Bundle
import android.view.View
import androidx.fragment.app.viewModels
import androidx.navigation.NavController
import androidx.navigation.fragment.NavHostFragment
import dagger.hilt.android.AndroidEntryPoint
import uz.ssd.mobiuz.databinding.FragmentPinLockBinding
import uz.ssd.mobiuz.model.SharedPref
import uz.ssd.mobiuz.ui.auth.AuthViewModel
import uz.ssd.mobiuz.ui.base.BaseFragment
import javax.inject.Inject
@AndroidEntryPoint
class PinLockFragment : BaseFragment(R.layout.fragment_pin_lock) {
@Inject
lateinit var pref: SharedPref
private var _bn: FragmentPinLockBinding? = 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) }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_bn = FragmentPinLockBinding.bind(view)
//200281 svet h shuhrat 50
// 0700268 100 gaz shuhrat
setUpUI()
collects()
}
override fun setUpUI() {
}
override fun collects() {
}
override fun onDestroy() {
_bn = null
super.onDestroy()
}
}
\ No newline at end of file
package uz.ssd.mobiuz
import android.content.Intent
import android.graphics.Color
import android.os.Bundle
import android.view.WindowManager
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope
import dagger.hilt.android.AndroidEntryPoint
......@@ -14,6 +12,7 @@ import javax.inject.Inject
@AndroidEntryPoint
class SplashActivity : AppCompatActivity() {
private var _bn: ActivitySplashBinding? = null
private val bn get() = _bn ?: throw NullPointerException("cannot inflate")
......@@ -25,13 +24,12 @@ class SplashActivity : AppCompatActivity() {
_bn = ActivitySplashBinding.inflate(layoutInflater)
setContentView(bn.root)
window.navigationBarColor = this.resources.getColor(R.color.red_dark)
lifecycleScope.launchWhenCreated {
delay(1000)
if (pref.language.isEmpty()) {
startActivity(Intent(this@SplashActivity, LanguageActivity::class.java))
} else {
startActivity(Intent(this@SplashActivity, LanguageActivity::class.java))
startActivity(Intent(this@SplashActivity, AuthActivity::class.java))
}
finish()
}
......
package uz.ssd.mobiuz.di
import android.content.Context
import android.os.Build
import com.readystatesoftware.chuck.ChuckInterceptor
import dagger.Module
import dagger.Provides
......@@ -50,6 +51,8 @@ class ServerModule {
.addInterceptor(Interceptor { chain ->
val builder = chain.request().newBuilder()
builder.header("Content-Type", "application/x-www-form-urlencoded")
builder.header("Lang", sharedPref.language)
builder.header("device-id", Build.DEVICE)
builder.header("Accept", "application/json")
builder.header("Authorization", "Bearer ${sharedPref.getUserToken()}")
chain.proceed(builder.build())
......
package uz.ssd.mobiuz.model
data class UserAuth(
val phoneNumber: String,
val password: String
val phone: String,
val password: String? = null,
val code: String? = null
)
\ No newline at end of file
......@@ -3,12 +3,30 @@ package uz.ssd.mobiuz.network.api
import retrofit2.http.Body
import retrofit2.http.POST
import uz.ssd.mobiuz.model.UserAuth
import uz.ssd.mobiuz.network.model.Action
import uz.ssd.mobiuz.network.model.GenerateToken
import uz.ssd.mobiuz.network.model.ResponseList
import uz.ssd.mobiuz.network.model.ResponseObject
interface ApiService {
@POST("auth/login")
@POST("customer/login")
suspend fun login(
@Body req: UserAuth
): ResponseObject<String>
): ResponseList<Any>
@POST("customer/register")
suspend fun register(
@Body req: UserAuth
): ResponseList<Any>
@POST("customer/check-phone")
suspend fun checkPhone(
@Body req: UserAuth
): ResponseObject<Action>
@POST("customer/check-sms-code")
suspend fun checkSMSCode(
@Body req: UserAuth
): ResponseObject<GenerateToken>
}
\ No newline at end of file
package uz.ssd.mobiuz.network.model
data class Action(
var action: String = ""
)
package uz.ssd.mobiuz.network.model
data class Errors(
var key:String,
var message:String
)
\ No newline at end of file
package uz.ssd.mobiuz.network.model
data class GenerateToken(
var token: String
)
......@@ -2,7 +2,9 @@ package uz.ssd.mobiuz.network.model
class ResponseList<T>(
var data: List<T>?,
var status: Status
var status: Boolean,
var message: String,
var errors: List<Errors>,
var data: List<T>?
)
......@@ -2,7 +2,9 @@ package uz.ssd.mobiuz.network.model
class ResponseObject<T>(
var status: Status,
var status: Boolean,
var message: String,
var errors: List<Errors>,
var data: T?
)
......@@ -2,32 +2,64 @@ package uz.ssd.mobiuz.network.repository
import android.content.Context
import dagger.hilt.android.qualifiers.ApplicationContext
import uz.ssd.mobiuz.model.SharedPref
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.UiStateObject
import uz.ssd.mobiuz.utils.extensions.userMessage
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class AuthRepository @Inject constructor(
private val apiService: ApiService,
private val pref: SharedPref,
@ApplicationContext val context: Context
) {
suspend fun loginUser(data: UserAuth): UiStateObject<String> {
suspend fun loginUser(data: UserAuth): UiStateObject<Action> {
return try {
val res = apiService.login(data)
when (res.status.code) {
200 -> {
UiStateObject.SUCCESS(res.status.message)
val res = apiService.checkPhone(data)
if (res.status)
UiStateObject.SUCCESS(res.data ?: Action())
else{
var error = ""
res.errors.forEach {
error += it.message
}
else -> UiStateObject.SUCCESS(res.status.message)
UiStateObject.ERROR(error)
}
} catch (e: Exception) {
UiStateObject.ERROR(e.userMessage(context))
}
}
suspend fun registerUser(data: UserAuth): UiStateObject<String> {
return try {
val res = apiService.register(data)
if (res.status)
UiStateObject.SUCCESS(res.message)
else UiStateObject.ERROR(res.message)
} catch (e: Exception) {
UiStateObject.SUCCESS("res.message")
UiStateObject.ERROR(e.userMessage(context))
}
}
suspend fun checkSMSCode(data: UserAuth): UiStateObject<String> {
return try {
val res = apiService.checkSMSCode(data)
if (res.status){
pref.setUserToken(res.data?.token)
UiStateObject.SUCCESS(res.message)
}
else UiStateObject.ERROR(res.message)
} catch (e: Exception) {
UiStateObject.ERROR(e.userMessage(context))
}
}
}
\ No newline at end of file
......@@ -3,11 +3,11 @@ package uz.ssd.mobiuz.ui.auth
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch
import uz.ssd.mobiuz.model.UserAuth
import uz.ssd.mobiuz.network.model.Action
import uz.ssd.mobiuz.network.model.UiStateObject
import uz.ssd.mobiuz.network.repository.AuthRepository
import javax.inject.Inject
......@@ -17,13 +17,28 @@ class AuthViewModel @Inject constructor(
private val repository: AuthRepository
) : ViewModel() {
private val _loginUiState = MutableStateFlow<UiStateObject<String>>(UiStateObject.EMPTY)
val loginUiState: StateFlow<UiStateObject<String>> = _loginUiState
private val _loginUiState = MutableStateFlow<UiStateObject<Action>>(UiStateObject.EMPTY)
val loginUiState: StateFlow<UiStateObject<Action>> = _loginUiState
fun login(data: UserAuth) = viewModelScope.launch {
_loginUiState.value = UiStateObject.LOADING
delay(1000)
_loginUiState.value = repository.loginUser(data)
_loginUiState.value = UiStateObject.EMPTY
}
private val _registerUiState = MutableStateFlow<UiStateObject<String>>(UiStateObject.EMPTY)
val registerUiState: StateFlow<UiStateObject<String>> = _registerUiState
fun register(data: UserAuth) = viewModelScope.launch {
_registerUiState.value = UiStateObject.LOADING
_registerUiState.value = repository.registerUser(data)
}
private val _verificationUiState = MutableStateFlow<UiStateObject<String>>(UiStateObject.EMPTY)
val verificationUiState: StateFlow<UiStateObject<String>> = _verificationUiState
fun verification(data: UserAuth) = viewModelScope.launch {
_verificationUiState.value = UiStateObject.LOADING
_verificationUiState.value = repository.checkSMSCode(data)
}
}
\ No newline at end of file
package uz.ssd.mobiuz.ui.auth
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 uz.ssd.mobiuz.R
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
......@@ -12,17 +17,15 @@ 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.databinding.FragmentLoginBinding
import uz.ssd.mobiuz.model.UserAuth
import uz.ssd.mobiuz.network.model.UiStateObject
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.utils.Utils
import uz.ssd.mobiuz.utils.extensions.customLog
import uz.ssd.mobiuz.utils.extensions.showMessage
@AndroidEntryPoint
......@@ -36,6 +39,17 @@ class BiometricFragment : BaseFragment(R.layout.fragment_biometric) {
private val viewModel: AuthViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (BuildConfig.VERSION_CODE >= Build.VERSION_CODES.P) {
if (ContextCompat.checkSelfPermission(requireContext(),Manifest.permission.USE_BIOMETRIC) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(requireActivity(), arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),101)
}
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_bn = FragmentBiometricBinding.bind(view)
......@@ -47,23 +61,27 @@ class BiometricFragment : BaseFragment(R.layout.fragment_biometric) {
override fun setUpUI() {
bn.apply {
btnBack.setOnClickListener(object : ButtonClick(){
btnBack.setOnClickListener(object : ButtonClick() {
override fun onSingleClick(v: View?) {
navController.navigateUp()
}
})
txtSkip.setOnClickListener(object : ButtonClick(){
txtSkip.setOnClickListener(object : ButtonClick() {
override fun onSingleClick(v: View?) {
requireActivity().finish()
startActivity(Intent(requireContext(),MainActivity::class.java))
val intent = Intent(requireContext(), MainActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_TASK_ON_HOME
startActivity(intent)
requireActivity().finish()
}
})
btnNext.setOnClickListener(object : ButtonClick(){
btnNext.setOnClickListener(object : ButtonClick() {
override fun onSingleClick(v: View?) {
val intent = Intent(requireContext(), MainActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_TASK_ON_HOME
startActivity(intent)
requireActivity().finish()
startActivity(Intent(requireContext(),MainActivity::class.java))
}
})
......@@ -75,47 +93,10 @@ class BiometricFragment : BaseFragment(R.layout.fragment_biometric) {
}
}
override fun collects() {
viewLifecycleOwner.lifecycleScope.launchWhenStarted {
viewModel.loginUiState.collect {
when (it) {
is UiStateObject.SUCCESS -> {
showProgressDialog(false)
if (phone != "+998949125150") {
navController.navigate(R.id.enterPasswordFragment, null, Utils.navOptions())
} else {
navController.navigate(R.id.passwordFragment, bundleOf(CONSTANTS.PHONE to phoneRaw), Utils.navOptions())
}
}
is UiStateObject.ERROR -> {
showProgressDialog(false)
showMessage(it.message)
}
is UiStateObject.LOADING -> {
showProgressDialog(true)
}
else -> Unit
}
}
}
}
override fun collects() {}
override fun onDestroy() {
_bn = null
super.onDestroy()
}
}
//fun main(){
// var ss = -421
// if(ss.toString().startsWith("-")){
// ss = ss.toString().replace("-","").toInt()
// val dd = (ss.toString().reversed().toInt()) * -1
// print(dd)
// }else{
// val dd = ss.toString().reversed().toInt()
// print(dd)
// }
//
//}
\ No newline at end of file
}
\ No newline at end of file
package uz.ssd.mobiuz.ui.auth
import android.content.Intent
import android.os.Bundle
import android.view.View
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
import androidx.recyclerview.widget.LinearLayoutManager
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.delay
import uz.ssd.mobiuz.MainActivity
import uz.ssd.mobiuz.R
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.Utils
import uz.ssd.mobiuz.utils.extensions.showMessage
import javax.inject.Inject
@AndroidEntryPoint
class ConfirmPinFragment : BaseFragment(R.layout.fragment_pin) {
@Inject
lateinit var pref: SharedPref
private var _bn: FragmentPinBinding? = null
private val bn get() = _bn ?: throw NullPointerException("cannot inflate")
private val navController: NavController by lazy(LazyThreadSafetyMode.NONE) { NavHostFragment.findNavController(this) }
private var pinCode = ""
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 {
pinCode = it.getString("pinCode","") ?: ""
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_bn = FragmentPinBinding.bind(view)
setUpUI()
collects()
}
override fun setUpUI() {
bn.apply {
loadData()
rvPin.layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)
rvPin.setHasFixedSize(true)
rvPin.adapter = pinAdapter
txtEnterPin.text = getString(R.string.confirm_pin)
txtNotPin.isVisible = false
pinAdapter.setOnDoneListener {
lifecycleScope.launchWhenCreated {
delay(500)
if (pinCode == it) {
pref.pin_code = pinCode
txtNotPin.isVisible = false
navigate()
} else {
txtNotPin.isVisible = true
}
}
}
toolbar.setNavigationOnClickListener {
navController.navigateUp()
}
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())
}
}
}
}
}
private fun navigate() {
val manager = FingerprintManagerCompat.from(requireContext())
val isEnabled = manager.isHardwareDetected && manager.hasEnrolledFingerprints()
if(isEnabled){
navController.navigate(R.id.biometricFragment, null, Utils.navOptions())
}else{
startActivity(Intent(requireContext(),MainActivity::class.java))
requireActivity().finish()
}
}
private fun loadData() {
data.clear()
for (i in 0..3) {
data.add(PinData(-1))
}
pinAdapter.submitList(data)
}
override fun collects() {
}
override fun onDestroy() {
_bn = null
super.onDestroy()
}
}
......@@ -2,6 +2,7 @@ package uz.ssd.mobiuz.ui.auth
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
......@@ -16,6 +17,7 @@ import uz.ssd.mobiuz.network.model.UiStateObject
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.utils.Utils
import uz.ssd.mobiuz.utils.extensions.showMessage
......@@ -27,6 +29,14 @@ class EnterPasswordFragment : BaseFragment(R.layout.fragment_enter_password) {
private val navController: NavController by lazy(LazyThreadSafetyMode.NONE) { NavHostFragment.findNavController(this) }
private val viewModel: AuthViewModel by viewModels()
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 = FragmentEnterPasswordBinding.bind(view)
......@@ -49,12 +59,12 @@ class EnterPasswordFragment : BaseFragment(R.layout.fragment_enter_password) {
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 = "Пароли совпали"
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 = "Пароли не совпали"
txtCheckConfirm.text = getString(R.string.password_not_same)
btnLogin.isEnabled = true
txtCheckConfirm.setTextColor(requireActivity().resources.getColor(R.color.red))
}
......@@ -66,8 +76,17 @@ class EnterPasswordFragment : BaseFragment(R.layout.fragment_enter_password) {
btnLogin.setOnClickListener(object : ButtonClick() {
override fun onSingleClick(v: View?) {
val phone = inputPassword.text.toString().trim()
viewModel.login(UserAuth(phone, "password"))
val password = inputPassword.text.toString().trim()
val confirm = inputConfirm.text.toString().trim()
when{
password.length < 5 || password != confirm ->{
}
else ->{
viewModel.register(UserAuth(phone.replace(" ",""), password))
}
}
}
})
......@@ -79,11 +98,11 @@ class EnterPasswordFragment : BaseFragment(R.layout.fragment_enter_password) {
override fun collects() {
viewLifecycleOwner.lifecycleScope.launchWhenStarted {
viewModel.loginUiState.collect {
viewModel.registerUiState.collect {
when (it) {
is UiStateObject.SUCCESS -> {
showProgressDialog(false)
navController.navigate(R.id.verificationFragment, null, Utils.navOptions())
navController.navigate(R.id.verificationFragment, bundleOf(CONSTANTS.PHONE to phone), Utils.navOptions())
}
is UiStateObject.ERROR -> {
showProgressDialog(false)
......
......@@ -2,6 +2,7 @@ package uz.ssd.mobiuz.ui.auth
import android.os.Bundle
import android.view.View
import android.view.animation.AnimationUtils
import androidx.core.os.bundleOf
import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
......@@ -43,7 +44,7 @@ class LoginFragment : BaseFragment(R.layout.fragment_login) {
override fun setUpUI() {
bn.apply {
inputPhone.addTextChangedListener(object : TextWatcherWrapper(){
inputPhone.addTextChangedListener(object : TextWatcherWrapper() {
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
super.onTextChanged(s, start, before, count)
customLog("s=${s?.toString()?.length}")
......@@ -55,11 +56,17 @@ class LoginFragment : BaseFragment(R.layout.fragment_login) {
override fun onSingleClick(v: View?) {
phone = "+998" + inputPhone.unmaskedText.toString().trim()
phoneRaw = inputPhone.text.toString().trim()
viewModel.login(UserAuth(phone, "password"))
when {
phone.length < 13 -> {
inputPhone.startAnimation(AnimationUtils.loadAnimation(requireContext(), R.anim.shake))
}
else -> viewModel.login(UserAuth(phone, null))
}
}
})
toolbar.setNavigationOnClickListener {
navController.navigateUp()
requireActivity().finish()
}
}
}
......@@ -70,11 +77,10 @@ class LoginFragment : BaseFragment(R.layout.fragment_login) {
when (it) {
is UiStateObject.SUCCESS -> {
showProgressDialog(false)
if (phone != "+998999999999") {
navController.navigate(R.id.enterPasswordFragment, null, Utils.navOptions())
} else {
if (it.data.action == "login") {
navController.navigate(R.id.passwordFragment, bundleOf(CONSTANTS.PHONE to phoneRaw), Utils.navOptions())
} else if (it.data.action == "register"){
navController.navigate(R.id.enterPasswordFragment, bundleOf(CONSTANTS.PHONE to phone), Utils.navOptions())
}
}
is UiStateObject.ERROR -> {
......@@ -94,17 +100,4 @@ class LoginFragment : BaseFragment(R.layout.fragment_login) {
_bn = null
super.onDestroy()
}
}
//fun main(){
// var ss = -421
// if(ss.toString().startsWith("-")){
// ss = ss.toString().replace("-","").toInt()
// val dd = (ss.toString().reversed().toInt()) * -1
// print(dd)
// }else{
// val dd = ss.toString().reversed().toInt()
// print(dd)
// }
//
//}
\ No newline at end of file
}
\ No newline at end of file
package uz.ssd.mobiuz.ui.auth
import android.util.Log
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
......@@ -11,8 +10,7 @@ import uz.ssd.mobiuz.utils.extensions.SingleBlock
class PinAdapter : RecyclerView.Adapter<PinAdapter.VHolder>() {
private val list = ArrayList<PinData>()
private val list : ArrayList<PinData> by lazy { ArrayList() }
private var listener: SingleBlock<String>? = null
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VHolder {
......@@ -31,9 +29,7 @@ class PinAdapter : RecyclerView.Adapter<PinAdapter.VHolder>() {
fun submitList(ls: List<PinData>) {
list.clear()
Log.e("AAA", "list $list")
list.addAll(ls)
Log.e("AAA", "list $list")
notifyDataSetChanged()
}
......@@ -42,18 +38,17 @@ class PinAdapter : RecyclerView.Adapter<PinAdapter.VHolder>() {
if (index != -1) {
list[index].count = id
notifyItemChanged(index)
Log.e("AAA", "add index ${getAddItem()}")
if(index == 3) checkDone()
if (index == 3) checkDone()
}
}
private fun checkDone(){
private fun checkDone() {
var pin = ""
list.forEach {
pin += it.count.toString()
}
if(pin.length == 4){
if (pin.length == 4) {
listener?.invoke(pin)
}
}
......@@ -63,7 +58,6 @@ class PinAdapter : RecyclerView.Adapter<PinAdapter.VHolder>() {
if (index != -1) {
list[index].count = -1
notifyItemChanged(index)
Log.e("AAA", " remove index ${getCheckedItem()}")
}
}
......@@ -73,7 +67,6 @@ class PinAdapter : RecyclerView.Adapter<PinAdapter.VHolder>() {
if (list[i].count != -1)
pos = i
}
return pos
}
......@@ -81,7 +74,7 @@ class PinAdapter : RecyclerView.Adapter<PinAdapter.VHolder>() {
private fun getAddItem(): Int {
var pos = -1
for (i in list.indices) {
if (list[i].count == -1){
if (list[i].count == -1) {
pos = i
return pos
}
......@@ -89,7 +82,7 @@ class PinAdapter : RecyclerView.Adapter<PinAdapter.VHolder>() {
return pos
}
fun setOnDoneListener(block: SingleBlock<String>){
fun setOnDoneListener(block: SingleBlock<String>) {
listener = block
}
......
......@@ -3,6 +3,8 @@ package uz.ssd.mobiuz.ui.auth
import android.os.Bundle
import android.view.View
import android.widget.TextView
import androidx.core.os.bundleOf
import androidx.core.view.isVisible
import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavController
......@@ -22,14 +24,11 @@ import javax.inject.Inject
@AndroidEntryPoint
class PinFragment : BaseFragment(R.layout.fragment_pin) {
@Inject
lateinit var pref: SharedPref
private var _bn: FragmentPinBinding? = null
private val bn get() = _bn ?: throw NullPointerException("cannot inflate")
private val navController: NavController by lazy(LazyThreadSafetyMode.NONE) { NavHostFragment.findNavController(this) }
var phone = ""
private var pinCode = ""
private val data = ArrayList<PinData>()
private val pinAdapter = PinAdapter()
......@@ -52,26 +51,14 @@ class PinFragment : BaseFragment(R.layout.fragment_pin) {
rvPin.adapter = pinAdapter
txtEnterPin.text = getString(R.string.install_pin)
txtNotPin.isVisible = false
pinAdapter.setOnDoneListener {
lifecycleScope.launchWhenCreated {
delay(500)
loadData()
if (pinCode.isEmpty()) {
pinCode = it
txtEnterPin.text = getString(R.string.confirm_pin)
showMessage(it)
} else {
if (pinCode == it) {
pref.pin_code = pinCode
navController.navigate(R.id.biometricFragment, null, Utils.navOptions())
} else {
pinCode = ""
txtEnterPin.text = getString(R.string.install_pin)
}
}
delay(100)
navController.navigate(R.id.confirmPinFragment, bundleOf("pinCode" to it), Utils.navOptions())
}
}
toolbar.setNavigationOnClickListener {
......
......@@ -44,7 +44,7 @@ class ForgetLoginFragment : BaseFragment(R.layout.fragment_login) {
override fun setUpUI() {
bn.apply {
txtEnterPhone.text = "Забыли пароль?"
// txtEnterPhone.text = "Забыли пароль?"
inputPhone.addTextChangedListener(object : TextWatcherWrapper(){
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
super.onTextChanged(s, start, before, count)
......
......@@ -42,7 +42,7 @@ class ForgetPasswordFragment : BaseFragment(R.layout.fragment_enter_password) {
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 < 5)
txtCheckPassword.isVisible = (s.toString().length < 6)
}
})
......@@ -51,12 +51,12 @@ class ForgetPasswordFragment : BaseFragment(R.layout.fragment_enter_password) {
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 = "Пароли совпали"
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 = "Пароли не совпали"
txtCheckConfirm.text = getString(R.string.password_not_same)
btnLogin.isEnabled = true
txtCheckConfirm.setTextColor(requireActivity().resources.getColor(R.color.red))
}
......@@ -69,7 +69,7 @@ class ForgetPasswordFragment : BaseFragment(R.layout.fragment_enter_password) {
btnLogin.setOnClickListener(object : ButtonClick() {
override fun onSingleClick(v: View?) {
val phone = inputPassword.text.toString().trim()
viewModel.login(UserAuth(phone, "password"))
viewModel.login(UserAuth("phone", phone))
}
})
......
......@@ -33,6 +33,8 @@ class ForgetVerificationFragment : BaseFragment(R.layout.fragment_verification)
private val viewModel: AuthViewModel by viewModels()
private val navController: NavController by lazy(LazyThreadSafetyMode.NONE) { NavHostFragment.findNavController(this) }
var code = ""
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_bn = FragmentVerificationBinding.bind(view)
setUpUI()
......@@ -47,15 +49,26 @@ class ForgetVerificationFragment : BaseFragment(R.layout.fragment_verification)
navController.navigateUp()
}
viewGroup.setOnClickListener(object : ButtonClick(){
override fun onSingleClick(v: View?) {
v?.hideKeyboard()
}
})
loadEdited()
frame.setOnClickListener {
clearPins()
}
btnLogin.setOnClickListener(object : ButtonClick() {
override fun onSingleClick(v: View?) {
viewModel.login(UserAuth("phone", "password"))
getLinePinCodes()
if(code.length == 6){
viewModel.login(UserAuth("phone", "password"))
}else{
clearPins()
}
}
})
......@@ -64,7 +77,6 @@ class ForgetVerificationFragment : BaseFragment(R.layout.fragment_verification)
sentCodeAgain.setTextColor(Color.parseColor("#FF9500"))
sentCodeAgain.setOnClickListener {
// viewModel.login(UserAuth("",""))
count(true)
}
coutdownView.setOnCountdownEndListener {
......@@ -76,25 +88,6 @@ class ForgetVerificationFragment : BaseFragment(R.layout.fragment_verification)
private fun loadEdited() {
bn.apply {
toolbar.setNavigationOnClickListener {
navController.navigateUp()
}
viewGroup.setOnClickListener {
it.hideKeyboard()
}
frame.setOnClickListener {
pin1.text?.clear()
pin2.text?.clear()
pin3.text?.clear()
pin4.text?.clear()
pin5.text?.clear()
pin6.text?.clear()
pin1.showKeyboard()
}
pin1.addTextChangedListener(object : TextWatcherWrapper() {
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
super.onTextChanged(s, start, before, count)
......@@ -175,45 +168,42 @@ class ForgetVerificationFragment : BaseFragment(R.layout.fragment_verification)
})
pin1.setOnKeyListener { _, keyCode, _ ->
if (keyCode == KeyEvent.KEYCODE_DEL) {
checkFocus().requestFocus()
}
false
}
pin2.setOnKeyListener { _, keyCode, _ ->
if (keyCode == KeyEvent.KEYCODE_DEL) {
checkFocus().requestFocus()
}
false
}
pin3.setOnKeyListener { _, keyCode, _ ->
if (keyCode == KeyEvent.KEYCODE_DEL) {
checkFocus().requestFocus()
}
false
}
pin4.setOnKeyListener { _, keyCode, _ ->
if (keyCode == KeyEvent.KEYCODE_DEL) {
checkFocus().requestFocus()
}
false
}
pin5.setOnKeyListener { _, keyCode, _ ->
if (keyCode == KeyEvent.KEYCODE_DEL) {
checkFocus().requestFocus()
}
false
}
pin6.setOnKeyListener { _, keyCode, _ ->
if (keyCode == KeyEvent.KEYCODE_DEL) {
checkFocus().requestFocus()
for (i in 0 until pinView.childCount){
pinView.getChildAt(i).setOnKeyListener { _, keyCode, _ ->
if (keyCode == KeyEvent.KEYCODE_DEL) {
checkFocus().requestFocus()
}
false
}
false
}
}
}
private fun getLinePinCodes() {
bn.apply {
code = ""
code += pin1.text.toString()
code += pin2.text.toString()
code += pin3.text.toString()
code += pin4.text.toString()
code += pin5.text.toString()
code += pin6.text.toString()
}
}
private fun clearPins() {
bn.apply {
pin1.text?.clear()
pin2.text?.clear()
pin3.text?.clear()
pin4.text?.clear()
pin5.text?.clear()
pin6.text?.clear()
pin1.showKeyboard()
}
}
private fun checkFocus(): View {
bn.apply {
return when {
......@@ -271,7 +261,7 @@ class ForgetVerificationFragment : BaseFragment(R.layout.fragment_verification)
sentCodeAgain.isVisible = !status
countWaitText.isVisible = status
coutdownView.isVisible = status
if (status) coutdownView.start(120000)
if (status) coutdownView.start(60000)
}
}
......
package uz.ssd.mobiuz.utils
object CONSTANTS {
const val BASE_URL = "http://157.230.7.9:9098/api/"
const val BASE_URL = "http://10.160.45.60/api/v1/"
const val BASE_URL_WITHOUT_API = "http://157.230.7.9:9098"
const val IMAGE_URL = "http://157.230.7.9:9098/api/attach/"
const val IMAGE_URL_GET = "http://157.230.7.9:9098/api/attach/get/"
......
......@@ -13,7 +13,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:cursorVisible="true"
android:hint="00000"
android:hint="*****"
android:inputType="text"
android:padding="@dimen/_1sdp"
android:textColor="@color/black"
......
......@@ -29,7 +29,7 @@
android:layout_gravity="center|end"
android:background="?android:selectableItemBackground"
android:padding="@dimen/_4sdp"
android:text="Пропустить"
android:text="@string/skip"
android:textColor="@color/red_dark"
android:textSize="16sp"
android:textStyle="bold" />
......@@ -54,7 +54,7 @@
android:layout_gravity="center"
android:layout_marginHorizontal="@dimen/_12sdp"
android:layout_marginTop="@dimen/_12sdp"
android:text="Биометрический вход"
android:text="@string/biometric_enter"
android:textSize="@dimen/_20sdp"
android:textStyle="bold" />
......@@ -64,8 +64,7 @@
android:layout_gravity="center"
android:layout_marginHorizontal="@dimen/_12sdp"
android:layout_marginTop="@dimen/_12sdp"
android:text="Быстро войти в систему с помощью отпечатка пальца
или Face ID."
android:text="@string/subtitle_biometric"
android:textColor="@color/text_color_77"
android:textSize="@dimen/_14sdp" />
......@@ -82,7 +81,7 @@
android:layout_height="wrap_content"
android:layout_weight="1"
android:textSize="17sp"
android:text="Активировать"
android:text="@string/avtorization"
android:textStyle="bold" />
<Switch
......@@ -103,7 +102,7 @@
android:layout_gravity="center"
android:textSize="15sp"
android:layout_marginHorizontal="@dimen/_12sdp"
android:text="Измените это в любое время в настройках"
android:text="@string/change_all_time"
/>
</LinearLayout>
......@@ -120,11 +119,11 @@
android:layout_height="wrap_content"
android:layout_gravity="end"
android:layout_marginEnd="@dimen/_12sdp"
android:paddingHorizontal="@dimen/_18sdp"
android:paddingHorizontal="@dimen/_22sdp"
android:paddingVertical="@dimen/_10sdp"
android:textStyle="bold"
android:textSize="16sp"
android:text="@string/continuoue_task"
android:text="@string/continuoue"
android:textAllCaps="false"
android:textColor="@color/red"
app:backgroundTint="@color/white" />
......
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".BlankFragment">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/hello_blank_fragment" />
</FrameLayout>
\ No newline at end of file
......@@ -34,7 +34,7 @@
android:layout_marginStart="@dimen/_12sdp"
android:layout_marginTop="@dimen/_16sdp"
android:layout_marginBottom="@dimen/_4sdp"
android:text="Введите пароль:"
android:text="@string/enter_parol"
android:textColor="@color/black"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent"
......@@ -59,7 +59,8 @@
android:background="@drawable/edit_text_bgn"
android:imeOptions="actionNext"
android:textSize="@dimen/_12sdp"
android:inputType="textPassword"
android:inputType="number"
android:maxLength="7"
android:paddingVertical="@dimen/_12sdp"
android:paddingStart="@dimen/_12sdp" />
</com.google.android.material.textfield.TextInputLayout>
......@@ -70,7 +71,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/_6sdp"
android:visibility="invisible"
android:text="Должно быть не менее 6 символов"
android:text="@string/min_6"
android:textColor="@color/light"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="@id/layout_input_confirm"
......@@ -82,7 +83,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/_34sdp"
android:layout_marginBottom="@dimen/_4sdp"
android:text="Введите пароль повторно:"
android:text="@string/confirm_parol"
android:textColor="@color/black"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="@id/layout_input_confirm"
......@@ -104,7 +105,8 @@
android:background="@drawable/edit_text_bgn"
android:imeOptions="actionDone"
android:textSize="@dimen/_12sdp"
android:inputType="textPassword"
android:inputType="number"
android:maxLength="7"
android:paddingVertical="@dimen/_12sdp"
android:paddingStart="@dimen/_12sdp"
/>
......@@ -125,7 +127,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/_10sdp"
android:text="Пароли должны совпадать"
android:text="@string/must_same"
android:textColor="@color/light"
android:textStyle="bold"
android:visibility="invisible"
......@@ -142,7 +144,7 @@
android:textSize="@dimen/_12sdp"
android:layout_marginHorizontal="@dimen/_12sdp"
android:layout_marginTop="@dimen/_34sdp"
android:text="@string/continuoue_task"
android:text="@string/continuoue"
app:layout_constraintTop_toBottomOf="@id/layout_input_confirm"
app:layout_constraintBottom_toBottomOf="parent" />
......
......@@ -68,7 +68,7 @@
android:textSize="@dimen/_12sdp"
android:layout_marginHorizontal="@dimen/_12sdp"
android:layout_marginTop="@dimen/_24sdp"
android:text="@string/continuoue_task"
android:text="@string/continuoue"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/layout_input" />
......
......@@ -12,6 +12,7 @@
android:fitsSystemWindows="false"
android:orientation="vertical">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="@dimen/_240sdp"
......@@ -55,7 +56,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/light"
android:text="Мой номер" />
android:text="@string/my_number" />
<TextView
android:layout_width="wrap_content"
......@@ -84,7 +85,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/light"
android:text="Баланс" />
android:text="@string/balance" />
<TextView
android:layout_width="wrap_content"
......@@ -150,7 +151,7 @@
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="10dp"
android:text="Остаток по тарифу"
android:text="@string/oatatok_tarifu"
android:textColor="@color/light" />
<LinearLayout
......@@ -262,7 +263,7 @@
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Следующее списание:"
android:text="@string/next_spisanie"
android:textSize="14sp"
android:textColor="@color/light" />
......
......@@ -77,7 +77,7 @@
android:textSize="@dimen/_12sdp"
android:layout_marginHorizontal="@dimen/_12sdp"
android:layout_marginTop="@dimen/_24sdp"
android:text="@string/continuoue_task" />
android:text="@string/continuoue" />
</LinearLayout>
......
......@@ -17,18 +17,31 @@
android:id="@+id/txt_enter_pin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/_12sdp"
android:layout_marginStart="@dimen/_14sdp"
android:layout_marginTop="@dimen/_14sdp"
android:text="@string/install_pin"
android:textSize="@dimen/_16sdp"
android:textStyle="bold" />
<LinearLayout
<FrameLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="center">
<TextView
android:layout_width="wrap_content"
android:text="@string/pin_not_same"
android:id="@+id/txt_not_pin"
android:visibility="gone"
android:textSize="@dimen/_10sdp"
android:layout_gravity="top|center"
android:layout_marginTop="@dimen/_20sdp"
android:textStyle="bold"
android:layout_marginBottom="@dimen/_20sdp"
android:textColor="@color/red"
android:layout_height="wrap_content"/>
<com.google.android.material.card.MaterialCardView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
......@@ -45,7 +58,7 @@
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
android:layout_height="wrap_content"/>
</com.google.android.material.card.MaterialCardView>
</LinearLayout>
</FrameLayout>
<androidx.constraintlayout.widget.ConstraintLayout
......@@ -58,7 +71,7 @@
<TextView
android:id="@+id/btn_1"
style="@style/BtnStyle"
android:text="1"
android:text="@string/_1"
android:background="@drawable/bgn_pin_btn"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
......@@ -66,7 +79,7 @@
<TextView
android:id="@+id/btn_2"
style="@style/BtnStyle"
android:text="2"
android:text="@string/_2"
android:background="@drawable/bgn_pin_btn"
app:layout_constraintEnd_toStartOf="@id/btn_3"
app:layout_constraintStart_toEndOf="@id/btn_1"
......@@ -75,7 +88,7 @@
<TextView
android:id="@+id/btn_3"
style="@style/BtnStyle"
android:text="3"
android:text="@string/_3"
android:background="@drawable/bgn_pin_btn"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
......@@ -84,7 +97,7 @@
android:id="@+id/btn_4"
style="@style/BtnStyle"
android:layout_marginTop="@dimen/_16sdp"
android:text="4"
android:text="@string/_4"
android:background="@drawable/bgn_pin_btn"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/btn_1" />
......@@ -92,7 +105,7 @@
<TextView
android:id="@+id/btn_5"
style="@style/BtnStyle"
android:text="5"
android:text="@string/_5"
android:background="@drawable/bgn_pin_btn"
app:layout_constraintEnd_toStartOf="@id/btn_3"
app:layout_constraintStart_toEndOf="@id/btn_1"
......@@ -101,7 +114,7 @@
<TextView
android:id="@+id/btn_6"
style="@style/BtnStyle"
android:text="6"
android:text="@string/_6"
android:background="@drawable/bgn_pin_btn"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/btn_4" />
......@@ -110,7 +123,7 @@
android:id="@+id/btn_7"
style="@style/BtnStyle"
android:layout_marginTop="@dimen/_16sdp"
android:text="7"
android:text="@string/_7"
android:background="@drawable/bgn_pin_btn"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/btn_4" />
......@@ -118,7 +131,7 @@
<TextView
android:id="@+id/btn_8"
style="@style/BtnStyle"
android:text="8"
android:text="@string/_8"
android:background="@drawable/bgn_pin_btn"
app:layout_constraintEnd_toStartOf="@id/btn_3"
app:layout_constraintStart_toEndOf="@id/btn_1"
......@@ -127,7 +140,7 @@
<TextView
android:id="@+id/btn_9"
style="@style/BtnStyle"
android:text="9"
android:text="@string/_9"
android:background="@drawable/bgn_pin_btn"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/btn_7" />
......@@ -137,7 +150,7 @@
android:id="@+id/btn_0"
style="@style/BtnStyle"
android:layout_marginTop="@dimen/_16sdp"
android:text="0"
android:text="@string/_0"
android:background="@drawable/bgn_pin_btn"
app:layout_constraintStart_toStartOf="@id/btn_8"
app:layout_constraintTop_toBottomOf="@id/btn_7" />
......@@ -148,8 +161,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="@dimen/_12sdp"
android:contentDescription="@string/remove"
android:src="@drawable/ic_vector_remove"
android:text="9"
android:background="?selectableItemBackgroundBorderless"
app:layout_constraintBottom_toBottomOf="@id/btn_0"
app:layout_constraintEnd_toEndOf="parent"
......
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".PinLockFragment">
<!-- TODO: Update blank fragment layout -->
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/hello_blank_fragment" />
</FrameLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:layout_width="wrap_content"
android:inputType="number"
android:layout_height="wrap_content"/>
</LinearLayout>
\ No newline at end of file
......@@ -18,9 +18,9 @@
tools:layout="@layout/fragment_verification" />
<fragment
android:id="@+id/enterPasswordFragment"
tools:layout="@layout/fragment_enter_password"
android:name="uz.ssd.mobiuz.ui.auth.EnterPasswordFragment"
android:label="EnterPasswordFragment" />
android:label="EnterPasswordFragment"
tools:layout="@layout/fragment_enter_password" />
<fragment
android:id="@+id/passwordFragment"
android:name="uz.ssd.mobiuz.ui.auth.PasswordFragment"
......@@ -28,14 +28,14 @@
tools:layout="@layout/fragment_password" />
<fragment
android:id="@+id/forgetPasswordFragment"
tools:layout="@layout/fragment_forget_password"
android:name="uz.ssd.mobiuz.ui.forget.ForgetPasswordFragment"
android:label="ForgetPasswordFragment" />
android:label="ForgetPasswordFragment"
tools:layout="@layout/fragment_forget_password" />
<fragment
android:id="@+id/pinFragment"
tools:layout="@layout/fragment_pin"
android:name="uz.ssd.mobiuz.ui.auth.PinFragment"
android:label="PinFragment" />
android:label="PinFragment"
tools:layout="@layout/fragment_pin" />
<fragment
android:id="@+id/biometricFragment"
android:name="uz.ssd.mobiuz.ui.auth.BiometricFragment"
......@@ -43,12 +43,17 @@
tools:layout="@layout/fragment_biometric" />
<fragment
android:id="@+id/forgetLoginFragment"
tools:layout="@layout/fragment_login"
android:name="uz.ssd.mobiuz.ui.forget.ForgetLoginFragment"
android:label="ForgetLoginFragment" />
android:label="ForgetLoginFragment"
tools:layout="@layout/fragment_login" />
<fragment
android:id="@+id/forgetVerificationFragment"
tools:layout="@layout/fragment_pin"
android:name="uz.ssd.mobiuz.ui.forget.ForgetVerificationFragment"
android:label="ForgetPinFragment" />
android:label="ForgetPinFragment"
tools:layout="@layout/fragment_pin" />
<fragment
android:id="@+id/confirmPinFragment"
android:name="uz.ssd.mobiuz.ui.auth.ConfirmPinFragment"
android:label="ConfirmPinFragment"
tools:layout="@layout/fragment_pin" />
</navigation>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="login">Login</string>
<string name="phone_number">Phone Number</string>
<string name="ex304">Не исправимая ошибка</string>
<string name="ex400">неверный запрос</string>
<string name="ex401">Пользователь не зарегистрирован</string>
<string name="ex403">Запрещено</string>
<string name="ex404">Не Найдено</string>
<string name="ex405">Метод запрещен</string>
<string name="ex406">Неприемлемо</string>
<string name="ex408">Тайм-аут запроса</string>
<string name="ex409">Конфликт</string>
<string name="ex413">Тайм-аут запроса</string>
<string name="ex422">Необработанный</string>
<string name="ex429">Необработанный</string>
<string name="ex500">Ошибка сервера</string>
<string name="ex502">Неверный шлюз</string>
<string name="exelse">Непредвиденная ошибка, повторите попытку позже</string>
<string name="ioexception">Ошибка сетевого подключения</string>
<string name="jsonsyntaxexception">Ma\'lumot olishda xatolik</string>
<string name="connect_exception">Internet yo\'q</string>
<string name="ex_nothing">Неизвестная ошибка</string>
<string name="register">Registration</string>
<string name="password">Password</string>
<string name="choose_lang">Tilni tanlang</string>
<string name="back">Back</string>
<string name="enter_number">Введите номер</string>
<string name="phone">Телефон:</string>
<string name="continuoue">Далее</string>
<string name="think_password">Придумайте пароль</string>
<string name="enter">Войти</string>
<string name="enter_verification">"Ведите код "</string>
<string name="sent_code_again">Sent code again</string>
<string name="install_pin">Установите PIN-код</string>
<string name="confirm_pin">Повторите этот PIN-код</string>
<string name="biometric_enter">Биометрический вход</string>
<string name="subtitle_biometric">Быстро войти в систему с помощью отпечатка пальца или Face ID.</string>
<string name="avtorization">Активировать</string>
<string name="change_all_time">Измените это в любое время в настройках</string>
<string name="skip">Пропустить</string>
<string name="enter_parol">Введите пароль:</string>
<string name="min_6">Должно быть не менее 6 символов</string>
<string name="confirm_parol">Введите пароль повторно:</string>
<string name="must_same">Пароли должны совпадать</string>
<string name="my_number">Мой номер</string>
<string name="balance">Баланс</string>
<string name="oatatok_tarifu">Остаток по тарифу</string>
<string name="next_spisanie">Следующее списание:</string>
<string name="forget_password">Забыли пароль?</string>
<string name="pin_not_same">Значения не совпадают</string>
<string name="remove">remove</string>
<string name="password_same">Пароли совпали</string>
<string name="password_not_same">Пароли не совпали</string>
</resources>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="login">Login</string>
<string name="phone_number">Phone Number</string>
<string name="ex304">Не исправимая ошибка</string>
<string name="ex400">неверный запрос</string>
<string name="ex401">Пользователь не зарегистрирован</string>
<string name="ex403">Запрещено</string>
<string name="ex404">Не Найдено</string>
<string name="ex405">Метод запрещен</string>
<string name="ex406">Неприемлемо</string>
<string name="ex408">Тайм-аут запроса</string>
<string name="ex409">Конфликт</string>
<string name="ex413">Тайм-аут запроса</string>
<string name="ex422">Необработанный</string>
<string name="ex429">Необработанный</string>
<string name="ex500">Ошибка сервера</string>
<string name="ex502">Неверный шлюз</string>
<string name="exelse">Непредвиденная ошибка, повторите попытку позже</string>
<string name="ioexception">Ошибка сетевого подключения</string>
<string name="jsonsyntaxexception">Ma\'lumot olishda xatolik</string>
<string name="connect_exception">Internet yo\'q</string>
<string name="ex_nothing">Неизвестная ошибка</string>
<string name="register">Registration</string>
<string name="password">Password</string>
<string name="choose_lang">Tilni tanlang</string>
<string name="back">Back</string>
<string name="enter_number">Введите номер</string>
<string name="continuoue">Далее</string>
<string name="phone">Телефон:</string>
<string name="think_password">Придумайте пароль</string>
<string name="enter">Войти</string>
<string name="enter_verification">"Ведите код "</string>
<string name="sent_code_again">Sent code again</string>
<string name="install_pin">Установите PIN-код</string>
<string name="confirm_pin">Повторите этот PIN-код</string>
<string name="biometric_enter">Биометрический вход</string>
<string name="subtitle_biometric">Быстро войти в систему с помощью отпечатка пальца или Face ID.</string>
<string name="avtorization">Активировать</string>
<string name="change_all_time">Измените это в любое время в настройках</string>
<string name="skip">Пропустить</string>
<string name="enter_parol">Введите пароль:</string>
<string name="min_6">Должно быть не менее 6 символов</string>
<string name="confirm_parol">Введите пароль повторно:</string>
<string name="must_same">Пароли должны совпадать</string>
<string name="my_number">Мой номер</string>
<string name="balance">Баланс</string>
<string name="oatatok_tarifu">Остаток по тарифу</string>
<string name="next_spisanie">Следующее списание:</string>
<string name="forget_password">Забыли пароль?</string>
<string name="pin_not_same">Значения не совпадают</string>
<string name="remove">remove</string>
<string name="password_same">Пароли совпали</string>
<string name="password_not_same">Пароли не совпали</string>
</resources>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="login">Login</string>
<string name="phone_number">Phone Number</string>
<string name="ex304">Не исправимая ошибка</string>
<string name="ex400">неверный запрос</string>
<string name="ex401">Пользователь не зарегистрирован</string>
<string name="ex403">Запрещено</string>
<string name="ex404">Не Найдено</string>
<string name="ex405">Метод запрещен</string>
<string name="ex406">Неприемлемо</string>
<string name="ex408">Тайм-аут запроса</string>
<string name="ex409">Конфликт</string>
<string name="ex413">Тайм-аут запроса</string>
<string name="ex422">Необработанный</string>
<string name="ex429">Необработанный</string>
<string name="ex500">Ошибка сервера</string>
<string name="ex502">Неверный шлюз</string>
<string name="exelse">Непредвиденная ошибка, повторите попытку позже</string>
<string name="ioexception">Ошибка сетевого подключения</string>
<string name="jsonsyntaxexception">Ma\'lumot olishda xatolik</string>
<string name="connect_exception">Internet yo\'q</string>
<string name="ex_nothing">Неизвестная ошибка</string>
<string name="register">Registration</string>
<string name="password">Password</string>
<string name="choose_lang">Tilni tanlang</string>
<string name="back">Back</string>
<string name="enter_number">Введите номер</string>
<string name="continuoue">Далее</string>
<string name="phone">Телефон:</string>
<string name="think_password">Придумайте пароль</string>
<string name="enter">Войти</string>
<string name="enter_verification">"Ведите код "</string>
<string name="sent_code_again">Sent code again</string>
<string name="install_pin">Установите PIN-код</string>
<string name="confirm_pin">Повторите этот PIN-код</string>
<string name="biometric_enter">Биометрический вход</string>
<string name="subtitle_biometric">Быстро войти в систему с помощью отпечатка пальца или Face ID.</string>
<string name="avtorization">Активировать</string>
<string name="change_all_time">Измените это в любое время в настройках</string>
<string name="skip">Пропустить</string>
<string name="enter_parol">Введите пароль:</string>
<string name="min_6">Должно быть не менее 6 символов</string>
<string name="confirm_parol">Введите пароль повторно:</string>
<string name="must_same">Пароли должны совпадать</string>
<string name="my_number">Мой номер</string>
<string name="balance">Баланс</string>
<string name="oatatok_tarifu">Остаток по тарифу</string>
<string name="next_spisanie">Следующее списание:</string>
<string name="forget_password">Забыли пароль?</string>
<string name="pin_not_same">Значения не совпадают</string>
<string name="remove">remove</string>
<string name="password_same">Пароли совпали</string>
<string name="password_not_same">Пароли не совпали</string>
</resources>
\ No newline at end of file
<resources>
<string name="app_name">MobiUz-Android</string>
<string name="app_name" translatable="false">MobiUz-Android</string>
<!-- TODO: Remove or change this placeholder text -->
<string name="hello_blank_fragment">Hello blank fragment</string>
<string name="hello_blank_fragment" translatable="false">Hello blank fragment</string>
<string name="login">Login</string>
<string name="phone_number">Phone Number</string>
<string name="ex304">Не исправимая ошибка</string>
<string name="ex400">неверный запрос</string>
<string name="ex401">Пользователь не зарегистрирован</string>
......@@ -24,23 +23,50 @@
<string name="jsonsyntaxexception">Ma\'lumot olishda xatolik</string>
<string name="connect_exception">Internet yo\'q</string>
<string name="ex_nothing">Неизвестная ошибка</string>
<string name="home_fragment">This is home page</string>
<string name="home_fragment" translatable="false">This is home page</string>
<string name="register">Registration</string>
<string name="password">Password</string>
<string name="choose_lang">Tilni tanlang</string>
<string name="uzbek">O\'zbek</string>
<string name="english">English</string>
<string name="russian">Russian</string>
<string name="uzbek" translatable="false">O\'zbek</string>
<string name="english" translatable="false">English</string>
<string name="russian" translatable="false">Russian</string>
<string name="back">Back</string>
<string name="enter_number">Введите номер</string>
<string name="continuoue">Далее</string>
<string name="phone">Телефон:</string>
<string name="continuoue_task">Далее</string>
<string name="think_password">Придумайте пароль</string>
<string name="enter">Войти</string>
<string name="enter_verification">Ведите код \nподтверждения</string>
<string name="sent_code_again">Sent code again</string>
<string name="install_pin">Установите PIN-код</string>
<string name="confirm_pin">Повторите этот PIN-код</string>
<string name="biometric_enter">Биометрический вход</string>
<string name="subtitle_biometric">Быстро войти в систему с помощью отпечатка пальца или Face ID.</string>
<string name="avtorization">Активировать</string>
<string name="change_all_time">Измените это в любое время в настройках</string>
<string name="skip">Пропустить</string>
<string name="enter_parol">Введите пароль:</string>
<string name="min_6">Должно быть не менее 6 символов</string>
<string name="confirm_parol">Введите пароль повторно:</string>
<string name="must_same">Пароли должны совпадать</string>
<string name="my_number">Мой номер</string>
<string name="balance">Баланс</string>
<string name="oatatok_tarifu">Остаток по тарифу</string>
<string name="next_spisanie">Следующее списание:</string>
<string name="forget_password">Забыли пароль?</string>
<string name="pin_not_same">Значения не совпадают</string>
<string name="_1" translatable="false">1</string>
<string name="_2" translatable="false">2</string>
<string name="_3" translatable="false">3</string>
<string name="_4" translatable="false">4</string>
<string name="_5" translatable="false">5</string>
<string name="_6" translatable="false">6</string>
<string name="_7" translatable="false">7</string>
<string name="_8" translatable="false">8</string>
<string name="_9" translatable="false">9</string>
<string name="_0" translatable="false">0</string>
<string name="remove">remove</string>
<string name="password_same">Пароли совпали</string>
<string name="password_not_same">Пароли не совпали</string>
</resources>
\ No newline at end of file
......@@ -59,15 +59,15 @@
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_width">wrap_content</item>
<item name="background">@drawable/bgn_pin_btn</item>
<item name="android:paddingTop">@dimen/_16sdp</item>
<item name="android:paddingBottom">@dimen/_16sdp</item>
<item name="android:paddingTop">@dimen/_14sdp</item>
<item name="android:paddingBottom">@dimen/_14sdp</item>
<item name="android:paddingStart">@dimen/_20sdp</item>
<item name="android:paddingEnd">@dimen/_20sdp</item>
<item name="android:clickable">true</item>
<item name="android:focusable">true</item>
<item name="android:gravity">center</item>
<item name="android:textStyle">bold</item>
<item name="android:textSize">18sp</item>
<item name="android:textSize">20sp</item>
</style>
<style name="PinStyle">
......@@ -78,7 +78,6 @@
<item name="android:focusable">true</item>
<item name="android:hint">*</item>
<item name="android:inputType">number</item>
<item name="android:imeOptions">actionNext</item>
<item name="android:layout_marginStart">@dimen/_4sdp</item>
<item name="android:layout_marginEnd">@dimen/_4sdp</item>
<item name="android:textColorHint">@color/black</item>
......
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