Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
S
shunchaki
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
JIRA
JIRA
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Shohboz Qoraboev
shunchaki
Commits
be371d26
Commit
be371d26
authored
Dec 24, 2021
by
shohboz
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[UPD]
MUS-278
Feature, updated biometric check and add roaming and other changes
parent
df4b3022
Changes
36
Hide whitespace changes
Inline
Side-by-side
Showing
36 changed files
with
514 additions
and
146 deletions
+514
-146
build.gradle
app/build.gradle
+8
-1
MainActivity.kt
app/src/main/java/com/mobiuz/app/dev/MainActivity.kt
+11
-3
SplashActivity.kt
app/src/main/java/com/mobiuz/app/dev/SplashActivity.kt
+9
-0
ApiService.kt
...rc/main/java/com/mobiuz/app/dev/network/api/ApiService.kt
+3
-0
Customer.kt
...rc/main/java/com/mobiuz/app/dev/network/model/Customer.kt
+3
-1
Roaming.kt
...src/main/java/com/mobiuz/app/dev/network/model/Roaming.kt
+5
-0
MainRepository.kt
...a/com/mobiuz/app/dev/network/repository/MainRepository.kt
+17
-0
CheckPhoneFragment.kt
...va/com/mobiuz/app/dev/ui/auth/check/CheckPhoneFragment.kt
+31
-8
LoginFragment.kt
...in/java/com/mobiuz/app/dev/ui/auth/login/LoginFragment.kt
+1
-1
PinFragment.kt
...c/main/java/com/mobiuz/app/dev/ui/auth/pin/PinFragment.kt
+15
-2
RegisterFragment.kt
...a/com/mobiuz/app/dev/ui/auth/register/RegisterFragment.kt
+15
-2
CONSTANTS.kt
app/src/main/java/com/mobiuz/app/dev/ui/global/CONSTANTS.kt
+16
-6
FullScreenFragment.kt
...n/java/com/mobiuz/app/dev/ui/global/FullScreenFragment.kt
+1
-26
HomeFragment.kt
app/src/main/java/com/mobiuz/app/dev/ui/home/HomeFragment.kt
+49
-20
HomeViewModel.kt
...src/main/java/com/mobiuz/app/dev/ui/home/HomeViewModel.kt
+9
-0
SliderAdapter.kt
...src/main/java/com/mobiuz/app/dev/ui/home/SliderAdapter.kt
+1
-1
StatusBarSpacer.kt
...c/main/java/com/mobiuz/app/dev/ui/home/StatusBarSpacer.kt
+13
-0
SafetyFragment.kt
...a/com/mobiuz/app/dev/ui/settings/safety/SafetyFragment.kt
+93
-10
StringExtension.kt
...va/com/mobiuz/app/dev/utils/extensions/StringExtension.kt
+41
-0
activity_main.xml
app/src/main/res/layout/activity_main.xml
+1
-2
fragment_change_password.xml
app/src/main/res/layout/fragment_change_password.xml
+4
-4
fragment_check_phone.xml
app/src/main/res/layout/fragment_check_phone.xml
+29
-12
fragment_home.xml
app/src/main/res/layout/fragment_home.xml
+77
-28
fragment_language.xml
app/src/main/res/layout/fragment_language.xml
+6
-1
fragment_login.xml
app/src/main/res/layout/fragment_login.xml
+1
-1
fragment_pin.xml
app/src/main/res/layout/fragment_pin.xml
+5
-4
fragment_profile.xml
app/src/main/res/layout/fragment_profile.xml
+7
-1
fragment_safety.xml
app/src/main/res/layout/fragment_safety.xml
+8
-2
fragment_service.xml
app/src/main/res/layout/fragment_service.xml
+6
-1
fragment_support.xml
app/src/main/res/layout/fragment_support.xml
+6
-1
fragment_ussd.xml
app/src/main/res/layout/fragment_ussd.xml
+6
-1
item_home.xml
app/src/main/res/layout/item_home.xml
+11
-6
strings.xml
app/src/main/res/values-en/strings.xml
+1
-0
strings.xml
app/src/main/res/values-ru/strings.xml
+1
-0
strings.xml
app/src/main/res/values-uz/strings.xml
+1
-0
strings.xml
app/src/main/res/values/strings.xml
+3
-1
No files found.
app/build.gradle
View file @
be371d26
...
@@ -66,7 +66,14 @@ dependencies {
...
@@ -66,7 +66,14 @@ dependencies {
// Firebase
// Firebase
implementation
'com.google.firebase:firebase-core:20.0.1'
implementation
'com.google.firebase:firebase-core:20.0.2'
// Import the BoM for the Firebase platform
implementation
platform
(
'com.google.firebase:firebase-bom:29.0.3'
)
// Declare the dependencies for the Crashlytics and Analytics libraries
// When using the BoM, you don't specify versions in Firebase library dependencies
implementation
'com.google.firebase:firebase-crashlytics-ktx'
implementation
'com.google.firebase:firebase-analytics-ktx'
// Navigation
// Navigation
implementation
"androidx.navigation:navigation-fragment-ktx:$nav_version"
implementation
"androidx.navigation:navigation-fragment-ktx:$nav_version"
...
...
app/src/main/java/com/mobiuz/app/dev/MainActivity.kt
View file @
be371d26
...
@@ -79,6 +79,7 @@ class MainActivity : AppCompatActivity() {
...
@@ -79,6 +79,7 @@ class MainActivity : AppCompatActivity() {
AppCompatDelegate
.
setDefaultNightMode
(
AppCompatDelegate
.
MODE_NIGHT_NO
)
AppCompatDelegate
.
setDefaultNightMode
(
AppCompatDelegate
.
MODE_NIGHT_NO
)
FirebaseApp
.
initializeApp
(
this
@MainActivity
)
FirebaseApp
.
initializeApp
(
this
@MainActivity
)
// throw java.lang.NullPointerException("cannot")
mFirebaseAnalytics
=
FirebaseAnalytics
.
getInstance
(
this
@MainActivity
)
mFirebaseAnalytics
=
FirebaseAnalytics
.
getInstance
(
this
@MainActivity
)
FirebaseMessaging
.
getInstance
().
token
.
addOnCompleteListener
{
FirebaseMessaging
.
getInstance
().
token
.
addOnCompleteListener
{
...
@@ -165,11 +166,19 @@ class MainActivity : AppCompatActivity() {
...
@@ -165,11 +166,19 @@ class MainActivity : AppCompatActivity() {
}
}
})
})
txtRedactData
.
setOnClickListener
{
txtRedactData
.
setOnClickListener
{
navigateUri
(
CONSTANTS
.
MAIN_URL1
)
navigateUri
(
when
(
pref
.
language
){
CONSTANTS
.
UZ
->
CONSTANTS
.
LICENSE_UZ
CONSTANTS
.
RU
->
CONSTANTS
.
LICENSE_RU
else
->
CONSTANTS
.
LICENSE_EN
})
}
}
txtPublicOferta
.
setOnClickListener
{
txtPublicOferta
.
setOnClickListener
{
navigateUri
(
CONSTANTS
.
MAIN_URL2
)
navigateUri
(
when
(
pref
.
language
){
CONSTANTS
.
UZ
->
CONSTANTS
.
PRIVACY_POLICY_UZ
CONSTANTS
.
RU
->
CONSTANTS
.
PRIVACY_POLICY_RU
else
->
CONSTANTS
.
PRIVACY_POLICY_EN
})
}
}
}
}
}
}
...
@@ -306,7 +315,6 @@ class MainActivity : AppCompatActivity() {
...
@@ -306,7 +315,6 @@ class MainActivity : AppCompatActivity() {
override
fun
onDestroy
()
{
override
fun
onDestroy
()
{
_bn
=
null
_bn
=
null
unregisterReceiver
(
receiver
)
unregisterReceiver
(
receiver
)
pref
.
blockedTime
=
0
super
.
onDestroy
()
super
.
onDestroy
()
}
}
}
}
\ No newline at end of file
app/src/main/java/com/mobiuz/app/dev/SplashActivity.kt
View file @
be371d26
...
@@ -5,8 +5,11 @@ import android.content.BroadcastReceiver
...
@@ -5,8 +5,11 @@ import android.content.BroadcastReceiver
import
android.content.Context
import
android.content.Context
import
android.content.Intent
import
android.content.Intent
import
android.content.IntentFilter
import
android.content.IntentFilter
import
android.graphics.Rect
import
android.os.Bundle
import
android.os.Bundle
import
android.util.Log
import
android.view.View
import
android.view.View
import
android.view.Window
import
androidx.activity.viewModels
import
androidx.activity.viewModels
import
androidx.appcompat.app.AppCompatActivity
import
androidx.appcompat.app.AppCompatActivity
import
androidx.appcompat.app.AppCompatDelegate
import
androidx.appcompat.app.AppCompatDelegate
...
@@ -20,10 +23,12 @@ import com.mobiuz.app.dev.ui.auth.AuthActivity
...
@@ -20,10 +23,12 @@ import com.mobiuz.app.dev.ui.auth.AuthActivity
import
com.mobiuz.app.dev.ui.global.ButtonClick
import
com.mobiuz.app.dev.ui.global.ButtonClick
import
com.mobiuz.app.dev.ui.global.CONSTANTS
import
com.mobiuz.app.dev.ui.global.CONSTANTS
import
com.mobiuz.app.dev.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
kotlinx.coroutines.delay
import
kotlinx.coroutines.delay
import
kotlinx.coroutines.flow.collect
import
kotlinx.coroutines.flow.collect
import
java.lang.RuntimeException
import
javax.inject.Inject
import
javax.inject.Inject
@SuppressLint
(
"CustomSplashScreen"
)
@SuppressLint
(
"CustomSplashScreen"
)
...
@@ -44,6 +49,8 @@ class SplashActivity : AppCompatActivity() {
...
@@ -44,6 +49,8 @@ class SplashActivity : AppCompatActivity() {
setContentView
(
bn
.
root
)
setContentView
(
bn
.
root
)
AppCompatDelegate
.
setDefaultNightMode
(
AppCompatDelegate
.
MODE_NIGHT_NO
)
AppCompatDelegate
.
setDefaultNightMode
(
AppCompatDelegate
.
MODE_NIGHT_NO
)
// customLog("rect.top: ${getStatusBarHeight() / resources.displayMetrics.density}")
receiver
=
object
:
BroadcastReceiver
()
{
receiver
=
object
:
BroadcastReceiver
()
{
override
fun
onReceive
(
context
:
Context
?,
intent
:
Intent
?)
{
override
fun
onReceive
(
context
:
Context
?,
intent
:
Intent
?)
{
val
type
=
NetworkUtil
.
getConnectivityStatus
(
this
@SplashActivity
)
val
type
=
NetworkUtil
.
getConnectivityStatus
(
this
@SplashActivity
)
...
@@ -96,6 +103,8 @@ class SplashActivity : AppCompatActivity() {
...
@@ -96,6 +103,8 @@ class SplashActivity : AppCompatActivity() {
}
}
fun
navigate
()
{
fun
navigate
()
{
when
{
when
{
pref
.
language
.
isEmpty
()
->
{
pref
.
language
.
isEmpty
()
->
{
...
...
app/src/main/java/com/mobiuz/app/dev/network/api/ApiService.kt
View file @
be371d26
...
@@ -69,5 +69,8 @@ interface ApiService {
...
@@ -69,5 +69,8 @@ interface ApiService {
@POST
(
CONSTANTS
.
API_SERVICE_INDEX
)
@POST
(
CONSTANTS
.
API_SERVICE_INDEX
)
suspend
fun
getServices
():
ResponseList
<
ServiceData
>
suspend
fun
getServices
():
ResponseList
<
ServiceData
>
@POST
(
CONSTANTS
.
API_MAIN_ROAMING
)
suspend
fun
mainRoaming
():
ResponseObject
<
Roaming
>
}
}
\ No newline at end of file
app/src/main/java/com/mobiuz/app/dev/network/model/Customer.kt
View file @
be371d26
...
@@ -13,7 +13,9 @@ data class CustomerData(
...
@@ -13,7 +13,9 @@ data class CustomerData(
data class
TarifCodeName
(
data class
TarifCodeName
(
var
code
:
String
,
var
code
:
String
,
var
name
:
Any
var
name
:
String
,
var
total_price
:
Int
,
var
next_tariffication_date
:
String
)
)
data class
CustomerInfo
(
data class
CustomerInfo
(
...
...
app/src/main/java/com/mobiuz/app/dev/network/model/Roaming.kt
0 → 100644
View file @
be371d26
package
com.mobiuz.app.dev.network.model
data class
Roaming
(
val
name
:
String
?
)
app/src/main/java/com/mobiuz/app/dev/network/repository/MainRepository.kt
View file @
be371d26
...
@@ -7,6 +7,7 @@ import com.mobiuz.app.dev.model.UserAuth
...
@@ -7,6 +7,7 @@ import com.mobiuz.app.dev.model.UserAuth
import
com.mobiuz.app.dev.network.api.ApiService
import
com.mobiuz.app.dev.network.api.ApiService
import
com.mobiuz.app.dev.network.model.ChangePassword
import
com.mobiuz.app.dev.network.model.ChangePassword
import
com.mobiuz.app.dev.network.model.Customer
import
com.mobiuz.app.dev.network.model.Customer
import
com.mobiuz.app.dev.network.model.Roaming
import
com.mobiuz.app.dev.network.model.UiStateObject
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
...
@@ -68,6 +69,22 @@ class MainRepository @Inject constructor(
...
@@ -68,6 +69,22 @@ class MainRepository @Inject constructor(
UiStateObject
.
ERROR
(
e
.
userMessage
(
context
))
UiStateObject
.
ERROR
(
e
.
userMessage
(
context
))
}
}
}
}
suspend
fun
mainRoaming
():
UiStateObject
<
Roaming
>
{
return
try
{
val
res
=
apiService
.
mainRoaming
()
when
{
res
.
status
->
{
UiStateObject
.
SUCCESS
(
res
.
data
!!
)
}
res
.
errors
.
isNotEmpty
()
->
UiStateObject
.
ERROR
(
res
.
errors
.
getMessage
())
else
->
UiStateObject
.
ERROR
(
res
.
message
)
}
}
catch
(
e
:
Exception
)
{
UiStateObject
.
ERROR
(
e
.
userMessage
(
context
))
}
}
}
}
\ No newline at end of file
app/src/main/java/com/mobiuz/app/dev/ui/auth/check/CheckPhoneFragment.kt
View file @
be371d26
package
com.mobiuz.app.dev.ui.auth.check
package
com.mobiuz.app.dev.ui.auth.check
import
android.os.Bundle
import
android.os.Bundle
import
android.telephony.PhoneNumberFormattingTextWatcher
import
android.text.Editable
import
android.view.View
import
android.view.View
import
android.view.animation.AnimationUtils
import
android.view.animation.AnimationUtils
import
androidx.core.os.bundleOf
import
androidx.core.os.bundleOf
...
@@ -19,7 +21,9 @@ import com.mobiuz.app.dev.ui.global.ButtonClick
...
@@ -19,7 +21,9 @@ import com.mobiuz.app.dev.ui.global.ButtonClick
import
com.mobiuz.app.dev.ui.global.CONSTANTS
import
com.mobiuz.app.dev.ui.global.CONSTANTS
import
com.mobiuz.app.dev.ui.global.TextWatcherWrapper
import
com.mobiuz.app.dev.ui.global.TextWatcherWrapper
import
com.mobiuz.app.dev.utils.Utils
import
com.mobiuz.app.dev.utils.Utils
import
com.mobiuz.app.dev.utils.extensions.checkChangedPosition
import
com.mobiuz.app.dev.utils.extensions.customLog
import
com.mobiuz.app.dev.utils.extensions.customLog
import
com.mobiuz.app.dev.utils.extensions.maskedTextMobi
import
com.mobiuz.app.dev.utils.extensions.showCustomDialog
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
...
@@ -32,6 +36,8 @@ class CheckPhoneFragment : BaseFragment(R.layout.fragment_check_phone) {
...
@@ -32,6 +36,8 @@ class CheckPhoneFragment : BaseFragment(R.layout.fragment_check_phone) {
private
val
bn
get
()
=
_bn
?:
throw
NullPointerException
(
"cannot inflate"
)
private
val
bn
get
()
=
_bn
?:
throw
NullPointerException
(
"cannot inflate"
)
private
val
navController
:
NavController
by
lazy
(
LazyThreadSafetyMode
.
NONE
)
{
NavHostFragment
.
findNavController
(
this
)
}
private
val
navController
:
NavController
by
lazy
(
LazyThreadSafetyMode
.
NONE
)
{
NavHostFragment
.
findNavController
(
this
)
}
var
phone
=
""
var
phone
=
""
var
oldText
=
""
var
newText
=
""
var
phoneRaw
=
""
var
phoneRaw
=
""
private
val
viewModel
:
AuthViewModel
by
viewModels
()
private
val
viewModel
:
AuthViewModel
by
viewModels
()
...
@@ -47,24 +53,41 @@ class CheckPhoneFragment : BaseFragment(R.layout.fragment_check_phone) {
...
@@ -47,24 +53,41 @@ class CheckPhoneFragment : BaseFragment(R.layout.fragment_check_phone) {
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
()
}
}
})
})
inputPhone
.
addTextChangedListener
(
object
:
TextWatcherWrapper
()
{
inputPhone
.
addTextChangedListener
(
object
:
TextWatcherWrapper
()
{
override
fun
beforeTextChanged
(
s
:
CharSequence
?,
start
:
Int
,
count
:
Int
,
after
:
Int
)
{
super
.
beforeTextChanged
(
s
,
start
,
count
,
after
)
oldText
=
s
.
toString
()
}
override
fun
onTextChanged
(
s
:
CharSequence
?,
start
:
Int
,
before
:
Int
,
count
:
Int
)
{
override
fun
onTextChanged
(
s
:
CharSequence
?,
start
:
Int
,
before
:
Int
,
count
:
Int
)
{
super
.
onTextChanged
(
s
,
start
,
before
,
count
)
super
.
onTextChanged
(
s
,
start
,
before
,
count
)
customLog
(
"s=${s?.toString()?.length}"
)
try
{
btnLogin
.
isEnabled
=
inputPhone
.
text
.
toString
().
trim
().
length
==
17
inputPhone
.
removeTextChangedListener
(
this
)
newText
=
s
.
toString
().
replace
(
" "
,
""
).
maskedTextMobi
()
inputPhone
.
setText
(
newText
)
inputPhone
.
setSelection
(
oldText
.
checkChangedPosition
(
newText
))
inputPhone
.
addTextChangedListener
(
this
)
btnLogin
.
isEnabled
=
inputPhone
.
text
.
toString
().
trim
().
length
==
12
}
catch
(
e
:
Exception
){
inputPhone
.
text
.
clear
()
}
}
}
})
})
btnLogin
.
setOnClickListener
(
object
:
ButtonClick
()
{
btnLogin
.
setOnClickListener
(
object
:
ButtonClick
()
{
override
fun
onSingleClick
(
v
:
View
?)
{
override
fun
onSingleClick
(
v
:
View
?)
{
phone
=
"+998"
+
inputPhone
.
unmaskedText
.
toString
().
trim
(
)
phone
=
"+998"
+
inputPhone
.
text
.
toString
().
trim
().
replace
(
" "
,
""
)
phoneRaw
=
inputPhone
.
text
.
toString
().
trim
()
phoneRaw
=
"+998 "
+
inputPhone
.
text
.
toString
().
trim
()
when
{
when
{
phone
.
length
<
13
->
{
phone
.
length
<
13
->
{
inputPhone
.
startAnimation
(
AnimationUtils
.
loadAnimation
(
requireContext
(),
R
.
anim
.
shake
))
inputPhone
.
startAnimation
(
AnimationUtils
.
loadAnimation
(
requireContext
(),
R
.
anim
.
shake
))
...
@@ -86,10 +109,10 @@ class CheckPhoneFragment : BaseFragment(R.layout.fragment_check_phone) {
...
@@ -86,10 +109,10 @@ class CheckPhoneFragment : BaseFragment(R.layout.fragment_check_phone) {
when
(
it
)
{
when
(
it
)
{
is
UiStateObject
.
SUCCESS
->
{
is
UiStateObject
.
SUCCESS
->
{
showProgressDialog
(
false
)
showProgressDialog
(
false
)
if
(
it
.
data
.
action
==
"login"
)
{
if
(
it
.
data
.
action
==
"register"
)
{
navController
.
navigate
(
R
.
id
.
loginFragment
,
bundleOf
(
CONSTANTS
.
PHONE
to
phoneRaw
),
Utils
.
navOptions
())
}
else
if
(
it
.
data
.
action
==
"register"
)
{
navController
.
navigate
(
R
.
id
.
registerFragment
,
bundleOf
(
CONSTANTS
.
PHONE
to
phone
),
Utils
.
navOptions
())
navController
.
navigate
(
R
.
id
.
registerFragment
,
bundleOf
(
CONSTANTS
.
PHONE
to
phone
),
Utils
.
navOptions
())
}
else
{
navController
.
navigate
(
R
.
id
.
loginFragment
,
bundleOf
(
CONSTANTS
.
PHONE
to
phoneRaw
),
Utils
.
navOptions
())
}
}
}
}
is
UiStateObject
.
ERROR
->
{
is
UiStateObject
.
ERROR
->
{
...
...
app/src/main/java/com/mobiuz/app/dev/ui/auth/login/LoginFragment.kt
View file @
be371d26
...
@@ -64,7 +64,7 @@ class LoginFragment : BaseFragment(R.layout.fragment_login) {
...
@@ -64,7 +64,7 @@ class LoginFragment : BaseFragment(R.layout.fragment_login) {
}
}
})
})
txtHelperMobiuz
.
makeLinks
(
Pair
(
"www.mobi.uz"
,
View
.
OnClickListener
{
txtHelperMobiuz
.
makeLinks
(
Pair
(
"www.mobi.uz"
,
View
.
OnClickListener
{
val
uri
=
Uri
.
parse
(
"https://www.mobi.uz/"
)
val
uri
=
Uri
.
parse
(
CONSTANTS
.
HTTP_MOBI_UZ
)
val
intent
=
Intent
(
Intent
.
ACTION_VIEW
)
val
intent
=
Intent
(
Intent
.
ACTION_VIEW
)
intent
.
data
=
uri
intent
.
data
=
uri
startActivity
(
intent
)
startActivity
(
intent
)
...
...
app/src/main/java/com/mobiuz/app/dev/ui/auth/pin/PinFragment.kt
View file @
be371d26
...
@@ -6,6 +6,7 @@ import android.os.Bundle
...
@@ -6,6 +6,7 @@ import android.os.Bundle
import
android.view.View
import
android.view.View
import
android.view.animation.AnimationUtils
import
android.view.animation.AnimationUtils
import
android.widget.TextView
import
android.widget.TextView
import
androidx.biometric.BiometricManager
import
androidx.core.hardware.fingerprint.FingerprintManagerCompat
import
androidx.core.hardware.fingerprint.FingerprintManagerCompat
import
androidx.core.os.bundleOf
import
androidx.core.os.bundleOf
import
androidx.core.view.isVisible
import
androidx.core.view.isVisible
...
@@ -42,6 +43,8 @@ class PinFragment : BaseFragment(R.layout.fragment_pin) {
...
@@ -42,6 +43,8 @@ class PinFragment : BaseFragment(R.layout.fragment_pin) {
private
var
titleText
=
""
private
var
titleText
=
""
private
var
pinCode
=
""
private
var
pinCode
=
""
private
var
count
=
3
private
var
count
=
3
private
lateinit
var
biometricManager
:
BiometricManager
override
fun
onCreate
(
savedInstanceState
:
Bundle
?)
{
override
fun
onCreate
(
savedInstanceState
:
Bundle
?)
{
super
.
onCreate
(
savedInstanceState
)
super
.
onCreate
(
savedInstanceState
)
...
@@ -54,6 +57,7 @@ class PinFragment : BaseFragment(R.layout.fragment_pin) {
...
@@ -54,6 +57,7 @@ class PinFragment : BaseFragment(R.layout.fragment_pin) {
override
fun
onViewCreated
(
view
:
View
,
savedInstanceState
:
Bundle
?)
{
override
fun
onViewCreated
(
view
:
View
,
savedInstanceState
:
Bundle
?)
{
_bn
=
FragmentPinBinding
.
bind
(
view
)
_bn
=
FragmentPinBinding
.
bind
(
view
)
biometricManager
=
BiometricManager
.
from
(
requireContext
())
setUpUI
()
setUpUI
()
collects
()
collects
()
...
@@ -80,9 +84,11 @@ class PinFragment : BaseFragment(R.layout.fragment_pin) {
...
@@ -80,9 +84,11 @@ class PinFragment : BaseFragment(R.layout.fragment_pin) {
rvPin
.
adapter
=
pinAdapter
rvPin
.
adapter
=
pinAdapter
titleText
=
when
(
type
)
{
titleText
=
when
(
type
)
{
CONSTANTS
.
NEW_PIN
->
{
CONSTANTS
.
NEW_PIN
->
{
topDiv
.
isVisible
=
false
getString
(
R
.
string
.
install_pin
)
getString
(
R
.
string
.
install_pin
)
}
}
CONSTANTS
.
CONFIRM_NEW_PIN
->
{
CONSTANTS
.
CONFIRM_NEW_PIN
->
{
topDiv
.
isVisible
=
false
getString
(
R
.
string
.
confirm_pin
)
getString
(
R
.
string
.
confirm_pin
)
}
}
CONSTANTS
.
CURRENT_PIN
->
{
CONSTANTS
.
CURRENT_PIN
->
{
...
@@ -169,6 +175,13 @@ class PinFragment : BaseFragment(R.layout.fragment_pin) {
...
@@ -169,6 +175,13 @@ class PinFragment : BaseFragment(R.layout.fragment_pin) {
}
}
}
}
private
fun
checkBiometric
()
:
Boolean
{
return
when
(
biometricManager
.
canAuthenticate
(
BiometricManager
.
Authenticators
.
BIOMETRIC_STRONG
or
BiometricManager
.
Authenticators
.
BIOMETRIC_WEAK
))
{
BiometricManager
.
BIOMETRIC_SUCCESS
->
true
else
->
false
}
}
private
fun
loadError
(){
private
fun
loadError
(){
bn
.
apply
{
bn
.
apply
{
...
@@ -196,8 +209,8 @@ class PinFragment : BaseFragment(R.layout.fragment_pin) {
...
@@ -196,8 +209,8 @@ class PinFragment : BaseFragment(R.layout.fragment_pin) {
}
}
private
fun
navigate
()
{
private
fun
navigate
()
{
val
golfing
=
Goldfinger
.
Builder
(
requireContext
()).
build
()
if
(
golfing
.
canAuthenticate
())
{
if
(
checkBiometric
())
{
navController
.
navigate
(
R
.
id
.
biometricFragment
,
null
,
Utils
.
navOptions
())
navController
.
navigate
(
R
.
id
.
biometricFragment
,
null
,
Utils
.
navOptions
())
}
else
{
}
else
{
val
intent
=
Intent
(
requireContext
(),
MainActivity
::
class
.
java
)
val
intent
=
Intent
(
requireContext
(),
MainActivity
::
class
.
java
)
...
...
app/src/main/java/com/mobiuz/app/dev/ui/auth/register/RegisterFragment.kt
View file @
be371d26
...
@@ -12,6 +12,7 @@ import androidx.navigation.NavController
...
@@ -12,6 +12,7 @@ import androidx.navigation.NavController
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.FragmentRegisterBinding
import
com.mobiuz.app.databinding.FragmentRegisterBinding
import
com.mobiuz.app.dev.model.SharedPref
import
com.mobiuz.app.dev.model.UserAuth
import
com.mobiuz.app.dev.model.UserAuth
import
com.mobiuz.app.dev.network.model.UiStateObject
import
com.mobiuz.app.dev.network.model.UiStateObject
import
com.mobiuz.app.dev.ui.auth.AuthViewModel
import
com.mobiuz.app.dev.ui.auth.AuthViewModel
...
@@ -25,10 +26,13 @@ import com.mobiuz.app.dev.utils.extensions.showCustomDialog
...
@@ -25,10 +26,13 @@ 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
import
javax.inject.Inject
@AndroidEntryPoint
@AndroidEntryPoint
class
RegisterFragment
:
BaseFragment
(
R
.
layout
.
fragment_register
)
{
class
RegisterFragment
:
BaseFragment
(
R
.
layout
.
fragment_register
)
{
@Inject
lateinit
var
pref
:
SharedPref
private
var
_bn
:
FragmentRegisterBinding
?
=
null
private
var
_bn
:
FragmentRegisterBinding
?
=
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
)
}
...
@@ -74,14 +78,23 @@ class RegisterFragment : BaseFragment(R.layout.fragment_register) {
...
@@ -74,14 +78,23 @@ class RegisterFragment : BaseFragment(R.layout.fragment_register) {
txtAgree
.
makeLinks
(
txtAgree
.
makeLinks
(
Pair
(
"Terms of Use"
,
View
.
OnClickListener
{
Pair
(
"Terms of Use"
,
View
.
OnClickListener
{
val
uri
=
Uri
.
parse
(
CONSTANTS
.
TERMS_OF_USE
)
val
uri
=
Uri
.
parse
(
when
(
pref
.
language
){
CONSTANTS
.
UZ
->
CONSTANTS
.
LICENSE_UZ
CONSTANTS
.
RU
->
CONSTANTS
.
LICENSE_RU
else
->
CONSTANTS
.
LICENSE_EN
})
val
intent
=
Intent
(
Intent
.
ACTION_VIEW
)
val
intent
=
Intent
(
Intent
.
ACTION_VIEW
)
intent
.
data
=
uri
intent
.
data
=
uri
startActivity
(
intent
)
startActivity
(
intent
)
}),
}),
Pair
(
"Privacy Policy"
,
View
.
OnClickListener
{
Pair
(
"Privacy Policy"
,
View
.
OnClickListener
{
val
uri
=
Uri
.
parse
(
CONSTANTS
.
PRIVACY_POLICY
)
val
uri
=
Uri
.
parse
(
when
(
pref
.
language
){
CONSTANTS
.
UZ
->
CONSTANTS
.
PRIVACY_POLICY_UZ
CONSTANTS
.
RU
->
CONSTANTS
.
PRIVACY_POLICY_RU
else
->
CONSTANTS
.
PRIVACY_POLICY_EN
})
val
intent
=
Intent
(
Intent
.
ACTION_VIEW
)
val
intent
=
Intent
(
Intent
.
ACTION_VIEW
)
intent
.
data
=
uri
intent
.
data
=
uri
startActivity
(
intent
)
startActivity
(
intent
)
...
...
app/src/main/java/com/mobiuz/app/dev/ui/global/CONSTANTS.kt
View file @
be371d26
...
@@ -11,12 +11,22 @@ object CONSTANTS {
...
@@ -11,12 +11,22 @@ object CONSTANTS {
// safety data
// safety data
const
val
HELP_BOT
=
"@MobiuzHelpBot"
const
val
HELP_BOT
=
"@MobiuzHelpBot"
const
val
TERMS_OF_USE
=
"https://ip.mobi.uz/selfcare/"
const
val
HTTP_MOBI_UZ
=
"https://mobi.uz/"
const
val
PRIVACY_POLICY
=
"https://www.mobi.uz/"
const
val
HTTP_MOBI_UZ
=
"https://www.mobi.uz/"
const
val
FEEDBACK
=
"https://company.mobi.uz/ru/feedback/"
const
val
FEEDBACK
=
"https://company.mobi.uz/ru/feedback/"
const
val
MAIN_URL1
=
"https://www.mobi.uz/"
const
val
MAIN_URL2
=
"https://www.mobi.uz/"
const
val
LICENSE_UZ
=
"http://10.160.45.60/uploads/licenses/license_uz.html"
const
val
LICENSE_RU
=
"http://10.160.45.60/uploads/licenses/license_ru.html"
const
val
LICENSE_EN
=
"http://10.160.45.60/uploads/licenses/license_en.html"
const
val
PRIVACY_POLICY_UZ
=
"http://10.160.45.60/uploads/privacy/privacy_policy_uz.html"
const
val
PRIVACY_POLICY_RU
=
"http://10.160.45.60/uploads/privacy/privacy_policy_ru.html"
const
val
PRIVACY_POLICY_EN
=
"http://10.160.45.60/uploads/privacy/privacy_policy_en.html"
const
val
PAYSYS_LICENSE_UZ
=
"http://10.160.45.60/uploads/paysys/license_uz.html"
const
val
PAYSYS_LICENSE_RU
=
"http://10.160.45.60/uploads/paysys/license_ru.html"
const
val
PAYSYS_LICENSE_EN
=
"http://10.160.45.60/uploads/paysys/license_en.html"
const
val
MAIN_URL2
=
"https://mobi.uz/"
const
val
PHONE1
=
"0890"
const
val
PHONE1
=
"0890"
const
val
PHONE2
=
"+998 97 130 09 09"
const
val
PHONE2
=
"+998 97 130 09 09"
const
val
PHONE3
=
"+998 97 203 10 10"
const
val
PHONE3
=
"+998 97 203 10 10"
...
@@ -39,7 +49,6 @@ object CONSTANTS {
...
@@ -39,7 +49,6 @@ object CONSTANTS {
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
MY_CONNECTIVITY_CHANGE
=
"MY_CONNECTIVITY_CHANGE"
const
val
MY_CONNECTIVITY_CHANGE
=
"MY_CONNECTIVITY_CHANGE"
const
val
USSD_ACTION_REFRESH
=
"com.times.ussd.action.REFRESH"
//password types
//password types
...
@@ -76,5 +85,6 @@ object CONSTANTS {
...
@@ -76,5 +85,6 @@ object CONSTANTS {
const
val
API_CHECK_PASSWORD
=
"customer/check-password"
const
val
API_CHECK_PASSWORD
=
"customer/check-password"
const
val
API_CHANGE_PASSWORD
=
"customer/change-password"
const
val
API_CHANGE_PASSWORD
=
"customer/change-password"
const
val
API_SERVICE_INDEX
=
"service/index"
const
val
API_SERVICE_INDEX
=
"service/index"
const
val
API_MAIN_ROAMING
=
"main/roaming"
}
}
app/src/main/java/com/mobiuz/app/dev/ui/global/FullScreenFragment.kt
View file @
be371d26
...
@@ -7,8 +7,7 @@ import android.view.animation.AnimationUtils
...
@@ -7,8 +7,7 @@ import android.view.animation.AnimationUtils
import
android.widget.TextView
import
android.widget.TextView
import
androidx.activity.OnBackPressedCallback
import
androidx.activity.OnBackPressedCallback
import
androidx.biometric.BiometricManager
import
androidx.biometric.BiometricManager
import
androidx.biometric.BiometricManager.Authenticators.BIOMETRIC_STRONG
import
androidx.biometric.BiometricManager.Authenticators.*
import
androidx.biometric.BiometricManager.Authenticators.BIOMETRIC_WEAK
import
androidx.biometric.BiometricPrompt
import
androidx.biometric.BiometricPrompt
import
androidx.core.os.bundleOf
import
androidx.core.os.bundleOf
import
androidx.core.view.isVisible
import
androidx.core.view.isVisible
...
@@ -47,7 +46,6 @@ class FullScreenFragment : BaseFragment(R.layout.fragment_pin_dialog) {
...
@@ -47,7 +46,6 @@ class FullScreenFragment : BaseFragment(R.layout.fragment_pin_dialog) {
private
lateinit
var
mainViewModel
:
MainViewModel
private
lateinit
var
mainViewModel
:
MainViewModel
private
var
type
=
""
private
var
type
=
""
private
var
errorCount
=
3
private
var
errorCount
=
3
private
lateinit
var
goldfinger
:
Goldfinger
private
lateinit
var
biometricManager
:
BiometricManager
private
lateinit
var
biometricManager
:
BiometricManager
private
lateinit
var
biometricPrompt
:
BiometricPrompt
private
lateinit
var
biometricPrompt
:
BiometricPrompt
private
lateinit
var
promptInfo
:
BiometricPrompt
.
PromptInfo
private
lateinit
var
promptInfo
:
BiometricPrompt
.
PromptInfo
...
@@ -71,8 +69,6 @@ class FullScreenFragment : BaseFragment(R.layout.fragment_pin_dialog) {
...
@@ -71,8 +69,6 @@ class FullScreenFragment : BaseFragment(R.layout.fragment_pin_dialog) {
setUpUI
()
setUpUI
()
goldfinger
=
Goldfinger
.
Builder
(
requireContext
()).
build
()
biometricManager
=
BiometricManager
.
from
(
requireContext
())
biometricManager
=
BiometricManager
.
from
(
requireContext
())
checkBiometric
()
checkBiometric
()
...
@@ -119,27 +115,6 @@ class FullScreenFragment : BaseFragment(R.layout.fragment_pin_dialog) {
...
@@ -119,27 +115,6 @@ class FullScreenFragment : BaseFragment(R.layout.fragment_pin_dialog) {
}
}
private
fun
loadFingerPrint
()
{
if
(
goldfinger
.
canAuthenticate
())
{
val
params
=
Goldfinger
.
PromptParams
.
Builder
(
this
)
.
title
(
getString
(
R
.
string
.
biometric_enter
))
.
description
(
getString
(
R
.
string
.
enter_from_finger_or_face
))
.
negativeButtonText
(
getString
(
R
.
string
.
cancel
))
.
build
()
goldfinger
.
authenticate
(
params
,
object
:
Goldfinger
.
Callback
{
override
fun
onResult
(
result
:
Goldfinger
.
Result
)
{
if
(
result
.
type
()
==
Goldfinger
.
Type
.
SUCCESS
)
{
navigate
()
}
}
override
fun
onError
(
e
:
Exception
)
{}
})
}
}
override
fun
setUpUI
()
{
override
fun
setUpUI
()
{
bn
.
apply
{
bn
.
apply
{
loadData
()
loadData
()
...
...
app/src/main/java/com/mobiuz/app/dev/ui/home/HomeFragment.kt
View file @
be371d26
...
@@ -7,14 +7,15 @@ import android.os.Bundle
...
@@ -7,14 +7,15 @@ import android.os.Bundle
import
android.view.View
import
android.view.View
import
android.widget.FrameLayout
import
android.widget.FrameLayout
import
android.widget.LinearLayout
import
android.widget.LinearLayout
import
androidx.core.view.isVisible
import
androidx.fragment.app.viewModels
import
androidx.fragment.app.viewModels
import
androidx.lifecycle.ViewModelProvider
import
androidx.lifecycle.ViewModelProvider
import
androidx.lifecycle.lifecycleScope
import
androidx.lifecycle.lifecycleScope
import
androidx.recyclerview.widget.RecyclerView
import
androidx.recyclerview.widget.RecyclerView
import
com.google.android.material.tabs.TabLayoutMediator
import
com.google.android.material.tabs.TabLayoutMediator
import
com.mobiuz.app.dev.BillingActivity
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.BillingActivity
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
...
@@ -24,8 +25,6 @@ import com.mobiuz.app.dev.utils.extensions.*
...
@@ -24,8 +25,6 @@ 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.flow.collect
import
kotlinx.coroutines.flow.collect
import
java.text.SimpleDateFormat
import
java.util.*
import
javax.inject.Inject
import
javax.inject.Inject
...
@@ -41,16 +40,20 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) {
...
@@ -41,16 +40,20 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) {
private
lateinit
var
mainViewModel
:
MainViewModel
private
lateinit
var
mainViewModel
:
MainViewModel
private
var
isFirstProgressing
=
true
private
var
isFirstProgressing
=
true
private
var
jobAutoSlide
:
Job
?
=
null
private
var
jobAutoSlide
:
Job
?
=
null
private
var
jobToMatch
:
Job
?
=
null
private
var
customer
:
Customer
?
=
null
private
var
customer
:
Customer
?
=
null
private
var
overScroll
=
0
private
var
overScroll
=
0
private
val
sliderAdapter
=
SliderAdapter
()
private
val
sliderAdapter
=
SliderAdapter
()
private
var
lastUpdateTime
=
0L
private
var
lastUpdateTime
=
0L
private
lateinit
var
matchParam
:
FrameLayout
.
LayoutParams
private
lateinit
var
changedParam
:
FrameLayout
.
LayoutParams
override
fun
onCreate
(
savedInstanceState
:
Bundle
?)
{
override
fun
onCreate
(
savedInstanceState
:
Bundle
?)
{
super
.
onCreate
(
savedInstanceState
)
super
.
onCreate
(
savedInstanceState
)
mainViewModel
=
ViewModelProvider
(
requireActivity
())[
MainViewModel
::
class
.
java
]
mainViewModel
=
ViewModelProvider
(
requireActivity
())[
MainViewModel
::
class
.
java
]
viewModel
.
mainIndex
()
viewModel
.
mainIndex
()
viewModel
.
mainRoaming
()
lastUpdateTime
=
System
.
currentTimeMillis
()
lastUpdateTime
=
System
.
currentTimeMillis
()
}
}
...
@@ -67,6 +70,8 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) {
...
@@ -67,6 +70,8 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) {
override
fun
setUpUI
()
{
override
fun
setUpUI
()
{
bn
.
apply
{
bn
.
apply
{
matchParam
=
FrameLayout
.
LayoutParams
(
LinearLayout
.
LayoutParams
.
MATCH_PARENT
,
LinearLayout
.
LayoutParams
.
WRAP_CONTENT
)
changedParam
=
FrameLayout
.
LayoutParams
(
LinearLayout
.
LayoutParams
.
WRAP_CONTENT
,
LinearLayout
.
LayoutParams
.
WRAP_CONTENT
)
slider
.
adapter
=
sliderAdapter
slider
.
adapter
=
sliderAdapter
...
@@ -106,27 +111,31 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) {
...
@@ -106,27 +111,31 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) {
mainViewModel
.
openDrawer
(
System
.
currentTimeMillis
())
mainViewModel
.
openDrawer
(
System
.
currentTimeMillis
())
}
}
val
params0
=
FrameLayout
.
LayoutParams
(
LinearLayout
.
LayoutParams
.
MATCH_PARENT
,
LinearLayout
.
LayoutParams
.
WRAP_CONTENT
)
val
params
=
FrameLayout
.
LayoutParams
(
LinearLayout
.
LayoutParams
.
WRAP_CONTENT
,
LinearLayout
.
LayoutParams
.
WRAP_CONTENT
)
bounceScrollView
.
setOnOverScrollListener
{
fromStart
,
overScrolledDistance
->
bounceScrollView
.
setOnOverScrollListener
{
fromStart
,
overScrolledDistance
->
if
(
fromStart
&&
overScrolledDistance
>
140.52632
&&
(
lastUpdateTime
<
System
.
currentTimeMillis
()
-
3000
))
{
// customLog("fromStart:$fromStart, overScroll:$overScroll, overScrolledDistance: $overScrolledDistance")
if
(!
fromStart
)
{
lastUpdateTime
=
System
.
currentTimeMillis
()
}
if
(
fromStart
&&
overScrolledDistance
>
140.52632
&&
(
lastUpdateTime
<
System
.
currentTimeMillis
()
-
2000
))
{
vibrate
(
requireContext
())
vibrate
(
requireContext
())
viewModel
.
mainIndex
()
viewModel
.
mainIndex
()
lastUpdateTime
=
System
.
currentTimeMillis
()
lastUpdateTime
=
System
.
currentTimeMillis
()
}
}
if
(
fromStart
&&
overScroll
<
overScrolledDistance
)
{
if
(
fromStart
&&
overScroll
<
overScrolledDistance
)
{
params
.
width
=
homeImage
.
width
+
(
overScrolledDistance
-
overScroll
)
changedParam
.
width
=
homeImage
.
width
+
(
overScrolledDistance
-
overScroll
)
params
.
height
=
homeImage
.
height
+
(
overScrolledDistance
-
overScroll
)
changedParam
.
height
=
homeImage
.
height
+
(
overScrolledDistance
-
overScroll
)
homeImage
.
layoutParams
=
params
homeImage
.
layoutParams
=
changedParam
}
else
{
}
else
{
params
.
width
=
homeImage
.
width
-
(
overScroll
-
overScrolledDistance
)
changedParam
.
width
=
homeImage
.
width
-
(
overScroll
-
overScrolledDistance
)
params
.
height
=
homeImage
.
height
-
(
overScroll
-
overScrolledDistance
)
changedParam
.
height
=
homeImage
.
height
-
(
overScroll
-
overScrolledDistance
)
homeImage
.
layoutParams
=
params0
homeImage
.
layoutParams
=
matchParam
}
}
overScroll
=
overScrolledDistance
overScroll
=
overScrolledDistance
}
}
bounceScrollView
.
setOnScrollListener
{
_
,
scrollY
->
bounceScrollView
.
setOnScrollListener
{
_
,
scrollY
->
...
@@ -174,6 +183,28 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) {
...
@@ -174,6 +183,28 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) {
}
}
}
}
}
}
viewLifecycleOwner
.
lifecycleScope
.
launchWhenStarted
{
viewModel
.
mainRoamingUiState
.
collect
{
when
(
it
)
{
is
UiStateObject
.
SUCCESS
->
{
showProgressDialog
(
false
)
bn
.
cardRoaming
.
isVisible
=
it
.
data
.
name
!=
null
customLog
(
"mainRoamingUiState SUCCESS${it.data}"
)
}
is
UiStateObject
.
ERROR
->
{
customLog
(
"mainRoamingUiState ERROR${it.message}"
)
showProgressDialog
(
false
)
bn
.
cardRoaming
.
isVisible
=
false
}
is
UiStateObject
.
LOADING
->
{
bn
.
cardRoaming
.
isVisible
=
false
customLog
(
"mainRoamingUiState LOADING"
)
}
else
->
Unit
}
}
}
}
}
@SuppressLint
(
"SetTextI18n"
)
@SuppressLint
(
"SetTextI18n"
)
...
@@ -184,19 +215,17 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) {
...
@@ -184,19 +215,17 @@ class HomeFragment : BaseFragment(R.layout.fragment_home) {
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
{
txtCountMb
.
text
=
it
.
BYTE
?.
value
?.
toMoneyFormat
()
?:
"0"
txtCountMb
.
text
=
it
.
BYTE
?.
value
?.
toMoneyFormat
()
?:
"0"
txtTypeMb
.
text
=
it
.
BYTE
?.
unit
?:
"mb"
txtTypeMb
.
text
=
it
.
BYTE
?.
unit
?:
"mb"
txtSumTariff
.
text
=
getString
(
R
.
string
.
sum_month
,
it
.
SECOND
?.
value
?.
toMoneyFormat
()
?:
"0"
)
txtCountMinut
.
text
=
it
.
SECOND
?.
value
?.
toMoneyFormat
()
?:
"0"
txtCountMinut
.
text
=
it
.
SECOND
?.
value
?.
toMoneyFormat
()
?:
"0"
txtTypeMinut
.
text
=
it
.
SECOND
?.
unit
?:
"min"
txtTypeMinut
.
text
=
it
.
SECOND
?.
unit
?:
"min"
txtTarif
.
text
=
it
.
SECOND
?.
name
?:
"My tarif"
val
strDate
=
it
.
SECOND
?.
date_to
txtTarif
.
text
=
customer
?.
customer
?.
tariff
?.
name
val
dateFormat
=
SimpleDateFormat
(
"yyyy-MM-dd'T'HH:mm"
)
txtSumTariff
.
text
=
getString
(
R
.
string
.
sum_month
,
customer
?.
customer
?.
tariff
?.
total_price
?.
toMoneyFormat
()
?:
"0"
)
val
date
:
Date
=
dateFormat
.
parse
(
strDate
)
txtTarifTo
.
text
=
customer
?.
customer
?.
tariff
?.
next_tariffication_date
val
d
=
SimpleDateFormat
(
"dd MMMM"
)
txtTarifTo
.
text
=
d
.
format
(
date
)
txtCountSms
.
text
=
it
.
ITEM
?.
value
?.
toMoneyFormat
()
?:
"0"
txtCountSms
.
text
=
it
.
ITEM
?.
value
?.
toMoneyFormat
()
?:
"0"
txtTypeSms
.
text
=
it
.
ITEM
?.
unit
?:
"sms"
txtTypeSms
.
text
=
it
.
ITEM
?.
unit
?:
"sms"
...
...
app/src/main/java/com/mobiuz/app/dev/ui/home/HomeViewModel.kt
View file @
be371d26
...
@@ -3,6 +3,7 @@ package com.mobiuz.app.dev.ui.home
...
@@ -3,6 +3,7 @@ package com.mobiuz.app.dev.ui.home
import
androidx.lifecycle.ViewModel
import
androidx.lifecycle.ViewModel
import
androidx.lifecycle.viewModelScope
import
androidx.lifecycle.viewModelScope
import
com.mobiuz.app.dev.network.model.Customer
import
com.mobiuz.app.dev.network.model.Customer
import
com.mobiuz.app.dev.network.model.Roaming
import
com.mobiuz.app.dev.network.model.UiStateObject
import
com.mobiuz.app.dev.network.model.UiStateObject
import
com.mobiuz.app.dev.network.repository.AuthRepository
import
com.mobiuz.app.dev.network.repository.AuthRepository
import
com.mobiuz.app.dev.network.repository.MainRepository
import
com.mobiuz.app.dev.network.repository.MainRepository
...
@@ -25,5 +26,13 @@ class HomeViewModel @Inject constructor(
...
@@ -25,5 +26,13 @@ class HomeViewModel @Inject constructor(
_mainIndexUiState
.
value
=
repository
.
mainIndex
()
_mainIndexUiState
.
value
=
repository
.
mainIndex
()
}
}
private
val
_mainRoamingUiState
=
MutableStateFlow
<
UiStateObject
<
Roaming
>>(
UiStateObject
.
EMPTY
)
val
mainRoamingUiState
:
StateFlow
<
UiStateObject
<
Roaming
>>
=
_mainRoamingUiState
fun
mainRoaming
()
=
viewModelScope
.
launch
{
_mainRoamingUiState
.
value
=
UiStateObject
.
LOADING
_mainRoamingUiState
.
value
=
repository
.
mainRoaming
()
}
}
}
\ No newline at end of file
app/src/main/java/com/mobiuz/app/dev/ui/home/SliderAdapter.kt
View file @
be371d26
...
@@ -29,7 +29,7 @@ class SliderAdapter : RecyclerView.Adapter<SliderAdapter.SliderViewHolder>() {
...
@@ -29,7 +29,7 @@ class SliderAdapter : RecyclerView.Adapter<SliderAdapter.SliderViewHolder>() {
fun
onBind
(
position
:
Int
)
{
fun
onBind
(
position
:
Int
)
{
view
.
apply
{
view
.
apply
{
if
(
position
%
2
!=
0
){
if
(
position
%
2
!=
0
){
imageSlider
.
set
Background
Resource
(
R
.
drawable
.
image_slider2
)
imageSlider
.
set
Image
Resource
(
R
.
drawable
.
image_slider2
)
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
)
}
}
...
...
app/src/main/java/com/mobiuz/app/dev/ui/home/StatusBarSpacer.kt
0 → 100644
View file @
be371d26
package
com.mobiuz.app.dev.ui.home
import
android.content.Context
import
android.util.AttributeSet
import
android.view.View
import
com.mobiuz.app.dev.utils.extensions.getStatusBarHeight
class
StatusBarSpacer
@JvmOverloads
constructor
(
context
:
Context
,
attrs
:
AttributeSet
?
=
null
)
:
View
(
context
,
attrs
)
{
override
fun
onMeasure
(
widthMeasureSpec
:
Int
,
heightMeasureSpec
:
Int
)
=
setMeasuredDimension
(
widthMeasureSpec
,
(
getStatusBarHeight
()))
}
\ No newline at end of file
app/src/main/java/com/mobiuz/app/dev/ui/settings/safety/SafetyFragment.kt
View file @
be371d26
package
com.mobiuz.app.dev.ui.settings.safety
package
com.mobiuz.app.dev.ui.settings.safety
import
android.content.Intent
import
android.os.Build
import
android.os.Bundle
import
android.os.Bundle
import
android.provider.Settings
import
android.provider.Settings.ACTION_BIOMETRIC_ENROLL
import
android.view.View
import
android.view.View
import
android.widget.SeekBar
import
androidx.biometric.BiometricManager
import
androidx.biometric.BiometricManager.Authenticators.*
import
androidx.core.os.bundleOf
import
androidx.core.os.bundleOf
import
androidx.core.view.isVisible
import
androidx.navigation.NavController
import
androidx.navigation.NavController
import
androidx.navigation.fragment.NavHostFragment
import
androidx.navigation.fragment.NavHostFragment
import
com.mobiuz.app.BuildConfig
import
com.mobiuz.app.R
import
com.mobiuz.app.R
import
com.mobiuz.app.databinding.FragmentSafetyBinding
import
com.mobiuz.app.databinding.FragmentSafetyBinding
import
com.mobiuz.app.dev.model.SharedPref
import
com.mobiuz.app.dev.model.SharedPref
...
@@ -13,8 +20,15 @@ import com.mobiuz.app.dev.ui.base.BaseFragment
...
@@ -13,8 +20,15 @@ import com.mobiuz.app.dev.ui.base.BaseFragment
import
com.mobiuz.app.dev.ui.global.ButtonClick
import
com.mobiuz.app.dev.ui.global.ButtonClick
import
com.mobiuz.app.dev.ui.global.CONSTANTS
import
com.mobiuz.app.dev.ui.global.CONSTANTS
import
com.mobiuz.app.dev.utils.Utils
import
com.mobiuz.app.dev.utils.Utils
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
uz.agr.sdk.core.entity.synxron.VersionSdk
// 35
// 93 320 36 00 = 30
import
javax.inject.Inject
import
javax.inject.Inject
@AndroidEntryPoint
@AndroidEntryPoint
...
@@ -23,6 +37,8 @@ class SafetyFragment : BaseFragment(R.layout.fragment_safety) {
...
@@ -23,6 +37,8 @@ class SafetyFragment : BaseFragment(R.layout.fragment_safety) {
@Inject
@Inject
lateinit
var
pref
:
SharedPref
lateinit
var
pref
:
SharedPref
private
lateinit
var
biometricManager
:
BiometricManager
private
var
_bn
:
FragmentSafetyBinding
?
=
null
private
var
_bn
:
FragmentSafetyBinding
?
=
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
)
}
...
@@ -32,6 +48,8 @@ class SafetyFragment : BaseFragment(R.layout.fragment_safety) {
...
@@ -32,6 +48,8 @@ class SafetyFragment : BaseFragment(R.layout.fragment_safety) {
_bn
=
FragmentSafetyBinding
.
bind
(
view
)
_bn
=
FragmentSafetyBinding
.
bind
(
view
)
setUpUI
()
setUpUI
()
collects
()
collects
()
biometricManager
=
BiometricManager
.
from
(
requireContext
())
checkBiometricAfter
(
false
)
}
}
...
@@ -42,32 +60,97 @@ class SafetyFragment : BaseFragment(R.layout.fragment_safety) {
...
@@ -42,32 +60,97 @@ class SafetyFragment : BaseFragment(R.layout.fragment_safety) {
navController
.
navigateUp
()
navController
.
navigateUp
()
}
}
val
text
=
getString
(
R
.
string
.
settings_safety
)
val
text
=
getString
(
R
.
string
.
settings_safety
)
val
myText
=
text
.
replace
(
CONSTANTS
.
DEFAULT_PHONE
,
pref
.
userPhone
)
val
myText
=
text
.
replace
(
CONSTANTS
.
DEFAULT_PHONE
,
pref
.
userPhone
)
txtPhoneSafety
.
text
=
myText
txtPhoneSafety
.
text
=
myText
switchBiometria
.
isChecked
=
pref
.
isUseFingerPrint
switchBiometria
.
isChecked
=
pref
.
isUseFingerPrint
switchBiometria
.
setOnCheckedChangeListener
{
_
,
isChecked
->
switchBiometria
.
setOnCheckedChangeListener
{
_
,
isChecked
->
val
message
=
if
(
isChecked
)
getString
(
R
.
string
.
biometric_enabled
)
else
getString
(
R
.
string
.
biometric_disabled
)
showToastMessage
(
message
)
if
(
isChecked
&&
checkBiometric
()){
pref
.
isUseFingerPrint
=
isChecked
showToastMessage
(
getString
(
R
.
string
.
biometric_enabled
))
pref
.
isUseFingerPrint
=
true
}
else
{
if
(
checkBiometric
()){
pref
.
isUseFingerPrint
=
false
showToastMessage
(
getString
(
R
.
string
.
biometric_disabled
))
}
else
{
checkBiometricAfter
(
true
)
}
}
switchBiometria
.
isChecked
=
checkBiometric
()
&&
isChecked
}
}
btn
1
.
setOnClickListener
(
object
:
ButtonClick
()
{
btn
Biometric
.
setOnClickListener
(
object
:
ButtonClick
()
{
override
fun
onSingleClick
(
v
:
View
?)
{
override
fun
onSingleClick
(
v
:
View
?)
{
switchBiometria
.
isChecked
=
!
switchBiometria
.
isChecked
switchBiometria
.
isChecked
=
!
switchBiometria
.
isChecked
}
}
})
})
btnChangePin
.
setOnClickListener
(
object
:
ButtonClick
(){
btnChangePin
.
setOnClickListener
(
object
:
ButtonClick
()
{
override
fun
onSingleClick
(
v
:
View
?)
{
override
fun
onSingleClick
(
v
:
View
?)
{
navController
.
navigate
(
R
.
id
.
pinFragment
,
bundleOf
(
CONSTANTS
.
TYPE_PIN
to
CONSTANTS
.
CURRENT_PIN
),
Utils
.
navOptions
())
navController
.
navigate
(
R
.
id
.
pinFragment
,
bundleOf
(
CONSTANTS
.
TYPE_PIN
to
CONSTANTS
.
CURRENT_PIN
),
Utils
.
navOptions
())
}
}
})
})
btnChangePassword
.
setOnClickListener
(
object
:
ButtonClick
(){
btnChangePassword
.
setOnClickListener
(
object
:
ButtonClick
()
{
override
fun
onSingleClick
(
v
:
View
?)
{
override
fun
onSingleClick
(
v
:
View
?)
{
navController
.
navigate
(
R
.
id
.
changePasswordFragment
,
bundleOf
(
CONSTANTS
.
TYPE_PASSWORD
to
CONSTANTS
.
CURRENT_PASSWORD
),
Utils
.
navOptions
())
navController
.
navigate
(
R
.
id
.
changePasswordFragment
,
bundleOf
(
CONSTANTS
.
TYPE_PASSWORD
to
CONSTANTS
.
CURRENT_PASSWORD
),
Utils
.
navOptions
())
}
}
})
})
}
}
}
}
private
fun
checkBiometricAfter
(
toSettings
:
Boolean
)
{
when
(
biometricManager
.
canAuthenticate
(
BIOMETRIC_STRONG
or
BIOMETRIC_WEAK
))
{
BiometricManager
.
BIOMETRIC_SUCCESS
->
{
customLog
(
"BIOMETRIC_SUCCESS"
)
bn
.
btnBiometric
.
isVisible
=
true
}
BiometricManager
.
BIOMETRIC_ERROR_NO_HARDWARE
->
{
customLog
(
"BIOMETRIC_ERROR_NO_HARDWARE"
)
pref
.
isUseFingerPrint
=
false
bn
.
btnBiometric
.
isVisible
=
false
}
BiometricManager
.
BIOMETRIC_ERROR_NONE_ENROLLED
->
{
customLog
(
"BIOMETRIC_ERROR_NONE_ENROLLED"
)
customLog
(
"${Build.VERSION.SDK_INT} >= ${Build.VERSION_CODES.R}"
)
if
(
toSettings
){
if
(
Build
.
VERSION
.
SDK_INT
>=
Build
.
VERSION_CODES
.
R
){
val
enrollIntent
=
Intent
(
ACTION_BIOMETRIC_ENROLL
).
apply
{
putExtra
(
Settings
.
EXTRA_BIOMETRIC_AUTHENTICATORS_ALLOWED
,
BIOMETRIC_STRONG
or
BIOMETRIC_WEAK
)
}
pref
.
isShowPin
=
false
customLog
(
"BIOMETRIC_ERROR_NONE_ENROLLED INTENT"
)
startActivityForResult
(
enrollIntent
,
1
)
}
else
{
showMessage
(
getString
(
R
.
string
.
to_settings
))
}
}
pref
.
isUseFingerPrint
=
false
}
else
->
Unit
}
}
override
fun
onActivityResult
(
requestCode
:
Int
,
resultCode
:
Int
,
data
:
Intent
?)
{
super
.
onActivityResult
(
requestCode
,
resultCode
,
data
)
}
private
fun
checkBiometric
():
Boolean
{
return
when
(
biometricManager
.
canAuthenticate
(
BIOMETRIC_STRONG
or
BIOMETRIC_WEAK
))
{
BiometricManager
.
BIOMETRIC_SUCCESS
->
true
else
->
false
}
}
override
fun
collects
()
{}
override
fun
collects
()
{}
...
...
app/src/main/java/com/mobiuz/app/dev/utils/extensions/StringExtension.kt
View file @
be371d26
...
@@ -128,6 +128,47 @@ fun FragmentActivity.showCustomExitDialog(block: () -> Unit) {
...
@@ -128,6 +128,47 @@ fun FragmentActivity.showCustomExitDialog(block: () -> Unit) {
dialog
.
show
(
supportFragmentManager
,
"childFragmentManager"
)
dialog
.
show
(
supportFragmentManager
,
"childFragmentManager"
)
}
}
fun
String
.
checkChangedPosition
(
new
:
String
):
Int
{
for
(
i
in
this
.
indices
){
if
(
i
==
new
.
length
){
return
new
.
length
}
else
if
(
this
[
i
]
!=
new
[
i
]){
return
i
}
}
return
new
.
length
}
fun
View
.
getStatusBarHeight
():
Int
{
var
result
=
0
val
resourceId
=
resources
.
getIdentifier
(
"status_bar_height"
,
"dimen"
,
"android"
)
if
(
resourceId
>
0
)
{
result
=
resources
.
getDimensionPixelSize
(
resourceId
)
}
resources
.
displayMetrics
.
heightPixels
return
result
}
fun
String
.
maskedTextMobi
():
String
{
var
newText
=
""
for
(
i
in
this
.
indices
){
if
(
i
==
2
){
newText
+=
" "
}
if
(
i
==
5
){
newText
+=
" "
}
if
(
i
==
7
){
newText
+=
" "
}
newText
+=
this
[
i
]
}
return
newText
}
//fun Fragment.showCustomDialog(string: String, status: Boolean, block: () -> Unit) {
//fun Fragment.showCustomDialog(string: String, status: Boolean, block: () -> Unit) {
// val snackBar = Snackbar.make(this.requireView(),string, Snackbar.LENGTH_LONG)
// val snackBar = Snackbar.make(this.requireView(),string, Snackbar.LENGTH_LONG)
// .setBackgroundTint(Color.GRAY)
// .setBackgroundTint(Color.GRAY)
...
...
app/src/main/res/layout/activity_main.xml
View file @
be371d26
...
@@ -195,7 +195,6 @@
...
@@ -195,7 +195,6 @@
android:layout_gravity=
"center"
android:layout_gravity=
"center"
android:src=
"@drawable/ic_baseline_keyboard_arrow_right"
/>
android:src=
"@drawable/ic_baseline_keyboard_arrow_right"
/>
</LinearLayout>
</LinearLayout>
<View
<View
...
@@ -256,7 +255,7 @@
...
@@ -256,7 +255,7 @@
android:layout_marginStart=
"12dp"
android:layout_marginStart=
"12dp"
android:layout_weight=
"1"
android:layout_weight=
"1"
android:text=
"@string/exit"
android:text=
"@string/exit"
android:textSize=
"
20
sp"
android:textSize=
"
17
sp"
android:textStyle=
"bold"
/>
android:textStyle=
"bold"
/>
<TextView
<TextView
...
...
app/src/main/res/layout/fragment_change_password.xml
View file @
be371d26
...
@@ -8,12 +8,12 @@
...
@@ -8,12 +8,12 @@
android:fitsSystemWindows=
"false"
android:fitsSystemWindows=
"false"
android:orientation=
"vertical"
>
android:orientation=
"vertical"
>
<View
<com.mobiuz.app.dev.ui.home.StatusBarSpacer
android:layout_width=
"match_parent"
android:id=
"@+id/div"
android:id=
"@+id/div"
app:layout_constraintTop_toTopOf=
"parent"
app:layout_constraintTop_toTopOf=
"parent"
android:background=
"@android:color/transparent"
android:layout_width=
"match_parent"
android:layout_height=
"24dp"
/>
android:layout_height=
"wrap_content"
android:background=
"@android:color/transparent"
/>
<FrameLayout
<FrameLayout
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
...
...
app/src/main/res/layout/fragment_check_phone.xml
View file @
be371d26
...
@@ -38,27 +38,44 @@
...
@@ -38,27 +38,44 @@
android:textColor=
"@color/black75"
android:textColor=
"@color/black75"
/>
/>
<com.google.android.material.textfield.TextInputLayout
android:id=
"@+id/layout_input"
<LinearLayout
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:background=
"@drawable/edit_text_unchecked"
android:layout_gravity=
"center"
android:layout_marginHorizontal=
"16dp"
android:layout_marginStart=
"@dimen/_12sdp"
android:layout_marginTop=
"6dp"
android:layout_marginEnd=
"@dimen/_12sdp"
>
android:layout_height=
"wrap_content"
>
<TextView
android:layout_width=
"wrap_content"
android:text=
"+998 "
android:visibility=
"visible"
android:layout_marginStart=
"@dimen/_16sdp"
android:paddingVertical=
"@dimen/_14sdp"
android:textStyle=
"bold"
android:layout_gravity=
"center"
android:textColor=
"@color/black80"
android:textSize=
"17sp"
android:layout_height=
"wrap_content"
/>
<com.github.pinball83.maskededittext.MaskedEditText
<EditText
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
android:id=
"@+id/input_phone"
android:id=
"@+id/input_phone"
android:inputType=
"phone"
android:inputType=
"phone"
app:allowed_chars=
"1234567890"
android:longClickable=
"false"
app:mask=
"+998 ## ### ## ##"
android:maxLength=
"12"
android:paddingVertical=
"@dimen/_14sdp"
android:textStyle=
"bold"
android:textStyle=
"bold"
android:layout_gravity=
"center"
android:imeOptions=
"actionDone"
android:imeOptions=
"actionDone"
app:mask=
"+998 ** *** ** **"
app:notMaskedSymbol=
"*"
android:textSize=
"17sp"
android:textSize=
"17sp"
android:padding=
"@dimen/_14sdp"
android:background=
"@drawable/edit_text_unchecked"
android:background=
"@drawable/edit_text_unchecked"
android:layout_height=
"match_parent"
/>
android:layout_height=
"wrap_content"
/>
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
...
...
app/src/main/res/layout/fragment_home.xml
View file @
be371d26
...
@@ -6,22 +6,35 @@
...
@@ -6,22 +6,35 @@
android:layout_height=
"match_parent"
android:layout_height=
"match_parent"
android:fitsSystemWindows=
"false"
>
android:fitsSystemWindows=
"false"
>
<
ImageView
<
FrameLayout
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
>
android:scaleType=
"fitXY"
android:id=
"@+id/home_image"
<ImageView
android:src=
"@drawable/bgn_home"
/>
android:id=
"@+id/home_image2"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:scaleType=
"fitXY"
android:src=
"@drawable/bgn_home"
/>
<ImageView
android:id=
"@+id/home_image"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:scaleType=
"fitXY"
android:src=
"@drawable/bgn_home"
/>
</FrameLayout>
<LinearLayout
<LinearLayout
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:layout_height=
"match_parent"
android:orientation=
"vertical"
>
android:orientation=
"vertical"
>
<
View
<
com.mobiuz.app.dev.ui.home.StatusBarSpacer
android:id=
"@+id/top_div"
android:id=
"@+id/top_div"
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
android:layout_height=
"
24dp
"
android:layout_height=
"
wrap_content
"
android:background=
"@android:color/transparent"
/>
android:background=
"@android:color/transparent"
/>
<com.google.android.material.appbar.MaterialToolbar
<com.google.android.material.appbar.MaterialToolbar
...
@@ -57,20 +70,21 @@
...
@@ -57,20 +70,21 @@
</LinearLayout>
</LinearLayout>
</com.google.android.material.appbar.MaterialToolbar>
</com.google.android.material.appbar.MaterialToolbar>
<FrameLayout
<FrameLayout
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
android:layout_height=
"0dp"
android:layout_height=
"0dp"
android:layout_weight=
"1"
>
android:layout_weight=
"1"
>
<com.airbnb.lottie.LottieAnimationView
<com.airbnb.lottie.LottieAnimationView
android:id=
"@+id/lottie"
android:layout_width=
"@dimen/_90sdp"
android:layout_width=
"@dimen/_90sdp"
android:layout_height=
"@dimen/_90sdp"
android:layout_height=
"@dimen/_90sdp"
android:adjustViewBounds=
"true"
app:lottie_autoPlay=
"true"
android:id=
"@+id/lottie"
android:visibility=
"invisible"
android:layout_gravity=
"center_horizontal"
android:layout_gravity=
"center_horizontal"
android:layout_marginTop=
"@dimen/_24sdp"
android:layout_marginTop=
"@dimen/_24sdp"
android:adjustViewBounds=
"true"
android:visibility=
"invisible"
app:lottie_autoPlay=
"true"
app:lottie_loop=
"true"
app:lottie_loop=
"true"
app:lottie_rawRes=
"@raw/rifki_loading"
app:lottie_rawRes=
"@raw/rifki_loading"
app:lottie_speed=
"1"
app:lottie_speed=
"1"
...
@@ -78,9 +92,9 @@
...
@@ -78,9 +92,9 @@
<com.xw.repo.widget.BounceScrollView
<com.xw.repo.widget.BounceScrollView
android:id=
"@+id/bounce_scrollView"
android:id=
"@+id/bounce_scrollView"
android:clipToPadding=
"true"
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
>
android:layout_height=
"match_parent"
android:clipToPadding=
"true"
>
<LinearLayout
<LinearLayout
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
...
@@ -190,20 +204,20 @@
...
@@ -190,20 +204,20 @@
android:id=
"@+id/txt_tarif"
android:id=
"@+id/txt_tarif"
android:layout_width=
"wrap_content"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"@string/my_tarif"
android:textSize=
"20sp"
android:textSize=
"20sp"
android:textStyle=
"bold"
/>
android:textStyle=
"bold"
tools:text=
"@string/my_tarif"
/>
<TextView
<TextView
android:id=
"@+id/txt_sum_tariff"
android:layout_width=
"0dp"
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center"
android:layout_gravity=
"center"
android:layout_weight=
"1"
android:layout_weight=
"1"
android:gravity=
"end"
android:gravity=
"end"
android:id=
"@+id/txt_sum_tariff"
android:text=
"@string/sum_month"
android:textColor=
"@color/grey70"
android:textColor=
"@color/grey70"
android:textSize=
"14sp"
/>
android:textSize=
"14sp"
tools:text=
"@string/sum_month"
/>
</LinearLayout>
</LinearLayout>
<View
<View
...
@@ -350,45 +364,80 @@
...
@@ -350,45 +364,80 @@
android:textSize=
"14sp"
/>
android:textSize=
"14sp"
/>
<TextView
<TextView
android:id=
"@+id/txt_tarif_to"
android:layout_width=
"wrap_content"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
android:id=
"@+id/txt_tarif_to"
android:layout_gravity=
"end"
android:layout_gravity=
"end"
tools:text=
"22 Декабря"
/>
tools:text=
"22 Декабря"
/>
</FrameLayout>
</FrameLayout>
</LinearLayout>
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
</com.google.android.material.card.MaterialCardView>
<com.google.android.material.card.MaterialCardView
android:id=
"@+id/card_roaming"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_marginHorizontal=
"16dp"
android:layout_marginTop=
"@dimen/_12sdp"
android:visibility=
"gone"
>
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:paddingVertical=
"10dp"
>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"end"
android:layout_marginStart=
"16dp"
android:text=
"@string/rouming"
android:textColor=
"@color/grey80"
android:textSize=
"14sp"
/>
<TextView
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_gravity=
"end"
android:layout_marginHorizontal=
"16dp"
android:layout_weight=
"1"
android:gravity=
"end"
android:textColor=
"@color/black"
android:textSize=
"14sp"
android:textStyle=
"bold"
tools:text=
"Light Роуминг"
/>
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
<androidx.viewpager2.widget.ViewPager2
<androidx.viewpager2.widget.ViewPager2
android:id=
"@+id/slider"
android:id=
"@+id/slider"
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
android:layout_height=
"180dp"
android:layout_marginStart=
"16dp"
android:layout_marginStart=
"16dp"
android:layout_marginTop=
"@dimen/_16sdp"
android:layout_marginTop=
"@dimen/_16sdp"
/>
android:layout_height=
"180dp"
/>
<com.google.android.material.tabs.TabLayout
<com.google.android.material.tabs.TabLayout
android:id=
"@+id/tabIndicator"
android:id=
"@+id/tabIndicator"
android:backgroundTint=
"@android:color/transparent"
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
android:layout_height=
"24dp"
android:layout_height=
"24dp"
app:tabPaddingStart=
"8dp"
android:layout_gravity=
"center"
android:layout_gravity=
"center"
android:layout_marginHorizontal=
"16dp"
android:layout_marginHorizontal=
"16dp"
android:layout_marginTop=
"8dp"
android:layout_marginTop=
"8dp"
android:layout_marginBottom=
"@dimen/_20sdp"
android:layout_marginBottom=
"@dimen/_20sdp"
app:tabPaddingEnd=
"8dp"
android:backgroundTint=
"@android:color/transparent"
app:tabIndicatorHeight=
"0dp"
app:layout_constraintEnd_toEndOf=
"parent"
app:layout_constraintEnd_toEndOf=
"parent"
app:tabBackground=
"@drawable/tab_indicator"
app:tabBackground=
"@drawable/tab_indicator"
app:tabGravity=
"center"
/>
app:tabGravity=
"center"
app:tabIndicatorHeight=
"0dp"
app:tabPaddingEnd=
"8dp"
app:tabPaddingStart=
"8dp"
/>
</LinearLayout>
</LinearLayout>
</com.xw.repo.widget.BounceScrollView>
</com.xw.repo.widget.BounceScrollView>
</FrameLayout>
</FrameLayout>
</LinearLayout>
</LinearLayout>
</FrameLayout>
</FrameLayout>
\ No newline at end of file
app/src/main/res/layout/fragment_language.xml
View file @
be371d26
...
@@ -5,11 +5,16 @@
...
@@ -5,11 +5,16 @@
android:layout_height=
"match_parent"
android:layout_height=
"match_parent"
android:orientation=
"vertical"
>
android:orientation=
"vertical"
>
<com.mobiuz.app.dev.ui.home.StatusBarSpacer
android:id=
"@+id/top_div"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:background=
"@android:color/transparent"
/>
<com.google.android.material.appbar.MaterialToolbar
<com.google.android.material.appbar.MaterialToolbar
android:id=
"@+id/toolbar"
android:id=
"@+id/toolbar"
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"24dp"
app:navigationIcon=
"@drawable/ic_baseline_arrow_back"
app:navigationIcon=
"@drawable/ic_baseline_arrow_back"
app:title=
"@string/language_app"
/>
app:title=
"@string/language_app"
/>
...
...
app/src/main/res/layout/fragment_login.xml
View file @
be371d26
...
@@ -133,7 +133,7 @@
...
@@ -133,7 +133,7 @@
android:layout_width=
"wrap_content"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
android:padding=
"@dimen/_6sdp"
android:padding=
"@dimen/_6sdp"
android:textSize=
"1
7
sp"
android:textSize=
"1
5
sp"
android:text=
"@string/forget_password"
android:text=
"@string/forget_password"
android:background=
"?android:selectableItemBackground"
android:background=
"?android:selectableItemBackground"
android:textColor=
"@color/grey110"
android:textColor=
"@color/grey110"
...
...
app/src/main/res/layout/fragment_pin.xml
View file @
be371d26
...
@@ -7,11 +7,12 @@
...
@@ -7,11 +7,12 @@
android:background=
"@color/white"
android:background=
"@color/white"
android:fitsSystemWindows=
"false"
android:fitsSystemWindows=
"false"
android:orientation=
"vertical"
>
android:orientation=
"vertical"
>
<View
android:layout_width=
"match_parent"
<com.mobiuz.app.dev.ui.home.StatusBarSpacer
android:id=
"@+id/top_div"
android:id=
"@+id/top_div"
android:visibility=
"gone"
android:layout_width=
"match_parent"
android:layout_height=
"24dp"
/>
android:layout_height=
"wrap_content"
android:background=
"@android:color/transparent"
/>
<com.google.android.material.appbar.MaterialToolbar
<com.google.android.material.appbar.MaterialToolbar
android:id=
"@+id/toolbar"
android:id=
"@+id/toolbar"
...
...
app/src/main/res/layout/fragment_profile.xml
View file @
be371d26
...
@@ -7,10 +7,16 @@
...
@@ -7,10 +7,16 @@
android:fitsSystemWindows=
"false"
android:fitsSystemWindows=
"false"
android:orientation=
"vertical"
>
android:orientation=
"vertical"
>
<com.mobiuz.app.dev.ui.home.StatusBarSpacer
android:id=
"@+id/top_div"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:background=
"@android:color/transparent"
/>
<com.google.android.material.appbar.MaterialToolbar
<com.google.android.material.appbar.MaterialToolbar
android:id=
"@+id/toolbar"
android:id=
"@+id/toolbar"
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
android:layout_marginTop=
"24dp"
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
app:navigationIcon=
"@drawable/ic_baseline_arrow_back"
app:navigationIcon=
"@drawable/ic_baseline_arrow_back"
app:title=
"@string/profile"
/>
app:title=
"@string/profile"
/>
...
...
app/src/main/res/layout/fragment_safety.xml
View file @
be371d26
...
@@ -7,11 +7,16 @@
...
@@ -7,11 +7,16 @@
android:fitsSystemWindows=
"false"
android:fitsSystemWindows=
"false"
android:orientation=
"vertical"
>
android:orientation=
"vertical"
>
<com.mobiuz.app.dev.ui.home.StatusBarSpacer
android:id=
"@+id/top_div"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:background=
"@android:color/transparent"
/>
<com.google.android.material.appbar.MaterialToolbar
<com.google.android.material.appbar.MaterialToolbar
android:id=
"@+id/toolbar"
android:id=
"@+id/toolbar"
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"34dp"
app:navigationIcon=
"@drawable/ic_baseline_arrow_back"
app:navigationIcon=
"@drawable/ic_baseline_arrow_back"
app:title=
"@string/safety"
/>
app:title=
"@string/safety"
/>
...
@@ -38,7 +43,8 @@
...
@@ -38,7 +43,8 @@
android:orientation=
"vertical"
>
android:orientation=
"vertical"
>
<LinearLayout
<LinearLayout
android:id=
"@+id/btn_1"
android:id=
"@+id/btn_biometric"
android:visibility=
"visible"
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"30dp"
android:layout_marginTop=
"30dp"
...
...
app/src/main/res/layout/fragment_service.xml
View file @
be371d26
...
@@ -10,10 +10,15 @@
...
@@ -10,10 +10,15 @@
<LinearLayout
<LinearLayout
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
android:paddingTop=
"@dimen/_30sdp"
android:fitsSystemWindows=
"false"
android:fitsSystemWindows=
"false"
android:orientation=
"vertical"
>
android:orientation=
"vertical"
>
<com.mobiuz.app.dev.ui.home.StatusBarSpacer
android:id=
"@+id/top_div"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:background=
"@android:color/transparent"
/>
<LinearLayout
<LinearLayout
android:id=
"@+id/layout_offline"
android:id=
"@+id/layout_offline"
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
...
...
app/src/main/res/layout/fragment_support.xml
View file @
be371d26
...
@@ -6,11 +6,16 @@
...
@@ -6,11 +6,16 @@
android:orientation=
"vertical"
android:orientation=
"vertical"
xmlns:app=
"http://schemas.android.com/apk/res-auto"
>
xmlns:app=
"http://schemas.android.com/apk/res-auto"
>
<com.mobiuz.app.dev.ui.home.StatusBarSpacer
android:id=
"@+id/top_div"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:background=
"@android:color/transparent"
/>
<com.google.android.material.appbar.MaterialToolbar
<com.google.android.material.appbar.MaterialToolbar
android:id=
"@+id/toolbar"
android:id=
"@+id/toolbar"
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
app:title=
"@string/support"
app:title=
"@string/support"
android:layout_marginTop=
"24dp"
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
app:navigationIcon=
"@drawable/ic_baseline_arrow_back"
app:navigationIcon=
"@drawable/ic_baseline_arrow_back"
/>
/>
...
...
app/src/main/res/layout/fragment_ussd.xml
View file @
be371d26
...
@@ -11,11 +11,16 @@
...
@@ -11,11 +11,16 @@
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
android:background=
"@color/white100"
>
android:background=
"@color/white100"
>
<com.mobiuz.app.dev.ui.home.StatusBarSpacer
android:id=
"@+id/top_div"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:background=
"@android:color/transparent"
/>
<com.google.android.material.appbar.MaterialToolbar
<com.google.android.material.appbar.MaterialToolbar
android:id=
"@+id/toolbar"
android:id=
"@+id/toolbar"
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginTop=
"24dp"
android:background=
"@color/white100"
android:background=
"@color/white100"
android:elevation=
"0dp"
android:elevation=
"0dp"
app:navigationIcon=
"@drawable/ic_baseline_arrow_back"
app:navigationIcon=
"@drawable/ic_baseline_arrow_back"
...
...
app/src/main/res/layout/item_home.xml
View file @
be371d26
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<
Linear
Layout
xmlns:android=
"http://schemas.android.com/apk/res/android"
<
Frame
Layout
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:app=
"http://schemas.android.com/apk/res-auto"
xmlns:app=
"http://schemas.android.com/apk/res-auto"
xmlns:tools=
"http://schemas.android.com/tools"
xmlns:tools=
"http://schemas.android.com/tools"
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:layout_height=
"match_parent"
android:orientation=
"vertical"
>
android:orientation=
"vertical"
>
<ImageView
android:layout_width=
"match_parent"
android:id=
"@+id/image_slider"
android:scaleType=
"centerCrop"
android:layout_marginEnd=
"16dp"
android:src=
"@drawable/image_slider1"
android:layout_height=
"200dp"
/>
<LinearLayout
<LinearLayout
android:layout_width=
"match_parent"
android:layout_width=
"match_parent"
android:paddingVertical=
"@dimen/_16sdp"
android:paddingVertical=
"@dimen/_16sdp"
android:layout_height=
"180dp"
android:layout_height=
"200dp"
android:layout_marginEnd=
"16dp"
android:id=
"@+id/image_slider"
android:paddingHorizontal=
"12dp"
android:paddingHorizontal=
"12dp"
android:background=
"@drawable/image_slider1"
android:orientation=
"vertical"
>
android:orientation=
"vertical"
>
<ImageView
<ImageView
...
@@ -67,4 +72,4 @@
...
@@ -67,4 +72,4 @@
</LinearLayout>
</LinearLayout>
</LinearLayout>
</FrameLayout>
\ No newline at end of file
\ No newline at end of file
app/src/main/res/values-en/strings.xml
View file @
be371d26
...
@@ -138,6 +138,7 @@
...
@@ -138,6 +138,7 @@
<string
name=
"pay_balance"
>
Update balance
</string>
<string
name=
"pay_balance"
>
Update balance
</string>
<string
name=
"more_know"
>
To learn more
</string>
<string
name=
"more_know"
>
To learn more
</string>
<string
name=
"check_internet_and_try_again"
>
Check your internet connection and try again
</string>
<string
name=
"check_internet_and_try_again"
>
Check your internet connection and try again
</string>
<string
name=
"to_settings"
>
To use the biometric data, you need to configure it from the settings section
</string>
</resources>
</resources>
\ No newline at end of file
app/src/main/res/values-ru/strings.xml
View file @
be371d26
...
@@ -138,6 +138,7 @@
...
@@ -138,6 +138,7 @@
<string
name=
"pay_balance"
>
Пополнить баланс
</string>
<string
name=
"pay_balance"
>
Пополнить баланс
</string>
<string
name=
"more_know"
>
Узнать больше
</string>
<string
name=
"more_know"
>
Узнать больше
</string>
<string
name=
"check_internet_and_try_again"
>
Проверьте подключение к Интернету и попробуйте еще раз
</string>
<string
name=
"check_internet_and_try_again"
>
Проверьте подключение к Интернету и попробуйте еще раз
</string>
<string
name=
"to_settings"
>
Чтобы использовать биометрические данные, вам необходимо настроить их в разделе настроек.
</string>
</resources>
</resources>
\ No newline at end of file
app/src/main/res/values-uz/strings.xml
View file @
be371d26
...
@@ -138,5 +138,6 @@
...
@@ -138,5 +138,6 @@
<string
name=
"pay_balance"
>
Hisobni to\'ldirish
</string>
<string
name=
"pay_balance"
>
Hisobni to\'ldirish
</string>
<string
name=
"more_know"
>
Ko\'proq bilish
</string>
<string
name=
"more_know"
>
Ko\'proq bilish
</string>
<string
name=
"check_internet_and_try_again"
>
Internet ulanishini tekshirib qayta urinib ko\'ring
</string>
<string
name=
"check_internet_and_try_again"
>
Internet ulanishini tekshirib qayta urinib ko\'ring
</string>
<string
name=
"to_settings"
>
Biometric ma\'lumotlardan foydalanish uchun sozlanmalar bo\'limidan sozlashingiz kerak
</string>
</resources>
</resources>
\ No newline at end of file
app/src/main/res/values/strings.xml
View file @
be371d26
<resources>
<resources>
<string
name=
"app_name"
translatable=
"false"
>
Mobi
Uz-Android
</string>
<string
name=
"app_name"
translatable=
"false"
>
Mobi
uz
</string>
<!-- TODO: Remove or change this placeholder text -->
<!-- TODO: Remove or change this placeholder text -->
<string
name=
"hello_blank_fragment"
translatable=
"false"
>
Hello blank fragment
</string>
<string
name=
"hello_blank_fragment"
translatable=
"false"
>
Hello blank fragment
</string>
<string
name=
"login"
>
Login
</string>
<string
name=
"login"
>
Login
</string>
...
@@ -163,5 +163,7 @@
...
@@ -163,5 +163,7 @@
<string
name=
"powered_by"
translatable=
"false"
>
Powered by
</string>
<string
name=
"powered_by"
translatable=
"false"
>
Powered by
</string>
<string
name=
"more_know"
>
Узнать больше
</string>
<string
name=
"more_know"
>
Узнать больше
</string>
<string
name=
"check_internet_and_try_again"
>
Internet ulanishini tekshirib qayta urinib ko\'ring
</string>
<string
name=
"check_internet_and_try_again"
>
Internet ulanishini tekshirib qayta urinib ko\'ring
</string>
<string
name=
"to_settings"
>
Biometric ma\'lumotlardan foydalanish uchun sozlanmalar bo\'limidan sozlashingiz kerak
</string>
<string
name=
"rouming"
>
Роуминг
</string>
</resources>
</resources>
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment