Commit ae54b133 authored by shohboz's avatar shohboz

[UPD] MUS-266 Feature, updated clickable urls and other changes

parent 0cad9a91
...@@ -54,6 +54,7 @@ ...@@ -54,6 +54,7 @@
<entry key="app/src/main/res/layout/activity_settings.xml" value="0.25625" /> <entry key="app/src/main/res/layout/activity_settings.xml" value="0.25625" />
<entry key="app/src/main/res/layout/activity_splash.xml" value="0.29936594202898553" /> <entry key="app/src/main/res/layout/activity_splash.xml" value="0.29936594202898553" />
<entry key="app/src/main/res/layout/activity_splash2.xml" value="0.25625" /> <entry key="app/src/main/res/layout/activity_splash2.xml" value="0.25625" />
<entry key="app/src/main/res/layout/activity_test.xml" value="0.25625" />
<entry key="app/src/main/res/layout/bottom_sheet_ussd.xml" value="0.266796875" /> <entry key="app/src/main/res/layout/bottom_sheet_ussd.xml" value="0.266796875" />
<entry key="app/src/main/res/layout/button_selector.xml" value="0.33242753623188404" /> <entry key="app/src/main/res/layout/button_selector.xml" value="0.33242753623188404" />
<entry key="app/src/main/res/layout/fragment_action.xml" value="0.25625" /> <entry key="app/src/main/res/layout/fragment_action.xml" value="0.25625" />
......
...@@ -24,7 +24,11 @@ ...@@ -24,7 +24,11 @@
android:theme="@style/Theme.MobiUzAndroid" android:theme="@style/Theme.MobiUzAndroid"
android:usesCleartextTraffic="true" android:usesCleartextTraffic="true"
tools:targetApi="m"> tools:targetApi="m">
<activity
android:name=".dev.TestActivity"
android:exported="true" >
</activity>
<activity <activity
android:name=".dev.SplashActivity" android:name=".dev.SplashActivity"
android:configChanges="orientation" android:configChanges="orientation"
...@@ -37,7 +41,6 @@ ...@@ -37,7 +41,6 @@
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter> </intent-filter>
</activity> </activity>
<activity <activity
android:name=".dev.LanguageActivity" android:name=".dev.LanguageActivity"
android:configChanges="orientation" android:configChanges="orientation"
...@@ -63,12 +66,6 @@ ...@@ -63,12 +66,6 @@
android:screenOrientation="portrait" android:screenOrientation="portrait"
android:windowSoftInputMode="adjustResize" /> android:windowSoftInputMode="adjustResize" />
<activity
android:name=".dev.BillingFragment"
android:configChanges="orientation"
android:exported="false"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustResize" />
</application> </application>
</manifest> </manifest>
\ No newline at end of file
package com.mobiuz.app.dev
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.net.Uri
import android.os.Bundle
import android.view.View
import androidx.annotation.IdRes
import androidx.core.os.bundleOf
import androidx.core.view.GravityCompat
import androidx.core.view.isVisible
import androidx.drawerlayout.widget.DrawerLayout
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.LiveData
import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavController
import androidx.navigation.fragment.NavHostFragment
import com.google.android.material.bottomnavigation.BottomNavigationView
import com.mobiuz.app.BuildConfig
import com.mobiuz.app.R
import com.mobiuz.app.databinding.FragmentMainBinding
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.NetworkUtil
import com.mobiuz.app.dev.utils.Utils
import com.mobiuz.app.dev.utils.extensions.*
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.launch
import javax.inject.Inject
@AndroidEntryPoint
class MainFragment : Fragment(R.layout.fragment_main) {
@Inject
lateinit var pref: SharedPref
private var _bn: FragmentMainBinding? = 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 val intentFilter = IntentFilter()
private val bottomNavSelectedItemIdKey = "BOTTOM_NAV_SELECTED_ITEM_ID_KEY"
private var bottomNavSelectedItemId = R.id.nav_graph_home // Must be your starting destination
private val navController : NavController by lazy (LazyThreadSafetyMode.NONE){ NavHostFragment.findNavController(this) }
// if offline type == 0
private var type = 0
override fun onCreate(savedInstanceState: Bundle?) {
// LocaleHelper.setLocale(this)
super.onCreate(savedInstanceState)
// _bn = ActivityMainBinding.inflate(layoutInflater)
// setContentView(bn.root)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_bn = FragmentMainBinding.bind(view)
pref.isShowPin = false
savedInstanceState?.let {
bottomNavSelectedItemId =
savedInstanceState.getInt(bottomNavSelectedItemIdKey, bottomNavSelectedItemId)
}
setupBottomNavigationBar(view)
// val data = intent?.getStringExtra(CONSTANTS.FIRST)
// if (data != null && data == CONSTANTS.FIRST) {
// currentNavController?.value?.popBackStack()
// currentNavController?.value?.navigate(R.id.homeFragment)
// }
setUpUI()
collects()
receiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
if (intent?.action == CONSTANTS.INTENT_ACTION_NAVIGATE){
val id = intent.getIntExtra(CONSTANTS.FRAGMENT_ID,0)
customLog("INTENT_ACTION_NAVIGATE: id: $id")
navController.navigate(id)
}
}
}
intentFilter.addAction(CONSTANTS.INTENT_ACTION_NAVIGATE)
requireActivity().registerReceiver(receiver, intentFilter)
}
private fun setUpUI() {
bn.apply {
bn.btnTryAgain.setOnClickListener {
if (type == 0) {
navigateToOffline()
}
}
txtVersion.text = "v ${BuildConfig.VERSION_NAME}"
header.txtUserPhone.text = pref.userPhone.customMasketHome()
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 {
GlobalScope.launch {
viewModel.logOut()
}
val intent = Intent(requireContext(), AuthActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_TASK_ON_HOME
startActivity(intent)
pref.clearUserData()
requireActivity().finish()
}
}
})
btnLanguage.setOnClickListener(object : ButtonClick() {
override fun onSingleClick(v: View?) {
navigateToSettingsScreen(R.id.languageFragment)
}
})
btnSupport.setOnClickListener(object : ButtonClick() {
override fun onSingleClick(v: View?) {
navigateToSettingsScreen(R.id.supportFragment)
}
})
btnSafety.setOnClickListener(object : ButtonClick() {
override fun onSingleClick(v: View?) {
navigateToSettingsScreen(R.id.securityFragment)
}
})
header.headerLayout.setOnClickListener(object : ButtonClick() {
override fun onSingleClick(v: View?) {
navigateToSettingsScreen(R.id.profileFragment)
}
})
txtRedactData.setOnClickListener {
navigateUri(
when (pref.language) {
CONSTANTS.UZ -> CONSTANTS.LICENSE_UZ
CONSTANTS.RU -> CONSTANTS.LICENSE_RU
else -> CONSTANTS.LICENSE_EN
}
)
}
txtPublicOferta.setOnClickListener {
navigateUri(
when (pref.language) {
CONSTANTS.UZ -> CONSTANTS.PRIVACY_POLICY_UZ
CONSTANTS.RU -> CONSTANTS.PRIVACY_POLICY_RU
else -> CONSTANTS.PRIVACY_POLICY_EN
}
)
}
}
}
private fun navigateToOffline() {
val intent = Intent(requireContext(), OfflineActivity::class.java)
intent.putExtra(CONSTANTS.TYPE_SERVICE, CONSTANTS.FROM_ONLINE)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_TASK_ON_HOME
startActivity(intent)
requireActivity().finish()
}
private fun navigateUri(link: String) {
val uri = Uri.parse(link)
val intent = Intent(Intent.ACTION_VIEW)
intent.data = uri
startActivity(intent)
pref.isShowPin = false
}
override fun onStop() {
super.onStop()
pref.blockedTime = System.currentTimeMillis()
bn.drawerLayout.closeDrawer(GravityCompat.START)
}
override fun onResume() {
super.onResume()
if (pref.isShowPin) {
showPinCode()
} else {
pref.blockedTime = System.currentTimeMillis()
pref.isShowPin = true
}
}
private fun showPinCode() {
if (pref.blockedTime < System.currentTimeMillis() - CONSTANTS.BLOCKED_TIME) {
if (currentNavController?.value?.currentDestination?.id != R.id.pinFragment &&
currentNavController?.value?.currentDestination?.id != R.id.ussdFragment
) {
bn.btnTryAgain.isVisible = false
currentNavController?.value?.navigate(R.id.pinFragment, bundleOf(CONSTANTS.TYPE_PIN to CONSTANTS.TYPE_AFTER))
}
}
}
private fun navigateToSettingsScreen(@IdRes resId: Int) {
val window = requireActivity().window.decorView
window.systemUiVisibility = window.systemUiVisibility or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
currentNavController?.value?.navigate(resId)
viewModel.bottomSheet(false)
bn.drawerLayout.closeDrawer(GravityCompat.START)
}
private fun collects() {
lifecycleScope.launchWhenStarted {
viewModel.mainIndexUiState.collect {
when (it) {
is UiStateObject.SUCCESS -> {
bn.drawerLayout.openDrawer(GravityCompat.START)
}
else -> Unit
}
}
}
lifecycleScope.launchWhenStarted {
viewModel.bottomSheetUiState.collect {
when (it) {
is UiStateObject.SUCCESS -> {
bn.bottomNavView.isVisible = it.data
}
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
}
}
}
lifecycleScope.launchWhenStarted {
viewModel.swipeDrawerUiState.collect {
when (it) {
is UiStateObject.SUCCESS -> {
if (it.data) {
bn.drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED)
} else {
bn.drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
}
}
else -> Unit
}
}
}
}
// Needed to maintain correct state over rotations
override fun onSaveInstanceState(outState: Bundle) {
outState.putInt(bottomNavSelectedItemIdKey, bottomNavSelectedItemId)
super.onSaveInstanceState(outState)
}
private fun setupBottomNavigationBar(view: View) {
try {
bottomNavigationView = view.findViewById(R.id.bottom_nav_view)
val navGraphIds = listOf(
R.navigation.nav_graph_home,
R.navigation.nav_graph_services
)
val controller = bottomNavigationView.setupWithNavController(
fragmentManager = childFragmentManager,
backButtonBehaviour = BackButtonBehaviour.POP_HOST_FRAGMENT,
navGraphIds = navGraphIds,
containerId = R.id.nav_host_fragment,
firstItemId = R.id.nav_graph_home,
intent = requireActivity().intent
)
controller.observe(viewLifecycleOwner, { navController ->
// NavigationUI.setupWithNavController(bottomNavigationView,navController)
bottomNavSelectedItemId = navController.graph.id // Needed to maintain correct state on return
})
currentNavController = controller
} catch (e: Exception) {
e.printStackTrace()
}
}
override fun onDestroy() {
requireActivity().unregisterReceiver(receiver)
_bn = null
super.onDestroy()
}
}
\ No newline at end of file
...@@ -5,7 +5,6 @@ import android.content.Context ...@@ -5,7 +5,6 @@ import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.IntentFilter import android.content.IntentFilter
import android.os.Bundle import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.os.bundleOf import androidx.core.os.bundleOf
import androidx.core.view.isVisible import androidx.core.view.isVisible
...@@ -16,10 +15,9 @@ import com.mobiuz.app.databinding.ActivityOfflineBinding ...@@ -16,10 +15,9 @@ import com.mobiuz.app.databinding.ActivityOfflineBinding
import com.mobiuz.app.dev.model.SharedPref import com.mobiuz.app.dev.model.SharedPref
import com.mobiuz.app.dev.ui.auth.AuthActivity import com.mobiuz.app.dev.ui.auth.AuthActivity
import com.mobiuz.app.dev.ui.global.CONSTANTS import com.mobiuz.app.dev.ui.global.CONSTANTS
import com.mobiuz.app.dev.ui.service.ServiceAdapter import com.mobiuz.app.dev.ui.service.ServicesAdapter
import com.mobiuz.app.dev.utils.LocaleHelper import com.mobiuz.app.dev.utils.LocaleHelper
import com.mobiuz.app.dev.utils.NetworkUtil import com.mobiuz.app.dev.utils.NetworkUtil
import com.mobiuz.app.dev.utils.extensions.customLog
import com.mobiuz.app.dev.utils.extensions.showMessage import com.mobiuz.app.dev.utils.extensions.showMessage
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject import javax.inject.Inject
...@@ -30,7 +28,7 @@ class OfflineActivity : AppCompatActivity() { ...@@ -30,7 +28,7 @@ class OfflineActivity : AppCompatActivity() {
private var _bn: ActivityOfflineBinding? = null private var _bn: ActivityOfflineBinding? = null
private val bn get() = _bn ?: throw NullPointerException("cannot inflate") private val bn get() = _bn ?: throw NullPointerException("cannot inflate")
private lateinit var adapter: ServiceAdapter private lateinit var adapter: ServicesAdapter
private lateinit var navController: NavController private lateinit var navController: NavController
private lateinit var receiver: BroadcastReceiver private lateinit var receiver: BroadcastReceiver
private val intentFilter = IntentFilter() private val intentFilter = IntentFilter()
...@@ -47,7 +45,7 @@ class OfflineActivity : AppCompatActivity() { ...@@ -47,7 +45,7 @@ class OfflineActivity : AppCompatActivity() {
_bn = ActivityOfflineBinding.inflate(layoutInflater) _bn = ActivityOfflineBinding.inflate(layoutInflater)
setContentView(bn.root) setContentView(bn.root)
adapter = ServiceAdapter(pref.language) adapter = ServicesAdapter(pref.language)
pref.isShowPin = false pref.isShowPin = false
......
package com.mobiuz.app.dev
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.mobiuz.app.R
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class TestActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_test)
}
}
\ No newline at end of file
...@@ -11,6 +11,8 @@ import com.mobiuz.app.dev.network.model.UiStateObject ...@@ -11,6 +11,8 @@ import com.mobiuz.app.dev.network.model.UiStateObject
import com.mobiuz.app.dev.utils.extensions.getMessage import com.mobiuz.app.dev.utils.extensions.getMessage
import com.mobiuz.app.dev.utils.extensions.userMessage import com.mobiuz.app.dev.utils.extensions.userMessage
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Singleton import javax.inject.Singleton
...@@ -23,13 +25,16 @@ class AuthRepository @Inject constructor( ...@@ -23,13 +25,16 @@ class AuthRepository @Inject constructor(
suspend fun checkPhone(data: UserAuth): UiStateObject<Action> { suspend fun checkPhone(data: UserAuth): UiStateObject<Action> {
return try { return try {
withContext(Dispatchers.IO){
val res = apiService.checkPhone(data) val res = apiService.checkPhone(data)
withContext(Dispatchers.Main){
when { when {
res.status -> UiStateObject.SUCCESS(res.data ?: Action()) res.status -> UiStateObject.SUCCESS(res.data ?: Action())
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage()) res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message) else -> UiStateObject.ERROR(res.message)
} }
}
}
} catch (e: Exception) { } catch (e: Exception) {
UiStateObject.ERROR(e.userMessage(context)) UiStateObject.ERROR(e.userMessage(context))
} }
...@@ -37,12 +42,16 @@ class AuthRepository @Inject constructor( ...@@ -37,12 +42,16 @@ class AuthRepository @Inject constructor(
suspend fun registerUser(data: UserAuth): UiStateObject<String> { suspend fun registerUser(data: UserAuth): UiStateObject<String> {
return try { return try {
withContext(Dispatchers.IO){
val res = apiService.register(data) val res = apiService.register(data)
withContext(Dispatchers.Main){
when { when {
res.status && res.data != null -> UiStateObject.SUCCESS(res.data!!) res.status && res.data != null -> UiStateObject.SUCCESS(res.data!!)
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage()) res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message) else -> UiStateObject.ERROR(res.message)
} }
}
}
} catch (e: Exception) { } catch (e: Exception) {
UiStateObject.ERROR(e.userMessage(context)) UiStateObject.ERROR(e.userMessage(context))
...@@ -51,8 +60,9 @@ class AuthRepository @Inject constructor( ...@@ -51,8 +60,9 @@ class AuthRepository @Inject constructor(
suspend fun checkSMSCode(data: UserAuth): UiStateObject<String> { suspend fun checkSMSCode(data: UserAuth): UiStateObject<String> {
return try { return try {
withContext(Dispatchers.IO){
val res = apiService.checkSMSCode(data) val res = apiService.checkSMSCode(data)
withContext(Dispatchers.Main){
when { when {
res.status -> { res.status -> {
pref.userToken = res.data?.token pref.userToken = res.data?.token
...@@ -62,6 +72,8 @@ class AuthRepository @Inject constructor( ...@@ -62,6 +72,8 @@ class AuthRepository @Inject constructor(
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage()) res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message) else -> UiStateObject.ERROR(res.message)
} }
}
}
} catch (e: Exception) { } catch (e: Exception) {
UiStateObject.ERROR(e.userMessage(context)) UiStateObject.ERROR(e.userMessage(context))
} }
...@@ -69,8 +81,9 @@ class AuthRepository @Inject constructor( ...@@ -69,8 +81,9 @@ class AuthRepository @Inject constructor(
suspend fun loginUser(data: UserAuth): UiStateObject<String> { suspend fun loginUser(data: UserAuth): UiStateObject<String> {
return try { return try {
withContext(Dispatchers.IO){
val res = apiService.login(data) val res = apiService.login(data)
withContext(Dispatchers.Main){
when { when {
res.status -> { res.status -> {
UiStateObject.SUCCESS(res.data!!) UiStateObject.SUCCESS(res.data!!)
...@@ -78,6 +91,8 @@ class AuthRepository @Inject constructor( ...@@ -78,6 +91,8 @@ class AuthRepository @Inject constructor(
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage()) res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message) else -> UiStateObject.ERROR(res.message)
} }
}
}
} catch (e: Exception) { } catch (e: Exception) {
UiStateObject.ERROR(e.userMessage(context)) UiStateObject.ERROR(e.userMessage(context))
} }
...@@ -85,8 +100,9 @@ class AuthRepository @Inject constructor( ...@@ -85,8 +100,9 @@ class AuthRepository @Inject constructor(
suspend fun checkResetCode(data: UserAuth): UiStateObject<String> { suspend fun checkResetCode(data: UserAuth): UiStateObject<String> {
return try { return try {
withContext(Dispatchers.IO){
val res = apiService.checkResetCode(data) val res = apiService.checkResetCode(data)
withContext(Dispatchers.Main){
when { when {
res.status -> { res.status -> {
UiStateObject.SUCCESS(res.message) UiStateObject.SUCCESS(res.message)
...@@ -94,6 +110,8 @@ class AuthRepository @Inject constructor( ...@@ -94,6 +110,8 @@ class AuthRepository @Inject constructor(
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage()) res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message) else -> UiStateObject.ERROR(res.message)
} }
}
}
} catch (e: Exception) { } catch (e: Exception) {
UiStateObject.ERROR(e.userMessage(context)) UiStateObject.ERROR(e.userMessage(context))
} }
...@@ -101,8 +119,9 @@ class AuthRepository @Inject constructor( ...@@ -101,8 +119,9 @@ class AuthRepository @Inject constructor(
suspend fun resetPassword(data: UserAuth): UiStateObject<String> { suspend fun resetPassword(data: UserAuth): UiStateObject<String> {
return try { return try {
withContext(Dispatchers.IO){
val res = apiService.resetPassword(data) val res = apiService.resetPassword(data)
withContext(Dispatchers.Main){
when { when {
res.status -> { res.status -> {
pref.isRegistered = true pref.isRegistered = true
...@@ -112,6 +131,8 @@ class AuthRepository @Inject constructor( ...@@ -112,6 +131,8 @@ class AuthRepository @Inject constructor(
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage()) res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message) else -> UiStateObject.ERROR(res.message)
} }
}
}
} catch (e: Exception) { } catch (e: Exception) {
UiStateObject.ERROR(e.userMessage(context)) UiStateObject.ERROR(e.userMessage(context))
} }
...@@ -119,8 +140,9 @@ class AuthRepository @Inject constructor( ...@@ -119,8 +140,9 @@ class AuthRepository @Inject constructor(
suspend fun forgetPassword(data: UserAuth): UiStateObject<String> { suspend fun forgetPassword(data: UserAuth): UiStateObject<String> {
return try { return try {
withContext(Dispatchers.IO){
val res = apiService.forgetPassword(data) val res = apiService.forgetPassword(data)
withContext(Dispatchers.Main){
when { when {
res.status -> { res.status -> {
UiStateObject.SUCCESS(res.data?:"") UiStateObject.SUCCESS(res.data?:"")
...@@ -128,6 +150,8 @@ class AuthRepository @Inject constructor( ...@@ -128,6 +150,8 @@ class AuthRepository @Inject constructor(
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage()) res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message) else -> UiStateObject.ERROR(res.message)
} }
}
}
} catch (e: Exception) { } catch (e: Exception) {
UiStateObject.ERROR(e.userMessage(context)) UiStateObject.ERROR(e.userMessage(context))
} }
...@@ -135,7 +159,9 @@ class AuthRepository @Inject constructor( ...@@ -135,7 +159,9 @@ class AuthRepository @Inject constructor(
suspend fun resetSmsCode(data: UserAuth): UiStateObject<String> { suspend fun resetSmsCode(data: UserAuth): UiStateObject<String> {
return try { return try {
withContext(Dispatchers.IO){
val res = apiService.reSendSms(data) val res = apiService.reSendSms(data)
withContext(Dispatchers.Main){
when { when {
res.status -> { res.status -> {
UiStateObject.SUCCESS(res.data ?: "") UiStateObject.SUCCESS(res.data ?: "")
...@@ -143,6 +169,8 @@ class AuthRepository @Inject constructor( ...@@ -143,6 +169,8 @@ class AuthRepository @Inject constructor(
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage()) res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message) else -> UiStateObject.ERROR(res.message)
} }
}
}
} catch (e: Exception) { } catch (e: Exception) {
UiStateObject.ERROR(e.userMessage(context)) UiStateObject.ERROR(e.userMessage(context))
} }
...@@ -150,8 +178,9 @@ class AuthRepository @Inject constructor( ...@@ -150,8 +178,9 @@ class AuthRepository @Inject constructor(
suspend fun checkPassword(data: UserAuth): UiStateObject<String> { suspend fun checkPassword(data: UserAuth): UiStateObject<String> {
return try { return try {
withContext(Dispatchers.IO){
val res = apiService.checkPassword(data) val res = apiService.checkPassword(data)
withContext(Dispatchers.Main){
when { when {
res.status -> { res.status -> {
UiStateObject.SUCCESS(res.message) UiStateObject.SUCCESS(res.message)
...@@ -159,6 +188,8 @@ class AuthRepository @Inject constructor( ...@@ -159,6 +188,8 @@ class AuthRepository @Inject constructor(
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage(),true) res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage(),true)
else -> UiStateObject.ERROR(res.message,true) else -> UiStateObject.ERROR(res.message,true)
} }
}
}
} catch (e: Exception) { } catch (e: Exception) {
UiStateObject.ERROR(e.userMessage(context)) UiStateObject.ERROR(e.userMessage(context))
} }
...@@ -166,8 +197,9 @@ class AuthRepository @Inject constructor( ...@@ -166,8 +197,9 @@ class AuthRepository @Inject constructor(
suspend fun installPassword(data: ChangePassword): UiStateObject<String> { suspend fun installPassword(data: ChangePassword): UiStateObject<String> {
return try { return try {
withContext(Dispatchers.IO){
val res = apiService.installPassword(data) val res = apiService.installPassword(data)
withContext(Dispatchers.Main){
when { when {
res.status -> { res.status -> {
UiStateObject.SUCCESS(res.message) UiStateObject.SUCCESS(res.message)
...@@ -175,6 +207,8 @@ class AuthRepository @Inject constructor( ...@@ -175,6 +207,8 @@ class AuthRepository @Inject constructor(
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage()) res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message) else -> UiStateObject.ERROR(res.message)
} }
}
}
} catch (e: Exception) { } catch (e: Exception) {
UiStateObject.ERROR(e.userMessage(context)) UiStateObject.ERROR(e.userMessage(context))
} }
......
...@@ -12,6 +12,9 @@ import com.mobiuz.app.dev.network.model.UiStateObject ...@@ -12,6 +12,9 @@ import com.mobiuz.app.dev.network.model.UiStateObject
import com.mobiuz.app.dev.utils.extensions.getMessage import com.mobiuz.app.dev.utils.extensions.getMessage
import com.mobiuz.app.dev.utils.extensions.userMessage import com.mobiuz.app.dev.utils.extensions.userMessage
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import uz.agr.mobiuz.AGRBilling
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Singleton import javax.inject.Singleton
...@@ -23,8 +26,9 @@ class MainRepository @Inject constructor( ...@@ -23,8 +26,9 @@ class MainRepository @Inject constructor(
){ ){
suspend fun mainIndex(): UiStateObject<Customer> { suspend fun mainIndex(): UiStateObject<Customer> {
return try { return try {
withContext(Dispatchers.IO){
val res = apiService.mainIndex() val res = apiService.mainIndex()
withContext(Dispatchers.Main){
when { when {
res.status && res.data != null -> { res.status && res.data != null -> {
UiStateObject.SUCCESS(res.data!!) UiStateObject.SUCCESS(res.data!!)
...@@ -32,31 +36,30 @@ class MainRepository @Inject constructor( ...@@ -32,31 +36,30 @@ class MainRepository @Inject constructor(
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage()) res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message) else -> UiStateObject.ERROR(res.message)
} }
}
}
} catch (e: Exception) { } catch (e: Exception) {
UiStateObject.ERROR(e.userMessage(context)) UiStateObject.ERROR(e.userMessage(context))
} }
} }
suspend fun logOut(): UiStateObject<String> { suspend fun logOut() {
return try { try {
val res = apiService.logOut() withContext(Dispatchers.IO){
AGRBilling.deleteAllCards()
when { AGRBilling.deleteAllMonitoring()
res.status -> { apiService.logOut()
UiStateObject.SUCCESS(res.message)
}
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message)
} }
} catch (e: Exception) { } catch (e: Exception) {
UiStateObject.ERROR(e.userMessage(context)) e.printStackTrace()
} }
} }
suspend fun services(): UiStateObject<String> { suspend fun services(): UiStateObject<String> {
return try { return try {
withContext(Dispatchers.IO){
val res = apiService.getServices() val res = apiService.getServices()
withContext(Dispatchers.Main){
when { when {
res.status -> { res.status -> {
pref.services = Gson().toJson(res.data) pref.services = Gson().toJson(res.data)
...@@ -65,14 +68,17 @@ class MainRepository @Inject constructor( ...@@ -65,14 +68,17 @@ class MainRepository @Inject constructor(
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage()) res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message) else -> UiStateObject.ERROR(res.message)
} }
}
}
} catch (e: Exception) { } catch (e: Exception) {
UiStateObject.ERROR(e.userMessage(context)) UiStateObject.ERROR(e.userMessage(context))
} }
} }
suspend fun mainRoaming(): UiStateObject<Roaming> { suspend fun mainRoaming(): UiStateObject<Roaming> {
return try { return try {
withContext(Dispatchers.IO){
val res = apiService.mainRoaming() val res = apiService.mainRoaming()
withContext(Dispatchers.Main){
when { when {
res.status -> { res.status -> {
UiStateObject.SUCCESS(res.data!!) UiStateObject.SUCCESS(res.data!!)
...@@ -80,6 +86,8 @@ class MainRepository @Inject constructor( ...@@ -80,6 +86,8 @@ class MainRepository @Inject constructor(
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage()) res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message) else -> UiStateObject.ERROR(res.message)
} }
}
}
} catch (e: Exception) { } catch (e: Exception) {
UiStateObject.ERROR(e.userMessage(context)) UiStateObject.ERROR(e.userMessage(context))
} }
......
...@@ -79,7 +79,7 @@ class AuthActivity : AppCompatActivity() { ...@@ -79,7 +79,7 @@ class AuthActivity : AppCompatActivity() {
} }
CONSTANTS.TYPE_VERIFICATION -> { CONSTANTS.TYPE_VERIFICATION -> {
navController.popBackStack() navController.popBackStack()
navController.navigate(R.id.myVerificationFragment, bundleOf(CONSTANTS.PHONE to phone , CONSTANTS.PIN_CODE to verificationCode), Utils.navOptions()) navController.navigate(R.id.verificationFragment, bundleOf(CONSTANTS.PHONE to phone , CONSTANTS.PIN_CODE to verificationCode), Utils.navOptions())
} }
} }
} }
......
...@@ -54,7 +54,7 @@ class CheckPhoneFragment : BaseFragment(R.layout.fragment_check_phone) { ...@@ -54,7 +54,7 @@ class CheckPhoneFragment : BaseFragment(R.layout.fragment_check_phone) {
toolbar.setNavigationOnClickListener { toolbar.setNavigationOnClickListener {
requireActivity().finish() requireActivity().onBackPressed()
} }
viewGroup.setOnClickListener(object : ButtonClick() { viewGroup.setOnClickListener(object : ButtonClick() {
...@@ -78,7 +78,7 @@ class CheckPhoneFragment : BaseFragment(R.layout.fragment_check_phone) { ...@@ -78,7 +78,7 @@ class CheckPhoneFragment : BaseFragment(R.layout.fragment_check_phone) {
inputPhone.setText(newText) inputPhone.setText(newText)
inputPhone.setSelection(oldText.checkChangedPosition(newText)) inputPhone.setSelection(oldText.checkChangedPosition(newText))
inputPhone.addTextChangedListener(this) inputPhone.addTextChangedListener(this)
btnLogin.isEnabled = inputPhone.text.toString().trim().length == 12 btnCheckPhone.isEnabled = inputPhone.text.toString().trim().length == 12
}catch (e: Exception){ }catch (e: Exception){
inputPhone.text.clear() inputPhone.text.clear()
} }
...@@ -86,7 +86,7 @@ class CheckPhoneFragment : BaseFragment(R.layout.fragment_check_phone) { ...@@ -86,7 +86,7 @@ class CheckPhoneFragment : BaseFragment(R.layout.fragment_check_phone) {
} }
}) })
btnLogin.setOnClickListener(object : ButtonClick() { btnCheckPhone.setOnClickListener(object : ButtonClick() {
override fun onSingleClick(v: View?) { override fun onSingleClick(v: View?) {
phone = "+998" + inputPhone.text.toString().trim().replace(" ","") phone = "+998" + inputPhone.text.toString().trim().replace(" ","")
phoneRaw = "+998 " + inputPhone.text.toString().trim() phoneRaw = "+998 " + inputPhone.text.toString().trim()
......
package com.mobiuz.app.dev.ui.auth.login package com.mobiuz.app.dev.ui.auth.login
import android.content.Intent import android.content.Intent
import android.graphics.Color
import android.net.Uri import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.text.Spannable
import android.text.SpannableString
import android.text.style.ForegroundColorSpan
import android.view.View import android.view.View
import androidx.core.os.bundleOf import androidx.core.os.bundleOf
import androidx.core.view.isVisible
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavController import androidx.navigation.NavController
...@@ -26,7 +21,6 @@ import com.mobiuz.app.dev.ui.global.TextWatcherWrapper ...@@ -26,7 +21,6 @@ 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.checkInternet import com.mobiuz.app.dev.utils.extensions.checkInternet
import com.mobiuz.app.dev.utils.extensions.makeLinks import com.mobiuz.app.dev.utils.extensions.makeLinks
import com.mobiuz.app.dev.utils.extensions.showCustomDialog
import com.mobiuz.app.dev.utils.hideKeyboard import com.mobiuz.app.dev.utils.hideKeyboard
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.collect
...@@ -58,8 +52,7 @@ class LoginFragment : BaseFragment(R.layout.fragment_login) { ...@@ -58,8 +52,7 @@ class LoginFragment : BaseFragment(R.layout.fragment_login) {
override fun setUpUI() { override fun setUpUI() {
bn.apply { bn.apply {
viewGroup.setOnClickListener(object : ButtonClick() {
viewGroup.setOnClickListener(object : ButtonClick(){
override fun onSingleClick(v: View?) { override fun onSingleClick(v: View?) {
bn.viewGroup.hideKeyboard() bn.viewGroup.hideKeyboard()
} }
...@@ -100,7 +93,7 @@ class LoginFragment : BaseFragment(R.layout.fragment_login) { ...@@ -100,7 +93,7 @@ class LoginFragment : BaseFragment(R.layout.fragment_login) {
) )
} }
else -> { else -> {
if(checkInternet()){ if (checkInternet()) {
viewModel.login(UserAuth(phone.filter { it.isDigit() }, password)) viewModel.login(UserAuth(phone.filter { it.isDigit() }, password))
} }
...@@ -122,7 +115,11 @@ class LoginFragment : BaseFragment(R.layout.fragment_login) { ...@@ -122,7 +115,11 @@ class LoginFragment : BaseFragment(R.layout.fragment_login) {
when (it) { when (it) {
is UiStateObject.SUCCESS -> { is UiStateObject.SUCCESS -> {
showProgressDialog(false) showProgressDialog(false)
navController.navigate(R.id.myVerificationFragment, bundleOf(CONSTANTS.PHONE to phone, CONSTANTS.PIN_CODE to it.data), Utils.navOptions()) navController.navigate(
R.id.verificationFragment,
bundleOf(CONSTANTS.PHONE to phone, CONSTANTS.PIN_CODE to it.data),
Utils.navOptions()
)
} }
is UiStateObject.ERROR -> { is UiStateObject.ERROR -> {
showProgressDialog(false) showProgressDialog(false)
...@@ -142,7 +139,7 @@ class LoginFragment : BaseFragment(R.layout.fragment_login) { ...@@ -142,7 +139,7 @@ class LoginFragment : BaseFragment(R.layout.fragment_login) {
is UiStateObject.SUCCESS -> { is UiStateObject.SUCCESS -> {
showProgressDialog(false) showProgressDialog(false)
navController.navigate( navController.navigate(
R.id.myVerificationFragment, R.id.verificationFragment,
bundleOf( bundleOf(
CONSTANTS.PHONE to phone, CONSTANTS.PHONE to phone,
CONSTANTS.TYPE_VERIFICATION to CONSTANTS.TYPE_FORGET, CONSTANTS.TYPE_VERIFICATION to CONSTANTS.TYPE_FORGET,
......
...@@ -34,13 +34,13 @@ class InstallPinFragment : BaseFragment(R.layout.fragment_install_pin) { ...@@ -34,13 +34,13 @@ class InstallPinFragment : BaseFragment(R.layout.fragment_install_pin) {
private var _bn: FragmentInstallPinBinding? = null private var _bn: FragmentInstallPinBinding? = null
private val bn get() = _bn ?: throw NullPointerException("cannot inflate") private val bn get() = _bn ?: throw NullPointerException("cannot inflate")
private val navController: NavController by lazy(LazyThreadSafetyMode.NONE) { NavHostFragment.findNavController(this) } private val navController: NavController by lazy(LazyThreadSafetyMode.NONE) { NavHostFragment.findNavController(this) }
private val data = ArrayList<PinData>() private lateinit var biometricManager: BiometricManager
private val pinAdapter = InstallPinAdapter() private val pinAdapter = InstallPinAdapter()
private var type = "" private val data = ArrayList<PinData>()
private var titleText = "" private var titleText = ""
private var pinCode = "" private var pinCode = ""
private var type = ""
private var count = 3 private var count = 3
private lateinit var biometricManager: BiometricManager
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
...@@ -49,12 +49,12 @@ class InstallPinFragment : BaseFragment(R.layout.fragment_install_pin) { ...@@ -49,12 +49,12 @@ class InstallPinFragment : BaseFragment(R.layout.fragment_install_pin) {
type = it.getString(CONSTANTS.TYPE_PIN, "") ?: "" type = it.getString(CONSTANTS.TYPE_PIN, "") ?: ""
pinCode = it.getString(CONSTANTS.PIN_CODE, "") ?: "" pinCode = it.getString(CONSTANTS.PIN_CODE, "") ?: ""
} }
biometricManager = BiometricManager.from(requireContext())
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_bn = FragmentInstallPinBinding.bind(view) _bn = FragmentInstallPinBinding.bind(view)
biometricManager = BiometricManager.from(requireContext())
setUpUI() setUpUI()
collects() collects()
...@@ -106,7 +106,8 @@ class InstallPinFragment : BaseFragment(R.layout.fragment_install_pin) { ...@@ -106,7 +106,8 @@ class InstallPinFragment : BaseFragment(R.layout.fragment_install_pin) {
pinAdapter.setOnDoneListener { pinAdapter.setOnDoneListener {
when (type) { when (type) {
CONSTANTS.NEW_PIN -> { CONSTANTS.NEW_PIN -> {
navController.navigate(R.id.installPinFragment, bundleOf(CONSTANTS.TYPE_PIN to CONSTANTS.CONFIRM_NEW_PIN, CONSTANTS.PIN_CODE to it), navController.navigate(R.id.installPinFragment,
bundleOf(CONSTANTS.TYPE_PIN to CONSTANTS.CONFIRM_NEW_PIN, CONSTANTS.PIN_CODE to it),
Utils.navOptions()) Utils.navOptions())
} }
CONSTANTS.CONFIRM_NEW_PIN -> { CONSTANTS.CONFIRM_NEW_PIN -> {
...@@ -121,7 +122,8 @@ class InstallPinFragment : BaseFragment(R.layout.fragment_install_pin) { ...@@ -121,7 +122,8 @@ class InstallPinFragment : BaseFragment(R.layout.fragment_install_pin) {
} }
CONSTANTS.CURRENT_PIN -> { CONSTANTS.CURRENT_PIN -> {
if(pref.pinCode == it){ if(pref.pinCode == it){
navController.navigate(R.id.installPinFragment, bundleOf( CONSTANTS.TYPE_PIN to CONSTANTS.CHANGE_NEW_PIN), Utils.navOptions()) navController.navigate(R.id.installPinFragment,
bundleOf( CONSTANTS.TYPE_PIN to CONSTANTS.CHANGE_NEW_PIN), Utils.navOptions())
}else{ }else{
loadError() loadError()
} }
...@@ -130,8 +132,9 @@ class InstallPinFragment : BaseFragment(R.layout.fragment_install_pin) { ...@@ -130,8 +132,9 @@ class InstallPinFragment : BaseFragment(R.layout.fragment_install_pin) {
if(pref.pinCode == it){ if(pref.pinCode == it){
showMessage(getString(R.string.cannot_change_pin)) showMessage(getString(R.string.cannot_change_pin))
}else{ }else{
navController.navigate(R.id.installPinFragment, bundleOf(CONSTANTS.TYPE_PIN to CONSTANTS.CONFIRM_CHANGE_NEW_PIN, CONSTANTS.PIN_CODE to it), Utils navController.navigate(R.id.installPinFragment,
.navOptions()) bundleOf(CONSTANTS.TYPE_PIN to CONSTANTS.CONFIRM_CHANGE_NEW_PIN, CONSTANTS.PIN_CODE to it),
Utils.navOptions())
} }
} }
CONSTANTS.CONFIRM_CHANGE_NEW_PIN -> { CONSTANTS.CONFIRM_CHANGE_NEW_PIN -> {
......
...@@ -131,7 +131,7 @@ class RegisterFragment : BaseFragment(R.layout.fragment_register) { ...@@ -131,7 +131,7 @@ class RegisterFragment : BaseFragment(R.layout.fragment_register) {
}) })
btnLogin.setOnClickListener(object : ButtonClick() { btnRegister.setOnClickListener(object : ButtonClick() {
override fun onSingleClick(v: View?) { override fun onSingleClick(v: View?) {
password = inputPassword.text.toString().trim() password = inputPassword.text.toString().trim()
confirmPassword = inputConfirm.text.toString().trim() confirmPassword = inputConfirm.text.toString().trim()
...@@ -157,7 +157,7 @@ class RegisterFragment : BaseFragment(R.layout.fragment_register) { ...@@ -157,7 +157,7 @@ class RegisterFragment : BaseFragment(R.layout.fragment_register) {
bn.apply { bn.apply {
password = inputPassword.text.toString().trim() password = inputPassword.text.toString().trim()
confirmPassword = inputConfirm.text.toString().trim() confirmPassword = inputConfirm.text.toString().trim()
btnLogin.isEnabled = (password.length > 3) && (password == confirmPassword) btnRegister.isEnabled = (password.length > 3) && (password == confirmPassword)
txtCheckPassword.isVisible = password.length < 4 txtCheckPassword.isVisible = password.length < 4
if (password.isNotEmpty() && confirmPassword.isNotEmpty()){ if (password.isNotEmpty() && confirmPassword.isNotEmpty()){
if (password == confirmPassword){ if (password == confirmPassword){
...@@ -184,7 +184,7 @@ class RegisterFragment : BaseFragment(R.layout.fragment_register) { ...@@ -184,7 +184,7 @@ class RegisterFragment : BaseFragment(R.layout.fragment_register) {
is UiStateObject.SUCCESS -> { is UiStateObject.SUCCESS -> {
showProgressDialog(false) showProgressDialog(false)
navController.navigate( navController.navigate(
R.id.myVerificationFragment, R.id.verificationFragment,
bundleOf(CONSTANTS.PHONE to phone, CONSTANTS.PIN_CODE to it.data), bundleOf(CONSTANTS.PHONE to phone, CONSTANTS.PIN_CODE to it.data),
Utils.navOptions() Utils.navOptions()
) )
......
...@@ -44,8 +44,8 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) { ...@@ -44,8 +44,8 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) {
private val bn get() = _bn ?: throw NullPointerException("cannot inflate") private val bn get() = _bn ?: throw NullPointerException("cannot inflate")
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 verificationCode = "" private var verificationCode = ""
private var code = ""
private var phone = "" private var phone = ""
...@@ -88,7 +88,7 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) { ...@@ -88,7 +88,7 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) {
setColorPins(getColorCompat(R.color.black100)) setColorPins(getColorCompat(R.color.black100))
} }
}) })
btnLogin.setOnClickListener(object : ButtonClick() { btnVerification.setOnClickListener(object : ButtonClick() {
override fun onSingleClick(v: View?) { override fun onSingleClick(v: View?) {
getLinePinCodes() getLinePinCodes()
val auth = UserAuth(phone.replace("+", "").replace(" ", ""), null, code) val auth = UserAuth(phone.replace("+", "").replace(" ", ""), null, code)
...@@ -107,7 +107,7 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) { ...@@ -107,7 +107,7 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) {
coutdownView.setOnCountdownEndListener { coutdownView.setOnCountdownEndListener {
count(false) count(false)
} }
setVerificationCode() // setVerificationCode()
} }
} }
...@@ -121,7 +121,7 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) { ...@@ -121,7 +121,7 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) {
pin5.setText(verificationCode[4].toString()) pin5.setText(verificationCode[4].toString())
pin6.setText(verificationCode[5].toString()) pin6.setText(verificationCode[5].toString())
pin6.requestFocus() pin6.requestFocus()
btnLogin.isEnabled = true btnVerification.isEnabled = true
} }
} }
} }
...@@ -186,12 +186,12 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) { ...@@ -186,12 +186,12 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) {
if (s.toString().isNotEmpty()) { if (s.toString().isNotEmpty()) {
if (i == pinView.childCount - 1) { if (i == pinView.childCount - 1) {
pin6.hideKeyboard() pin6.hideKeyboard()
btnLogin.isEnabled = true btnVerification.isEnabled = true
} else pinView.getChildAt(i + 1).requestFocus() } else pinView.getChildAt(i + 1).requestFocus()
this@apply.setBackgroundResource(R.drawable.bgn_ver_checked) this@apply.setBackgroundResource(R.drawable.bgn_ver_checked)
} else { } else {
if (i == pinView.childCount - 1) { if (i == pinView.childCount - 1) {
btnLogin.isEnabled = false btnVerification.isEnabled = false
} }
this@apply.setBackgroundResource(R.drawable.bgn_ver_unchecked) this@apply.setBackgroundResource(R.drawable.bgn_ver_unchecked)
} }
...@@ -239,9 +239,9 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) { ...@@ -239,9 +239,9 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) {
viewModel.resetSmsCodeUiState.collect { viewModel.resetSmsCodeUiState.collect {
when (it) { when (it) {
is UiStateObject.SUCCESS -> { is UiStateObject.SUCCESS -> {
showToastMessage(it.data) // showToastMessage(it.data)
verificationCode = it.data // verificationCode = it.data
setVerificationCode() // setVerificationCode()
count(true) count(true)
showProgressDialog(false) showProgressDialog(false)
} }
......
...@@ -50,7 +50,9 @@ object CONSTANTS { ...@@ -50,7 +50,9 @@ object CONSTANTS {
const val FROM_ONLINE = "FROM_ONLINE" const val FROM_ONLINE = "FROM_ONLINE"
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 CONNECTIVITY_CHANGE = "android.net.conn.CONNECTIVITY_CHANGE"
const val INTENT_ACTION_NAVIGATE = "INTENT_ACTION_NAVIGATE"
const val MY_CONNECTIVITY_CHANGE = "MY_CONNECTIVITY_CHANGE" const val MY_CONNECTIVITY_CHANGE = "MY_CONNECTIVITY_CHANGE"
const val FRAGMENT_ID = "FRAGMENT_ID"
//password types //password types
......
...@@ -13,7 +13,7 @@ import dagger.hilt.android.AndroidEntryPoint ...@@ -13,7 +13,7 @@ import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint @AndroidEntryPoint
class OfflineBottomSheet() : BottomSheetDialogFragment() { class OfflineBottomSheet: BottomSheetDialogFragment() {
@Inject @Inject
lateinit var pref: SharedPref lateinit var pref: SharedPref
...@@ -34,14 +34,14 @@ class OfflineBottomSheet() : BottomSheetDialogFragment() { ...@@ -34,14 +34,14 @@ class OfflineBottomSheet() : BottomSheetDialogFragment() {
private fun setUpUI() { private fun setUpUI() {
bn.apply { bn.apply {
lng = pref.language lng = pref.language
btnZapros.setOnClickListener(object : ButtonClick() { btnToOfflineActivity.setOnClickListener(object : ButtonClick() {
override fun onSingleClick(v: View?) { override fun onSingleClick(v: View?) {
pref.isShowPin = false pref.isShowPin = false
navigate() navigate()
} }
}) })
btnOtmena.setOnClickListener(object : ButtonClick() { btnCancel.setOnClickListener(object : ButtonClick() {
override fun onSingleClick(v: View?) { override fun onSingleClick(v: View?) {
dismiss() dismiss()
} }
......
package com.mobiuz.app.dev package com.mobiuz.app.dev.ui.home
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.navigation.fragment.NavHostFragment import androidx.navigation.fragment.NavHostFragment
import com.mobiuz.app.R import com.mobiuz.app.R
import com.mobiuz.app.databinding.FragmentBillingBinding import com.mobiuz.app.databinding.FragmentBillingBinding
import com.mobiuz.app.dev.model.SharedPref import com.mobiuz.app.dev.model.SharedPref
import com.mobiuz.app.dev.ui.base.BaseFragment import com.mobiuz.app.dev.ui.base.BaseFragment
import com.mobiuz.app.dev.utils.LocaleHelper
import com.mobiuz.app.dev.utils.extensions.showMessage import com.mobiuz.app.dev.utils.extensions.showMessage
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import uz.agr.mobiuz.AGRBilling import uz.agr.mobiuz.AGRBilling
import uz.agr.sdk.coreui.extension.showMessage
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint @AndroidEntryPoint
......
...@@ -3,6 +3,7 @@ package com.mobiuz.app.dev.ui.home ...@@ -3,6 +3,7 @@ package com.mobiuz.app.dev.ui.home
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Intent import android.content.Intent
import android.graphics.Color import android.graphics.Color
import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.widget.FrameLayout import android.widget.FrameLayout
...@@ -17,16 +18,15 @@ import androidx.recyclerview.widget.RecyclerView ...@@ -17,16 +18,15 @@ import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.tabs.TabLayoutMediator import com.google.android.material.tabs.TabLayoutMediator
import com.mobiuz.app.R import com.mobiuz.app.R
import com.mobiuz.app.databinding.FragmentHomeBinding import com.mobiuz.app.databinding.FragmentHomeBinding
import com.mobiuz.app.dev.BillingFragment
import com.mobiuz.app.dev.MainViewModel import com.mobiuz.app.dev.MainViewModel
import com.mobiuz.app.dev.model.SharedPref import com.mobiuz.app.dev.model.SharedPref
import com.mobiuz.app.dev.network.model.Customer 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.ui.global.CONSTANTS
import com.mobiuz.app.dev.utils.extensions.* import com.mobiuz.app.dev.utils.extensions.*
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.collect
import javax.inject.Inject import javax.inject.Inject
...@@ -77,6 +77,13 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) { ...@@ -77,6 +77,13 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) {
bn.apply { bn.apply {
slider.adapter = sliderAdapter slider.adapter = sliderAdapter
sliderAdapter.setOnClickListener {
val uri = Uri.parse(it)
val intent = Intent(Intent.ACTION_VIEW)
intent.data = uri
startActivity(intent)
}
TabLayoutMediator(tabIndicator, slider) { _, _ -> }.attach() TabLayoutMediator(tabIndicator, slider) { _, _ -> }.attach()
// lifecycleScope.launchWhenCreated { // lifecycleScope.launchWhenCreated {
...@@ -102,6 +109,7 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) { ...@@ -102,6 +109,7 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) {
btnAddSum.setOnClickListener { btnAddSum.setOnClickListener {
pref.isShowPin = false pref.isShowPin = false
if(checkInternet()){ if(checkInternet()){
// requireActivity().sendBroadcast(Intent(CONSTANTS.INTENT_ACTION_NAVIGATE).putExtra(CONSTANTS.FRAGMENT_ID,R.id.billingFragment))
navController.navigate(R.id.billingFragment) navController.navigate(R.id.billingFragment)
} }
...@@ -212,10 +220,10 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) { ...@@ -212,10 +220,10 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) {
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
private fun loadData() { private fun loadData() {
try { try {
// sliderAdapter.submitList(customer?.events ?: emptyList())
customer?.customer?.info?.let { customer?.customer?.info?.let {
bn.apply { bn.apply {
// loadSum(it.balance?.amount?.toDouble(),it.balance?.currency)
txtBalance.text = "${it.balance?.amount?.toMoneyFormat()} ${it.balance?.currency}" txtBalance.text = "${it.balance?.amount?.toMoneyFormat()} ${it.balance?.currency}"
pref.userBirthday = customer?.customer?.date_of_birth ?: "" pref.userBirthday = customer?.customer?.date_of_birth ?: ""
it.counters?.let { it.counters?.let {
...@@ -246,18 +254,6 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) { ...@@ -246,18 +254,6 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) {
} }
} }
private fun loadSum(amount:Double?, currency:String?){
lifecycleScope.launchWhenCreated {
var i = 0.0
while (i < amount ?: 0.0){
delay(50)
i += 10000
bn.txtBalance.text = "${i.toMoneyFormat()} $currency"
}
}
}
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
mainViewModel.bottomSheet(true) mainViewModel.bottomSheet(true)
......
...@@ -4,21 +4,23 @@ import android.graphics.Color ...@@ -4,21 +4,23 @@ import android.graphics.Color
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import coil.load
import com.mobiuz.app.R import com.mobiuz.app.R
import com.mobiuz.app.databinding.ItemHomeBinding import com.mobiuz.app.databinding.ItemHomeBinding
import com.mobiuz.app.dev.network.model.Events import com.mobiuz.app.dev.network.model.Events
import com.mobiuz.app.dev.ui.global.ButtonClick
import com.mobiuz.app.dev.ui.global.CONSTANTS
import com.mobiuz.app.dev.utils.extensions.SingleBlock import com.mobiuz.app.dev.utils.extensions.SingleBlock
class SliderAdapter : RecyclerView.Adapter<SliderAdapter.SliderViewHolder>() { class SliderAdapter : RecyclerView.Adapter<SliderAdapter.SliderViewHolder>() {
private var listener: SingleBlock<Events>? = null private var listener: SingleBlock<String>? = null
private val sliderItems: ArrayList<Events> = ArrayList() private val sliderItems: ArrayList<String> = ArrayList()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SliderViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SliderViewHolder {
return SliderViewHolder( return SliderViewHolder(
ItemHomeBinding.inflate(LayoutInflater.from(parent.context),parent,false) ItemHomeBinding.inflate(LayoutInflater.from(parent.context), parent, false)
) )
} }
...@@ -35,16 +37,22 @@ class SliderAdapter : RecyclerView.Adapter<SliderAdapter.SliderViewHolder>() { ...@@ -35,16 +37,22 @@ class SliderAdapter : RecyclerView.Adapter<SliderAdapter.SliderViewHolder>() {
txtDescription.setTextColor(Color.WHITE) txtDescription.setTextColor(Color.WHITE)
txtDescription.text = itemView.context.getString(R.string.misic_all_with_you) txtDescription.text = itemView.context.getString(R.string.misic_all_with_you)
} }
btnSeeMore.setOnClickListener(object : ButtonClick() {
override fun onSingleClick(v: View?) {
listener?.invoke(CONSTANTS.HTTP_MOBI_UZ)
}
})
} }
} }
} }
fun setOnClickListener(block: SingleBlock<Events>) { fun setOnClickListener(block: SingleBlock<String>) {
listener = block listener = block
} }
fun submitList(ls: List<Events>) { fun submitList(ls: List<String>) {
sliderItems.clear() sliderItems.clear()
sliderItems.addAll(ls) sliderItems.addAll(ls)
notifyDataSetChanged() notifyDataSetChanged()
......
...@@ -5,30 +5,29 @@ import android.view.View ...@@ -5,30 +5,29 @@ import android.view.View
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import com.google.gson.Gson import com.google.gson.Gson
import com.mobiuz.app.R import com.mobiuz.app.R
import com.mobiuz.app.databinding.FragmentActionBinding import com.mobiuz.app.databinding.FragmentSendUssdBinding
import com.mobiuz.app.dev.MainViewModel import com.mobiuz.app.dev.MainViewModel
import com.mobiuz.app.dev.model.InnerData import com.mobiuz.app.dev.model.InnerData
import com.mobiuz.app.dev.model.SharedPref import com.mobiuz.app.dev.model.SharedPref
import com.mobiuz.app.dev.ui.base.BaseFragment import com.mobiuz.app.dev.ui.base.BaseFragment
import com.mobiuz.app.dev.ui.global.CONSTANTS import com.mobiuz.app.dev.ui.global.CONSTANTS
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import me.everything.android.ui.overscroll.OverScrollDecoratorHelper
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint @AndroidEntryPoint
class ActionFragment : BaseFragment(R.layout.fragment_action) { class SendUssdFragment : BaseFragment(R.layout.fragment_send_ussd) {
@Inject @Inject
lateinit var pref: SharedPref lateinit var pref: SharedPref
private lateinit var mainViewModel: MainViewModel private lateinit var mainViewModel: MainViewModel
private var _bn: FragmentActionBinding? = null private var _bn: FragmentSendUssdBinding? = null
private val bn get() = _bn ?: throw NullPointerException("cannot inflate") private val bn get() = _bn ?: throw NullPointerException("cannot inflate")
private lateinit var adapter : ActionAdapter private lateinit var adapter : UssdAdapter
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
adapter = ActionAdapter(pref.language) adapter = UssdAdapter(pref.language)
mainViewModel = ViewModelProvider(requireActivity())[MainViewModel::class.java] mainViewModel = ViewModelProvider(requireActivity())[MainViewModel::class.java]
arguments?.let { arguments?.let {
val arg = it.getString(CONSTANTS.SERVICE) ?: "" val arg = it.getString(CONSTANTS.SERVICE) ?: ""
...@@ -40,7 +39,7 @@ class ActionFragment : BaseFragment(R.layout.fragment_action) { ...@@ -40,7 +39,7 @@ class ActionFragment : BaseFragment(R.layout.fragment_action) {
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_bn = FragmentActionBinding.bind(view) _bn = FragmentSendUssdBinding.bind(view)
setUpUI() setUpUI()
collects() collects()
......
...@@ -11,7 +11,7 @@ import com.mobiuz.app.dev.ui.global.ButtonClick ...@@ -11,7 +11,7 @@ import com.mobiuz.app.dev.ui.global.ButtonClick
import com.mobiuz.app.dev.utils.extensions.SingleBlock import com.mobiuz.app.dev.utils.extensions.SingleBlock
import com.mobiuz.app.dev.utils.extensions.getCurrentName import com.mobiuz.app.dev.utils.extensions.getCurrentName
class ServiceAdapter(val lang: String) : RecyclerView.Adapter<ServiceAdapter.VHolder>() { class ServicesAdapter(val lang: String) : RecyclerView.Adapter<ServicesAdapter.VHolder>() {
private val list: ArrayList<ServiceData> by lazy { ArrayList() } private val list: ArrayList<ServiceData> by lazy { ArrayList() }
private var listener: SingleBlock<ServiceData>? = null private var listener: SingleBlock<ServiceData>? = null
......
...@@ -10,32 +10,31 @@ import androidx.navigation.fragment.NavHostFragment ...@@ -10,32 +10,31 @@ import androidx.navigation.fragment.NavHostFragment
import com.google.gson.Gson import com.google.gson.Gson
import com.google.gson.reflect.TypeToken import com.google.gson.reflect.TypeToken
import com.mobiuz.app.R import com.mobiuz.app.R
import com.mobiuz.app.databinding.FragmentServiceBinding import com.mobiuz.app.databinding.FragmentServicesBinding
import com.mobiuz.app.dev.MainViewModel import com.mobiuz.app.dev.MainViewModel
import com.mobiuz.app.dev.model.ServiceData import com.mobiuz.app.dev.model.ServiceData
import com.mobiuz.app.dev.model.SharedPref import com.mobiuz.app.dev.model.SharedPref
import com.mobiuz.app.dev.ui.base.BaseFragment import com.mobiuz.app.dev.ui.base.BaseFragment
import com.mobiuz.app.dev.ui.global.CONSTANTS import com.mobiuz.app.dev.ui.global.CONSTANTS
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import me.everything.android.ui.overscroll.OverScrollDecoratorHelper
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint @AndroidEntryPoint
class ServiceFragment : BaseFragment(R.layout.fragment_service) { class ServicesFragment : BaseFragment(R.layout.fragment_services) {
@Inject @Inject
lateinit var pref: SharedPref lateinit var pref: SharedPref
private lateinit var mainViewModel: MainViewModel private lateinit var mainViewModel: MainViewModel
private var _bn: FragmentServiceBinding? = null private var _bn: FragmentServicesBinding? = null
private val bn get() = _bn ?: throw NullPointerException("cannot inflate") private val bn get() = _bn ?: throw NullPointerException("cannot inflate")
private lateinit var adapter: ServiceAdapter private lateinit var adapter: ServicesAdapter
private val navController: NavController by lazy(LazyThreadSafetyMode.NONE) { NavHostFragment.findNavController(this) } private val navController: NavController by lazy(LazyThreadSafetyMode.NONE) { NavHostFragment.findNavController(this) }
private var type = "" private var type = ""
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]
adapter = ServiceAdapter(pref.language) adapter = ServicesAdapter(pref.language)
arguments?.let { arguments?.let {
type = it.getString(CONSTANTS.TYPE_SERVICE) ?: "" type = it.getString(CONSTANTS.TYPE_SERVICE) ?: ""
...@@ -43,7 +42,7 @@ class ServiceFragment : BaseFragment(R.layout.fragment_service) { ...@@ -43,7 +42,7 @@ class ServiceFragment : BaseFragment(R.layout.fragment_service) {
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_bn = FragmentServiceBinding.bind(view) _bn = FragmentServicesBinding.bind(view)
setUpUI() setUpUI()
collects() collects()
......
...@@ -2,17 +2,16 @@ package com.mobiuz.app.dev.ui.service ...@@ -2,17 +2,16 @@ package com.mobiuz.app.dev.ui.service
import androidx.core.os.bundleOf import androidx.core.os.bundleOf
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import androidx.viewpager2.adapter.FragmentStateAdapter import androidx.viewpager2.adapter.FragmentStateAdapter
import com.google.gson.Gson import com.google.gson.Gson
import com.mobiuz.app.dev.model.ServiceData import com.mobiuz.app.dev.model.ServiceData
import com.mobiuz.app.dev.ui.global.CONSTANTS import com.mobiuz.app.dev.ui.global.CONSTANTS
class FragmentPagerAdapter(fragment: Fragment, private val service: ServiceData): FragmentStateAdapter(fragment) { class ServicesPagerAdapter(fragment: Fragment, private val service: ServiceData): FragmentStateAdapter(fragment) {
override fun getItemCount() = service.data.size override fun getItemCount() = service.data.size
override fun createFragment(position: Int): Fragment { override fun createFragment(position: Int): Fragment {
return ActionFragment().apply { return SendUssdFragment().apply {
this.arguments = bundleOf(CONSTANTS.SERVICE to Gson().toJson(service.data[position])) this.arguments = bundleOf(CONSTANTS.SERVICE to Gson().toJson(service.data[position]))
} }
} }
......
...@@ -11,7 +11,7 @@ import com.mobiuz.app.dev.ui.global.ButtonClick ...@@ -11,7 +11,7 @@ import com.mobiuz.app.dev.ui.global.ButtonClick
import com.mobiuz.app.dev.utils.extensions.SingleBlock import com.mobiuz.app.dev.utils.extensions.SingleBlock
import com.mobiuz.app.dev.utils.extensions.getCurrentName import com.mobiuz.app.dev.utils.extensions.getCurrentName
class ActionAdapter(val lang: String) : RecyclerView.Adapter<ActionAdapter.VHolder>() { class UssdAdapter(val lang: String) : RecyclerView.Adapter<UssdAdapter.VHolder>() {
private val list: ArrayList<UssdData> by lazy { ArrayList() } private val list: ArrayList<UssdData> by lazy { ArrayList() }
private var listener: SingleBlock<UssdData>? = null private var listener: SingleBlock<UssdData>? = null
......
package com.mobiuz.app.dev.ui.service package com.mobiuz.app.dev.ui.service
import android.Manifest import android.Manifest
import android.content.Context
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.telephony.PhoneStateListener
import android.telephony.TelephonyManager
import android.util.Log
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
...@@ -17,11 +13,9 @@ import com.mobiuz.app.databinding.BottomSheetUssdBinding ...@@ -17,11 +13,9 @@ import com.mobiuz.app.databinding.BottomSheetUssdBinding
import com.mobiuz.app.dev.model.SharedPref 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.checkPermission import com.mobiuz.app.dev.utils.extensions.checkPermission
import com.mobiuz.app.dev.utils.extensions.customLog import com.mobiuz.app.dev.utils.extensions.getCurrentName
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import dagger.hilt.android.qualifiers.ApplicationContext
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint @AndroidEntryPoint
...@@ -53,7 +47,7 @@ class UssdBottomSheetDialog(val data: UssdData) : BottomSheetDialogFragment() { ...@@ -53,7 +47,7 @@ class UssdBottomSheetDialog(val data: UssdData) : BottomSheetDialogFragment() {
txtDescription.text = dec txtDescription.text = dec
txtCode.text = this.code txtCode.text = this.code
} }
btnZapros.setOnClickListener(object : ButtonClick() { btnSent.setOnClickListener(object : ButtonClick() {
override fun onSingleClick(v: View?) { override fun onSingleClick(v: View?) {
pref.isShowPin = false pref.isShowPin = false
checkPermission(Manifest.permission.CALL_PHONE) { checkPermission(Manifest.permission.CALL_PHONE) {
...@@ -62,8 +56,8 @@ class UssdBottomSheetDialog(val data: UssdData) : BottomSheetDialogFragment() { ...@@ -62,8 +56,8 @@ class UssdBottomSheetDialog(val data: UssdData) : BottomSheetDialogFragment() {
pref.isShowPin = false pref.isShowPin = false
var ussd = "" var ussd = ""
data.code.forEach { data.code.forEach {
if(it == '#') ussd += Uri.encode("#") if (it == '#') ussd += Uri.encode("#")
else ussd+= it else ussd += it
} }
val intent = Intent(Intent.ACTION_CALL, Uri.parse("tel:$ussd")) val intent = Intent(Intent.ACTION_CALL, Uri.parse("tel:$ussd"))
startActivity(intent) startActivity(intent)
......
...@@ -27,7 +27,7 @@ class UssdFragment : BaseFragment(R.layout.fragment_ussd) { ...@@ -27,7 +27,7 @@ class UssdFragment : BaseFragment(R.layout.fragment_ussd) {
@Inject @Inject
lateinit var pref: SharedPref lateinit var pref: SharedPref
private var service: ServiceData? = null private var service: ServiceData? = null
private lateinit var adapter: FragmentPagerAdapter private lateinit var adapter: ServicesPagerAdapter
private val navController: NavController by lazy(LazyThreadSafetyMode.NONE) { NavHostFragment.findNavController(this) } private val navController: NavController by lazy(LazyThreadSafetyMode.NONE) { NavHostFragment.findNavController(this) }
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
...@@ -63,7 +63,7 @@ class UssdFragment : BaseFragment(R.layout.fragment_ussd) { ...@@ -63,7 +63,7 @@ class UssdFragment : BaseFragment(R.layout.fragment_ussd) {
tabLayout.tabMode = MODE_SCROLLABLE tabLayout.tabMode = MODE_SCROLLABLE
} }
adapter = FragmentPagerAdapter(this@UssdFragment, it) adapter = ServicesPagerAdapter(this@UssdFragment, it)
viewPager.adapter = adapter viewPager.adapter = adapter
TabLayoutMediator(bn.tabLayout, bn.viewPager) { tab, pos -> TabLayoutMediator(bn.tabLayout, bn.viewPager) { tab, pos ->
......
/*
* Copyright 2020, The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.mobiuz.app.dev.utils.extensions
import android.annotation.SuppressLint
import android.content.Intent
import android.util.SparseArray
import androidx.fragment.app.FragmentManager
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.navigation.NavController
import androidx.navigation.fragment.NavHostFragment
import com.google.android.material.bottomnavigation.BottomNavigationView
import com.mobiuz.app.R
import com.mobiuz.app.dev.utils.extensions.BackButtonBehaviour.SHOW_STARTING_FRAGMENT
/**
* Manages the various graphs needed for a [BottomNavigationView].
*
* This sample is a workaround until the Navigation Component supports multiple back stacks.
*
* Your navGraphIds must have the same ids as your menuItem ids
*/
fun BottomNavigationView.setupWithNavController(
fragmentManager: FragmentManager,
navGraphIds: List<Int>,
backButtonBehaviour: BackButtonBehaviour,
containerId: Int,
firstItemId: Int,
intent: Intent
): LiveData<NavController> {
// Map of tags
val graphIdToTagMap = SparseArray<String>()
// Result. Mutable live data with the selected controlled
val selectedNavController = MutableLiveData<NavController>()
// First create a NavHostFragment for each NavGraph ID
navGraphIds.forEachIndexed { index, navGraphId ->
val fragmentTag = getFragmentTag(index)
// Find or create the Navigation host fragment
val navHostFragment = obtainNavHostFragment(
fragmentManager,
fragmentTag,
navGraphId,
containerId
)
// Obtain its id
val graphId = navHostFragment.navController.graph.id
// Save to the map
graphIdToTagMap[graphId] = fragmentTag
// Attach or detach nav host fragment depending on whether it's the selected item.
if (this.selectedItemId == graphId) {
// Update livedata with the selected graph
selectedNavController.value = navHostFragment.navController
attachNavHostFragment(fragmentManager, navHostFragment, graphId == firstItemId)
} else {
detachNavHostFragment(fragmentManager, navHostFragment)
}
}
// Now connect selecting an item with swapping Fragments
var selectedItemTag = graphIdToTagMap[this.selectedItemId]
val firstFragmentTag = graphIdToTagMap[firstItemId]
var isOnFirstFragment = selectedItemTag == firstFragmentTag
// When a navigation item is selected
setOnNavigationItemSelectedListener { item ->
// Don't do anything if the state is state has already been saved.
if (fragmentManager.isStateSaved) {
false
} else {
val newlySelectedItemTag = graphIdToTagMap[item.itemId]
if (selectedItemTag != newlySelectedItemTag) {
// Pop everything above the first fragment (the "fixed start destination")
fragmentManager.popBackStack(
firstFragmentTag,
FragmentManager.POP_BACK_STACK_INCLUSIVE
)
val selectedFragment = fragmentManager.findFragmentByTag(newlySelectedItemTag)
as NavHostFragment
if (backButtonBehaviour == SHOW_STARTING_FRAGMENT) { // Back button goes to first
// Exclude the first fragment tag because it's always in the back stack.
if (firstFragmentTag != newlySelectedItemTag) {
// Commit a transaction that cleans the back stack and adds the first fragment
// to it, creating the fixed started destination.
commitTransactionWithFixedStart(
fragmentManager,
selectedFragment,
firstFragmentTag
)
}
} else { // Back button goes to previous 'main' graph destination
commitTransaction(fragmentManager, selectedFragment, selectedItemTag)
}
selectedItemTag = newlySelectedItemTag
isOnFirstFragment = selectedItemTag == firstFragmentTag
selectedNavController.value = selectedFragment.navController
true
} else {
false
}
}
}
// Optional: on item reselected, pop back stack to the destination of the graph
setupItemReselected(graphIdToTagMap, fragmentManager)
// Optional: handle deep links
setupDeepLinks(navGraphIds, fragmentManager, containerId, intent)
// Finally, ensure that we update our BottomNavigationView when the back stack changes
fragmentManager.addOnBackStackChangedListener {
if (!isOnFirstFragment && !fragmentManager.isOnBackStack(firstFragmentTag)) {
this.selectedItemId = firstItemId
}
// Reset the graph if the currentDestination is not valid (happens when the back
// stack is popped after using the back button).
selectedNavController.value?.let { controller ->
if (controller.currentDestination == null) {
controller.navigate(controller.graph.id)
}
}
}
return selectedNavController
}
private fun commitTransaction(
fragmentManager: FragmentManager,
selectedFragment: NavHostFragment,
selectedItemTag: String
) {
fragmentManager.beginTransaction()
.setCustomAnimations(
R.anim.nav_default_enter_anim,
R.anim.nav_default_exit_anim,
R.anim.nav_default_pop_enter_anim,
R.anim.nav_default_pop_exit_anim
)
.attach(selectedFragment)
.setPrimaryNavigationFragment(selectedFragment)
.detach(fragmentManager.findFragmentByTag(selectedItemTag)!!)
.setReorderingAllowed(true)
.commit()
}
private fun commitTransactionWithFixedStart(
fragmentManager: FragmentManager,
selectedFragment: NavHostFragment,
firstFragmentTag: String
) {
fragmentManager.beginTransaction()
.setCustomAnimations(
R.anim.nav_default_enter_anim,
R.anim.nav_default_exit_anim,
R.anim.nav_default_pop_enter_anim,
R.anim.nav_default_pop_exit_anim
)
.attach(selectedFragment)
.setPrimaryNavigationFragment(selectedFragment)
.detach(fragmentManager.findFragmentByTag(firstFragmentTag)!!)
.addToBackStack(firstFragmentTag)
.setReorderingAllowed(true)
.commit()
}
private fun BottomNavigationView.setupDeepLinks(
navGraphIds: List<Int>,
fragmentManager: FragmentManager,
containerId: Int,
intent: Intent
) {
navGraphIds.forEachIndexed { index, navGraphId ->
val fragmentTag = getFragmentTag(index)
// Find or create the Navigation host fragment
val navHostFragment = obtainNavHostFragment(
fragmentManager,
fragmentTag,
navGraphId,
containerId
)
// Handle Intent
if (navHostFragment.navController.handleDeepLink(intent)
&& selectedItemId != navHostFragment.navController.graph.id
) {
this.selectedItemId = navHostFragment.navController.graph.id
}
}
}
private fun BottomNavigationView.setupItemReselected(
graphIdToTagMap: SparseArray<String>,
fragmentManager: FragmentManager
) {
setOnNavigationItemReselectedListener { item ->
val newlySelectedItemTag = graphIdToTagMap[item.itemId]
val selectedFragment = fragmentManager.findFragmentByTag(newlySelectedItemTag)
as NavHostFragment
val navController = selectedFragment.navController
// Pop the back stack to the start destination of the current navController graph
navController.popBackStack(
navController.graph.startDestination, false
)
}
}
private fun detachNavHostFragment(
fragmentManager: FragmentManager,
navHostFragment: NavHostFragment
) {
fragmentManager.beginTransaction()
.detach(navHostFragment)
.commitNow()
}
private fun attachNavHostFragment(
fragmentManager: FragmentManager,
navHostFragment: NavHostFragment,
isPrimaryNavFragment: Boolean
) {
fragmentManager.beginTransaction()
.attach(navHostFragment)
.apply {
if (isPrimaryNavFragment) {
setPrimaryNavigationFragment(navHostFragment)
}
}
.commitNow()
}
private fun obtainNavHostFragment(
fragmentManager: FragmentManager,
fragmentTag: String,
navGraphId: Int,
containerId: Int
): NavHostFragment {
// If the Nav Host fragment exists, return it
val existingFragment = fragmentManager.findFragmentByTag(fragmentTag) as NavHostFragment?
existingFragment?.let { return it }
// Otherwise, create it and return it.
val navHostFragment = NavHostFragment.create(navGraphId)
fragmentManager.beginTransaction()
.add(containerId, navHostFragment, fragmentTag)
.commitNow()
return navHostFragment
}
private fun FragmentManager.isOnBackStack(backStackName: String): Boolean {
val backStackCount = backStackEntryCount
for (index in 0 until backStackCount) {
if (getBackStackEntryAt(index).name == backStackName) {
return true
}
}
return false
}
private fun getFragmentTag(index: Int) = "bottomNavigation#$index"
enum class BackButtonBehaviour {
SHOW_STARTING_FRAGMENT,
POP_HOST_FRAGMENT
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white100"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:fitsSystemWindows="false">
<androidx.fragment.app.FragmentContainerView
android:id="@+id/test_container"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/nav_graph_test"
tools:context=".dev.ui.auth.AuthActivity"/>
</LinearLayout>
\ No newline at end of file
...@@ -50,7 +50,7 @@ ...@@ -50,7 +50,7 @@
android:textSize="14sp" /> android:textSize="14sp" />
<Button <Button
android:id="@+id/btn_zapros" android:id="@+id/btn_sent"
style="@style/ButtonPrimary" style="@style/ButtonPrimary"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:fitsSystemWindows="true" android:fitsSystemWindows="true"
android:orientation="vertical" android:orientation="vertical"
tools:context=".dev.BillingFragment"> tools:context=".dev.ui.home.BillingFragment">
<com.google.android.material.appbar.MaterialToolbar <com.google.android.material.appbar.MaterialToolbar
......
...@@ -85,7 +85,7 @@ ...@@ -85,7 +85,7 @@
android:layout_weight="1.5"> android:layout_weight="1.5">
<Button <Button
android:id="@+id/btn_login" android:id="@+id/btn_check_phone"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
......
<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout 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:id="@+id/drawerLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="false"
tools:openDrawer="start">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white100"
android:orientation="vertical">
<androidx.fragment.app.FragmentContainerView
android:id="@+id/nav_host_fragment"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<Button
android:id="@+id/btn_try_again"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginVertical="4dp"
android:text="@string/to_offline"
android:visibility="gone" />
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_nav_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
app:elevation="4dp"
app:itemIconSize="24dp"
app:itemIconTint="@color/nav_item_tint"
app:itemTextColor="@color/nav_item_tint"
app:labelVisibilityMode="labeled"
app:menu="@menu/bottom_nav_menu" />
</LinearLayout>
<com.google.android.material.navigation.NavigationView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="@color/white100"
android:fitsSystemWindows="false">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:orientation="vertical"
android:layout_weight="1">
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:overScrollMode="never"
android:layout_weight="1">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include
android:id="@+id/header"
layout="@layout/layout_home_header"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginTop="@dimen/_4sdp"
android:background="@color/grey20" />
<LinearLayout
android:id="@+id/btn_safety"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="@dimen/_14sdp"
android:background="?android:selectableItemBackground"
android:orientation="horizontal"
android:paddingVertical="18dp"
android:paddingStart="30dp"
android:paddingEnd="13dp">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_safety" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_weight="1"
android:text="@string/bezopasnost"
android:textSize="16sp"
android:textStyle="bold" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/ic_baseline_keyboard_arrow_right" />
</LinearLayout>
<LinearLayout
android:id="@+id/btn_language"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="@dimen/_10sdp"
android:background="?android:selectableItemBackground"
android:orientation="horizontal"
android:paddingVertical="10dp"
android:paddingStart="30dp"
android:paddingEnd="13dp">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/ic_image_language" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:text="@string/language_app"
android:textSize="16sp"
android:textStyle="bold" />
<TextView
android:id="@+id/txt_language"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:text="Русский"
android:textColor="@color/grey80"
android:textSize="12sp" />
</LinearLayout>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/ic_baseline_keyboard_arrow_right" />
</LinearLayout>
<LinearLayout
android:id="@+id/btn_support"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="@dimen/_10sdp"
android:background="?android:selectableItemBackground"
android:orientation="horizontal"
android:paddingVertical="20dp"
android:paddingStart="30dp"
android:paddingEnd="10dp">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_image_support" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_weight="1"
android:text="@string/support"
android:textSize="16sp"
android:textStyle="bold" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/ic_baseline_keyboard_arrow_right" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginTop="@dimen/_14sdp"
android:background="@color/grey20" />
<TextView
android:id="@+id/txt_redact_data"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="32dp"
android:layout_marginTop="20dp"
android:background="?android:selectableItemBackground"
android:text="@string/oferta_finans"
android:textColor="@color/link"
android:textSize="14sp" />
<TextView
android:id="@+id/txt_public_oferta"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="32dp"
android:layout_marginBottom="20dp"
android:layout_marginTop="12dp"
android:background="?android:selectableItemBackground"
android:text="@string/public_oferta"
android:textColor="@color/link"
android:textSize="14sp" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>
</LinearLayout>
<LinearLayout
android:id="@+id/btn_exit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:background="?android:selectableItemBackground"
android:orientation="horizontal"
android:paddingVertical="16dp"
android:paddingStart="30dp"
android:paddingEnd="16dp">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/ic_log_out" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginStart="12dp"
android:layout_weight="1"
android:text="@string/exit"
android:textSize="17sp"
android:textStyle="bold" />
<TextView
android:id="@+id/txt_version"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
tools:text="0.01.1"
android:textColor="@color/grey80"
android:textSize="14sp" />
</LinearLayout>
</LinearLayout>
</com.google.android.material.navigation.NavigationView>
</androidx.drawerlayout.widget.DrawerLayout>
...@@ -144,7 +144,7 @@ ...@@ -144,7 +144,7 @@
app:layout_constraintTop_toBottomOf="@id/txt_check_confirm" /> app:layout_constraintTop_toBottomOf="@id/txt_check_confirm" />
<Button <Button
android:id="@+id/btn_login" android:id="@+id/btn_register"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="bottom" android:layout_gravity="bottom"
...@@ -168,6 +168,6 @@ ...@@ -168,6 +168,6 @@
android:textColor="@color/grey80" android:textColor="@color/grey80"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/btn_login" /> app:layout_constraintTop_toBottomOf="@id/btn_register" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
...@@ -172,12 +172,12 @@ ...@@ -172,12 +172,12 @@
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_chainStyle="packed" app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btn_login" /> app:layout_constraintTop_toBottomOf="@+id/btn_verification" />
<Button <Button
android:id="@+id/btn_login" android:id="@+id/btn_verification"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="bottom" android:layout_gravity="bottom"
......
...@@ -44,6 +44,7 @@ ...@@ -44,6 +44,7 @@
<com.google.android.material.card.MaterialCardView <com.google.android.material.card.MaterialCardView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:id="@+id/btn_see_more"
android:layout_marginTop="16dp" android:layout_marginTop="16dp"
app:cardCornerRadius="4dp"> app:cardCornerRadius="4dp">
......
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
<Button <Button
android:id="@+id/btn_zapros" android:id="@+id/btn_to_offline_activity"
style="@style/ButtonPrimary" style="@style/ButtonPrimary"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
android:textSize="14sp" /> android:textSize="14sp" />
<TextView <TextView
android:id="@+id/btn_otmena" android:id="@+id/btn_cancel"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
......
...@@ -34,8 +34,20 @@ ...@@ -34,8 +34,20 @@
tools:layout="@layout/fragment_biometric" /> tools:layout="@layout/fragment_biometric" />
<fragment <fragment
android:id="@+id/myVerificationFragment" android:id="@+id/verificationFragment"
android:name="com.mobiuz.app.dev.ui.auth.verification.VerificationFragment" android:name="com.mobiuz.app.dev.ui.auth.verification.VerificationFragment"
android:label="MyVerificationFragment" /> android:label="MyVerificationFragment" />
<fragment
android:id="@+id/mainFragment"
android:name="com.mobiuz.app.dev.MainFragment"
android:label="MainFragment" >
<deepLink
android:id="@+id/deepLink"
android:autoVerify="true"
app:uri="www.example.com/user/{userName}" />
<argument
android:name="userName"
app:argType="string" />
</fragment>
</navigation> </navigation>
\ No newline at end of file
...@@ -44,7 +44,7 @@ ...@@ -44,7 +44,7 @@
<fragment <fragment
android:id="@+id/billingFragment" android:id="@+id/billingFragment"
android:name="com.mobiuz.app.dev.BillingFragment" android:name="com.mobiuz.app.dev.ui.home.BillingFragment"
android:label="fragment_billing" android:label="fragment_billing"
tools:layout="@layout/fragment_billing" /> tools:layout="@layout/fragment_billing" />
......
...@@ -7,8 +7,8 @@ ...@@ -7,8 +7,8 @@
<fragment <fragment
android:id="@+id/serviceFragment" android:id="@+id/serviceFragment"
tools:layout="@layout/fragment_service" tools:layout="@layout/fragment_services"
android:name="com.mobiuz.app.dev.ui.service.ServiceFragment" android:name="com.mobiuz.app.dev.ui.service.ServicesFragment"
android:label="MotionFragment" /> android:label="MotionFragment" />
<fragment <fragment
android:id="@+id/ussdFragment" android:id="@+id/ussdFragment"
......
...@@ -13,8 +13,8 @@ ...@@ -13,8 +13,8 @@
<fragment <fragment
android:id="@+id/serviceFragment" android:id="@+id/serviceFragment"
tools:layout="@layout/fragment_service" tools:layout="@layout/fragment_services"
android:name="com.mobiuz.app.dev.ui.service.ServiceFragment" android:name="com.mobiuz.app.dev.ui.service.ServicesFragment"
android:label="MotionFragment" /> android:label="MotionFragment" />
<fragment <fragment
android:id="@+id/ussdFragment" android:id="@+id/ussdFragment"
......
<?xml version="1.0" encoding="utf-8"?>
<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"
android:id="@+id/nav_graph_test"
app:startDestination="@id/mainFragment2">
<fragment
android:id="@+id/mainFragment2"
android:name="com.mobiuz.app.dev.MainFragment"
android:label="MainFragment" />
<fragment
android:id="@+id/installPinFragment"
android:name="com.mobiuz.app.dev.ui.auth.pin.InstallPinFragment"
android:label="PinFragment"
tools:layout="@layout/fragment_install_pin" />
<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/securityFragment"
android:name="com.mobiuz.app.dev.ui.settings.security.SecurityFragment"
android:label="fragment_safety"
tools:layout="@layout/fragment_security" />
<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/changePasswordFragment"
android:name="com.mobiuz.app.dev.ui.settings.security.ChangePasswordFragment"
android:label="CurrentPasswordFragment" />
<fragment
android:id="@+id/billingFragment"
android:name="com.mobiuz.app.dev.ui.home.BillingFragment"
android:label="fragment_billing"
tools:layout="@layout/fragment_billing" />
<fragment
android:id="@+id/pinFragment"
tools:layout="@layout/fragment_pin"
android:name="com.mobiuz.app.dev.ui.global.PinFragment"
android:label="FullScreenFragment" />
</navigation>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment