Commit ae54b133 authored by shohboz's avatar shohboz

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

parent 0cad9a91
......@@ -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_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_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/button_selector.xml" value="0.33242753623188404" />
<entry key="app/src/main/res/layout/fragment_action.xml" value="0.25625" />
......
......@@ -24,7 +24,11 @@
android:theme="@style/Theme.MobiUzAndroid"
android:usesCleartextTraffic="true"
tools:targetApi="m">
<activity
android:name=".dev.TestActivity"
android:exported="true" >
</activity>
<activity
android:name=".dev.SplashActivity"
android:configChanges="orientation"
......@@ -37,7 +41,6 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".dev.LanguageActivity"
android:configChanges="orientation"
......@@ -63,12 +66,6 @@
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustResize" />
<activity
android:name=".dev.BillingFragment"
android:configChanges="orientation"
android:exported="false"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustResize" />
</application>
</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
import android.content.Intent
import android.content.IntentFilter
import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.core.os.bundleOf
import androidx.core.view.isVisible
......@@ -16,10 +15,9 @@ import com.mobiuz.app.databinding.ActivityOfflineBinding
import com.mobiuz.app.dev.model.SharedPref
import com.mobiuz.app.dev.ui.auth.AuthActivity
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.NetworkUtil
import com.mobiuz.app.dev.utils.extensions.customLog
import com.mobiuz.app.dev.utils.extensions.showMessage
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
......@@ -30,7 +28,7 @@ class OfflineActivity : AppCompatActivity() {
private var _bn: ActivityOfflineBinding? = null
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 receiver: BroadcastReceiver
private val intentFilter = IntentFilter()
......@@ -47,7 +45,7 @@ class OfflineActivity : AppCompatActivity() {
_bn = ActivityOfflineBinding.inflate(layoutInflater)
setContentView(bn.root)
adapter = ServiceAdapter(pref.language)
adapter = ServicesAdapter(pref.language)
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
import com.mobiuz.app.dev.utils.extensions.getMessage
import com.mobiuz.app.dev.utils.extensions.userMessage
import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import javax.inject.Inject
import javax.inject.Singleton
......@@ -23,13 +25,16 @@ class AuthRepository @Inject constructor(
suspend fun checkPhone(data: UserAuth): UiStateObject<Action> {
return try {
val res = apiService.checkPhone(data)
when {
res.status -> UiStateObject.SUCCESS(res.data ?: Action())
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message)
withContext(Dispatchers.IO){
val res = apiService.checkPhone(data)
withContext(Dispatchers.Main){
when {
res.status -> UiStateObject.SUCCESS(res.data ?: Action())
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message)
}
}
}
} catch (e: Exception) {
UiStateObject.ERROR(e.userMessage(context))
}
......@@ -37,11 +42,15 @@ class AuthRepository @Inject constructor(
suspend fun registerUser(data: UserAuth): UiStateObject<String> {
return try {
val res = apiService.register(data)
when {
res.status && res.data != null -> UiStateObject.SUCCESS(res.data!!)
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message)
withContext(Dispatchers.IO){
val res = apiService.register(data)
withContext(Dispatchers.Main){
when {
res.status && res.data != null -> UiStateObject.SUCCESS(res.data!!)
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message)
}
}
}
} catch (e: Exception) {
......@@ -51,16 +60,19 @@ class AuthRepository @Inject constructor(
suspend fun checkSMSCode(data: UserAuth): UiStateObject<String> {
return try {
val res = apiService.checkSMSCode(data)
when {
res.status -> {
pref.userToken = res.data?.token
pref.isRegistered = true
UiStateObject.SUCCESS(res.message)
withContext(Dispatchers.IO){
val res = apiService.checkSMSCode(data)
withContext(Dispatchers.Main){
when {
res.status -> {
pref.userToken = res.data?.token
pref.isRegistered = true
UiStateObject.SUCCESS(res.message)
}
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message)
}
}
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message)
}
} catch (e: Exception) {
UiStateObject.ERROR(e.userMessage(context))
......@@ -69,14 +81,17 @@ class AuthRepository @Inject constructor(
suspend fun loginUser(data: UserAuth): UiStateObject<String> {
return try {
val res = apiService.login(data)
when {
res.status -> {
UiStateObject.SUCCESS(res.data!!)
withContext(Dispatchers.IO){
val res = apiService.login(data)
withContext(Dispatchers.Main){
when {
res.status -> {
UiStateObject.SUCCESS(res.data!!)
}
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message)
}
}
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message)
}
} catch (e: Exception) {
UiStateObject.ERROR(e.userMessage(context))
......@@ -85,14 +100,17 @@ class AuthRepository @Inject constructor(
suspend fun checkResetCode(data: UserAuth): UiStateObject<String> {
return try {
val res = apiService.checkResetCode(data)
when {
res.status -> {
UiStateObject.SUCCESS(res.message)
withContext(Dispatchers.IO){
val res = apiService.checkResetCode(data)
withContext(Dispatchers.Main){
when {
res.status -> {
UiStateObject.SUCCESS(res.message)
}
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message)
}
}
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message)
}
} catch (e: Exception) {
UiStateObject.ERROR(e.userMessage(context))
......@@ -101,16 +119,19 @@ class AuthRepository @Inject constructor(
suspend fun resetPassword(data: UserAuth): UiStateObject<String> {
return try {
val res = apiService.resetPassword(data)
when {
res.status -> {
pref.isRegistered = true
pref.userToken = res.data?.token
UiStateObject.SUCCESS(res.message)
withContext(Dispatchers.IO){
val res = apiService.resetPassword(data)
withContext(Dispatchers.Main){
when {
res.status -> {
pref.isRegistered = true
pref.userToken = res.data?.token
UiStateObject.SUCCESS(res.message)
}
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message)
}
}
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message)
}
} catch (e: Exception) {
UiStateObject.ERROR(e.userMessage(context))
......@@ -119,14 +140,17 @@ class AuthRepository @Inject constructor(
suspend fun forgetPassword(data: UserAuth): UiStateObject<String> {
return try {
val res = apiService.forgetPassword(data)
when {
res.status -> {
UiStateObject.SUCCESS(res.data?:"")
withContext(Dispatchers.IO){
val res = apiService.forgetPassword(data)
withContext(Dispatchers.Main){
when {
res.status -> {
UiStateObject.SUCCESS(res.data?:"")
}
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message)
}
}
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message)
}
} catch (e: Exception) {
UiStateObject.ERROR(e.userMessage(context))
......@@ -135,13 +159,17 @@ class AuthRepository @Inject constructor(
suspend fun resetSmsCode(data: UserAuth): UiStateObject<String> {
return try {
val res = apiService.reSendSms(data)
when {
res.status -> {
UiStateObject.SUCCESS(res.data ?: "")
withContext(Dispatchers.IO){
val res = apiService.reSendSms(data)
withContext(Dispatchers.Main){
when {
res.status -> {
UiStateObject.SUCCESS(res.data ?: "")
}
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message)
}
}
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message)
}
} catch (e: Exception) {
UiStateObject.ERROR(e.userMessage(context))
......@@ -150,14 +178,17 @@ class AuthRepository @Inject constructor(
suspend fun checkPassword(data: UserAuth): UiStateObject<String> {
return try {
val res = apiService.checkPassword(data)
when {
res.status -> {
UiStateObject.SUCCESS(res.message)
withContext(Dispatchers.IO){
val res = apiService.checkPassword(data)
withContext(Dispatchers.Main){
when {
res.status -> {
UiStateObject.SUCCESS(res.message)
}
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage(),true)
else -> UiStateObject.ERROR(res.message,true)
}
}
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage(),true)
else -> UiStateObject.ERROR(res.message,true)
}
} catch (e: Exception) {
UiStateObject.ERROR(e.userMessage(context))
......@@ -166,14 +197,17 @@ class AuthRepository @Inject constructor(
suspend fun installPassword(data: ChangePassword): UiStateObject<String> {
return try {
val res = apiService.installPassword(data)
when {
res.status -> {
UiStateObject.SUCCESS(res.message)
withContext(Dispatchers.IO){
val res = apiService.installPassword(data)
withContext(Dispatchers.Main){
when {
res.status -> {
UiStateObject.SUCCESS(res.message)
}
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message)
}
}
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message)
}
} catch (e: Exception) {
UiStateObject.ERROR(e.userMessage(context))
......
......@@ -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.userMessage
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.Singleton
......@@ -23,47 +26,49 @@ class MainRepository @Inject constructor(
){
suspend fun mainIndex(): UiStateObject<Customer> {
return try {
val res = apiService.mainIndex()
when {
res.status && res.data != null -> {
UiStateObject.SUCCESS(res.data!!)
withContext(Dispatchers.IO){
val res = apiService.mainIndex()
withContext(Dispatchers.Main){
when {
res.status && res.data != null -> {
UiStateObject.SUCCESS(res.data!!)
}
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message)
}
}
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message)
}
} catch (e: Exception) {
UiStateObject.ERROR(e.userMessage(context))
}
}
suspend fun logOut(): UiStateObject<String> {
return try {
val res = apiService.logOut()
when {
res.status -> {
UiStateObject.SUCCESS(res.message)
}
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message)
suspend fun logOut() {
try {
withContext(Dispatchers.IO){
AGRBilling.deleteAllCards()
AGRBilling.deleteAllMonitoring()
apiService.logOut()
}
} catch (e: Exception) {
UiStateObject.ERROR(e.userMessage(context))
e.printStackTrace()
}
}
suspend fun services(): UiStateObject<String> {
return try {
val res = apiService.getServices()
when {
res.status -> {
pref.services = Gson().toJson(res.data)
UiStateObject.SUCCESS(res.message)
withContext(Dispatchers.IO){
val res = apiService.getServices()
withContext(Dispatchers.Main){
when {
res.status -> {
pref.services = Gson().toJson(res.data)
UiStateObject.SUCCESS(res.message)
}
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message)
}
}
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message)
}
} catch (e: Exception) {
UiStateObject.ERROR(e.userMessage(context))
......@@ -71,14 +76,17 @@ class MainRepository @Inject constructor(
}
suspend fun mainRoaming(): UiStateObject<Roaming> {
return try {
val res = apiService.mainRoaming()
when {
res.status -> {
UiStateObject.SUCCESS(res.data!!)
withContext(Dispatchers.IO){
val res = apiService.mainRoaming()
withContext(Dispatchers.Main){
when {
res.status -> {
UiStateObject.SUCCESS(res.data!!)
}
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message)
}
}
res.errors.isNotEmpty() -> UiStateObject.ERROR(res.errors.getMessage())
else -> UiStateObject.ERROR(res.message)
}
} catch (e: Exception) {
UiStateObject.ERROR(e.userMessage(context))
......
......@@ -79,7 +79,7 @@ class AuthActivity : AppCompatActivity() {
}
CONSTANTS.TYPE_VERIFICATION -> {
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) {
toolbar.setNavigationOnClickListener {
requireActivity().finish()
requireActivity().onBackPressed()
}
viewGroup.setOnClickListener(object : ButtonClick() {
......@@ -78,7 +78,7 @@ class CheckPhoneFragment : BaseFragment(R.layout.fragment_check_phone) {
inputPhone.setText(newText)
inputPhone.setSelection(oldText.checkChangedPosition(newText))
inputPhone.addTextChangedListener(this)
btnLogin.isEnabled = inputPhone.text.toString().trim().length == 12
btnCheckPhone.isEnabled = inputPhone.text.toString().trim().length == 12
}catch (e: Exception){
inputPhone.text.clear()
}
......@@ -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?) {
phone = "+998" + inputPhone.text.toString().trim().replace(" ","")
phoneRaw = "+998 " + inputPhone.text.toString().trim()
......
package com.mobiuz.app.dev.ui.auth.login
import android.content.Intent
import android.graphics.Color
import android.net.Uri
import android.os.Bundle
import android.text.Spannable
import android.text.SpannableString
import android.text.style.ForegroundColorSpan
import android.view.View
import androidx.core.os.bundleOf
import androidx.core.view.isVisible
import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavController
......@@ -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.extensions.checkInternet
import com.mobiuz.app.dev.utils.extensions.makeLinks
import com.mobiuz.app.dev.utils.extensions.showCustomDialog
import com.mobiuz.app.dev.utils.hideKeyboard
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.collect
......@@ -58,8 +52,7 @@ class LoginFragment : BaseFragment(R.layout.fragment_login) {
override fun setUpUI() {
bn.apply {
viewGroup.setOnClickListener(object : ButtonClick(){
viewGroup.setOnClickListener(object : ButtonClick() {
override fun onSingleClick(v: View?) {
bn.viewGroup.hideKeyboard()
}
......@@ -100,7 +93,7 @@ class LoginFragment : BaseFragment(R.layout.fragment_login) {
)
}
else -> {
if(checkInternet()){
if (checkInternet()) {
viewModel.login(UserAuth(phone.filter { it.isDigit() }, password))
}
......@@ -122,7 +115,11 @@ class LoginFragment : BaseFragment(R.layout.fragment_login) {
when (it) {
is UiStateObject.SUCCESS -> {
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 -> {
showProgressDialog(false)
......@@ -142,7 +139,7 @@ class LoginFragment : BaseFragment(R.layout.fragment_login) {
is UiStateObject.SUCCESS -> {
showProgressDialog(false)
navController.navigate(
R.id.myVerificationFragment,
R.id.verificationFragment,
bundleOf(
CONSTANTS.PHONE to phone,
CONSTANTS.TYPE_VERIFICATION to CONSTANTS.TYPE_FORGET,
......
......@@ -34,13 +34,13 @@ class InstallPinFragment : BaseFragment(R.layout.fragment_install_pin) {
private var _bn: FragmentInstallPinBinding? = null
private val bn get() = _bn ?: throw NullPointerException("cannot inflate")
private val navController: NavController by lazy(LazyThreadSafetyMode.NONE) { NavHostFragment.findNavController(this) }
private val data = ArrayList<PinData>()
private lateinit var biometricManager: BiometricManager
private val pinAdapter = InstallPinAdapter()
private var type = ""
private val data = ArrayList<PinData>()
private var titleText = ""
private var pinCode = ""
private var type = ""
private var count = 3
private lateinit var biometricManager: BiometricManager
override fun onCreate(savedInstanceState: Bundle?) {
......@@ -49,12 +49,12 @@ class InstallPinFragment : BaseFragment(R.layout.fragment_install_pin) {
type = it.getString(CONSTANTS.TYPE_PIN, "") ?: ""
pinCode = it.getString(CONSTANTS.PIN_CODE, "") ?: ""
}
biometricManager = BiometricManager.from(requireContext())
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_bn = FragmentInstallPinBinding.bind(view)
biometricManager = BiometricManager.from(requireContext())
setUpUI()
collects()
......@@ -106,7 +106,8 @@ class InstallPinFragment : BaseFragment(R.layout.fragment_install_pin) {
pinAdapter.setOnDoneListener {
when (type) {
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())
}
CONSTANTS.CONFIRM_NEW_PIN -> {
......@@ -121,7 +122,8 @@ class InstallPinFragment : BaseFragment(R.layout.fragment_install_pin) {
}
CONSTANTS.CURRENT_PIN -> {
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{
loadError()
}
......@@ -130,8 +132,9 @@ class InstallPinFragment : BaseFragment(R.layout.fragment_install_pin) {
if(pref.pinCode == it){
showMessage(getString(R.string.cannot_change_pin))
}else{
navController.navigate(R.id.installPinFragment, bundleOf(CONSTANTS.TYPE_PIN to CONSTANTS.CONFIRM_CHANGE_NEW_PIN, CONSTANTS.PIN_CODE to it), Utils
.navOptions())
navController.navigate(R.id.installPinFragment,
bundleOf(CONSTANTS.TYPE_PIN to CONSTANTS.CONFIRM_CHANGE_NEW_PIN, CONSTANTS.PIN_CODE to it),
Utils.navOptions())
}
}
CONSTANTS.CONFIRM_CHANGE_NEW_PIN -> {
......
......@@ -131,7 +131,7 @@ class RegisterFragment : BaseFragment(R.layout.fragment_register) {
})
btnLogin.setOnClickListener(object : ButtonClick() {
btnRegister.setOnClickListener(object : ButtonClick() {
override fun onSingleClick(v: View?) {
password = inputPassword.text.toString().trim()
confirmPassword = inputConfirm.text.toString().trim()
......@@ -157,7 +157,7 @@ class RegisterFragment : BaseFragment(R.layout.fragment_register) {
bn.apply {
password = inputPassword.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
if (password.isNotEmpty() && confirmPassword.isNotEmpty()){
if (password == confirmPassword){
......@@ -184,7 +184,7 @@ class RegisterFragment : BaseFragment(R.layout.fragment_register) {
is UiStateObject.SUCCESS -> {
showProgressDialog(false)
navController.navigate(
R.id.myVerificationFragment,
R.id.verificationFragment,
bundleOf(CONSTANTS.PHONE to phone, CONSTANTS.PIN_CODE to it.data),
Utils.navOptions()
)
......
......@@ -44,8 +44,8 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) {
private val bn get() = _bn ?: throw NullPointerException("cannot inflate")
private val viewModel: AuthViewModel by viewModels()
private val navController: NavController by lazy(LazyThreadSafetyMode.NONE) { NavHostFragment.findNavController(this) }
private var code = ""
private var verificationCode = ""
private var code = ""
private var phone = ""
......@@ -88,7 +88,7 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) {
setColorPins(getColorCompat(R.color.black100))
}
})
btnLogin.setOnClickListener(object : ButtonClick() {
btnVerification.setOnClickListener(object : ButtonClick() {
override fun onSingleClick(v: View?) {
getLinePinCodes()
val auth = UserAuth(phone.replace("+", "").replace(" ", ""), null, code)
......@@ -107,7 +107,7 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) {
coutdownView.setOnCountdownEndListener {
count(false)
}
setVerificationCode()
// setVerificationCode()
}
}
......@@ -121,7 +121,7 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) {
pin5.setText(verificationCode[4].toString())
pin6.setText(verificationCode[5].toString())
pin6.requestFocus()
btnLogin.isEnabled = true
btnVerification.isEnabled = true
}
}
}
......@@ -186,12 +186,12 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) {
if (s.toString().isNotEmpty()) {
if (i == pinView.childCount - 1) {
pin6.hideKeyboard()
btnLogin.isEnabled = true
btnVerification.isEnabled = true
} else pinView.getChildAt(i + 1).requestFocus()
this@apply.setBackgroundResource(R.drawable.bgn_ver_checked)
} else {
if (i == pinView.childCount - 1) {
btnLogin.isEnabled = false
btnVerification.isEnabled = false
}
this@apply.setBackgroundResource(R.drawable.bgn_ver_unchecked)
}
......@@ -239,9 +239,9 @@ class VerificationFragment : BaseFragment(R.layout.fragment_verification) {
viewModel.resetSmsCodeUiState.collect {
when (it) {
is UiStateObject.SUCCESS -> {
showToastMessage(it.data)
verificationCode = it.data
setVerificationCode()
// showToastMessage(it.data)
// verificationCode = it.data
// setVerificationCode()
count(true)
showProgressDialog(false)
}
......
......@@ -50,7 +50,9 @@ object CONSTANTS {
const val FROM_ONLINE = "FROM_ONLINE"
const val FULL_SCREEN_DIALOG = "full_screen_dialog"
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 FRAGMENT_ID = "FRAGMENT_ID"
//password types
......
......@@ -13,7 +13,7 @@ import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
@AndroidEntryPoint
class OfflineBottomSheet() : BottomSheetDialogFragment() {
class OfflineBottomSheet: BottomSheetDialogFragment() {
@Inject
lateinit var pref: SharedPref
......@@ -34,14 +34,14 @@ class OfflineBottomSheet() : BottomSheetDialogFragment() {
private fun setUpUI() {
bn.apply {
lng = pref.language
btnZapros.setOnClickListener(object : ButtonClick() {
btnToOfflineActivity.setOnClickListener(object : ButtonClick() {
override fun onSingleClick(v: View?) {
pref.isShowPin = false
navigate()
}
})
btnOtmena.setOnClickListener(object : ButtonClick() {
btnCancel.setOnClickListener(object : ButtonClick() {
override fun onSingleClick(v: View?) {
dismiss()
}
......
package com.mobiuz.app.dev
package com.mobiuz.app.dev.ui.home
import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.navigation.fragment.NavHostFragment
import com.mobiuz.app.R
import com.mobiuz.app.databinding.FragmentBillingBinding
import com.mobiuz.app.dev.model.SharedPref
import com.mobiuz.app.dev.ui.base.BaseFragment
import com.mobiuz.app.dev.utils.LocaleHelper
import com.mobiuz.app.dev.utils.extensions.showMessage
import dagger.hilt.android.AndroidEntryPoint
import uz.agr.mobiuz.AGRBilling
import uz.agr.sdk.coreui.extension.showMessage
import javax.inject.Inject
@AndroidEntryPoint
......
......@@ -3,6 +3,7 @@ package com.mobiuz.app.dev.ui.home
import android.annotation.SuppressLint
import android.content.Intent
import android.graphics.Color
import android.net.Uri
import android.os.Bundle
import android.view.View
import android.widget.FrameLayout
......@@ -17,16 +18,15 @@ import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.tabs.TabLayoutMediator
import com.mobiuz.app.R
import com.mobiuz.app.databinding.FragmentHomeBinding
import com.mobiuz.app.dev.BillingFragment
import com.mobiuz.app.dev.MainViewModel
import com.mobiuz.app.dev.model.SharedPref
import com.mobiuz.app.dev.network.model.Customer
import com.mobiuz.app.dev.network.model.UiStateObject
import com.mobiuz.app.dev.ui.base.BaseFragment
import com.mobiuz.app.dev.ui.global.CONSTANTS
import com.mobiuz.app.dev.utils.extensions.*
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.collect
import javax.inject.Inject
......@@ -77,6 +77,13 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) {
bn.apply {
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()
// lifecycleScope.launchWhenCreated {
......@@ -102,6 +109,7 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) {
btnAddSum.setOnClickListener {
pref.isShowPin = false
if(checkInternet()){
// requireActivity().sendBroadcast(Intent(CONSTANTS.INTENT_ACTION_NAVIGATE).putExtra(CONSTANTS.FRAGMENT_ID,R.id.billingFragment))
navController.navigate(R.id.billingFragment)
}
......@@ -212,10 +220,10 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) {
@SuppressLint("SetTextI18n")
private fun loadData() {
try {
// sliderAdapter.submitList(customer?.events ?: emptyList())
customer?.customer?.info?.let {
bn.apply {
// loadSum(it.balance?.amount?.toDouble(),it.balance?.currency)
txtBalance.text = "${it.balance?.amount?.toMoneyFormat()} ${it.balance?.currency}"
pref.userBirthday = customer?.customer?.date_of_birth ?: ""
it.counters?.let {
......@@ -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() {
super.onResume()
mainViewModel.bottomSheet(true)
......
......@@ -4,21 +4,23 @@ import android.graphics.Color
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView
import coil.load
import com.mobiuz.app.R
import com.mobiuz.app.databinding.ItemHomeBinding
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
class SliderAdapter : RecyclerView.Adapter<SliderAdapter.SliderViewHolder>() {
private var listener: SingleBlock<Events>? = null
private val sliderItems: ArrayList<Events> = ArrayList()
private var listener: SingleBlock<String>? = null
private val sliderItems: ArrayList<String> = ArrayList()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SliderViewHolder {
return SliderViewHolder(
ItemHomeBinding.inflate(LayoutInflater.from(parent.context),parent,false)
ItemHomeBinding.inflate(LayoutInflater.from(parent.context), parent, false)
)
}
......@@ -35,16 +37,22 @@ class SliderAdapter : RecyclerView.Adapter<SliderAdapter.SliderViewHolder>() {
txtDescription.setTextColor(Color.WHITE)
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
}
fun submitList(ls: List<Events>) {
fun submitList(ls: List<String>) {
sliderItems.clear()
sliderItems.addAll(ls)
notifyDataSetChanged()
......
......@@ -5,30 +5,29 @@ import android.view.View
import androidx.lifecycle.ViewModelProvider
import com.google.gson.Gson
import com.mobiuz.app.R
import com.mobiuz.app.databinding.FragmentActionBinding
import com.mobiuz.app.databinding.FragmentSendUssdBinding
import com.mobiuz.app.dev.MainViewModel
import com.mobiuz.app.dev.model.InnerData
import com.mobiuz.app.dev.model.SharedPref
import com.mobiuz.app.dev.ui.base.BaseFragment
import com.mobiuz.app.dev.ui.global.CONSTANTS
import dagger.hilt.android.AndroidEntryPoint
import me.everything.android.ui.overscroll.OverScrollDecoratorHelper
import javax.inject.Inject
@AndroidEntryPoint
class ActionFragment : BaseFragment(R.layout.fragment_action) {
class SendUssdFragment : BaseFragment(R.layout.fragment_send_ussd) {
@Inject
lateinit var pref: SharedPref
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 lateinit var adapter : ActionAdapter
private lateinit var adapter : UssdAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
adapter = ActionAdapter(pref.language)
adapter = UssdAdapter(pref.language)
mainViewModel = ViewModelProvider(requireActivity())[MainViewModel::class.java]
arguments?.let {
val arg = it.getString(CONSTANTS.SERVICE) ?: ""
......@@ -40,7 +39,7 @@ class ActionFragment : BaseFragment(R.layout.fragment_action) {
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_bn = FragmentActionBinding.bind(view)
_bn = FragmentSendUssdBinding.bind(view)
setUpUI()
collects()
......
......@@ -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.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 var listener: SingleBlock<ServiceData>? = null
......
......@@ -10,32 +10,31 @@ import androidx.navigation.fragment.NavHostFragment
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
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.model.ServiceData
import com.mobiuz.app.dev.model.SharedPref
import com.mobiuz.app.dev.ui.base.BaseFragment
import com.mobiuz.app.dev.ui.global.CONSTANTS
import dagger.hilt.android.AndroidEntryPoint
import me.everything.android.ui.overscroll.OverScrollDecoratorHelper
import javax.inject.Inject
@AndroidEntryPoint
class ServiceFragment : BaseFragment(R.layout.fragment_service) {
class ServicesFragment : BaseFragment(R.layout.fragment_services) {
@Inject
lateinit var pref: SharedPref
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 lateinit var adapter: ServiceAdapter
private lateinit var adapter: ServicesAdapter
private val navController: NavController by lazy(LazyThreadSafetyMode.NONE) { NavHostFragment.findNavController(this) }
private var type = ""
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mainViewModel = ViewModelProvider(requireActivity())[MainViewModel::class.java]
adapter = ServiceAdapter(pref.language)
adapter = ServicesAdapter(pref.language)
arguments?.let {
type = it.getString(CONSTANTS.TYPE_SERVICE) ?: ""
......@@ -43,7 +42,7 @@ class ServiceFragment : BaseFragment(R.layout.fragment_service) {
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_bn = FragmentServiceBinding.bind(view)
_bn = FragmentServicesBinding.bind(view)
setUpUI()
collects()
......
......@@ -2,17 +2,16 @@ package com.mobiuz.app.dev.ui.service
import androidx.core.os.bundleOf
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import androidx.viewpager2.adapter.FragmentStateAdapter
import com.google.gson.Gson
import com.mobiuz.app.dev.model.ServiceData
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 createFragment(position: Int): Fragment {
return ActionFragment().apply {
return SendUssdFragment().apply {
this.arguments = bundleOf(CONSTANTS.SERVICE to Gson().toJson(service.data[position]))
}
}
......
......@@ -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.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 var listener: SingleBlock<UssdData>? = null
......
package com.mobiuz.app.dev.ui.service
import android.Manifest
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.telephony.PhoneStateListener
import android.telephony.TelephonyManager
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
......@@ -17,11 +13,9 @@ import com.mobiuz.app.databinding.BottomSheetUssdBinding
import com.mobiuz.app.dev.model.SharedPref
import com.mobiuz.app.dev.model.UssdData
import com.mobiuz.app.dev.ui.global.ButtonClick
import com.mobiuz.app.dev.utils.extensions.getCurrentName
import com.mobiuz.app.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.qualifiers.ApplicationContext
import javax.inject.Inject
@AndroidEntryPoint
......@@ -53,7 +47,7 @@ class UssdBottomSheetDialog(val data: UssdData) : BottomSheetDialogFragment() {
txtDescription.text = dec
txtCode.text = this.code
}
btnZapros.setOnClickListener(object : ButtonClick() {
btnSent.setOnClickListener(object : ButtonClick() {
override fun onSingleClick(v: View?) {
pref.isShowPin = false
checkPermission(Manifest.permission.CALL_PHONE) {
......@@ -62,8 +56,8 @@ class UssdBottomSheetDialog(val data: UssdData) : BottomSheetDialogFragment() {
pref.isShowPin = false
var ussd = ""
data.code.forEach {
if(it == '#') ussd += Uri.encode("#")
else ussd+= it
if (it == '#') ussd += Uri.encode("#")
else ussd += it
}
val intent = Intent(Intent.ACTION_CALL, Uri.parse("tel:$ussd"))
startActivity(intent)
......
......@@ -27,7 +27,7 @@ class UssdFragment : BaseFragment(R.layout.fragment_ussd) {
@Inject
lateinit var pref: SharedPref
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) }
override fun onCreate(savedInstanceState: Bundle?) {
......@@ -63,7 +63,7 @@ class UssdFragment : BaseFragment(R.layout.fragment_ussd) {
tabLayout.tabMode = MODE_SCROLLABLE
}
adapter = FragmentPagerAdapter(this@UssdFragment, it)
adapter = ServicesPagerAdapter(this@UssdFragment, it)
viewPager.adapter = adapter
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 @@
android:textSize="14sp" />
<Button
android:id="@+id/btn_zapros"
android:id="@+id/btn_sent"
style="@style/ButtonPrimary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
......
......@@ -6,7 +6,7 @@
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:orientation="vertical"
tools:context=".dev.BillingFragment">
tools:context=".dev.ui.home.BillingFragment">
<com.google.android.material.appbar.MaterialToolbar
......
......@@ -85,7 +85,7 @@
android:layout_weight="1.5">
<Button
android:id="@+id/btn_login"
android:id="@+id/btn_check_phone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
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 @@
app:layout_constraintTop_toBottomOf="@id/txt_check_confirm" />
<Button
android:id="@+id/btn_login"
android:id="@+id/btn_register"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
......@@ -168,6 +168,6 @@
android:textColor="@color/grey80"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/btn_login" />
app:layout_constraintTop_toBottomOf="@id/btn_register" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
......@@ -172,12 +172,12 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btn_login" />
app:layout_constraintTop_toBottomOf="@+id/btn_verification" />
<Button
android:id="@+id/btn_login"
android:id="@+id/btn_verification"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
......
......@@ -44,6 +44,7 @@
<com.google.android.material.card.MaterialCardView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn_see_more"
android:layout_marginTop="16dp"
app:cardCornerRadius="4dp">
......
......@@ -26,7 +26,7 @@
<Button
android:id="@+id/btn_zapros"
android:id="@+id/btn_to_offline_activity"
style="@style/ButtonPrimary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
......@@ -37,7 +37,7 @@
android:textSize="14sp" />
<TextView
android:id="@+id/btn_otmena"
android:id="@+id/btn_cancel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
......
......@@ -34,8 +34,20 @@
tools:layout="@layout/fragment_biometric" />
<fragment
android:id="@+id/myVerificationFragment"
android:id="@+id/verificationFragment"
android:name="com.mobiuz.app.dev.ui.auth.verification.VerificationFragment"
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>
\ No newline at end of file
......@@ -44,7 +44,7 @@
<fragment
android:id="@+id/billingFragment"
android:name="com.mobiuz.app.dev.BillingFragment"
android:name="com.mobiuz.app.dev.ui.home.BillingFragment"
android:label="fragment_billing"
tools:layout="@layout/fragment_billing" />
......
......@@ -7,8 +7,8 @@
<fragment
android:id="@+id/serviceFragment"
tools:layout="@layout/fragment_service"
android:name="com.mobiuz.app.dev.ui.service.ServiceFragment"
tools:layout="@layout/fragment_services"
android:name="com.mobiuz.app.dev.ui.service.ServicesFragment"
android:label="MotionFragment" />
<fragment
android:id="@+id/ussdFragment"
......
......@@ -13,8 +13,8 @@
<fragment
android:id="@+id/serviceFragment"
tools:layout="@layout/fragment_service"
android:name="com.mobiuz.app.dev.ui.service.ServiceFragment"
tools:layout="@layout/fragment_services"
android:name="com.mobiuz.app.dev.ui.service.ServicesFragment"
android:label="MotionFragment" />
<fragment
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