Commit 0ce41d2e authored by shohboz's avatar shohboz

[ADD] MUS-107 Feature, home page apis

parent d1c07931
......@@ -2,17 +2,26 @@ package uz.ssd.mobiuz
import android.graphics.Color
import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.LiveData
import androidx.navigation.NavController
import com.google.android.material.bottomnavigation.BottomNavigationView
import dagger.hilt.android.AndroidEntryPoint
import uz.ssd.mobiuz.databinding.ActivityMainBinding
import uz.ssd.mobiuz.model.SharedPref
import uz.ssd.mobiuz.ui.auth.FullScreenDialog
import uz.ssd.mobiuz.utils.CONSTANTS
import uz.ssd.mobiuz.utils.extensions.customLog
import uz.ssd.mobiuz.utils.extensions.setupWithNavController
import javax.inject.Inject
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject
lateinit var pref: SharedPref
private var _bn: ActivityMainBinding? = null
private val bn get() = _bn ?: throw NullPointerException("cannot inflate")
......@@ -30,9 +39,17 @@ class MainActivity : AppCompatActivity() {
setupBottomNavigationBar()
}
intent?.let {
val arg = it.getStringExtra(CONSTANTS.FIRST) ?: ""
if (arg.isEmpty()) {
val dialog = FullScreenDialog()
dialog.setOnPinDoneListener { }
dialog.show(supportFragmentManager, "tag")
}
}
customLog("token: ${pref.getUserToken()}")
}
private fun setupBottomNavigationBar() {
try {
bottomNavigationView = findViewById(R.id.bottom_nav_view)
......
......@@ -8,6 +8,7 @@ import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.delay
import uz.ssd.mobiuz.databinding.ActivitySplashBinding
import uz.ssd.mobiuz.model.SharedPref
import uz.ssd.mobiuz.utils.CONSTANTS
import javax.inject.Inject
@AndroidEntryPoint
......@@ -26,10 +27,22 @@ class SplashActivity : AppCompatActivity() {
lifecycleScope.launchWhenCreated {
delay(1000)
if (pref.language.isEmpty()) {
startActivity(Intent(this@SplashActivity, LanguageActivity::class.java))
} else {
startActivity(Intent(this@SplashActivity, AuthActivity::class.java))
when {
pref.language.isEmpty() -> {
startActivity(Intent(this@SplashActivity, LanguageActivity::class.java))
}
!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))
}
else -> {
startActivity(Intent(this@SplashActivity, MainActivity::class.java))
}
}
finish()
}
......
......@@ -14,9 +14,12 @@ import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
import retrofit2.adapter.rxjava3.RxJava3CallAdapterFactory
import retrofit2.converter.gson.GsonConverterFactory
import uz.ssd.mobiuz.BuildConfig
import uz.ssd.mobiuz.model.SharedPref
import uz.ssd.mobiuz.network.api.ApiService
import uz.ssd.mobiuz.utils.CONSTANTS
import uz.ssd.mobiuz.utils.Utils
import java.util.*
import javax.inject.Singleton
@Module
......@@ -52,7 +55,7 @@ class ServerModule {
val builder = chain.request().newBuilder()
builder.header("Content-Type", "application/x-www-form-urlencoded")
builder.header("Lang", sharedPref.language)
builder.header("device-id", Build.DEVICE)
builder.header("device-id", Utils.getDeviceName())
builder.header("Accept", "application/json")
builder.header("Authorization", "Bearer ${sharedPref.getUserToken()}")
chain.proceed(builder.build())
......
......@@ -17,14 +17,6 @@ class SharedPref @Inject constructor(@ApplicationContext context: Context) {
return mySharedPref.getString("device_token", null)
}
fun setUserId(id: Int) {
mySharedPref.edit().putInt("user_id", id).apply()
}
fun getUserId(): Int {
return mySharedPref.getInt("user_id", 0)
}
fun setUserToken(token: String?) {
mySharedPref.edit().putString("user_token", token).apply()
}
......@@ -45,4 +37,16 @@ class SharedPref @Inject constructor(@ApplicationContext context: Context) {
mySharedPref.edit().putString(::pin_code.name, value).apply()
}
var isRegistered: Boolean
get() = mySharedPref.getBoolean("isRegistered", false)
set(value) {
mySharedPref.edit().putBoolean("isRegistered", value).apply()
}
var userPhone: String
get() = mySharedPref.getString(::userPhone.name, "")?:""
set(value) {
mySharedPref.edit().putString(::userPhone.name, value).apply()
}
}
\ No newline at end of file
......@@ -3,10 +3,8 @@ package uz.ssd.mobiuz.network.api
import retrofit2.http.Body
import retrofit2.http.POST
import uz.ssd.mobiuz.model.UserAuth
import uz.ssd.mobiuz.network.model.Action
import uz.ssd.mobiuz.network.model.GenerateToken
import uz.ssd.mobiuz.network.model.ResponseList
import uz.ssd.mobiuz.network.model.ResponseObject
import uz.ssd.mobiuz.network.model.*
interface ApiService {
......@@ -29,4 +27,7 @@ interface ApiService {
suspend fun checkSMSCode(
@Body req: UserAuth
): ResponseObject<GenerateToken>
@POST("main/index")
suspend fun mainIndex(): ResponseObject<Customer>
}
\ No newline at end of file
package uz.ssd.mobiuz.network.model
data class Customer(
var customer: CustomerData
)
data class CustomerData(
var info: CustomerInfo,
var name: String
)
data class CustomerInfo(
var balance: CustomerInfoBalance,
var counters: CustomerInfoCounters
)
data class CustomerInfoBalance(
var amount: String,
var currency: String
)
data class CustomerInfoCounters(
var BYTE: CodeValueUnit,
var ITEM: CodeValueUnit,
var SECOND: CodeValueUnit
)
data class CodeValueUnit(
var code: String,
var value: Int,
var unit: String,
)
\ No newline at end of file
......@@ -4,6 +4,7 @@ package uz.ssd.mobiuz.network.model
sealed class UiStateList<out T> {
data class SUCCESS<out T>(val data: List<T>) : UiStateList<T>()
data class ERROR(val message: String, var fromServer: Boolean = false) : UiStateList<Nothing>()
data class ERRORS(val errors: List<Errors>) : UiStateObject<Nothing>()
object LOADING : UiStateList<Nothing>()
object EMPTY : UiStateList<Nothing>()
}
\ No newline at end of file
......@@ -3,6 +3,7 @@ package uz.ssd.mobiuz.network.model
sealed class UiStateObject<out T> {
data class SUCCESS<out T>(val data: T) : UiStateObject<T>()
data class ERROR(val message: String,var fromServer: Boolean = false) : UiStateObject<Nothing>()
data class ERRORS(val errors: List<Errors>) : UiStateObject<Nothing>()
object LOADING : UiStateObject<Nothing>()
object EMPTY : UiStateObject<Nothing>()
}
\ No newline at end of file
package uz.ssd.mobiuz.ui.auth
import android.os.Bundle
import android.view.View
import android.view.animation.AnimationUtils
import android.widget.TextView
import androidx.core.view.isVisible
import androidx.fragment.app.DialogFragment
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.delay
import uz.ssd.mobiuz.R
import uz.ssd.mobiuz.databinding.FragmentPinDialogBinding
import uz.ssd.mobiuz.model.PinData
import uz.ssd.mobiuz.model.SharedPref
import uz.ssd.mobiuz.utils.extensions.SingleBlock
import javax.inject.Inject
@AndroidEntryPoint
class FullScreenDialog : DialogFragment(R.layout.fragment_pin_dialog) {
@Inject
lateinit var pref: SharedPref
private var _bn: FragmentPinDialogBinding? = null
private val bn get() = _bn ?: throw NullPointerException("cannot inflate")
private val data = ArrayList<PinData>()
private val pinAdapter = PinAdapter()
private var listener: SingleBlock<Unit>? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setStyle(STYLE_NO_TITLE,R.style.FullScreenDialog)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
_bn = FragmentPinDialogBinding.bind(view)
setUpUI()
}
fun setUpUI() {
bn.apply {
loadData()
rvPin.layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)
rvPin.adapter = pinAdapter
txtNotPin.isVisible = false
pinAdapter.setOnDoneListener {
lifecycleScope.launchWhenCreated {
delay(200)
if (pref.pin_code == it) {
listener?.invoke(Unit)
txtNotPin.isVisible = false
dismiss()
} else {
cardPin.startAnimation(AnimationUtils.loadAnimation(context, R.anim.shake))
txtNotPin.isVisible = true
}
}
}
for (i in 0 until btnViewGroup.childCount) {
btnViewGroup.getChildAt(i).setOnClickListener {
if (it.id == R.id.btn_remove) {
pinAdapter.removeItem()
txtNotPin.isVisible = false
} 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)
}
fun setOnPinDoneListener(block: SingleBlock<Unit>) {
listener = block
}
override fun onDestroy() {
_bn = null
super.onDestroy()
}
}
package uz.ssd.mobiuz.ui.base
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.DialogFragment
import uz.ssd.mobiuz.R
import uz.ssd.mobiuz.databinding.LayoutExitBinding
import uz.ssd.mobiuz.utils.extensions.SingleBlock
class ExitDialog : DialogFragment() {
private var doneListener: SingleBlock<Boolean>? = null
private var _bn: LayoutExitBinding? = null
private val bn get() = _bn!!
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setStyle(STYLE_NO_TITLE, R.style.CustomDialog)
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_bn = LayoutExitBinding.inflate(inflater, container, false)
return bn.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
isCancelable = false
bn.apply {
btnCancel.setOnClickListener {
dismiss()
}
btnDone.setOnClickListener {
doneListener?.invoke(true)
dismiss()
}
}
}
fun setOnDoneListener(block: SingleBlock<Boolean>) {
doneListener = block
}
override fun onDestroy() {
super.onDestroy()
_bn = null
}
}
\ No newline at end of file
package uz.ssd.mobiuz.utils.extensions
import java.text.DecimalFormat
import java.text.DecimalFormatSymbols
import java.util.*
fun Number.toMoneyFormat(): String {
return String.format(
DecimalFormat(
"#,###.##",
DecimalFormatSymbols(Locale("ru", "RU"))
).format(this)
)
}
fun String.toMoneyFormat(): String {
return try {
val number = this.toFloat()
number.toMoneyFormat()
} catch (e: Exception) {
this
}
}
fun String.currencyFormat():String{
val format = this.replace(",","")
return DecimalFormat("###,###,###").format(format.toDouble())
}
This diff is collapsed.
This diff is collapsed.
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.motion.widget.MotionLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/motionLayout"
android:orientation="vertical"
android:scrollbars="vertical"
android:fitsSystemWindows="false"
app:layoutDescription="@xml/home_motion_scene">
<ImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="@dimen/_240sdp"
android:src="@drawable/bgn_home"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.motion.widget.MotionLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<MotionScene
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:motion="http://schemas.android.com/apk/res-auto">
<Transition
motion:constraintSetEnd="@+id/end"
motion:constraintSetStart="@id/start"
motion:motionInterpolator="linear"
motion:duration="1000">
<KeyFrameSet>
</KeyFrameSet>
</Transition>
<ConstraintSet android:id="@+id/start">
</ConstraintSet>
<ConstraintSet android:id="@+id/end">
</ConstraintSet>
</MotionScene>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment