Commit 07477fb9 authored by shohboz's avatar shohboz

[UPD] MUS-191 Feature, updated screens and view

parent 66e9f332
......@@ -4,23 +4,24 @@
package="com.mobiuz.app">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.USE_BIOMETRIC" />
<uses-permission android:name="android.permission.VIBRATE" />
<application
android:name=".dev.app.App"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:hardwareAccelerated="true"
android:networkSecurityConfig="@xml/network_security_config"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.MobiUzAndroid"
android:usesCleartextTraffic="true"
tools:targetApi="m">
<activity
android:name=".dev.ui.service.ServicesActivity"
android:exported="false" />
<activity
android:name=".dev.ui.settings.SettingsActivity"
android:exported="false" />
......@@ -54,6 +55,7 @@
android:exported="false"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustResize" />
</application>
</manifest>
\ No newline at end of file
package com.mobiuz.app.dev
import android.util.Log
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.mobiuz.app.dev.network.model.Customer
import com.mobiuz.app.dev.model.UserAuth
import com.mobiuz.app.dev.network.model.ChangePassword
import com.mobiuz.app.dev.network.model.UiStateObject
import com.mobiuz.app.dev.network.repository.AuthRepository
import com.mobiuz.app.dev.network.repository.MainRepository
import com.mobiuz.app.dev.utils.extensions.customLog
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
......@@ -22,16 +23,46 @@ class MainViewModel @Inject constructor(
private val _userNameUiState = MutableStateFlow<UiStateObject<String>>(UiStateObject.EMPTY)
val userNameUiState: StateFlow<UiStateObject<String>> = _userNameUiState
fun setUserName(name: String){
fun setUserName(name: String) {
_userNameUiState.value = UiStateObject.SUCCESS(name)
}
private val _mainIndexUiState = MutableStateFlow<UiStateObject<Long>>(UiStateObject.EMPTY)
val mainIndexUiState: StateFlow<UiStateObject<Long>> = _mainIndexUiState
fun mainIndex(status:Long) = viewModelScope.launch {
fun mainIndex(status: Long) = viewModelScope.launch {
_mainIndexUiState.value = UiStateObject.SUCCESS(status)
// _mainIndexUiState.value = repository.mainIndex()
}
private val _servicesUiState = MutableStateFlow<UiStateObject<String>>(UiStateObject.EMPTY)
val servicesUiState: StateFlow<UiStateObject<String>> = _servicesUiState
fun services() = viewModelScope.launch {
_servicesUiState.value = UiStateObject.LOADING
_servicesUiState.value = repository.services()
}
private val _bottomSheetUiState = MutableStateFlow<UiStateObject<Boolean>>(UiStateObject.EMPTY)
val bottomSheetUiState: StateFlow<UiStateObject<Boolean>> = _bottomSheetUiState
fun bottomSheet(status:Boolean) = viewModelScope.launch {
_bottomSheetUiState.value = UiStateObject.EMPTY
_bottomSheetUiState.value = UiStateObject.SUCCESS(status)
}
private val _swipeDrawerUiState = MutableStateFlow<UiStateObject<Boolean>>(UiStateObject.EMPTY)
val swipeDrawerUiState: StateFlow<UiStateObject<Boolean>> = _swipeDrawerUiState
fun swipeDrawer(status:Boolean) = viewModelScope.launch {
Log.e("AAA","swipeDrawer:$status")
_swipeDrawerUiState.value = UiStateObject.EMPTY
_swipeDrawerUiState.value = UiStateObject.SUCCESS(status)
}
suspend fun logOut() = repository.logOut()
}
\ No newline at end of file
......@@ -2,14 +2,22 @@ package com.mobiuz.app.dev
import android.content.Intent
import android.os.Bundle
import android.view.View
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.GravityCompat
import androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope
import com.mobiuz.app.databinding.ActivitySplashBinding
import com.mobiuz.app.dev.model.SharedPref
import com.mobiuz.app.dev.network.model.UiStateObject
import com.mobiuz.app.dev.ui.auth.AuthActivity
import com.mobiuz.app.dev.ui.global.ButtonClick
import com.mobiuz.app.dev.ui.global.CONSTANTS
import com.mobiuz.app.dev.utils.extensions.showMessage
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.collect
import javax.inject.Inject
......@@ -18,7 +26,7 @@ class SplashActivity : AppCompatActivity() {
private var _bn: ActivitySplashBinding? = null
private val bn get() = _bn ?: throw NullPointerException("cannot inflate")
private val viewModel: MainViewModel by viewModels()
@Inject
lateinit var pref: SharedPref
......@@ -27,27 +35,52 @@ class SplashActivity : AppCompatActivity() {
_bn = ActivitySplashBinding.inflate(layoutInflater)
setContentView(bn.root)
lifecycleScope.launchWhenCreated {
delay(1000)
when {
pref.language.isEmpty() -> {
startActivity(Intent(this@SplashActivity, LanguageActivity::class.java))
viewModel.services()
bn.btnTryAgain.setOnClickListener(object : ButtonClick(){
override fun onSingleClick(v: View?) {
viewModel.services()
}
})
lifecycleScope.launchWhenStarted {
viewModel.servicesUiState.collect {
when (it) {
is UiStateObject.SUCCESS -> {
bn.btnTryAgain.isVisible = false
navigate()
}
is UiStateObject.ERROR -> {
bn.btnTryAgain.isVisible = true
showMessage(it.message)
}
is UiStateObject.LOADING -> {
bn.btnTryAgain.isVisible = false
}
else -> Unit
}
}
}
!pref.isRegistered -> {
startActivity(Intent(this@SplashActivity, AuthActivity::class.java))
}
}
pref.pin_code.isEmpty() -> {
startActivity(Intent(this@SplashActivity, AuthActivity::class.java).putExtra(CONSTANTS.TYPE_AUTH, CONSTANTS.PIN_CODE))
}
fun navigate(){
when {
pref.language.isEmpty() -> {
startActivity(Intent(this@SplashActivity, LanguageActivity::class.java))
}
else -> {
startActivity(Intent(this@SplashActivity, MainActivity::class.java))
}
!pref.isRegistered -> {
startActivity(Intent(this@SplashActivity, AuthActivity::class.java))
}
pref.pinCode.isEmpty() -> {
startActivity(Intent(this@SplashActivity, AuthActivity::class.java).putExtra(CONSTANTS.TYPE_AUTH, CONSTANTS.PIN_CODE))
}
else -> {
startActivity(Intent(this@SplashActivity, MainActivity::class.java))
}
finish()
}
finish()
}
override fun onDestroy() {
......
......@@ -12,8 +12,8 @@ class SharedPref @Inject constructor(@ApplicationContext context: Context) {
fun clearUserData(){
isRegistered = false
pin_code = ""
setUserToken("")
pinCode = ""
userName = ""
}
fun setDeviceToken(token: String) {
mySharedPref.edit().putString("device_token", token).apply()
......@@ -37,10 +37,10 @@ class SharedPref @Inject constructor(@ApplicationContext context: Context) {
mySharedPref.edit().putString(::language.name, value).apply()
}
var pin_code: String
get() = mySharedPref.getString(::pin_code.name, "") ?: ""
var pinCode: String
get() = mySharedPref.getString(::pinCode.name, "") ?: ""
set(value) {
mySharedPref.edit().putString(::pin_code.name, value).apply()
mySharedPref.edit().putString(::pinCode.name, value).apply()
}
var isRegistered: Boolean
......@@ -61,4 +61,22 @@ class SharedPref @Inject constructor(@ApplicationContext context: Context) {
mySharedPref.edit().putString(::userPhone.name, value).apply()
}
var userName: String
get() = mySharedPref.getString(::userName.name, "") ?: ""
set(value) {
mySharedPref.edit().putString(::userName.name, value).apply()
}
var services: String
get() = mySharedPref.getString(::services.name, "") ?: ""
set(value) {
mySharedPref.edit().putString(::services.name, value).apply()
}
var isShowPin: Boolean
get() = mySharedPref.getBoolean(::isShowPin.name, true)
set(value) {
mySharedPref.edit().putBoolean(::isShowPin.name, value).apply()
}
}
\ No newline at end of file
package com.mobiuz.app.dev.model
data class UserAuth(
val phone: String,
val phone: String? = null,
val password: String? = null,
val code: String? = null
)
\ No newline at end of file
......@@ -5,8 +5,10 @@ import com.mobiuz.app.dev.model.SharedPref
import com.mobiuz.app.dev.model.UserAuth
import com.mobiuz.app.dev.network.api.ApiService
import com.mobiuz.app.dev.network.model.Action
import com.mobiuz.app.dev.network.model.ChangePassword
import com.mobiuz.app.dev.network.model.Customer
import com.mobiuz.app.dev.network.model.UiStateObject
import com.mobiuz.app.dev.utils.extensions.getMessage
import com.mobiuz.app.dev.utils.extensions.userMessage
import dagger.hilt.android.qualifiers.ApplicationContext
import javax.inject.Inject
......@@ -24,13 +26,7 @@ class AuthRepository @Inject constructor(
val res = apiService.checkPhone(data)
when {
res.status -> UiStateObject.SUCCESS(res.data ?: Action())
res.errors.isNotEmpty() -> {
var message = ""
res.errors.forEach {
message += "${it.message}\n"
}
UiStateObject.ERROR(message)
}
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message)
}
......@@ -44,13 +40,7 @@ class AuthRepository @Inject constructor(
val res = apiService.register(data)
when {
res.status -> UiStateObject.SUCCESS(res.message)
res.errors.isNotEmpty() -> {
var message = ""
res.errors.forEach {
message += "${it.message}\n"
}
UiStateObject.ERROR(message)
}
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message)
}
......@@ -69,13 +59,7 @@ class AuthRepository @Inject constructor(
pref.isRegistered = true
UiStateObject.SUCCESS(res.message)
}
res.errors.isNotEmpty() -> {
var message = ""
res.errors.forEach {
message += "${it.message}\n"
}
UiStateObject.ERROR(message)
}
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message)
}
} catch (e: Exception) {
......@@ -91,13 +75,7 @@ class AuthRepository @Inject constructor(
res.status -> {
UiStateObject.SUCCESS(res.message)
}
res.errors.isNotEmpty() -> {
var message = ""
res.errors.forEach {
message += "${it.message}\n"
}
UiStateObject.ERROR(message)
}
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message)
}
} catch (e: Exception) {
......@@ -113,13 +91,7 @@ class AuthRepository @Inject constructor(
res.status -> {
UiStateObject.SUCCESS(res.message)
}
res.errors.isNotEmpty() -> {
var message = ""
res.errors.forEach {
message += "${it.message}\n"
}
UiStateObject.ERROR(message)
}
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message)
}
} catch (e: Exception) {
......@@ -137,13 +109,7 @@ class AuthRepository @Inject constructor(
pref.setUserToken(res.data?.token)
UiStateObject.SUCCESS(res.message)
}
res.errors.isNotEmpty() -> {
var message = ""
res.errors.forEach {
message += "${it.message}\n"
}
UiStateObject.ERROR(message)
}
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message)
}
} catch (e: Exception) {
......@@ -159,13 +125,55 @@ class AuthRepository @Inject constructor(
res.status -> {
UiStateObject.SUCCESS(res.message)
}
res.errors.isNotEmpty() -> {
var message = ""
res.errors.forEach {
message += "${it.message}\n"
}
UiStateObject.ERROR(message)
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message)
}
} catch (e: Exception) {
UiStateObject.ERROR(e.userMessage(context))
}
}
suspend fun resetSmsCode(data: UserAuth): UiStateObject<String> {
return try {
val res = apiService.reSendSms(data)
when {
res.status -> {
UiStateObject.SUCCESS(res.message)
}
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message)
}
} catch (e: Exception) {
UiStateObject.ERROR(e.userMessage(context))
}
}
suspend fun checkPassword(data: UserAuth): UiStateObject<String> {
return try {
val res = apiService.checkPassword(data)
when {
res.status -> {
UiStateObject.SUCCESS(res.message)
}
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message)
}
} catch (e: Exception) {
UiStateObject.ERROR(e.userMessage(context))
}
}
suspend fun installPassword(data: ChangePassword): UiStateObject<String> {
return try {
val res = apiService.installPassword(data)
when {
res.status -> {
UiStateObject.SUCCESS(res.message)
}
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message)
}
} catch (e: Exception) {
......
package com.mobiuz.app.dev.network.repository
import android.content.Context
import com.google.gson.Gson
import com.mobiuz.app.dev.model.SharedPref
import com.mobiuz.app.dev.model.UserAuth
import com.mobiuz.app.dev.network.api.ApiService
import com.mobiuz.app.dev.network.model.ChangePassword
import com.mobiuz.app.dev.network.model.Customer
import com.mobiuz.app.dev.network.model.UiStateObject
import com.mobiuz.app.dev.utils.extensions.getMessage
import com.mobiuz.app.dev.utils.extensions.userMessage
import dagger.hilt.android.qualifiers.ApplicationContext
import javax.inject.Inject
......@@ -24,17 +28,46 @@ class MainRepository @Inject constructor(
res.status && res.data != null -> {
UiStateObject.SUCCESS(res.data!!)
}
res.errors.isNotEmpty() -> {
var message = ""
res.errors.forEach {
message += "${it.message}\n"
}
UiStateObject.ERROR(message)
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message)
}
} catch (e: Exception) {
UiStateObject.ERROR(e.userMessage(context))
}
}
suspend fun logOut(): UiStateObject<String> {
return try {
val res = apiService.logOut()
when {
res.status -> {
UiStateObject.SUCCESS(res.message)
}
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message)
}
} catch (e: Exception) {
UiStateObject.ERROR(e.userMessage(context))
}
}
suspend fun services(): UiStateObject<String> {
return try {
val res = apiService.getServices()
when {
res.status -> {
pref.services = Gson().toJson(res.data)
UiStateObject.SUCCESS(res.message)
}
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message)
}
} catch (e: Exception) {
UiStateObject.ERROR(e.userMessage(context))
}
}
}
\ No newline at end of file
package com.mobiuz.app.dev.ui
import android.content.BroadcastReceiver
import android.content.Intent
import android.os.Bundle
import android.view.View
import androidx.core.view.GravityCompat
import androidx.fragment.app.viewModels
import androidx.lifecycle.LiveData
import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavController
import com.google.android.material.bottomnavigation.BottomNavigationView
import com.google.firebase.analytics.FirebaseAnalytics
import com.mobiuz.app.R
import com.mobiuz.app.databinding.ActivityMainBinding
import com.mobiuz.app.dev.MainViewModel
import com.mobiuz.app.dev.model.SharedPref
import com.mobiuz.app.dev.network.model.UiStateObject
import com.mobiuz.app.dev.ui.auth.AuthActivity
import com.mobiuz.app.dev.ui.base.BaseFragment
import com.mobiuz.app.dev.ui.global.ButtonClick
import com.mobiuz.app.dev.ui.global.CONSTANTS
import com.mobiuz.app.dev.ui.settings.SettingsActivity
import com.mobiuz.app.dev.utils.extensions.customLog
import com.mobiuz.app.dev.utils.extensions.customMasketHome
import com.mobiuz.app.dev.utils.extensions.setupWithNavController
import com.mobiuz.app.dev.utils.extensions.showCustomExitDialog
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.collect
import javax.inject.Inject
@AndroidEntryPoint
class MainFragment : BaseFragment(R.layout.fragment_main) {
@Inject
lateinit var pref: SharedPref
private var _bn: ActivityMainBinding? = null
private val bn get() = _bn ?: throw NullPointerException("cannot inflate")
private lateinit var bottomNavigationView: BottomNavigationView
private var currentNavController: LiveData<NavController>? = null
private val viewModel: MainViewModel by viewModels()
private lateinit var receiver: BroadcastReceiver
private lateinit var mFirebaseAnalytics: FirebaseAnalytics
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_bn = ActivityMainBinding.bind(view)
if (savedInstanceState == null) {
setupBottomNavigationBar()
}
setUpUI()
collects()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
_bn = ActivityMainBinding.inflate(layoutInflater)
if (savedInstanceState == null) {
setupBottomNavigationBar()
}
setUpUI()
collects()
}
override fun setUpUI() {
bn.apply {
header.txtUserPhone.text = pref.userPhone.customMasketHome()
customLog("lang:${pref.language}")
when (pref.language) {
CONSTANTS.UZ -> txtLanguage.text = getString(R.string.uzbek)
CONSTANTS.RU -> txtLanguage.text = getString(R.string.russian)
CONSTANTS.EN -> txtLanguage.text = getString(R.string.english)
}
btnExit.setOnClickListener(object : ButtonClick() {
override fun onSingleClick(v: View?) {
showCustomExitDialog {
pref.clearUserData()
val intent = Intent(requireContext(), AuthActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_TASK_ON_HOME
startActivity(intent)
requireActivity().finish()
}
}
})
btnLanguage.setOnClickListener(object : ButtonClick() {
override fun onSingleClick(v: View?) {
navigateToSettingsScreen("")
}
})
btnSupport.setOnClickListener(object : ButtonClick() {
override fun onSingleClick(v: View?) {
navigateToSettingsScreen(CONSTANTS.SUPPORT)
}
})
btnSafety.setOnClickListener(object : ButtonClick() {
override fun onSingleClick(v: View?) {
navigateToSettingsScreen(CONSTANTS.SAFETY)
}
})
header.headerLayout.setOnClickListener(object : ButtonClick() {
override fun onSingleClick(v: View?) {
navigateToSettingsScreen(CONSTANTS.PROFILE)
}
})
txtRedactData.setOnClickListener {
}
txtPublicOferta.setOnClickListener {
}
txtConfidensialnost.setOnClickListener {
}
}
}
private fun navigateToSettingsScreen(key: String) {
val intent = Intent(requireContext(), SettingsActivity::class.java)
intent.putExtra(CONSTANTS.TYPE_SETTINGS, key)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_TASK_ON_HOME
startActivity(intent)
}
override fun collects() {
lifecycleScope.launchWhenStarted {
viewModel.mainIndexUiState.collect {
when (it) {
is UiStateObject.SUCCESS -> {
bn.drawerLayout.openDrawer(GravityCompat.START)
}
else -> Unit
}
}
}
lifecycleScope.launchWhenStarted {
viewModel.userNameUiState.collect {
when (it) {
is UiStateObject.SUCCESS -> {
pref.userName = it.data
bn.header.txtUserName.text = it.data
bn.header.txtAvatar.text = it.data[0].toString()
}
else -> Unit
}
}
}
}
private fun setupBottomNavigationBar() {
try {
bottomNavigationView = requireActivity().findViewById(R.id.bottom_nav_view)
val navGraphIds = listOf(
R.navigation.nav_graph_home,
R.navigation.nav_graph_profile
)
val controller = bottomNavigationView.setupWithNavController(
navGraphIds = navGraphIds,
fragmentManager = parentFragmentManager,
containerId = R.id.nav_host_fragment,
intent = requireActivity().intent
)
currentNavController = controller
} catch (e: Exception) {
e.printStackTrace()
}
requireActivity()
}
fun onSupportNavigateUp(): Boolean {
return currentNavController?.value?.navigateUp() ?: false
}
override fun onDestroy() {
_bn = null
// unregisterReceiver(receiver)
super.onDestroy()
}
}
\ No newline at end of file
......@@ -3,6 +3,7 @@ package com.mobiuz.app.dev.ui.auth
import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.core.os.bundleOf
import androidx.navigation.NavController
import androidx.navigation.fragment.NavHostFragment
import com.google.firebase.FirebaseApp
......@@ -51,6 +52,14 @@ class AuthActivity : AppCompatActivity() {
if (type == CONSTANTS.PIN_CODE) {
navController.popBackStack()
navController.navigate(R.id.pinFragment, null, Utils.navOptions())
}else if (type == CONSTANTS.LOGIN) {
val phone = it.getStringExtra(CONSTANTS.PHONE)
navController.popBackStack()
navController.navigate(R.id.loginFragment, bundleOf(CONSTANTS.PHONE to phone ), Utils.navOptions())
}else if (type == CONSTANTS.TYPE_VERIFICATION) {
val phone = it.getStringExtra(CONSTANTS.PHONE)
navController.popBackStack()
navController.navigate(R.id.myVerificationFragment, bundleOf(CONSTANTS.PHONE to phone ), Utils.navOptions())
}
}
}
......
......@@ -4,6 +4,7 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.mobiuz.app.dev.model.UserAuth
import com.mobiuz.app.dev.network.model.Action
import com.mobiuz.app.dev.network.model.ChangePassword
import com.mobiuz.app.dev.network.model.UiStateObject
import com.mobiuz.app.dev.network.repository.AuthRepository
import dagger.hilt.android.lifecycle.HiltViewModel
......@@ -79,4 +80,33 @@ class AuthViewModel @Inject constructor(
_resetPasswordUiState.value = repository.resetPassword(data)
_resetPasswordUiState.value = UiStateObject.EMPTY
}
private val _resetSmsCodeUiState = MutableStateFlow<UiStateObject<String>>(UiStateObject.EMPTY)
val resetSmsCodeUiState: StateFlow<UiStateObject<String>> = _resetSmsCodeUiState
fun resetSmsCode(data: UserAuth) = viewModelScope.launch {
_resetSmsCodeUiState.value = UiStateObject.LOADING
_resetSmsCodeUiState.value = repository.resetSmsCode(data)
_resetSmsCodeUiState.value = UiStateObject.EMPTY
}
private val _checkPasswordUiState = MutableStateFlow<UiStateObject<String>>(UiStateObject.EMPTY)
val checkPasswordUiState: StateFlow<UiStateObject<String>> = _checkPasswordUiState
fun checkPassword(data: UserAuth) = viewModelScope.launch {
_checkPasswordUiState.value = UiStateObject.LOADING
_checkPasswordUiState.value = repository.checkPassword(data)
_checkPasswordUiState.value = UiStateObject.EMPTY
}
private val _changePasswordUiState = MutableStateFlow<UiStateObject<String>>(UiStateObject.EMPTY)
val changePasswordUiState: StateFlow<UiStateObject<String>> = _changePasswordUiState
fun changePassword(data: ChangePassword) = viewModelScope.launch {
_changePasswordUiState.value = UiStateObject.LOADING
_changePasswordUiState.value = repository.installPassword(data)
_changePasswordUiState.value = UiStateObject.EMPTY
}
}
\ No newline at end of file
......@@ -26,6 +26,7 @@ import com.mobiuz.app.dev.ui.global.TextWatcherWrapper
import com.mobiuz.app.dev.utils.Utils
import com.mobiuz.app.dev.utils.extensions.makeLinks
import com.mobiuz.app.dev.utils.extensions.showCustomDialog
import com.mobiuz.app.dev.utils.hideKeyboard
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.collect
......@@ -56,6 +57,12 @@ class LoginFragment : BaseFragment(R.layout.fragment_login) {
override fun setUpUI() {
bn.apply {
viewGroup.setOnClickListener(object : ButtonClick(){
override fun onSingleClick(v: View?) {
bn.viewGroup.hideKeyboard()
}
})
txtHelperMobiuz.makeLinks(Pair("www.mobi.uz", View.OnClickListener {
val uri = Uri.parse("https://www.mobi.uz/")
val intent = Intent(Intent.ACTION_VIEW)
......
......@@ -21,6 +21,7 @@ import com.mobiuz.app.dev.ui.global.CONSTANTS
import com.mobiuz.app.dev.ui.global.TextWatcherWrapper
import com.mobiuz.app.dev.utils.Utils
import com.mobiuz.app.dev.utils.extensions.makeLinks
import com.mobiuz.app.dev.utils.hideKeyboard
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.collect
......@@ -55,7 +56,14 @@ class RegisterFragment : BaseFragment(R.layout.fragment_register) {
override fun setUpUI() {
bn.apply {
txtHelperMobiuz.makeLinks(Pair("www.mobi.uz", View.OnClickListener {
viewGroup.setOnClickListener(object : ButtonClick(){
override fun onSingleClick(v: View?) {
bn.viewGroup.hideKeyboard()
}
})
txtHelperMobiuz.makeLinks(
Pair("www.mobi.uz", View.OnClickListener {
val uri = Uri.parse("https://www.mobi.uz/")
val intent = Intent(Intent.ACTION_VIEW)
intent.data = uri
......
......@@ -101,6 +101,7 @@ class MyVerificationFragment : BaseFragment(R.layout.fragment_my_verification) {
sentCodeAgain.setOnClickListener {
count(true)
viewModel.resetSmsCode(UserAuth(phone.replace("+", "").replace(" ", "")))
}
coutdownView.setOnCountdownEndListener {
count(false)
......@@ -218,6 +219,26 @@ class MyVerificationFragment : BaseFragment(R.layout.fragment_my_verification) {
}
}
viewLifecycleOwner.lifecycleScope.launchWhenStarted {
viewModel.resetSmsCodeUiState.collect {
when (it) {
is UiStateObject.SUCCESS -> {
showToastMessage(it.data)
showProgressDialog(false)
}
is UiStateObject.ERROR -> {
showProgressDialog(false)
showToastMessage(it.message)
}
is UiStateObject.LOADING -> {
showProgressDialog(true)
}
else -> Unit
}
}
}
viewLifecycleOwner.lifecycleScope.launchWhenStarted {
viewModel.checkResetCodeUiState.collect {
when (it) {
is UiStateObject.SUCCESS -> {
......
......@@ -51,6 +51,6 @@ abstract class BaseFragment(private val layoutId: Int) : Fragment() {
// }
protected fun showToastMessage(message:String) {
Toast.makeText(requireContext(), message, Toast.LENGTH_LONG).show()
Toast.makeText(requireContext(), message, Toast.LENGTH_SHORT).show()
}
}
\ No newline at end of file
......@@ -83,7 +83,7 @@ class FullScreenDialog : DialogFragment(R.layout.fragment_pin_dialog) {
pinAdapter.setOnDoneListener {
lifecycleScope.launchWhenCreated {
delay(50)
if (pref.pin_code == it) {
if (pref.pinCode == it) {
txtNotPin.isVisible = false
dismiss()
} else {
......@@ -103,7 +103,6 @@ class FullScreenDialog : DialogFragment(R.layout.fragment_pin_dialog) {
txtNotPin.isVisible = false
}
R.id.with_password -> {
dismiss()
listener?.invoke(true)
}
R.id.btn_finger_print -> {
......
package com.mobiuz.app.dev.ui.global
import android.graphics.Color
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.view.isVisible
import androidx.fragment.app.DialogFragment
import com.mobiuz.app.R
import com.mobiuz.app.databinding.LayoutSenderBinding
......@@ -37,13 +37,11 @@ class SenderDialog(
super.onViewCreated(view, savedInstanceState)
isCancelable = false
bn.apply {
title.text = txtDescription
image.isVisible = status
if (!status) {
title.text = getString(R.string.error_data)
description.setTextColor(Color.RED)
title.setTextColor(Color.RED)
lottie.setAnimation(R.raw.error_lottie)
btnOk.text = getString(R.string.login_register)
}
description.text = txtDescription
btnOk.setOnClickListener {
listener?.invoke(Unit)
dismiss()
......
......@@ -5,10 +5,11 @@ import android.graphics.Color
import android.os.Bundle
import android.view.View
import androidx.core.view.isVisible
import androidx.core.widget.NestedScrollView
import androidx.fragment.app.viewModels
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavController
import androidx.navigation.fragment.NavHostFragment
import com.mobiuz.app.R
import com.mobiuz.app.databinding.FragmentHomeBinding
import com.mobiuz.app.dev.MainViewModel
......@@ -16,11 +17,10 @@ import com.mobiuz.app.dev.model.SharedPref
import com.mobiuz.app.dev.network.model.Customer
import com.mobiuz.app.dev.network.model.UiStateObject
import com.mobiuz.app.dev.ui.base.BaseFragment
import com.mobiuz.app.dev.utils.extensions.customLog
import com.mobiuz.app.dev.utils.extensions.getColorCompat
import com.mobiuz.app.dev.utils.extensions.toMoneyFormat
import com.mobiuz.app.dev.utils.extensions.*
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.collect
import me.everything.android.ui.overscroll.OverScrollDecoratorHelper
import javax.inject.Inject
......@@ -34,19 +34,23 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) {
private val bn get() = _bn ?: throw NullPointerException("cannot inflate")
private val viewModel: HomeViewModel by viewModels()
private lateinit var mainViewModel: MainViewModel
private var isProgressing = false
private var isFirstProgressing = true
private val navController: NavController by lazy(LazyThreadSafetyMode.NONE) { NavHostFragment.findNavController(this) }
private var customer: Customer? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mainViewModel = ViewModelProvider(requireActivity())[MainViewModel::class.java]
// viewModel.mainIndex()
viewModel.mainIndex()
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_bn = FragmentHomeBinding.bind(view)
val window = requireActivity().window.decorView
window.systemUiVisibility = View.VISIBLE
setUpUI()
collects()
......@@ -55,25 +59,48 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) {
override fun setUpUI() {
bn.apply {
btnAddSum.setOnClickListener {
navController.navigate(R.id.addFragment)
// parentFragmentManager.beginTransaction().replace(R.id.nav_host_fragment,AddCardFragment)
// startActivity(Intent(requireContext()))
}
toolbar.setNavigationOnClickListener {
mainViewModel.mainIndex(System.currentTimeMillis())
}
nestedScrollView.setOnScrollChangeListener(
NestedScrollView.OnScrollChangeListener { v, scrollX, scrollY, oldScrollX, oldScrollY ->
scrollView.viewTreeObserver.addOnScrollChangedListener {
if (scrollY > 120) {
toolbarInsideLayout.isVisible = true
topDiv.setBackgroundColor(getColorCompat(R.color.primary100))
toolbar.setBackgroundColor(getColorCompat(R.color.primary100))
}
if (scrollY < 100) {
toolbarInsideLayout.isVisible = false
topDiv.setBackgroundColor(Color.TRANSPARENT)
toolbar.setBackgroundColor(Color.TRANSPARENT)
if (scrollView.scrollY < 100) {
toolbarInsideLayout.isVisible = false
topDiv.setBackgroundColor(Color.TRANSPARENT)
toolbar.setBackgroundColor(Color.TRANSPARENT)
}
if (scrollView.scrollY > 20) {
toolbar.setBackgroundColor(getColorCompat(R.color.primary100))
topDiv.setBackgroundColor(getColorCompat(R.color.primary100))
}
if (scrollView.scrollY > 100) {
toolbarInsideLayout.isVisible = true
}
}
val decor = OverScrollDecoratorHelper.setUpOverScroll(scrollView)
decor.setOverScrollUpdateListener { _, _, offset ->
if (offset > 150.52632) {
if (!isProgressing) {
vibrate(requireContext())
viewModel.mainIndex()
}
})
}
if (offset < 1.0) {
lottie.isVisible = false
}
}
}
}
......@@ -82,16 +109,24 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) {
viewModel.mainIndexUiState.collect {
when (it) {
is UiStateObject.SUCCESS -> {
isProgressing = false
showProgressDialog(false)
bn.lottie.isVisible = false
isFirstProgressing = false
customer = it.data
loadData()
}
is UiStateObject.ERROR -> {
isProgressing = false
isFirstProgressing = false
showProgressDialog(false)
// showCustomDialog(it.message,false){}
bn.lottie.isVisible = false
}
is UiStateObject.LOADING -> {
showProgressDialog(true)
isProgressing = true
if (isFirstProgressing) showProgressDialog(true)
isFirstProgressing = false
bn.lottie.isVisible = true
}
else -> Unit
}
......@@ -102,7 +137,6 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) {
@SuppressLint("SetTextI18n")
private fun loadData() {
try {
customLog("customer:$customer")
customer?.customer?.info?.let {
bn.apply {
txtBalance.text = "${it.balance?.amount?.toMoneyFormat()} ${it.balance?.currency}"
......@@ -118,15 +152,25 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) {
}
mainViewModel.setUserName(customer?.customer?.name ?: "Unnamed User")
txtTarif.text = customer?.customer?.tarifi?.name ?: getString(R.string.my_tarif)
txtMyNumber.text = pref.userPhone
toolbarMyNumber.text = pref.userPhone
txtMyNumber.text = pref.userPhone.customMasketHome().replace("-", " ")
toolbarMyNumber.text = pref.userPhone.customMasketHome().replace("-", " ")
}
}
} catch (e: Exception) {
// showSnackMessage(it.message)
}
}
override fun onResume() {
super.onResume()
mainViewModel.bottomSheet(true)
mainViewModel.swipeDrawer(true)
customLog("onResume")
}
override fun onStop() {
super.onStop()
mainViewModel.swipeDrawer(false)
}
override fun onDestroy() {
......
......@@ -25,4 +25,6 @@ class HomeViewModel @Inject constructor(
_mainIndexUiState.value = repository.mainIndex()
}
suspend fun logOut() = repository.logOut()
}
\ No newline at end of file
package com.mobiuz.app.dev.ui.service
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.view.isVisible
import androidx.recyclerview.widget.RecyclerView
import com.mobiuz.app.databinding.ItemActionBinding
import com.mobiuz.app.databinding.ItemUssdBinding
import com.mobiuz.app.dev.model.PinData
import com.mobiuz.app.dev.model.UssdData
import com.mobiuz.app.dev.ui.global.ButtonClick
import com.mobiuz.app.dev.utils.extensions.SingleBlock
import com.mobiuz.app.dev.utils.extensions.getCurrentName
class ActionAdapter : RecyclerView.Adapter<ActionAdapter.VHolder>() {
class ActionAdapter(val lang: String) : RecyclerView.Adapter<ActionAdapter.VHolder>() {
private val list: ArrayList<PinData> by lazy { ArrayList() }
private var listener: SingleBlock<String>? = null
private val list: ArrayList<UssdData> by lazy { ArrayList() }
private var listener: SingleBlock<UssdData>? = null
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VHolder {
return VHolder(ItemActionBinding.inflate(LayoutInflater.from(parent.context)))
}
override fun onBindViewHolder(holder: VHolder, position: Int) = holder.bind(position)
override fun getItemCount() = 16
override fun getItemCount() = list.size
inner class VHolder(private val binding: ItemActionBinding) : RecyclerView.ViewHolder(binding.root) {
fun bind(position: Int) {
itemView.setOnClickListener {
listener?.invoke("")
val d = list[position]
binding.apply {
title.text = d.title.getCurrentName(lang)
val des = d.short_description.getCurrentName(lang)
description.text = des
description.isVisible = des.isNotEmpty()
code.text = d.code
cardView.setOnClickListener(object : ButtonClick() {
override fun onSingleClick(v: View?) {
listener?.invoke(d)
}
})
}
// val d = list[position]
// binding.imagePin.setImageResource(if (d.count == -1) R.drawable.ic_pin_unchecked else R.drawable.ic_pin_checked)
}
}
fun submitList(ls: List<PinData>) {
fun submitList(ls: List<UssdData>) {
list.clear()
list.addAll(ls)
notifyDataSetChanged()
}
fun setOnClickListener(block: SingleBlock<String>) {
fun setOnClickListener(block: SingleBlock<UssdData>) {
listener = block
}
......
......@@ -3,24 +3,40 @@ package com.mobiuz.app.dev.ui.service
import android.os.Bundle
import android.view.View
import androidx.lifecycle.ViewModelProvider
import com.google.gson.Gson
import com.mobiuz.app.R
import com.mobiuz.app.databinding.FragmentActionBinding
import com.mobiuz.app.databinding.FragmentMainUssdBinding
import com.mobiuz.app.dev.MainViewModel
import com.mobiuz.app.dev.model.InnerData
import com.mobiuz.app.dev.model.SharedPref
import com.mobiuz.app.dev.ui.base.BaseFragment
import com.mobiuz.app.dev.ui.global.CONSTANTS
import dagger.hilt.android.AndroidEntryPoint
import me.everything.android.ui.overscroll.OverScrollDecoratorHelper
import javax.inject.Inject
@AndroidEntryPoint
class ActionFragment : BaseFragment(R.layout.fragment_action) {
@Inject
lateinit var pref: SharedPref
private lateinit var mainViewModel: MainViewModel
private var _bn: FragmentActionBinding? = null
private val bn get() = _bn ?: throw NullPointerException("cannot inflate")
private val adapter = ActionAdapter()
private lateinit var adapter : ActionAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
adapter = ActionAdapter(pref.language)
mainViewModel = ViewModelProvider(requireActivity())[MainViewModel::class.java]
arguments?.let {
val arg = it.getString(CONSTANTS.SERVICE) ?: ""
if (arg.isNotEmpty()){
val data = Gson().fromJson(arg, InnerData::class.java)
adapter.submitList(data.data)
}
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
......@@ -33,10 +49,12 @@ class ActionFragment : BaseFragment(R.layout.fragment_action) {
override fun setUpUI() {
bn.apply {
OverScrollDecoratorHelper.setUpStaticOverScroll(bn.rvUssdCommand, OverScrollDecoratorHelper.ORIENTATION_VERTICAL)
rvUssdCommand.adapter = adapter
adapter.setOnClickListener {
val dialog = UssdBottomSheetDialog(UssdData("Переход на тариф","Mobi 20","*111*120#","Перейти"))
val dialog = UssdBottomSheetDialog(it)
dialog.show(childFragmentManager, "tag")
}
}
......
package com.mobiuz.app.dev.ui.service
import android.content.Context
import android.Manifest
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.view.isVisible
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import com.mobiuz.app.R
import com.mobiuz.app.databinding.BottomSheetUssdBinding
import com.mobiuz.app.databinding.FragmentMainUssdBinding
import com.mobiuz.app.dev.model.SharedPref
import com.mobiuz.app.dev.model.UssdData
import com.mobiuz.app.dev.ui.global.ButtonClick
import com.mobiuz.app.dev.utils.extensions.getCurrentName
import com.mobiuz.app.utils.checkPermission
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
@AndroidEntryPoint
class UssdBottomSheetDialog(val data: UssdData) : BottomSheetDialogFragment() {
@Inject
lateinit var pref: SharedPref
private var _bn: BottomSheetUssdBinding? = null
private val bn get() = _bn ?: throw NullPointerException("cannot inflate")
private var lng = ""
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
_bn = BottomSheetUssdBinding.inflate(inflater)
......@@ -22,16 +34,23 @@ class UssdBottomSheetDialog(val data: UssdData) : BottomSheetDialogFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_bn = BottomSheetUssdBinding.bind(view)
lng = pref.language
bn.apply {
data.apply {
txtTitle.text = this.title
txtTarif.text = this.tariff
txtTitle.text = this.title.getCurrentName(lng)
val dec = this.short_description.getCurrentName(lng)
txtDescription.isVisible = dec.isNotEmpty()
txtDescription.text = dec
txtCode.text = this.code
btnZapros.text = this.text_button
// btnZapros.text = this.text_button
}
btnZapros.setOnClickListener(object : ButtonClick(){
btnZapros.setOnClickListener(object : ButtonClick() {
override fun onSingleClick(v: View?) {
dismiss()
checkPermission(Manifest.permission.CALL_PHONE) {
val ussd = data.code.replace("#","") + Uri.encode("#")
requireActivity().startActivity(Intent(Intent.ACTION_CALL, Uri.parse("tel:$ussd")))
dismiss()
}
}
})
}
......
......@@ -8,12 +8,15 @@ import androidx.navigation.NavController
import androidx.navigation.fragment.NavHostFragment
import com.mobiuz.app.R
import com.mobiuz.app.databinding.FragmentLanguageBinding
import com.mobiuz.app.dev.MainActivity
import com.mobiuz.app.dev.model.SharedPref
import com.mobiuz.app.dev.ui.base.BaseFragment
import com.mobiuz.app.dev.ui.global.ButtonClick
import com.mobiuz.app.dev.ui.global.CONSTANTS
import com.mobiuz.app.dev.utils.LocaleHelper
import com.mobiuz.app.dev.utils.extensions.SingleBlock
import dagger.hilt.android.AndroidEntryPoint
import me.everything.android.ui.overscroll.OverScrollDecoratorHelper
import javax.inject.Inject
......@@ -37,8 +40,10 @@ class LanguageFragment : BaseFragment(R.layout.fragment_language) {
override fun setUpUI() {
bn.apply {
// OverScrollDecoratorHelper.setUpStaticOverScroll(bn.viewGroup, OverScrollDecoratorHelper.ORIENTATION_VERTICAL)
toolbar.setNavigationOnClickListener {
requireActivity().finish()
navController.navigateUp()
}
bn.apply {
when (pref.language) {
......@@ -63,20 +68,18 @@ class LanguageFragment : BaseFragment(R.layout.fragment_language) {
setLangAndNavigate(CONSTANTS.EN)
}
})
}
}
}
private fun setLangAndNavigate(lang: String) {
pref.language = lang
LocaleHelper.setLocale(requireContext())
val intent = Intent(requireContext(), SettingsActivity::class.java)
val intent = Intent(requireContext(), MainActivity::class.java)
intent.putExtra(CONSTANTS.FIRST, CONSTANTS.FIRST)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_TASK_ON_HOME
startActivity(intent)
requireActivity().finish()
requireActivity().finishAffinity()
}
override fun collects() {
......
......@@ -9,6 +9,7 @@ import com.mobiuz.app.databinding.FragmentProfileBinding
import com.mobiuz.app.dev.model.SharedPref
import com.mobiuz.app.dev.ui.base.BaseFragment
import com.mobiuz.app.dev.ui.global.ButtonClick
import com.mobiuz.app.dev.utils.extensions.customMasket
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
......@@ -33,8 +34,11 @@ class ProfileFragment : BaseFragment(R.layout.fragment_profile) {
override fun setUpUI() {
bn.apply {
txtUserPhone.text = pref.userPhone.customMasket()
txtUserName.text = pref.userName
txtAvatar.text = pref.userName[0].toString()
toolbar.setNavigationOnClickListener {
requireActivity().finish()
navController.navigateUp()
}
btn0890.setOnClickListener(object : ButtonClick() {
override fun onSingleClick(v: View?) {
......
......@@ -11,7 +11,9 @@ import com.mobiuz.app.databinding.FragmentSupportBinding
import com.mobiuz.app.dev.model.SharedPref
import com.mobiuz.app.dev.ui.base.BaseFragment
import com.mobiuz.app.dev.ui.global.ButtonClick
import com.mobiuz.app.dev.ui.global.CONSTANTS
import dagger.hilt.android.AndroidEntryPoint
import me.everything.android.ui.overscroll.OverScrollDecoratorHelper
import javax.inject.Inject
......@@ -36,42 +38,65 @@ class SupportFragment : BaseFragment(R.layout.fragment_support) {
override fun setUpUI() {
bn.apply {
toolbar.setNavigationOnClickListener {
requireActivity().finish()
navController.navigateUp()
}
OverScrollDecoratorHelper.setUpOverScroll(bn.scrollView)
txtPhone1.text = CONSTANTS.PHONE1
txtPhone2.text = CONSTANTS.PHONE2
txtPhone3.text = CONSTANTS.PHONE3
txtHelpBot.text = CONSTANTS.HELP_BOT
btn0890.setOnClickListener(object : ButtonClick(){
override fun onSingleClick(v: View?) {
val intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:0890"))
requireActivity().startActivity(intent)
actionDial(CONSTANTS.PHONE1)
}
})
btnPhone1.setOnClickListener(object : ButtonClick(){
override fun onSingleClick(v: View?) {
val intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:+998971300909"))
requireActivity().startActivity(intent)
actionDial(CONSTANTS.PHONE2.replace(" ",""))
}
})
btnPhone2.setOnClickListener(object : ButtonClick(){
override fun onSingleClick(v: View?) {
val intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:+998972031010"))
requireActivity().startActivity(intent)
actionDial(CONSTANTS.PHONE3.replace(" ",""))
}
})
btnHelpBot.setOnClickListener(object : ButtonClick(){
override fun onSingleClick(v: View?) {
actionView("https://t.me/${CONSTANTS.HELP_BOT.replace("@","")}")
}
})
btnSentMessage.setOnClickListener(object : ButtonClick(){
override fun onSingleClick(v: View?) {
actionView(CONSTANTS.FEEDBACK)
}
})
}
}
private fun actionDial(url:String){
val intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:$url"))
requireActivity().startActivity(intent)
pref.isShowPin = false
}
private fun actionView(url:String){
val intent = Intent(Intent.ACTION_VIEW)
intent.data = Uri.parse(url)
startActivity(intent)
pref.isShowPin = false
}
override fun collects() {
}
override fun onDestroy() {
_bn = null
super.onDestroy()
......
package com.mobiuz.app.dev.ui.settings.safety.pin
import android.os.Bundle
import android.view.View
import android.widget.TextView
import androidx.core.os.bundleOf
import androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavController
import androidx.navigation.fragment.NavHostFragment
import androidx.recyclerview.widget.LinearLayoutManager
import com.mobiuz.app.R
import com.mobiuz.app.databinding.FragmentNewPinBinding
import com.mobiuz.app.databinding.FragmentOldPinBinding
import com.mobiuz.app.databinding.FragmentPinBinding
import com.mobiuz.app.dev.model.PinData
import com.mobiuz.app.dev.model.SharedPref
import com.mobiuz.app.dev.ui.auth.pin.PinAdapter
import com.mobiuz.app.dev.ui.base.BaseFragment
import com.mobiuz.app.dev.utils.Utils
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.delay
import javax.inject.Inject
@AndroidEntryPoint
class NewPinFragment : BaseFragment(R.layout.fragment_new_pin) {
@Inject
lateinit var pref: SharedPref
private var _bn: FragmentNewPinBinding? = null
private val bn get() = _bn ?: throw NullPointerException("cannot inflate")
private val navController: NavController by lazy(LazyThreadSafetyMode.NONE) { NavHostFragment.findNavController(this) }
private val data = ArrayList<PinData>()
private val pinAdapter = PinAdapter()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_bn = FragmentNewPinBinding.bind(view)
setUpUI()
collects()
}
override fun setUpUI() {
bn.apply {
loadData()
toolbar.setNavigationOnClickListener {
navController.navigateUp()
}
rvPin.layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)
rvPin.setHasFixedSize(true)
rvPin.adapter = pinAdapter
txtNotPin.isVisible = false
pinAdapter.setOnDoneListener {
lifecycleScope.launchWhenCreated {
delay(50)
navController.navigate(R.id.confirmNewPinFragment, bundleOf("pinCode" to it), Utils.navOptions())
}
}
toolbar.setNavigationOnClickListener {
navController.navigateUp()
}
for (i in 0 until btnViewGroup.childCount) {
btnViewGroup.getChildAt(i).setOnClickListener {
when (it.id) {
R.id.btn_remove -> {
pinAdapter.removeItem()
}
R.id.btn_forget_pin -> {
}
else -> {
val text = it as TextView
pinAdapter.addItem(text.text.toString().toInt())
}
}
}
}
}
}
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()
}
}
\ No newline at end of file
package com.mobiuz.app.dev.ui.settings.safety.pin
import android.content.Intent
import android.graphics.Color
import android.os.Bundle
import android.view.View
import android.view.animation.AnimationUtils
import android.widget.TextView
import androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavController
import androidx.navigation.fragment.NavHostFragment
import androidx.recyclerview.widget.LinearLayoutManager
import com.mobiuz.app.R
import com.mobiuz.app.databinding.FragmentOldPinBinding
import com.mobiuz.app.dev.model.PinData
import com.mobiuz.app.dev.model.SharedPref
import com.mobiuz.app.dev.ui.auth.AuthActivity
import com.mobiuz.app.dev.ui.auth.pin.PinAdapter
import com.mobiuz.app.dev.ui.base.BaseFragment
import com.mobiuz.app.dev.ui.global.CONSTANTS
import com.mobiuz.app.dev.utils.Utils
import com.mobiuz.app.dev.utils.extensions.getColorCompat
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.delay
import javax.inject.Inject
@AndroidEntryPoint
class OldPinFragment : BaseFragment(R.layout.fragment_old_pin) {
@Inject
lateinit var pref: SharedPref
private var _bn: FragmentOldPinBinding? = null
private val bn get() = _bn ?: throw NullPointerException("cannot inflate")
private val navController: NavController by lazy(LazyThreadSafetyMode.NONE) { NavHostFragment.findNavController(this) }
private val data = ArrayList<PinData>()
private val pinAdapter = PinAdapter()
private var count = 3
private lateinit var decorView: View
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_bn = FragmentOldPinBinding.bind(view)
count = 3
setUpUI()
collects()
}
override fun setUpUI() {
bn.apply {
loadData()
toolbar.setNavigationOnClickListener {
navController.navigateUp()
}
rvPin.layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)
rvPin.setHasFixedSize(true)
rvPin.adapter = pinAdapter
pinAdapter.setOnDoneListener {
lifecycleScope.launchWhenCreated {
delay(50)
if (pref.pinCode == it) {
navController.navigate(R.id.newPinFragment, null, Utils.navOptions())
} else {
cardPin.startAnimation(AnimationUtils.loadAnimation(requireContext(), R.anim.shake))
count--
if(count == 0){
lifecycleScope.launchWhenCreated {
loadError(true)
delay(1000)
pref.clearUserData()
val intent = Intent(requireContext(), AuthActivity::class.java)
intent.putExtra(CONSTANTS.TYPE_AUTH, CONSTANTS.LOGIN)
intent.putExtra(CONSTANTS.PHONE, pref.userPhone)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_TASK_ON_HOME
startActivity(intent)
requireActivity().finish()
}
}else{
loadError(true)
}
}
}
}
toolbar.setNavigationOnClickListener {
navController.navigateUp()
}
for (i in 0 until btnViewGroup.childCount) {
btnViewGroup.getChildAt(i).setOnClickListener {
when (it.id) {
R.id.btn_remove -> {
loadError(false)
pinAdapter.removeItem()
}
R.id.btn_forget_pin -> {
}
else -> {
loadError(false)
val text = it as TextView
pinAdapter.addItem(text.text.toString().toInt())
}
}
}
}
}
}
private fun loadError(status:Boolean){
bn.apply {
if (count == 0){
errorTitle.text = getString(R.string.impossible_change_pin)
errorText.text = getString(R.string.popitok_error)
}else{
errorText.text = getString(R.string.popitok,count.toString())
}
errorLayout.isVisible = status
div.setBackgroundColor(if(status) getColorCompat(R.color.primary100) else Color.TRANSPARENT)
decorView = requireActivity().window.decorView
decorView.systemUiVisibility = if(status) View.VISIBLE else{decorView.systemUiVisibility or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR}
}
}
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()
}
}
\ No newline at end of file
package com.mobiuz.app.dev.utils
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.util.Log
class NetworkChangeReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val status = NetworkUtil.getConnectivityStatusString(context)
if ("android.net.conn.CONNECTIVITY_CHANGE" == intent.action) {
if (status == NetworkUtil.NETWORK_STATUS_NOT_CONNECTED) {
Log.e("AAA", "NETWORK_STATUS_NOT_CONNECTED")
} else {
Log.e("AAA", "ELSE ")
}
}
}
}
\ No newline at end of file
package com.mobiuz.app.dev.utils;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
public class NetworkUtil {
public static final int TYPE_WIFI = 1;
public static final int TYPE_MOBILE = 2;
public static final int TYPE_NOT_CONNECTED = 0;
public static final int NETWORK_STATUS_NOT_CONNECTED = 0;
public static final int NETWORK_STATUS_WIFI = 1;
public static final int NETWORK_STATUS_MOBILE = 2;
public static int getConnectivityStatus(Context context) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
if (null != activeNetwork) {
if(activeNetwork.getType() == ConnectivityManager.TYPE_WIFI)
return TYPE_WIFI;
if(activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE)
return TYPE_MOBILE;
}
return TYPE_NOT_CONNECTED;
}
public static int getConnectivityStatusString(Context context) {
int conn = NetworkUtil.getConnectivityStatus(context);
int status = 0;
if (conn == NetworkUtil.TYPE_WIFI) {
status = NETWORK_STATUS_WIFI;
} else if (conn == NetworkUtil.TYPE_MOBILE) {
status = NETWORK_STATUS_MOBILE;
} else if (conn == NetworkUtil.TYPE_NOT_CONNECTED) {
status = NETWORK_STATUS_NOT_CONNECTED;
}
return status;
}
}
\ No newline at end of file
......@@ -3,6 +3,7 @@ package com.mobiuz.app.dev.utils.extensions
import android.app.Activity
import android.content.Context
import android.graphics.drawable.Drawable
import android.os.Vibrator
import android.text.*
import android.text.method.LinkMovementMethod
import android.text.style.ClickableSpan
......@@ -20,6 +21,9 @@ import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.textfield.TextInputEditText
import com.google.gson.JsonSyntaxException
import com.mobiuz.app.R
import com.mobiuz.app.dev.model.UzRuEn
import com.mobiuz.app.dev.network.model.Errors
import com.mobiuz.app.dev.ui.global.CONSTANTS
import com.mobiuz.app.dev.ui.global.ExitDialog
import com.mobiuz.app.dev.ui.global.SenderDialog
import retrofit2.HttpException
......@@ -31,6 +35,13 @@ fun Fragment.showMessage(message: String) {
Toast.makeText(requireContext(), message, Toast.LENGTH_SHORT).show()
}
fun Fragment.showCustomDialog(description:String,status:Boolean, block: () -> Unit){
val dialog = SenderDialog(description,status)
dialog.setOnClickListener {
block()
}
dialog.show(childFragmentManager,"tab")
}
fun Activity.showMessage(message: String) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
}
......@@ -169,4 +180,70 @@ fun Activity.getDrawableCompat(@DrawableRes drawableRes: Int): Drawable? = Conte
fun TextInputEditText.clearText(): View {
this.text?.clear()
return this
}
fun String.customMasket():String{
val text = this.replace(" ","")
var new = ""
for (i in text.indices){
if (i == 4){
new += " ("
}
if (i == 6){
new += ") "
}
if (i == 9){
new += "-"
}
if (i == 11){
new += "-"
}
new += text[i]
}
return new
}
fun String.customMasketHome():String{
val text = this.replace(" ","")
var new = ""
for (i in text.indices){
if (i == 4){
new += " "
}
if (i == 6){
new += " "
}
if (i == 9){
new += "-"
}
if (i == 11){
new += "-"
}
new += text[i]
}
return new
}
fun vibrate(context: Context) {
val vibrate = context.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
vibrate.vibrate(100)
}
fun List<Errors>.getMessage():String{
var message = ""
this.forEach {
message += "${it.message}\n"
}
return message
}
fun UzRuEn.getCurrentName(lang:String):String{
return when(lang){
CONSTANTS.EN -> this.en
CONSTANTS.RU -> this.ru
else -> this.uz
}
}
\ No newline at end of file
This diff is collapsed.
......@@ -5,15 +5,26 @@
android:layout_height="match_parent"
android:layout_gravity="center"
android:background="@drawable/bgn_splash"
android:gravity="center"
android:fitsSystemWindows="false"
android:gravity="center"
android:orientation="vertical"
tools:context=".dev.SplashActivity">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_mobiuz_logo"
android:layout_gravity="center"
android:layout_marginBottom="@dimen/_58sdp"
android:src="@drawable/ic_mobiuz_logo"
android:textStyle="bold" />
<Button
android:id="@+id/btn_try_again"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="@dimen/_24sdp"
android:text="Try Again"
android:visibility="gone"
android:textColor="@color/white100" />
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:fitsSystemWindows="false"
android:layout_height="match_parent"
android:background="@color/white"
android:orientation="vertical">
<View
android:layout_width="match_parent"
android:id="@+id/div"
android:background="@android:color/transparent"
android:layout_height="24dp"/>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:navigationIcon="@drawable/ic_baseline_arrow_back" />
<LinearLayout
android:layout_width="match_parent"
android:gravity="center"
android:visibility="invisible"
android:id="@+id/error_layout"
android:orientation="vertical"
android:background="@color/primary100"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:textColor="@color/white100"
android:id="@+id/error_title"
android:layout_height="wrap_content"
android:text="@string/pin_not_same"
android:textSize="16sp"
android:textStyle="bold" />
</LinearLayout>
</FrameLayout>
<TextView
android:id="@+id/txt_enter_pin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="@dimen/_14sdp"
android:layout_marginTop="@dimen/_14sdp"
android:text="@string/confirm_new_pin"
android:textSize="29sp"
android:textStyle="bold" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="0.8">
<LinearLayout
android:layout_width="@dimen/_100sdp"
android:layout_gravity="center"
android:orientation="vertical"
android:gravity="center"
android:layout_height="wrap_content">
<com.google.android.material.card.MaterialCardView
android:id="@+id/card_pin"
android:layout_width="wrap_content"
android:layout_gravity="center"
android:layout_height="wrap_content"
app:cardCornerRadius="0dp"
android:minWidth="@dimen/_100sdp"
android:minHeight="@dimen/_32sdp">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_pin"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:orientation="horizontal"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:itemCount="4"
tools:listitem="@layout/item_pin" />
</com.google.android.material.card.MaterialCardView>
<View
android:layout_width="@dimen/_120sdp"
android:background="@color/grey30"
android:layout_height="2dp"/>
</LinearLayout>
</FrameLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/btn_view_group"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="3"
android:paddingStart="@dimen/_44sdp"
android:paddingEnd="@dimen/_44sdp">
<TextView
android:id="@+id/btn_1"
style="@style/BtnStyle"
android:background="@drawable/bgn_pin_btn"
android:text="@string/_1"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/btn_2"
style="@style/BtnStyle"
android:background="@drawable/bgn_pin_btn"
android:text="@string/_2"
app:layout_constraintEnd_toStartOf="@id/btn_3"
app:layout_constraintStart_toEndOf="@id/btn_1"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/btn_3"
style="@style/BtnStyle"
android:background="@drawable/bgn_pin_btn"
android:text="@string/_3"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/btn_4"
style="@style/BtnStyle"
android:layout_marginTop="@dimen/_16sdp"
android:background="@drawable/bgn_pin_btn"
android:text="@string/_4"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/btn_1" />
<TextView
android:id="@+id/btn_5"
style="@style/BtnStyle"
android:background="@drawable/bgn_pin_btn"
android:text="@string/_5"
app:layout_constraintEnd_toStartOf="@id/btn_6"
app:layout_constraintStart_toEndOf="@id/btn_4"
app:layout_constraintTop_toTopOf="@id/btn_4" />
<TextView
android:id="@+id/btn_6"
style="@style/BtnStyle"
android:background="@drawable/bgn_pin_btn"
android:text="@string/_6"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/btn_4" />
<TextView
android:id="@+id/btn_7"
style="@style/BtnStyle"
android:layout_marginTop="@dimen/_16sdp"
android:background="@drawable/bgn_pin_btn"
android:text="@string/_7"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/btn_4" />
<TextView
android:id="@+id/btn_8"
style="@style/BtnStyle"
android:background="@drawable/bgn_pin_btn"
android:text="@string/_8"
app:layout_constraintEnd_toStartOf="@id/btn_9"
app:layout_constraintStart_toEndOf="@id/btn_7"
app:layout_constraintTop_toTopOf="@id/btn_7" />
<TextView
android:id="@+id/btn_9"
style="@style/BtnStyle"
android:background="@drawable/bgn_pin_btn"
android:text="@string/_9"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/btn_7" />
<TextView
android:id="@+id/btn_0"
style="@style/BtnStyle"
android:layout_marginTop="@dimen/_16sdp"
android:background="@drawable/bgn_pin_btn"
android:text="@string/_0"
app:layout_constraintEnd_toEndOf="@id/btn_8"
app:layout_constraintStart_toStartOf="@id/btn_8"
app:layout_constraintTop_toBottomOf="@id/btn_7" />
<ImageView
android:id="@+id/btn_remove"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?selectableItemBackgroundBorderless"
android:contentDescription="@string/remove"
android:padding="@dimen/_4sdp"
android:src="@drawable/ic_vector_remove"
app:layout_constraintBottom_toBottomOf="@id/btn_0"
app:layout_constraintEnd_toEndOf="@id/btn_9"
app:layout_constraintStart_toStartOf="@id/btn_9"
app:layout_constraintTop_toTopOf="@id/btn_0" />
<TextView
android:layout_width="match_parent"
app:layout_constraintTop_toBottomOf="@id/btn_0"
android:text="@string/forget_pin"
android:gravity="center"
android:paddingVertical="12dp"
android:textSize="14sp"
android:background="?android:selectableItemBackground"
android:textStyle="bold"
android:id="@+id/btn_forget_pin"
android:layout_marginTop="@dimen/_20sdp"
android:textColor="@color/primary100"
android:layout_height="wrap_content"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
\ No newline at end of file
This diff is collapsed.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
xmlns:app="http://schemas.android.com/apk/res-auto"
>
android:orientation="vertical">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
app:title="@string/language_app"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
app:navigationIcon="@drawable/ic_baseline_arrow_back"
/>
app:title="@string/language_app" />
<LinearLayout
android:id="@+id/uzbek_lang"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="27dp"
android:paddingHorizontal="@dimen/_16sdp"
android:background="?android:selectableItemBackground"
android:paddingHorizontal="@dimen/_16sdp"
android:paddingVertical="@dimen/_12sdp">
<ImageView
......@@ -31,30 +30,30 @@
<TextView
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/_12sdp"
android:layout_weight="1"
android:text="@string/uzbek"
android:textStyle="bold"
android:textColor="@color/black100"
android:textSize="16sp" />
android:textSize="16sp"
android:textStyle="bold" />
<ImageView
android:layout_width="wrap_content"
android:layout_gravity="center"
android:visibility="invisible"
android:id="@+id/image_uzbek"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_vector_checked" />
android:layout_gravity="center"
android:src="@drawable/ic_vector_checked"
android:visibility="invisible" />
</LinearLayout>
<LinearLayout
android:id="@+id/russian_lang"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingHorizontal="@dimen/_16sdp"
android:layout_marginVertical="@dimen/_12sdp"
android:background="?android:selectableItemBackground"
android:paddingHorizontal="@dimen/_16sdp"
android:paddingVertical="@dimen/_12sdp">
<ImageView
......@@ -64,28 +63,29 @@
<TextView
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/_12sdp"
android:layout_weight="1"
android:text="@string/russian"
android:textStyle="bold"
android:textColor="@color/black100"
android:textSize="16sp" />
android:textSize="16sp"
android:textStyle="bold" />
<ImageView
android:layout_width="wrap_content"
android:layout_gravity="center"
android:visibility="invisible"
android:id="@+id/image_russian"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_vector_checked" />
android:layout_gravity="center"
android:src="@drawable/ic_vector_checked"
android:visibility="invisible" />
</LinearLayout>
<LinearLayout
android:id="@+id/english_lang"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingHorizontal="@dimen/_16sdp"
android:background="?android:selectableItemBackground"
android:paddingHorizontal="@dimen/_16sdp"
android:paddingVertical="@dimen/_12sdp">
<ImageView
......@@ -95,20 +95,22 @@
<TextView
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/_12sdp"
android:layout_weight="1"
android:text="@string/english"
android:textStyle="bold"
android:textColor="@color/black100"
android:textSize="16sp" />
android:textSize="16sp"
android:textStyle="bold" />
<ImageView
android:id="@+id/image_english"
android:layout_width="wrap_content"
android:layout_gravity="center"
android:layout_height="wrap_content"
android:visibility="invisible"
android:id="@+id/image_english"
android:src="@drawable/ic_vector_checked" />
android:layout_gravity="center"
android:src="@drawable/ic_vector_checked"
android:visibility="invisible" />
</LinearLayout>
</LinearLayout>
\ No newline at end of file
......@@ -4,6 +4,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/view_group"
android:orientation="vertical">
<com.google.android.material.appbar.MaterialToolbar
......
......@@ -15,13 +15,13 @@
android:layout_marginStart="@dimen/_14sdp"
android:layout_marginTop="@dimen/_34sdp"
android:text="@string/enter_pin_code"
android:textSize="@dimen/_16sdp"
android:textSize="29sp"
android:textStyle="bold" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="0.9">
android:layout_weight="0.8">
<TextView
android:id="@+id/txt_not_pin"
......@@ -47,7 +47,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:cardCornerRadius="0dp"
android:minWidth="@dimen/_120sdp"
android:minWidth="@dimen/_110sdp"
android:minHeight="@dimen/_32sdp">
<androidx.recyclerview.widget.RecyclerView
......@@ -62,7 +62,7 @@
tools:listitem="@layout/item_pin" />
</com.google.android.material.card.MaterialCardView>
<View
android:layout_width="@dimen/_120sdp"
android:layout_width="@dimen/_110sdp"
android:background="@color/grey30"
android:layout_height="2dp"/>
</LinearLayout>
......
......@@ -3,11 +3,14 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:tools="http://schemas.android.com/tools"
android:fitsSystemWindows="false"
android:orientation="vertical">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_marginTop="24dp"
android:layout_height="wrap_content"
app:navigationIcon="@drawable/ic_baseline_arrow_back"
app:title="@string/profile" />
......@@ -21,21 +24,28 @@
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
<TextView
android:layout_width="84dp"
android:layout_height="84dp"
android:text="Ю"
android:id="@+id/txt_avatar"
android:gravity="center"
android:textSize="24sp"
android:layout_gravity="center"
android:layout_marginTop="20dp"
android:src="@drawable/ic_user" />
android:background="@drawable/bgn_avatar"
android:layout_marginTop="20dp" />
<TextView
android:id="@+id/txt_user_name"
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:gravity="center"
android:elevation="8dp"
android:layout_marginHorizontal="@dimen/_24sdp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="12dp"
android:text="Юлия Шевченко "
android:textSize="29sp"
tools:text="Юлия Шевченко "
android:textSize="25sp"
android:textStyle="bold" />
<TextView
......@@ -43,22 +53,25 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="8dp"
android:layout_marginTop="15dp"
android:text="@string/my_number"
android:textColor="@color/grey70"
android:textSize="16sp" />
<com.google.android.material.button.MaterialButton
<TextView
android:id="@+id/txt_user_phone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="12dp"
android:paddingHorizontal="@dimen/_16sdp"
android:paddingVertical="12dp"
android:layout_marginTop="16dp"
android:textStyle="bold"
android:translationZ="@dimen/_10sdp"
android:background="@drawable/bgn_user_phone"
android:textColor="@color/white100"
android:paddingHorizontal="18dp"
android:paddingVertical="10dp"
android:text="+998 97 999-99-99"
android:textSize="14sp"
app:backgroundTint="@color/primary100" />
android:textSize="15sp" />
<View
android:layout_width="match_parent"
......@@ -85,7 +98,7 @@
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:layout_marginStart="12dp"
android:orientation="vertical">
<TextView
......@@ -101,9 +114,9 @@
android:text="31.12.1999"
android:textColor="@color/black100"
android:textSize="15sp"
android:layout_marginTop="4dp"
android:textStyle="bold" />
</LinearLayout>
......@@ -114,6 +127,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:visibility="invisible"
android:background="?android:selectableItemBackground"
android:paddingHorizontal="@dimen/_16sdp"
android:paddingVertical="@dimen/_10sdp">
......@@ -153,6 +167,7 @@
android:id="@+id/btn_sim"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="invisible"
android:layout_marginTop="10dp"
android:background="?android:selectableItemBackground"
android:paddingHorizontal="@dimen/_16sdp"
......
......@@ -2,6 +2,7 @@
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:id="@+id/view_group"
android:layout_height="match_parent"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical">
......
......@@ -7,11 +7,16 @@
android:paddingHorizontal="@dimen/_12sdp"
android:layout_height="wrap_content">
<ImageView
<TextView
android:layout_width="84dp"
android:src="@drawable/ic_user"
android:layout_marginTop="20dp"
android:layout_height="84dp"/>
android:layout_height="84dp"
android:text="Ю"
android:id="@+id/txt_avatar"
android:gravity="center"
android:textSize="24sp"
android:layout_gravity="start"
android:background="@drawable/bgn_avatar"
android:layout_marginTop="20dp" />
<TextView
android:layout_width="wrap_content"
android:id="@+id/txt_user_name"
......
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_width="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:cardCornerRadius="12dp"
app:cardCornerRadius="6dp"
app:cardUseCompatPadding="true"
android:layout_marginHorizontal="@dimen/_16sdp"
app:cardBackgroundColor="@color/white"
xmlns:tools="http://schemas.android.com/tools"
android:layout_height="wrap_content">
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:orientation="vertical"
android:clickable="true"
android:minWidth="@dimen/_230sdp"
android:focusable="true"
android:layout_height="wrap_content">
<com.airbnb.lottie.LottieAnimationView
android:layout_width="80dp"
android:id="@+id/lottie"
android:layout_height="80dp"
<ImageView
android:layout_width="@dimen/_70sdp"
android:id="@+id/image"
android:src="@drawable/icon_famale"
android:layout_height="@dimen/_70sdp"
android:adjustViewBounds="true"
app:lottie_autoPlay="true"
android:layout_gravity="center"
app:lottie_loop="true"
android:layout_marginTop="16dp"
app:lottie_rawRes="@raw/success_lottie"
app:lottie_speed="1"
android:layout_marginTop="36dp"
tools:ignore="ContentDescription" />
......@@ -34,41 +32,28 @@
android:layout_width="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:textSize="16sp"
android:textSize="24sp"
android:id="@+id/title"
android:textStyle="bold"
android:layout_marginTop="24dp"
android:layout_marginHorizontal="26dp"
android:text="@string/successfully"
android:layout_height="wrap_content"/>
<TextView
android:layout_width="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:textSize="16sp"
android:layout_marginTop="10dp"
android:layout_marginBottom="20dp"
android:id="@+id/description"
android:layout_marginHorizontal="26dp"
android:text="description"
android:layout_height="wrap_content"/>
<View
android:layout_width="match_parent"
android:background="@color/grey20"
android:layout_height="1dp"/>
<TextView
<Button
style="@style/ButtonPrimary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:id="@+id/btn_ok"
android:textSize="14sp"
android:layout_margin="24dp"
android:textStyle="bold"
android:elevation="2dp"
android:paddingVertical="16dp"
android:gravity="center"
android:text="@string/ok"/>
android:text="@string/close_process"/>
</androidx.appcompat.widget.LinearLayoutCompat>
</com.google.android.material.card.MaterialCardView>
\ No newline at end of file
......@@ -11,4 +11,50 @@
android:label="fragment_home"
tools:layout="@layout/fragment_home" />
<fragment
android:id="@+id/addFragment"
android:name="uz.agr.delta.ui.card.add.AddCardFragment"
android:label="fragment_add"
tools:layout="@layout/agr_fragment_add_card" />
<fragment
android:id="@+id/languageFragment"
android:name="com.mobiuz.app.dev.ui.settings.LanguageFragment"
android:label="fragment_language"
tools:layout="@layout/fragment_language" />
<fragment
android:id="@+id/supportFragment"
tools:layout="@layout/fragment_support"
android:name="com.mobiuz.app.dev.ui.settings.SupportFragment"
android:label="SupportFragment" />
<fragment
android:id="@+id/safetyFragment"
android:name="com.mobiuz.app.dev.ui.settings.safety.SafetyFragment"
android:label="fragment_safety"
tools:layout="@layout/fragment_safety" />
<fragment
android:id="@+id/profileFragment"
android:name="com.mobiuz.app.dev.ui.settings.ProfileFragment"
android:label="fragment_profile"
tools:layout="@layout/fragment_profile" />
<fragment
android:id="@+id/currentPasswordFragment"
android:name="com.mobiuz.app.dev.ui.settings.safety.password.ChangePasswordFragment"
android:label="CurrentPasswordFragment" />
<fragment
android:id="@+id/oldPinFragment"
android:name="com.mobiuz.app.dev.ui.settings.safety.pin.OldPinFragment"
android:label="OldPinFragment" />
<fragment
android:id="@+id/newPinFragment"
android:name="com.mobiuz.app.dev.ui.settings.safety.pin.NewPinFragment"
android:label="NewPinFragment" />
<fragment
android:id="@+id/confirmNewPinFragment"
android:name="com.mobiuz.app.dev.ui.settings.safety.pin.ConfirmNewPinFragment"
android:label="ConfirmNewPinFragment" />
</navigation>
\ No newline at end of file
......@@ -2,13 +2,55 @@
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
app:startDestination="@id/motionFragment"
app:startDestination="@id/serviceFragment"
android:id="@+id/nav_graph_profile">
<fragment
android:id="@+id/motionFragment"
android:id="@+id/serviceFragment"
tools:layout="@layout/fragment_service"
android:name="com.mobiuz.app.dev.ui.service.ServiceFragment"
android:label="MotionFragment" />
<fragment
android:id="@+id/servicesFragmentActivity"
android:name="com.mobiuz.app.dev.ui.service.ServicesFragmentActivity"
android:label="ServicesFragmentActivity" />
<fragment
android:id="@+id/languageFragment"
android:name="com.mobiuz.app.dev.ui.settings.LanguageFragment"
android:label="fragment_language"
tools:layout="@layout/fragment_language" />
<fragment
android:id="@+id/supportFragment"
tools:layout="@layout/fragment_support"
android:name="com.mobiuz.app.dev.ui.settings.SupportFragment"
android:label="SupportFragment" />
<fragment
android:id="@+id/safetyFragment"
android:name="com.mobiuz.app.dev.ui.settings.safety.SafetyFragment"
android:label="fragment_safety"
tools:layout="@layout/fragment_safety" />
<fragment
android:id="@+id/profileFragment"
android:name="com.mobiuz.app.dev.ui.settings.ProfileFragment"
android:label="fragment_profile"
tools:layout="@layout/fragment_profile" />
<fragment
android:id="@+id/currentPasswordFragment"
android:name="com.mobiuz.app.dev.ui.settings.safety.password.ChangePasswordFragment"
android:label="CurrentPasswordFragment" />
<fragment
android:id="@+id/oldPinFragment"
android:name="com.mobiuz.app.dev.ui.settings.safety.pin.OldPinFragment"
android:label="OldPinFragment" />
<fragment
android:id="@+id/newPinFragment"
android:name="com.mobiuz.app.dev.ui.settings.safety.pin.NewPinFragment"
android:label="NewPinFragment" />
<fragment
android:id="@+id/confirmNewPinFragment"
android:name="com.mobiuz.app.dev.ui.settings.safety.pin.ConfirmNewPinFragment"
android:label="ConfirmNewPinFragment" />
</navigation>
\ No newline at end of file
......@@ -103,5 +103,30 @@
<string name="enter_new_password">Введите новый пароль</string>
<string name="enter_confirm_new_password">Для подтверждения введите новый пароль ещё раз</string>
<string name="password_changed">Пароль изменен</string>
<string name="enter_old_pin">Ведите старый PIN-код</string>
<string name="forget_pin">Забыл PIN?</string>
<string name="enter_new_pin">Введите новый PIN-код</string>
<string name="confirm_new_pin">Подтвердите PIN-код</string>
<string name="wrong_pin">Неверный PIN-код</string>
<string name="popitok">Осталось %1$s попытки</string>
<string name="impossible_change_pin">Смена ПИН кода невозможна</string>
<string name="popitok_error">Вы ввели неправильный PIN код 3 раза</string>
<string name="pin_code_updated">Пин-код успешно обновлен</string>
<string name="for_abonent">Для абонентов</string>
<string name="all_nomer">Со всех номеров</string>
<string name="contact_us">Связь с нами</string>
<string name="telegram_bot">Телеграм бот</string>
<string name="email">Email</string>
<string name="send_an_appeal">Отправить обращение</string>
<string name="your_opinion_matters">Ваше мнение имеет значение</string>
<string name="biometric_enabled">Biometric enabled</string>
<string name="biometric_disabled">Biometric disabled</string>
<string name="password_updated">Password Successfully Updated</string>
<string name="wrong_password">Неверный Пароль</string>
<string name="impossible_change_password">Замена пароля невозможна</string>
<string name="login_register">Авторизация/Регистрация</string>
<string name="close_process">Закрыть</string>
<string name="popitok_error_password">Вы ввели неправильный пароль 3 раза</string>
<string name="settings_safety">Настройки безопасности действуют только для основного номера +998 97 999-99-99</string>
</resources>
\ No newline at end of file
......@@ -11,6 +11,7 @@
<item name="colorPrimaryDark">@android:color/transparent</item>
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowAnimationStyle">@style/WindowAnimationStyle</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/teal_200</item>
......@@ -33,6 +34,11 @@
<item name="android:background">@drawable/radius_top</item>
</style>
<style name="WindowAnimationStyle">
<item name="android:windowEnterAnimation">@android:anim/fade_in</item>
<item name="android:windowExitAnimation">@android:anim/fade_out</item>
</style>
<style name="ProgressDialogTheme" parent="ThemeOverlay.AppCompat.Dialog">
<item name="android:windowBackground">@android:color/transparent</item>
</style>
......@@ -52,6 +58,14 @@
<item name="android:textSize">17sp</item>
<item name="android:background">@drawable/button_selector</item>
<item name="textAllCaps">false</item>
</style>
<style name="BiometricButtonPrimary" parent="Widget.AppCompat.Button">
<item name="android:textColor">@color/primary100</item>
<item name="android:textSize">16sp</item>
<item name="android:textStyle">bold</item>
<item name="android:background">@drawable/btn_biometric_bgn</item>
<item name="textAllCaps">false</item>
</style>
......
dependencyResolutionManagement {
/*dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
flatDir {
dirs 'aars'
}
maven { url "https://maven.google.com" }
google()
mavenCentral()
jcenter() // Warning: this repository is going to shut down soon
}
}
}*/
rootProject.name = "MobiUz-Android"
include ':app'
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