Commit a714b180 authored by shohboz's avatar shohboz

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

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