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