Commit f36c04c8 authored by shohboz's avatar shohboz

[UPD] MUS-282 Feature, updated home page data

parent 53283a78
...@@ -2,26 +2,26 @@ package com.mobiuz.app.dev.model ...@@ -2,26 +2,26 @@ package com.mobiuz.app.dev.model
data class ServiceData ( data class ServiceData (
val id:Int, val id:Int,
val title:UzRuEn, val title:Translate,
val short_description:UzRuEn, val short_description:Translate,
val data: List<InnerData> val data: List<InnerData>
) )
data class UzRuEn( data class Translate(
val uz:String, val uz:String,
val ru:String, val ru:String,
val en:String val en:String
) )
data class InnerData( data class InnerData(
val title:UzRuEn, val title:Translate,
val data: List<UssdData> val data: List<UssdData>
) )
data class UssdData( data class UssdData(
val title:UzRuEn, val title:Translate,
val short_description:UzRuEn, val short_description:Translate,
val code: String, val code: String,
val limit: Int, val limit: Int,
) )
\ No newline at end of file \ No newline at end of file
...@@ -62,6 +62,12 @@ class SharedPref @Inject constructor(@ApplicationContext context: Context) { ...@@ -62,6 +62,12 @@ class SharedPref @Inject constructor(@ApplicationContext context: Context) {
mySharedPref.edit().putString(::userName.name, value).apply() mySharedPref.edit().putString(::userName.name, value).apply()
} }
var userBirthday: String
get() = mySharedPref.getString(::userBirthday.name, "") ?: ""
set(value) {
mySharedPref.edit().putString(::userBirthday.name, value).apply()
}
var services: String var services: String
get() = mySharedPref.getString(::services.name, "") ?: "" get() = mySharedPref.getString(::services.name, "") ?: ""
set(value) { set(value) {
......
...@@ -7,7 +7,8 @@ data class Customer( ...@@ -7,7 +7,8 @@ data class Customer(
data class CustomerData( data class CustomerData(
var info: CustomerInfo?, var info: CustomerInfo?,
var name: String, var name: String,
val tariff:TarifCodeName? val tariff:TarifCodeName?,
var date_of_birth: String
) )
data class TarifCodeName( data class TarifCodeName(
......
package com.mobiuz.app.dev.network.model
data class Status(
var message: String,
var code: Int
)
\ No newline at end of file
...@@ -136,7 +136,6 @@ class AuthRepository @Inject constructor( ...@@ -136,7 +136,6 @@ class AuthRepository @Inject constructor(
suspend fun resetSmsCode(data: UserAuth): UiStateObject<String> { suspend fun resetSmsCode(data: UserAuth): UiStateObject<String> {
return try { return try {
val res = apiService.reSendSms(data) val res = apiService.reSendSms(data)
when { when {
res.status -> { res.status -> {
UiStateObject.SUCCESS(res.data ?: "") UiStateObject.SUCCESS(res.data ?: "")
......
package com.mobiuz.app.dev.ui.auth package com.mobiuz.app.dev.ui.auth
import android.util.Log
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.mobiuz.app.dev.model.UserAuth import com.mobiuz.app.dev.model.UserAuth
...@@ -8,7 +9,9 @@ import com.mobiuz.app.dev.network.model.ChangePassword ...@@ -8,7 +9,9 @@ import com.mobiuz.app.dev.network.model.ChangePassword
import com.mobiuz.app.dev.network.model.UiStateObject import com.mobiuz.app.dev.network.model.UiStateObject
import com.mobiuz.app.dev.network.repository.AuthRepository import com.mobiuz.app.dev.network.repository.AuthRepository
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import javax.inject.Inject import javax.inject.Inject
...@@ -18,94 +21,84 @@ class AuthViewModel @Inject constructor( ...@@ -18,94 +21,84 @@ class AuthViewModel @Inject constructor(
private val repository: AuthRepository private val repository: AuthRepository
) : ViewModel() { ) : ViewModel() {
private val _checkPhoneUiState = MutableStateFlow<UiStateObject<Action>>(UiStateObject.EMPTY) private val _checkPhoneUiState = MutableSharedFlow<UiStateObject<Action>>()
val checkPhoneUiState: StateFlow<UiStateObject<Action>> = _checkPhoneUiState val checkPhoneUiState: SharedFlow<UiStateObject<Action>> = _checkPhoneUiState
fun checkPhone(data: UserAuth) = viewModelScope.launch { fun checkPhone(data: UserAuth) = viewModelScope.launch {
_checkPhoneUiState.value = UiStateObject.LOADING _checkPhoneUiState.emit(UiStateObject.LOADING)
_checkPhoneUiState.value = repository.checkPhone(data) _checkPhoneUiState.emit(repository.checkPhone(data))
_checkPhoneUiState.value = UiStateObject.EMPTY
} }
private val _registerUiState = MutableStateFlow<UiStateObject<String>>(UiStateObject.EMPTY) private val _registerUiState = MutableSharedFlow<UiStateObject<String>>()
val registerUiState: StateFlow<UiStateObject<String>> = _registerUiState val registerUiState: SharedFlow<UiStateObject<String>> = _registerUiState
fun register(data: UserAuth) = viewModelScope.launch { fun register(data: UserAuth) = viewModelScope.launch {
_registerUiState.value = UiStateObject.LOADING _registerUiState.emit(UiStateObject.LOADING)
_registerUiState.value = repository.registerUser(data) _registerUiState.emit(repository.registerUser(data))
_registerUiState.value = UiStateObject.EMPTY
} }
private val _verificationUiState = MutableStateFlow<UiStateObject<String>>(UiStateObject.EMPTY) private val _verificationUiState = MutableSharedFlow<UiStateObject<String>>()
val verificationUiState: StateFlow<UiStateObject<String>> = _verificationUiState val verificationUiState: SharedFlow<UiStateObject<String>> = _verificationUiState
fun verification(data: UserAuth) = viewModelScope.launch { fun verification(data: UserAuth) = viewModelScope.launch {
_verificationUiState.value = UiStateObject.LOADING _verificationUiState.emit(UiStateObject.LOADING)
_verificationUiState.value = repository.checkSMSCode(data) _verificationUiState.emit(repository.checkSMSCode(data))
_verificationUiState.value = UiStateObject.EMPTY
} }
private val _loginUiState = MutableStateFlow<UiStateObject<String>>(UiStateObject.EMPTY) private val _loginUiState = MutableSharedFlow<UiStateObject<String>>()
val loginUiState: StateFlow<UiStateObject<String>> = _loginUiState val loginUiState: SharedFlow<UiStateObject<String>> = _loginUiState
fun login(data: UserAuth) = viewModelScope.launch { fun login(data: UserAuth) = viewModelScope.launch {
_loginUiState.value = UiStateObject.LOADING _loginUiState.emit(UiStateObject.LOADING)
_loginUiState.value = repository.loginUser(data) _loginUiState.emit(repository.loginUser(data))
_loginUiState.value = UiStateObject.EMPTY
} }
private val _forgetPasswordUiState = MutableStateFlow<UiStateObject<String>>(UiStateObject.EMPTY) private val _forgetPasswordUiState = MutableSharedFlow<UiStateObject<String>>()
val forgetPasswordUiState: StateFlow<UiStateObject<String>> = _forgetPasswordUiState val forgetPasswordUiState: SharedFlow<UiStateObject<String>> = _forgetPasswordUiState
fun forgetPassword(data: UserAuth) = viewModelScope.launch { fun forgetPassword(data: UserAuth) = viewModelScope.launch {
_forgetPasswordUiState.value = UiStateObject.LOADING _forgetPasswordUiState.emit(UiStateObject.LOADING)
_forgetPasswordUiState.value = repository.forgetPassword(data) _forgetPasswordUiState.emit(repository.forgetPassword(data))
_forgetPasswordUiState.value = UiStateObject.EMPTY
} }
private val _checkResetCodeUiState = MutableStateFlow<UiStateObject<String>>(UiStateObject.EMPTY) private val _checkResetCodeUiState = MutableSharedFlow<UiStateObject<String>>()
val checkResetCodeUiState: StateFlow<UiStateObject<String>> = _checkResetCodeUiState val checkResetCodeUiState: SharedFlow<UiStateObject<String>> = _checkResetCodeUiState
fun checkResetCode(data: UserAuth) = viewModelScope.launch { fun checkResetCode(data: UserAuth) = viewModelScope.launch {
_checkResetCodeUiState.value = UiStateObject.LOADING _checkResetCodeUiState.emit(UiStateObject.LOADING)
_checkResetCodeUiState.value = repository.checkResetCode(data) _checkResetCodeUiState.emit(repository.checkResetCode(data))
_checkResetCodeUiState.value = UiStateObject.EMPTY
} }
private val _resetPasswordUiState = MutableStateFlow<UiStateObject<String>>(UiStateObject.EMPTY) private val _resetPasswordUiState = MutableSharedFlow<UiStateObject<String>>()
val resetPasswordUiState: StateFlow<UiStateObject<String>> = _resetPasswordUiState val resetPasswordUiState: SharedFlow<UiStateObject<String>> = _resetPasswordUiState
fun resetPassword(data: UserAuth) = viewModelScope.launch { fun resetPassword(data: UserAuth) = viewModelScope.launch {
_resetPasswordUiState.value = UiStateObject.LOADING _resetPasswordUiState.emit(UiStateObject.LOADING)
_resetPasswordUiState.value = repository.resetPassword(data) _resetPasswordUiState.emit(repository.resetPassword(data))
_resetPasswordUiState.value = UiStateObject.EMPTY
} }
private val _resetSmsCodeUiState = MutableStateFlow<UiStateObject<String>>(UiStateObject.EMPTY) private val _resetSmsCodeUiState = MutableSharedFlow<UiStateObject<String>>()
val resetSmsCodeUiState: StateFlow<UiStateObject<String>> = _resetSmsCodeUiState val resetSmsCodeUiState: SharedFlow<UiStateObject<String>> = _resetSmsCodeUiState
fun resetSmsCode(data: UserAuth) = viewModelScope.launch { fun resetSmsCode(data: UserAuth) = viewModelScope.launch {
_resetSmsCodeUiState.value = UiStateObject.LOADING _resetSmsCodeUiState.emit(UiStateObject.LOADING)
_resetSmsCodeUiState.value = repository.resetSmsCode(data) _resetSmsCodeUiState.emit(repository.resetSmsCode(data))
_resetSmsCodeUiState.value = UiStateObject.EMPTY
} }
private val _checkPasswordUiState = MutableStateFlow<UiStateObject<String>>(UiStateObject.EMPTY) private val _checkPasswordUiState = MutableSharedFlow<UiStateObject<String>>()
val checkPasswordUiState: StateFlow<UiStateObject<String>> = _checkPasswordUiState val checkPasswordUiState: SharedFlow<UiStateObject<String>> = _checkPasswordUiState
fun checkPassword(data: UserAuth) = viewModelScope.launch { fun checkPassword(data: UserAuth) = viewModelScope.launch {
_checkPasswordUiState.value = UiStateObject.LOADING _checkPasswordUiState.emit(UiStateObject.LOADING)
_checkPasswordUiState.value = repository.checkPassword(data) _checkPasswordUiState.emit(repository.checkPassword(data))
_checkPasswordUiState.value = UiStateObject.EMPTY
} }
private val _changePasswordUiState = MutableStateFlow<UiStateObject<String>>(UiStateObject.EMPTY) private val _changePasswordUiState = MutableSharedFlow<UiStateObject<String>>()
val changePasswordUiState: StateFlow<UiStateObject<String>> = _changePasswordUiState val changePasswordUiState: SharedFlow<UiStateObject<String>> = _changePasswordUiState
fun changePassword(data: ChangePassword) = viewModelScope.launch { fun changePassword(data: ChangePassword) = viewModelScope.launch {
_changePasswordUiState.value = UiStateObject.LOADING _changePasswordUiState.emit(UiStateObject.LOADING)
_changePasswordUiState.value = repository.installPassword(data) _changePasswordUiState.emit(repository.installPassword(data))
_changePasswordUiState.value = UiStateObject.EMPTY
} }
......
package com.mobiuz.app.dev.ui.auth.verification package com.mobiuz.app.dev.ui.auth.verification
import android.graphics.Color
import android.os.Bundle import android.os.Bundle
import android.view.KeyEvent
import android.view.View import android.view.View
import android.view.animation.AnimationUtils import android.view.animation.AnimationUtils
import androidx.core.os.bundleOf import androidx.core.os.bundleOf
...@@ -10,6 +10,7 @@ import androidx.fragment.app.viewModels ...@@ -10,6 +10,7 @@ import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavController import androidx.navigation.NavController
import androidx.navigation.fragment.NavHostFragment import androidx.navigation.fragment.NavHostFragment
import com.google.android.material.textfield.TextInputEditText
import com.mobiuz.app.R import com.mobiuz.app.R
import com.mobiuz.app.databinding.FragmentVerificationBinding import com.mobiuz.app.databinding.FragmentVerificationBinding
import com.mobiuz.app.dev.model.SharedPref import com.mobiuz.app.dev.model.SharedPref
...@@ -21,14 +22,21 @@ import com.mobiuz.app.dev.ui.global.ButtonClick ...@@ -21,14 +22,21 @@ import com.mobiuz.app.dev.ui.global.ButtonClick
import com.mobiuz.app.dev.ui.global.CONSTANTS import com.mobiuz.app.dev.ui.global.CONSTANTS
import com.mobiuz.app.dev.ui.global.TextWatcherWrapper import com.mobiuz.app.dev.ui.global.TextWatcherWrapper
import com.mobiuz.app.dev.utils.Utils import com.mobiuz.app.dev.utils.Utils
import com.mobiuz.app.dev.utils.extensions.clearText
import com.mobiuz.app.dev.utils.extensions.getColorCompat
import com.mobiuz.app.dev.utils.extensions.isEmpty
import com.mobiuz.app.dev.utils.extensions.isNotEmpty
import com.mobiuz.app.dev.utils.hideKeyboard import com.mobiuz.app.dev.utils.hideKeyboard
import com.mobiuz.app.dev.utils.showKeyboard
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.collect
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint @AndroidEntryPoint
class VerificationFragment : BaseFragment(R.layout.fragment_verification) { class VerificationFragment : BaseFragment(R.layout.fragment_verification) {
@Inject @Inject
lateinit var pref: SharedPref lateinit var pref: SharedPref
...@@ -37,6 +45,7 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) { ...@@ -37,6 +45,7 @@ class VerificationFragment : 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) }
private var code = "" private var code = ""
private var verificationCode = ""
private var phone = "" private var phone = ""
...@@ -47,6 +56,7 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) { ...@@ -47,6 +56,7 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) {
arguments?.let { arguments?.let {
phone = it.getString(CONSTANTS.PHONE) ?: "" phone = it.getString(CONSTANTS.PHONE) ?: ""
type = it.getString(CONSTANTS.TYPE_VERIFICATION) ?: "" type = it.getString(CONSTANTS.TYPE_VERIFICATION) ?: ""
verificationCode = it.getString(CONSTANTS.PIN_CODE) ?: ""
} }
} }
...@@ -64,21 +74,20 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) { ...@@ -64,21 +74,20 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) {
navController.navigateUp() navController.navigateUp()
} }
loadEdited()
viewGroup.setOnClickListener(object : ButtonClick() { viewGroup.setOnClickListener(object : ButtonClick() {
override fun onSingleClick(v: View?) { override fun onSingleClick(v: View?) {
v?.hideKeyboard() v?.hideKeyboard()
} }
}) })
lineField.addTextChangedListener(object : TextWatcherWrapper() { frame.setOnClickListener(object : ButtonClick() {
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { override fun onSingleClick(v: View?) {
super.onTextChanged(s, start, before, count) checkFocus().showKeyboard()
bn.lineField.setTextColor(Color.RED) setColorPins(getColorCompat(R.color.black100))
btnLogin.isEnabled = (s.toString().length == 6)
} }
}) })
btnLogin.setOnClickListener(object : ButtonClick() { btnLogin.setOnClickListener(object : ButtonClick() {
override fun onSingleClick(v: View?) { override fun onSingleClick(v: View?) {
getLinePinCodes() getLinePinCodes()
...@@ -93,21 +102,113 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) { ...@@ -93,21 +102,113 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) {
}) })
sentCodeAgain.setOnClickListener { sentCodeAgain.setOnClickListener {
count(true) viewModel.resetSmsCode(UserAuth(phone.replace("+", "").replace(" ", "")))
} }
coutdownView.setOnCountdownEndListener { coutdownView.setOnCountdownEndListener {
count(false) count(false)
} }
setVerificationCode()
} }
} }
override fun onResume() { private fun setVerificationCode() {
super.onResume() if(verificationCode.length == 6){
bn.lineField.hideKeyboard() bn.apply {
pin1.setText(verificationCode[0].toString())
pin2.setText(verificationCode[1].toString())
pin3.setText(verificationCode[2].toString())
pin4.setText(verificationCode[3].toString())
pin5.setText(verificationCode[4].toString())
pin6.setText(verificationCode[5].toString())
pin6.requestFocus()
btnLogin.isEnabled = true
}
}
} }
private fun getLinePinCodes() { private fun getLinePinCodes() {
code = bn.lineField.text.toString() 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 setColorPins(color: Int) {
bn.apply {
pin1.setTextColor(color)
pin2.setTextColor(color)
pin3.setTextColor(color)
pin4.setTextColor(color)
pin5.setTextColor(color)
pin6.setTextColor(color)
}
}
private fun checkFocus(): View {
bn.apply {
return when {
pin1.isEmpty() -> pin1
pin2.isEmpty() -> pin2
pin3.isEmpty() -> pin3
pin4.isEmpty() -> pin4
pin5.isEmpty() -> pin5
else -> pin6
}
}
}
private fun clearLatest(): View {
bn.apply {
return when {
pin6.isNotEmpty() -> pin6.clearText()
pin5.isNotEmpty() -> pin5.clearText()
pin4.isNotEmpty() -> pin4.clearText()
pin3.isNotEmpty() -> pin3.clearText()
pin2.isNotEmpty() -> pin2.clearText()
else -> pin1.clearText()
}
}
}
private fun loadEdited() {
bn.apply {
for (i in 0 until pinView.childCount) {
(pinView.getChildAt(i) as TextInputEditText).apply {
this.addTextChangedListener(object : TextWatcherWrapper() {
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
super.onTextChanged(s, start, before, count)
bn.txtErrorCode.isVisible = false
if (s.toString().isNotEmpty()) {
if (i == pinView.childCount - 1) {
pin6.hideKeyboard()
btnLogin.isEnabled = true
} else pinView.getChildAt(i + 1).requestFocus()
this@apply.setBackgroundResource(R.drawable.bgn_ver_checked)
} else {
if (i == pinView.childCount - 1) {
btnLogin.isEnabled = false
}
this@apply.setBackgroundResource(R.drawable.bgn_ver_unchecked)
}
}
})
}
}
for (i in 0 until pinView.childCount) {
pinView.getChildAt(i).setOnKeyListener { _, keyCode, event ->
if (event.action == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_DEL) {
clearLatest().requestFocus()
return@setOnKeyListener false
}
false
}
}
}
} }
override fun collects() { override fun collects() {
...@@ -117,12 +218,35 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) { ...@@ -117,12 +218,35 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) {
is UiStateObject.SUCCESS -> { is UiStateObject.SUCCESS -> {
showProgressDialog(false) showProgressDialog(false)
pref.userPhone = phone pref.userPhone = phone
navController.navigate(R.id.pinFragment, null, Utils.navOptions()) navController.navigate(R.id.pinFragment, bundleOf(CONSTANTS.TYPE_PIN to CONSTANTS.NEW_PIN), Utils.navOptions())
}
is UiStateObject.ERROR -> {
showProgressDialog(false)
setColorPins(getColorCompat(R.color.primary100))
bn.txtErrorCode.isVisible = true
bn.pinView.startAnimation(AnimationUtils.loadAnimation(requireContext(), R.anim.shake))
showToastMessage(it.message)
}
is UiStateObject.LOADING -> {
showProgressDialog(true)
}
else -> Unit
}
}
}
viewLifecycleOwner.lifecycleScope.launchWhenStarted {
viewModel.resetSmsCodeUiState.collect {
when (it) {
is UiStateObject.SUCCESS -> {
showToastMessage(it.data)
verificationCode = it.data
setVerificationCode()
count(true)
showProgressDialog(false)
} }
is UiStateObject.ERROR -> { is UiStateObject.ERROR -> {
showProgressDialog(false) showProgressDialog(false)
bn.lineField.setTextColor(Color.RED)
bn.lineField.startAnimation(AnimationUtils.loadAnimation(requireContext(), R.anim.shake))
showToastMessage(it.message) showToastMessage(it.message)
} }
...@@ -151,11 +275,10 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) { ...@@ -151,11 +275,10 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) {
} }
is UiStateObject.ERROR -> { is UiStateObject.ERROR -> {
showProgressDialog(false) showProgressDialog(false)
bn.lineField.setTextColor(Color.RED) setColorPins(getColorCompat(R.color.primary100))
bn.lineField.startAnimation(AnimationUtils.loadAnimation(requireContext(), R.anim.shake)) bn.pinView.startAnimation(AnimationUtils.loadAnimation(requireContext(), R.anim.shake))
showToastMessage(it.message) showToastMessage(it.message)
} }
is UiStateObject.LOADING -> { is UiStateObject.LOADING -> {
showProgressDialog(true) showProgressDialog(true)
} }
...@@ -167,11 +290,10 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) { ...@@ -167,11 +290,10 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) {
private fun count(status: Boolean) { private fun count(status: Boolean) {
bn.apply { bn.apply {
countWaitText.hideKeyboard()
sentCodeAgain.isVisible = !status sentCodeAgain.isVisible = !status
coutdownViewHelperText.isVisible = !status coutdownViewHelperText.isVisible = !status
coutdownView.isVisible = status coutdownView.isVisible = status
if (status) coutdownView.start(60000) if (status) coutdownView.start(CONSTANTS.RESEND_CODE_TIME)
} }
} }
......
...@@ -20,30 +20,25 @@ object CONSTANTS { ...@@ -20,30 +20,25 @@ object CONSTANTS {
const val PHONE1 = "0890" const val PHONE1 = "0890"
const val PHONE2 = "+998 97 130 09 09" const val PHONE2 = "+998 97 130 09 09"
const val PHONE3 = "+998 97 203 10 10" const val PHONE3 = "+998 97 203 10 10"
const val DEFAULT_PHONE = "+998 97 999-99-99"
const val RESEND_CODE_TIME = 60000L
const val BLOCKED_TIME = 600
const val PHONE = "phone" const val PHONE = "phone"
const val RESEND_CODE_TIME = 10000L
const val BLOCKED_TIME = 6000
//auth types
const val TYPE_AUTH = "type_auth" const val TYPE_AUTH = "type_auth"
const val LOGIN = "login" const val LOGIN = "login"
const val TYPE_VERIFICATION = "type_verification" const val TYPE_VERIFICATION = "type_verification"
const val TYPE_FORGET = "type_forget" const val TYPE_FORGET = "type_forget"
const val PIN_CODE = "PIN_CODE" const val PIN_CODE = "PIN_CODE"
const val FIRST = "first" const val FIRST = "first"
const val SERVICE = "service" const val SERVICE = "service"
const val TYPE_SERVICE = "type_service" const val TYPE_SERVICE = "type_service"
const val OFFLINE = "offline" const val OFFLINE = "offline"
const val FROM_ONLINE = "FROM_ONLINE"
const val DEFAULT_PHONE = "+998 97 999-99-99"
const val FULL_SCREEN_DIALOG = "full_screen_dialog" const val FULL_SCREEN_DIALOG = "full_screen_dialog"
const val CONNECTIVITY_CHANGE = "android.net.conn.CONNECTIVITY_CHANGE"
const val MY_CONNECTIVITY_CHANGE = "MY_CONNECTIVITY_CHANGE"
//password types //password types
...@@ -57,6 +52,7 @@ object CONSTANTS { ...@@ -57,6 +52,7 @@ object CONSTANTS {
//pin types //pin types
const val TYPE_PIN = "TYPE_PIN" const val TYPE_PIN = "TYPE_PIN"
const val TYPE_AFTER = "TYPE_AFTER"
const val NEW_PIN = "NEW_PIN" const val NEW_PIN = "NEW_PIN"
const val CONFIRM_NEW_PIN = "CONFIRM_NEW_PIN" const val CONFIRM_NEW_PIN = "CONFIRM_NEW_PIN"
const val CURRENT_PIN = "CURRENT_PIN" const val CURRENT_PIN = "CURRENT_PIN"
...@@ -80,7 +76,4 @@ object CONSTANTS { ...@@ -80,7 +76,4 @@ object CONSTANTS {
const val API_CHANGE_PASSWORD = "customer/change-password" const val API_CHANGE_PASSWORD = "customer/change-password"
const val API_SERVICE_INDEX = "service/index" const val API_SERVICE_INDEX = "service/index"
const val LONGITUDE = 69.2602108116081
const val LATITUDE = 41.34823322480444
} }
...@@ -5,12 +5,16 @@ import android.content.Intent ...@@ -5,12 +5,16 @@ import android.content.Intent
import android.graphics.Color import android.graphics.Color
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.widget.FrameLayout
import android.widget.LinearLayout
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavController import androidx.navigation.NavController
import androidx.navigation.fragment.NavHostFragment import androidx.navigation.fragment.NavHostFragment
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.tabs.TabLayoutMediator
import com.mobiuz.app.BillingActivity import com.mobiuz.app.BillingActivity
import com.mobiuz.app.R import com.mobiuz.app.R
import com.mobiuz.app.databinding.FragmentHomeBinding import com.mobiuz.app.databinding.FragmentHomeBinding
...@@ -20,10 +24,13 @@ import com.mobiuz.app.dev.network.model.Customer ...@@ -20,10 +24,13 @@ import com.mobiuz.app.dev.network.model.Customer
import com.mobiuz.app.dev.network.model.UiStateObject import com.mobiuz.app.dev.network.model.UiStateObject
import com.mobiuz.app.dev.ui.base.BaseFragment import com.mobiuz.app.dev.ui.base.BaseFragment
import com.mobiuz.app.dev.utils.extensions.* import com.mobiuz.app.dev.utils.extensions.*
import com.xw.repo.widget.BounceScrollView
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.collect
import me.everything.android.ui.overscroll.OverScrollDecoratorHelper import kotlinx.coroutines.isActive
import java.text.SimpleDateFormat
import java.util.*
import javax.inject.Inject import javax.inject.Inject
...@@ -37,16 +44,19 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) { ...@@ -37,16 +44,19 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) {
private val bn get() = _bn ?: throw NullPointerException("cannot inflate") private val bn get() = _bn ?: throw NullPointerException("cannot inflate")
private val viewModel: HomeViewModel by viewModels() private val viewModel: HomeViewModel by viewModels()
private lateinit var mainViewModel: MainViewModel private lateinit var mainViewModel: MainViewModel
private var isProgressing = false
private var isFirstProgressing = true private var isFirstProgressing = true
private val navController: NavController by lazy(LazyThreadSafetyMode.NONE) { NavHostFragment.findNavController(this) } private var jobAutoSlide: Job? = null
private var customer: Customer? = null private var customer: Customer? = null
private var overScroll = 0
private val sliderAdapter = SliderAdapter()
private var lastUpdateTime = 0L
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
mainViewModel = ViewModelProvider(requireActivity())[MainViewModel::class.java] mainViewModel = ViewModelProvider(requireActivity())[MainViewModel::class.java]
viewModel.mainIndex() viewModel.mainIndex()
lastUpdateTime = System.currentTimeMillis()
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
...@@ -62,10 +72,28 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) { ...@@ -62,10 +72,28 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) {
override fun setUpUI() { override fun setUpUI() {
bn.apply { bn.apply {
slider.adapter = sliderAdapter
TabLayoutMediator(tabIndicator, slider) { _, _ -> }.attach()
jobAutoSlide = viewLifecycleOwner.lifecycleScope.launchWhenStarted {
while (isActive) {
delay(4000)
if (slider.currentItem != tabIndicator.tabCount - 1) {
slider.currentItem = slider.currentItem + 1
} else {
slider.currentItem = 0
}
}
}
slider.offscreenPageLimit = 3
slider.getChildAt(0).overScrollMode = RecyclerView.OVER_SCROLL_NEVER
btnAddSum.setOnClickListener { btnAddSum.setOnClickListener {
pref.isShowPin = false pref.isShowPin = false
pref.blockedTime = System.currentTimeMillis() pref.blockedTime = System.currentTimeMillis()
startActivity(Intent(requireContext(),BillingActivity::class.java)) startActivity(Intent(requireContext(), BillingActivity::class.java))
} }
txtMyNumber.text = pref.userPhone.customMasketHome().replace("-", " ") txtMyNumber.text = pref.userPhone.customMasketHome().replace("-", " ")
...@@ -75,20 +103,33 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) { ...@@ -75,20 +103,33 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) {
mainViewModel.openDrawer(System.currentTimeMillis()) mainViewModel.openDrawer(System.currentTimeMillis())
} }
val params0 = FrameLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)
val params = FrameLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)
bounceScrollView.setOnOverScrollListener { fromStart, overScrolledDistance -> bounceScrollView.setOnOverScrollListener { fromStart, overScrolledDistance ->
if (overScrolledDistance > 120.52632) {
if (!isProgressing) { // customLog("fromStart:$fromStart, overScrolledDistance:$overScrolledDistance")
vibrate(requireContext())
viewModel.mainIndex() if (fromStart && overScrolledDistance > 140.52632 && (lastUpdateTime < System.currentTimeMillis() - 3000)) {
} vibrate(requireContext())
viewModel.mainIndex()
lastUpdateTime = System.currentTimeMillis()
}
if (fromStart && overScroll < overScrolledDistance) {
params.width = homeImage.width + (overScrolledDistance - overScroll)
params.height = homeImage.height + (overScrolledDistance - overScroll)
homeImage.layoutParams = params
} else {
params.width = homeImage.width - (overScroll - overScrolledDistance)
params.height = homeImage.height - (overScroll - overScrolledDistance)
homeImage.layoutParams = params0
} }
overScroll = overScrolledDistance
} }
bounceScrollView.setOnScrollListener { _, scrollY -> bounceScrollView.setOnScrollListener { _, scrollY ->
if (scrollY < 1.0) {
lottie.isVisible = false
}
if (scrollY < 100) { if (scrollY < 100) {
toolbarInsideLayout.isVisible = false toolbarInsideLayout.isVisible = false
topDiv.setBackgroundColor(Color.TRANSPARENT) topDiv.setBackgroundColor(Color.TRANSPARENT)
...@@ -110,7 +151,6 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) { ...@@ -110,7 +151,6 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) {
viewModel.mainIndexUiState.collect { viewModel.mainIndexUiState.collect {
when (it) { when (it) {
is UiStateObject.SUCCESS -> { is UiStateObject.SUCCESS -> {
isProgressing = false
showProgressDialog(false) showProgressDialog(false)
bn.lottie.isVisible = false bn.lottie.isVisible = false
isFirstProgressing = false isFirstProgressing = false
...@@ -118,13 +158,11 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) { ...@@ -118,13 +158,11 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) {
loadData() loadData()
} }
is UiStateObject.ERROR -> { is UiStateObject.ERROR -> {
isProgressing = false
isFirstProgressing = false isFirstProgressing = false
showProgressDialog(false) showProgressDialog(false)
bn.lottie.isVisible = false bn.lottie.isVisible = false
} }
is UiStateObject.LOADING -> { is UiStateObject.LOADING -> {
isProgressing = true
if (isFirstProgressing) showProgressDialog(true) if (isFirstProgressing) showProgressDialog(true)
else { else {
bn.lottie.isVisible = true bn.lottie.isVisible = true
...@@ -144,17 +182,24 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) { ...@@ -144,17 +182,24 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) {
customer?.customer?.info?.let { customer?.customer?.info?.let {
bn.apply { bn.apply {
txtBalance.text = "${it.balance?.amount?.toMoneyFormat()} ${it.balance?.currency}" txtBalance.text = "${it.balance?.amount?.toMoneyFormat()} ${it.balance?.currency}"
it.counters.let { pref.userBirthday = customer?.customer?.date_of_birth ?: ""
txtCountMb.text = it?.BYTE?.value?.toMoneyFormat() ?: "0" it.counters?.let {
txtTypeMb.text = it?.BYTE?.unit ?: "mb" txtCountMb.text = it.BYTE?.value?.toMoneyFormat() ?: "0"
txtTypeMb.text = it.BYTE?.unit ?: "mb"
txtCountMinut.text = it?.SECOND?.value?.toMoneyFormat() ?: "0"
txtTypeMinut.text = it?.SECOND?.unit ?: "min" txtSumTariff.text = getString(R.string.sum_month,it.SECOND?.value?.toMoneyFormat() ?: "0")
txtTarif.text = it?.SECOND?.name ?: "My tarif" txtCountMinut.text = it.SECOND?.value?.toMoneyFormat() ?: "0"
txtTarifTo.text = it?.SECOND?.date_to?.getDateTime() ?: "" txtTypeMinut.text = it.SECOND?.unit ?: "min"
txtTarif.text = it.SECOND?.name ?: "My tarif"
txtCountSms.text = it?.ITEM?.value?.toMoneyFormat() ?: "0"
txtTypeSms.text = it?.ITEM?.unit ?: "sms" val strDate = it.SECOND?.date_to
val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm")
val date: Date = dateFormat.parse(strDate)
val d = SimpleDateFormat("dd MMMM")
txtTarifTo.text = d.format(date)
txtCountSms.text = it.ITEM?.value?.toMoneyFormat() ?: "0"
txtTypeSms.text = it.ITEM?.unit ?: "sms"
} }
mainViewModel.setUserName(customer?.customer?.name ?: "Unnamed User") mainViewModel.setUserName(customer?.customer?.name ?: "Unnamed User")
} }
......
...@@ -25,6 +25,5 @@ class HomeViewModel @Inject constructor( ...@@ -25,6 +25,5 @@ class HomeViewModel @Inject constructor(
_mainIndexUiState.value = repository.mainIndex() _mainIndexUiState.value = repository.mainIndex()
} }
suspend fun logOut() = repository.logOut()
} }
\ No newline at end of file
package com.mobiuz.app.dev.ui.home
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.mobiuz.app.databinding.ItemHomeBinding
class SliderAdapter : RecyclerView.Adapter<SliderAdapter.SliderViewHolder>() {
private var listener: ((String) -> Unit)? = null
private val sliderItems: ArrayList<String> = ArrayList()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SliderViewHolder {
return SliderViewHolder(
ItemHomeBinding.inflate(LayoutInflater.from(parent.context),parent,false)
)
}
override fun onBindViewHolder(holder: SliderViewHolder, position: Int) = holder.onBind()
override fun getItemCount(): Int = 4
inner class SliderViewHolder(val view: ItemHomeBinding) : RecyclerView.ViewHolder(view.root) {
fun onBind() {
}
}
fun setOnClickListener(block: (String) -> Unit) {
listener = block
}
fun submitList(ls: List<String>) {
sliderItems.clear()
sliderItems.addAll(ls)
notifyDataSetChanged()
}
}
\ No newline at end of file
...@@ -14,9 +14,8 @@ import com.mobiuz.app.dev.model.SharedPref ...@@ -14,9 +14,8 @@ import com.mobiuz.app.dev.model.SharedPref
import com.mobiuz.app.dev.model.UssdData import com.mobiuz.app.dev.model.UssdData
import com.mobiuz.app.dev.ui.global.ButtonClick import com.mobiuz.app.dev.ui.global.ButtonClick
import com.mobiuz.app.dev.utils.extensions.getCurrentName import com.mobiuz.app.dev.utils.extensions.getCurrentName
import com.mobiuz.app.utils.checkPermission import com.mobiuz.app.dev.utils.extensions.checkPermission
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import java.lang.Exception
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint @AndroidEntryPoint
...@@ -34,16 +33,19 @@ class UssdBottomSheetDialog(val data: UssdData) : BottomSheetDialogFragment() { ...@@ -34,16 +33,19 @@ class UssdBottomSheetDialog(val data: UssdData) : BottomSheetDialogFragment() {
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_bn = BottomSheetUssdBinding.bind(view) super.onViewCreated(view, savedInstanceState)
lng = pref.language setUpUI()
}
private fun setUpUI() {
bn.apply { bn.apply {
lng = pref.language
data.apply { data.apply {
txtTitle.text = this.title.getCurrentName(lng) txtTitle.text = this.title.getCurrentName(lng)
val dec = this.short_description.getCurrentName(lng) val dec = this.short_description.getCurrentName(lng)
txtDescription.isVisible = dec.isNotEmpty() txtDescription.isVisible = dec.isNotEmpty()
txtDescription.text = dec txtDescription.text = dec
txtCode.text = this.code txtCode.text = this.code
// btnZapros.text = this.text_button
} }
btnZapros.setOnClickListener(object : ButtonClick() { btnZapros.setOnClickListener(object : ButtonClick() {
override fun onSingleClick(v: View?) { override fun onSingleClick(v: View?) {
...@@ -51,9 +53,9 @@ class UssdBottomSheetDialog(val data: UssdData) : BottomSheetDialogFragment() { ...@@ -51,9 +53,9 @@ class UssdBottomSheetDialog(val data: UssdData) : BottomSheetDialogFragment() {
checkPermission(Manifest.permission.CALL_PHONE) { checkPermission(Manifest.permission.CALL_PHONE) {
try { try {
pref.isShowPin = false pref.isShowPin = false
val ussd = data.code.replace("#","") + Uri.encode("#") val ussd = data.code.replace("#", "") + Uri.encode("#")
startActivity(Intent(Intent.ACTION_CALL, Uri.parse("tel:$ussd"))) startActivity(Intent(Intent.ACTION_CALL, Uri.parse("tel:$ussd")))
}catch (e:Exception){ } catch (e: Exception) {
pref.isShowPin = false pref.isShowPin = false
} }
dismiss() dismiss()
......
...@@ -35,6 +35,7 @@ class ProfileFragment : BaseFragment(R.layout.fragment_profile) { ...@@ -35,6 +35,7 @@ class ProfileFragment : BaseFragment(R.layout.fragment_profile) {
bn.apply { bn.apply {
txtUserPhone.text = pref.userPhone.customMasket() txtUserPhone.text = pref.userPhone.customMasket()
txtUserName.text = pref.userName txtUserName.text = pref.userName
txtBirthday.text = pref.userBirthday
txtAvatar.text = pref.userName[0].toString() txtAvatar.text = pref.userName[0].toString()
toolbar.setNavigationOnClickListener { toolbar.setNavigationOnClickListener {
navController.navigateUp() navController.navigateUp()
......
...@@ -22,7 +22,7 @@ import com.google.android.material.textfield.TextInputEditText ...@@ -22,7 +22,7 @@ import com.google.android.material.textfield.TextInputEditText
import com.google.gson.JsonSyntaxException import com.google.gson.JsonSyntaxException
import com.mobiuz.app.R import com.mobiuz.app.R
import com.mobiuz.app.dev.model.SharedPref import com.mobiuz.app.dev.model.SharedPref
import com.mobiuz.app.dev.model.UzRuEn import com.mobiuz.app.dev.model.Translate
import com.mobiuz.app.dev.network.model.Errors import com.mobiuz.app.dev.network.model.Errors
import com.mobiuz.app.dev.ui.global.CONSTANTS import com.mobiuz.app.dev.ui.global.CONSTANTS
import com.mobiuz.app.dev.ui.global.ExitDialog import com.mobiuz.app.dev.ui.global.ExitDialog
...@@ -31,7 +31,6 @@ import com.mobiuz.app.dev.ui.global.SenderDialog ...@@ -31,7 +31,6 @@ import com.mobiuz.app.dev.ui.global.SenderDialog
import retrofit2.HttpException import retrofit2.HttpException
import java.io.IOException import java.io.IOException
import java.net.ConnectException import java.net.ConnectException
import java.sql.Date
import java.sql.Timestamp import java.sql.Timestamp
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
...@@ -271,7 +270,7 @@ fun List<Errors>.getMessage():String{ ...@@ -271,7 +270,7 @@ fun List<Errors>.getMessage():String{
return message return message
} }
fun UzRuEn.getCurrentName(lang:String):String{ fun Translate.getCurrentName(lang:String):String{
return when(lang){ return when(lang){
CONSTANTS.EN -> this.en CONSTANTS.EN -> this.en
CONSTANTS.RU -> this.ru CONSTANTS.RU -> this.ru
......
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true">
<shape android:innerRadius="0dp" android:shape="ring" android:thickness="5dp" android:useLevel="false">
<solid android:color="@color/primary110" />
</shape>
</item>
<item>
<shape android:innerRadius="0dp" android:shape="ring" android:thickness="5dp" android:useLevel="false">
<solid android:color="@color/grey20" />
</shape>
</item>
</selector>
\ No newline at end of file
...@@ -200,7 +200,8 @@ ...@@ -200,7 +200,8 @@
android:layout_gravity="center" android:layout_gravity="center"
android:layout_weight="1" android:layout_weight="1"
android:gravity="end" android:gravity="end"
android:text="0 Сум/мес" android:id="@+id/txt_sum_tariff"
android:text="@string/sum_month"
android:textColor="@color/grey70" android:textColor="@color/grey70"
android:textSize="14sp" /> android:textSize="14sp" />
</LinearLayout> </LinearLayout>
...@@ -358,40 +359,27 @@ ...@@ -358,40 +359,27 @@
</LinearLayout> </LinearLayout>
</com.google.android.material.card.MaterialCardView> </com.google.android.material.card.MaterialCardView>
<include <androidx.viewpager2.widget.ViewPager2
layout="@layout/item_home" android:id="@+id/slider"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="@dimen/_150sdp"
android:layout_marginHorizontal="12dp" android:layout_marginHorizontal="12dp"
android:layout_marginTop="@dimen/_16sdp" /> android:layout_marginTop="@dimen/_16sdp"
android:layout_height="@dimen/_150sdp" />
<ImageView <com.google.android.material.tabs.TabLayout
android:layout_width="wrap_content" android:id="@+id/tabIndicator"
android:layout_height="wrap_content" android:backgroundTint="@android:color/transparent"
android:layout_gravity="center"
android:layout_marginHorizontal="12dp"
android:layout_marginTop="@dimen/_8sdp"
android:layout_marginBottom="@dimen/_20sdp"
android:background="?selectableItemBackgroundBorderless"
android:src="@drawable/ic_group_12" />
<include
layout="@layout/item_home"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="@dimen/_150sdp" android:layout_height="24dp"
android:layout_marginHorizontal="12dp" app:tabPaddingStart="8dp"
android:layout_marginTop="@dimen/_16sdp" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
android:layout_marginHorizontal="12dp" android:layout_marginHorizontal="12dp"
android:layout_marginTop="@dimen/_8sdp"
android:layout_marginBottom="@dimen/_20sdp" android:layout_marginBottom="@dimen/_20sdp"
android:background="?selectableItemBackgroundBorderless" app:tabPaddingEnd="8dp"
android:src="@drawable/ic_group_12" /> app:tabIndicatorHeight="0dp"
app:layout_constraintEnd_toEndOf="parent"
app:tabBackground="@drawable/tab_indicator"
app:tabGravity="center" />
</LinearLayout> </LinearLayout>
</com.xw.repo.widget.BounceScrollView> </com.xw.repo.widget.BounceScrollView>
......
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical" android:layout_width="match_parent"
android:paddingVertical="@dimen/_16sdp" android:layout_height="match_parent"
android:paddingHorizontal="12dp" android:orientation="vertical">
android:background="@drawable/banner"
android:layout_height="@dimen/_140sdp"> <LinearLayout
android:layout_width="match_parent"
<ImageView android:paddingVertical="@dimen/_16sdp"
android:layout_width="wrap_content" android:layout_height="@dimen/_140sdp"
android:textColor="@color/primary100" android:paddingHorizontal="12dp"
android:src="@drawable/ic_mobiuz_logo_red" android:background="@drawable/banner"
android:textStyle="bold" android:orientation="vertical">
android:textSize="24sp"
android:layout_height="wrap_content"/> <ImageView
<TextView
android:layout_width="wrap_content"
android:textColor="@color/black80"
android:maxWidth="@dimen/_120sdp"
android:layout_marginTop="13dp"
android:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Dui, risus"
android:textSize="10sp"
android:layout_marginBottom="8dp"
android:layout_height="wrap_content"/>
<com.google.android.material.card.MaterialCardView
android:layout_width="wrap_content"
app:cardCornerRadius="4dp"
android:layout_marginTop="20dp"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:paddingHorizontal="16dp" android:layout_height="wrap_content"
android:paddingVertical="8dp" android:src="@drawable/ic_mobiuz_logo_red"
android:layout_height="wrap_content"> android:textColor="@color/primary100"
android:textSize="24sp"
android:textStyle="bold" />
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:textColor="@color/primary100" android:layout_height="wrap_content"
android:text="Узнать больше" android:layout_marginTop="13dp"
android:textStyle="bold" android:layout_marginBottom="8dp"
android:textSize="12sp" android:maxWidth="@dimen/_120sdp"
android:layout_gravity="center" android:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Dui, risus"
android:layout_height="wrap_content"/> android:textColor="@color/black80"
android:textSize="10sp" />
<ImageView
<com.google.android.material.card.MaterialCardView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
app:cardCornerRadius="4dp">
<LinearLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_marginStart="4dp" android:layout_height="wrap_content"
android:src="@drawable/ic_baseline_keyboard_arrow_right" android:paddingHorizontal="16dp"
android:layout_height="wrap_content"/> android:paddingVertical="8dp">
</LinearLayout>
</com.google.android.material.card.MaterialCardView> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Узнать больше"
android:textColor="@color/primary100"
android:textSize="12sp"
android:textStyle="bold" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="4dp"
android:src="@drawable/ic_baseline_keyboard_arrow_right" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
</LinearLayout>
</LinearLayout> </LinearLayout>
\ No newline at end of file
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
<fragment <fragment
android:id="@+id/myVerificationFragment" android:id="@+id/myVerificationFragment"
android:name="com.mobiuz.app.dev.ui.auth.verification.MyVerificationFragment" android:name="com.mobiuz.app.dev.ui.auth.verification.VerificationFragment"
android:label="MyVerificationFragment" /> android:label="MyVerificationFragment" />
</navigation> </navigation>
\ No newline at end of file
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
<navigation xmlns:android="http://schemas.android.com/apk/res/android" <navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
app:startDestination="@id/homeFragment" app:startDestination="@id/fullScreenFragment"
android:id="@+id/nav_graph_home"> android:id="@+id/nav_graph_home">
<fragment <fragment
...@@ -48,4 +48,10 @@ ...@@ -48,4 +48,10 @@
android:label="fragment_billing" android:label="fragment_billing"
tools:layout="@layout/fragment_billing" /> tools:layout="@layout/fragment_billing" />
<fragment
android:id="@+id/fullScreenFragment"
tools:layout="@layout/fragment_pin_dialog"
android:name="com.mobiuz.app.dev.ui.global.FullScreenFragment"
android:label="FullScreenFragment" />
</navigation> </navigation>
\ No newline at end of file
...@@ -79,6 +79,52 @@ ...@@ -79,6 +79,52 @@
<string name="open">Available</string> <string name="open">Available</string>
<string name="yes_internet_connect">Internet connection restored</string> <string name="yes_internet_connect">Internet connection restored</string>
<string name="not_internet_connect">No active connection</string> <string name="not_internet_connect">No active connection</string>
<string name="btn_try_again">Try again</string> <string name="btn_try_again">Попробуй снова</string>
<string name="not_internet_try_again">Check your internet connection and try again</string> <string name="not_internet_try_again">Check your internet connection and try again</string>
<string name="cannot_change_pin">You cannot change new pin to current pin</string>
<string name="cannot_change_password">You cannot change new password to current password</string>
<string name="password_updated">Password Successfully Updated</string>
<string name="by_signing_up_you_re_agree_to_our_nterms_of_use_and_privacy_policy">By signing up, you\'re agree to our \nTerms of Use and Privacy Policy</string>
<string name="not_internet">Нет интернет соединения</string>
<string name="settings_safety">Настройки безопасности действуют только для основного номера +998 97 999-99-99</string>
<string name="popitok_error_password">"Замена пароля невозможна "</string>
<string name="close_process">Закрыть</string>
<string name="login_register">Авторизация/Регистрация</string>
<string name="impossible_change_password">Замена пароля невозможна</string>
<string name="wrong_password">Неверный Пароль</string>
<string name="your_opinion_matters">Ваше мнение имеет значение</string>
<string name="send_an_appeal">Отправить обращение</string>
<string name="email">Email</string>
<string name="telegram_bot">Телеграм бот</string>
<string name="contact_us">Связь с нами</string>
<string name="all_nomer">Со всех номеров</string>
<string name="for_abonent">Для абонентов</string>
<string name="pin_code_updated">Вы ввели неправильный PIN код 3 раза</string>
<string name="popitok_error">"Смена ПИН кода невозможна "</string>
<string name="popitok">Неверный PIN-код \nОсталось %1$s попытки</string>
<string name="popitok_password">Неверный Пароль \nОсталось %1$s попытки</string>
<string name="confirm_new_pin">Подтвердите PIN-код</string>
<string name="enter_new_pin">Введите новый PIN-код</string>
<string name="forget_pin">Забыли PIN?</string>
<string name="enter_old_pin">Введите старый PIN-код</string>
<string name="password_changed">Пароль изменен</string>
<string name="enter_confirm_new_password">Для подтверждения введите новый пароль ещё раз</string>
<string name="enter_new_password">Введите новый пароль</string>
<string name="enter_password">Введите пароль:</string>
<string name="enter_current_password">Введите текущий пароль</string>
<string name="minutes_and_sms">Минуты и SMS</string>
<string name="packets">Интернет-пакеты</string>
<string name="tariffs">Тарифы</string>
<string name="main_ussd_command">Основные ussd команды</string>
<string name="services">Услуги</string>
<string name="profile">Профиль</string>
<string name="safety">Безопасность</string>
<string name="error_code">Неверный код</string>
<string name="redact_data"><u>Согласие на обработку данных</u></string>
<string name="public_oferta"><u>Оферта на обработку персональных данных</u></string>
<string name="txt_confidensialnost"><u>Политика конфиденциальности</u></string>
<string name="oferta_finans"><u>Оферта на предоставление финансовых услуг</u></string>
<string name="open_with_password">Войти по паролю</string>
<string name="sum_month">%1$s Сум/мес</string>
</resources> </resources>
\ No newline at end of file
...@@ -81,4 +81,50 @@ ...@@ -81,4 +81,50 @@
<string name="not_internet_connect">Отсутствует активное подключение</string> <string name="not_internet_connect">Отсутствует активное подключение</string>
<string name="btn_try_again">Попробуй снова</string> <string name="btn_try_again">Попробуй снова</string>
<string name="not_internet_try_again">Проверьте интернет соединение и попробуйте снова</string> <string name="not_internet_try_again">Проверьте интернет соединение и попробуйте снова</string>
<string name="cannot_change_pin">Вы не можете изменить новый пин-код на текущий пин-код</string>
<string name="cannot_change_password">Вы не можете изменить новый пароль на текущий пароль</string>
<string name="password_updated">Пароль успешно обновлен</string>
<string name="by_signing_up_you_re_agree_to_our_nterms_of_use_and_privacy_policy">By signing up, you\'re agree to our \nTerms of Use and Privacy Policy</string>
<string name="not_internet">Нет интернет соединения</string>
<string name="settings_safety">Настройки безопасности действуют только для основного номера +998 97 999-99-99</string>
<string name="popitok_error_password">"Замена пароля невозможна "</string>
<string name="close_process">Закрыть</string>
<string name="login_register">Авторизация/Регистрация</string>
<string name="impossible_change_password">Замена пароля невозможна</string>
<string name="wrong_password">Неверный Пароль</string>
<string name="your_opinion_matters">Ваше мнение имеет значение</string>
<string name="send_an_appeal">Отправить обращение</string>
<string name="email">Email</string>
<string name="telegram_bot">Телеграм бот</string>
<string name="contact_us">Связь с нами</string>
<string name="all_nomer">Со всех номеров</string>
<string name="for_abonent">Для абонентов</string>
<string name="pin_code_updated">Вы ввели неправильный PIN код 3 раза</string>
<string name="popitok_error">"Смена ПИН кода невозможна "</string>
<string name="popitok">Неверный PIN-код \nОсталось %1$s попытки</string>
<string name="popitok_password">Неверный Пароль \nОсталось %1$s попытки</string>
<string name="confirm_new_pin">Подтвердите PIN-код</string>
<string name="enter_new_pin">Введите новый PIN-код</string>
<string name="forget_pin">Забыли PIN?</string>
<string name="enter_old_pin">Введите старый PIN-код</string>
<string name="password_changed">Пароль изменен</string>
<string name="enter_confirm_new_password">Для подтверждения введите новый пароль ещё раз</string>
<string name="enter_new_password">Введите новый пароль</string>
<string name="enter_password">Введите пароль:</string>
<string name="enter_current_password">Введите текущий пароль</string>
<string name="minutes_and_sms">Минуты и SMS</string>
<string name="packets">Интернет-пакеты</string>
<string name="tariffs">Тарифы</string>
<string name="main_ussd_command">Основные ussd команды</string>
<string name="services">Услуги</string>
<string name="profile">Профиль</string>
<string name="safety">Безопасность</string>
<string name="error_code">Неверный код</string>
<string name="redact_data"><u>Согласие на обработку данных</u></string>
<string name="public_oferta"><u>Оферта на обработку персональных данных</u></string>
<string name="txt_confidensialnost"><u>Политика конфиденциальности</u></string>
<string name="oferta_finans"><u>Оферта на предоставление финансовых услуг</u></string>
<string name="open_with_password">Войти по паролю</string>
<string name="sum_month">%1$s Сум/мес</string>
</resources> </resources>
\ No newline at end of file
...@@ -79,6 +79,52 @@ ...@@ -79,6 +79,52 @@
<string name="open">Mavjud</string> <string name="open">Mavjud</string>
<string name="yes_internet_connect">Internetga ulanish tiklandi</string> <string name="yes_internet_connect">Internetga ulanish tiklandi</string>
<string name="not_internet_connect">Faol ulanish yo\'q</string> <string name="not_internet_connect">Faol ulanish yo\'q</string>
<string name="btn_try_again">Qayta urinib ko\'rish</string> <string name="btn_try_again">Попробуй снова</string>
<string name="not_internet_try_again">Internet aloqangizni tekshiring va qayta urinib ko\'ring</string> <string name="not_internet_try_again">Internet aloqangizni tekshiring va qayta urinib ko\'ring</string>
<string name="cannot_change_pin">Siz yangi pin kodni joriy pin kodiga o\'zgartira olmaysiz</string>
<string name="cannot_change_password">Siz yangi parolni joriy parolga o\'zgartira olmaysiz</string>
<string name="password_updated">Parol muvaffaqiyatli yangilandi</string>
<string name="by_signing_up_you_re_agree_to_our_nterms_of_use_and_privacy_policy">By signing up, you\'re agree to our \nTerms of Use and Privacy Policy</string>
<string name="not_internet">Нет интернет соединения</string>
<string name="settings_safety">Настройки безопасности действуют только для основного номера +998 97 999-99-99</string>
<string name="popitok_error_password">"Замена пароля невозможна "</string>
<string name="close_process">Закрыть</string>
<string name="login_register">Авторизация/Регистрация</string>
<string name="impossible_change_password">Замена пароля невозможна</string>
<string name="wrong_password">Неверный Пароль</string>
<string name="your_opinion_matters">Ваше мнение имеет значение</string>
<string name="send_an_appeal">Отправить обращение</string>
<string name="email">Email</string>
<string name="telegram_bot">Телеграм бот</string>
<string name="contact_us">Связь с нами</string>
<string name="all_nomer">Со всех номеров</string>
<string name="for_abonent">Для абонентов</string>
<string name="pin_code_updated">Вы ввели неправильный PIN код 3 раза</string>
<string name="popitok_error">"Смена ПИН кода невозможна "</string>
<string name="popitok">Неверный PIN-код \nОсталось %1$s попытки</string>
<string name="popitok_password">Неверный Пароль \nОсталось %1$s попытки</string>
<string name="confirm_new_pin">Подтвердите PIN-код</string>
<string name="enter_new_pin">Введите новый PIN-код</string>
<string name="forget_pin">Забыли PIN?</string>
<string name="enter_old_pin">Введите старый PIN-код</string>
<string name="password_changed">Пароль изменен</string>
<string name="enter_confirm_new_password">Для подтверждения введите новый пароль ещё раз</string>
<string name="enter_new_password">Введите новый пароль</string>
<string name="enter_password">Введите пароль:</string>
<string name="enter_current_password">Введите текущий пароль</string>
<string name="minutes_and_sms">Минуты и SMS</string>
<string name="packets">Интернет-пакеты</string>
<string name="tariffs">Тарифы</string>
<string name="main_ussd_command">Основные ussd команды</string>
<string name="services">Услуги</string>
<string name="profile">Профиль</string>
<string name="safety">Безопасность</string>
<string name="error_code">Неверный код</string>
<string name="redact_data"><u>Согласие на обработку данных</u></string>
<string name="public_oferta"><u>Оферта на обработку персональных данных</u></string>
<string name="txt_confidensialnost"><u>Политика конфиденциальности</u></string>
<string name="oferta_finans"><u>Оферта на предоставление финансовых услуг</u></string>
<string name="open_with_password">Войти по паролю</string>
<string name="sum_month">%1$s Сум/мес</string>
</resources> </resources>
\ No newline at end of file
...@@ -127,10 +127,10 @@ ...@@ -127,10 +127,10 @@
<string name="close_process">Закрыть</string> <string name="close_process">Закрыть</string>
<string name="popitok_error_password">Замена пароля невозможна \nВы ввели неправильный пароль 3 раза</string> <string name="popitok_error_password">Замена пароля невозможна \nВы ввели неправильный пароль 3 раза</string>
<string name="settings_safety">Настройки безопасности действуют только для основного номера +998 97 999-99-99</string> <string name="settings_safety">Настройки безопасности действуют только для основного номера +998 97 999-99-99</string>
<string name="title_activity_offline">OfflineActivity</string> <string name="title_activity_offline" translatable="false">OfflineActivity</string>
<string name="title_home">Home</string> <string name="title_home" translatable="false">Home</string>
<string name="title_dashboard">Dashboard</string> <string name="title_dashboard" translatable="false">Dashboard</string>
<string name="title_notifications">Notifications</string> <string name="title_notifications" translatable="false">Notifications</string>
<string name="not_internet">Нет интернет соединения</string> <string name="not_internet">Нет интернет соединения</string>
<string name="not_internet_try_again">Проверьте интернет соединение и попробуйте снова</string> <string name="not_internet_try_again">Проверьте интернет соединение и попробуйте снова</string>
<string name="open">Доступно</string> <string name="open">Доступно</string>
...@@ -139,8 +139,12 @@ ...@@ -139,8 +139,12 @@
<string name="to_offline">Перейти в офлайн режим</string> <string name="to_offline">Перейти в офлайн режим</string>
<string name="not_internet_connect">Отсутствует активное подключение</string> <string name="not_internet_connect">Отсутствует активное подключение</string>
<string name="yes_internet_connect">Интернет соединение восстановлено</string> <string name="yes_internet_connect">Интернет соединение восстановлено</string>
<string name="oferta_finans"><u>Оферта на предоставление \nфинансовых услуг</u></string> <string name="oferta_finans"><u>Оферта на предоставление финансовых услуг</u></string>
<string name="by_signing_up_you_re_agree_to_our_nterms_of_use_and_privacy_policy">By signing up, you\'re agree to our \nTerms of Use and Privacy Policy</string> <string name="by_signing_up_you_re_agree_to_our_nterms_of_use_and_privacy_policy">By signing up, you\'re agree to our \nTerms of Use and Privacy Policy</string>
<string name="btn_try_again">Попробуй снова</string> <string name="btn_try_again">Попробуй снова</string>
<string name="cannot_change_pin">You cannot change new pin to current pin</string>
<string name="cannot_change_password">You cannot change new password to current password</string>
<string name="open_with_password">Войти по паролю</string>
<string name="sum_month">%1$s Сум/мес</string>
</resources> </resources>
\ No newline at end of file
...@@ -79,8 +79,8 @@ ...@@ -79,8 +79,8 @@
</style> </style>
<style name="BtnStyle"> <style name="BtnStyle">
<item name="android:layout_height">@dimen/_54sdp</item> <item name="android:layout_height">@dimen/_50sdp</item>
<item name="android:layout_width">@dimen/_54sdp</item> <item name="android:layout_width">@dimen/_50sdp</item>
<item name="background">@drawable/bgn_pin_btn</item> <item name="background">@drawable/bgn_pin_btn</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>
......
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