Integration of get user data api call on SplashFragment

BottomNav on HomeActivity
Worked on sidebar menu
- sidebar implementation
- ui for user data
- theme switching
- language switching
This commit is contained in:
2024-05-15 21:04:35 +05:30
parent 6153339bea
commit d4ac42b62a
49 changed files with 499 additions and 20 deletions

View File

@@ -1,30 +1,97 @@
package com.woka.home
import android.graphics.Color
import android.os.Bundle
import android.util.Log
import android.view.Gravity
import android.view.View.GONE
import android.view.View.VISIBLE
import android.view.WindowManager
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.core.view.GravityCompat
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.Observer
import com.bumptech.glide.Glide
import com.woka.R
import com.woka.WokaApp.Companion.userPrefs
import com.woka.databinding.ActivityHomeBinding
import com.woka.mvvm.userDataModels.UserDataResponse
import com.woka.networking.ApiResult
import com.woka.utils.TAG
import kotlinx.coroutines.launch
import com.woka.utils.UserType
import com.woka.utils.WokaBaseActivity
import com.woka.utils.toast
class HomeActivity : AppCompatActivity() {
class HomeActivity : WokaBaseActivity(), Observer<ApiResult<UserDataResponse>> {
private lateinit var binding: ActivityHomeBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContentView(R.layout.activity_home)
binding = ActivityHomeBinding.inflate(layoutInflater)
setContentView(binding.root)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
Log.d(TAG, "onCreate: ${userPrefs?.userType} ${userPrefs?.accessToken}")
userPrefs?.userLiveData?.observe(this, this)
initViews()
clickEvents()
}
private fun initViews() {
binding.apply {
bottomNav.setOnItemSelectedListener {
if (bottomNav.selectedItemId != it.itemId)
toast(it.title.toString())
true
}
}
}
private fun clickEvents() {
binding.apply {
sideMenu.setOnClickListener {
homeDrawer.openDrawer(GravityCompat.END)
}
closeDrawer.setOnClickListener {
homeDrawer.closeDrawer(GravityCompat.END)
}
}
}
override fun onChanged(value: ApiResult<UserDataResponse>) {
when(value){
is ApiResult.Error -> {}
is ApiResult.Loading -> {}
is ApiResult.Success -> {
Log.d(TAG, "onChanged: ${value.data?.result}")
value.data?.result?.let {
binding.apply {
it.avtar?.let {
Glide.with(this@HomeActivity)
.load(it)
.placeholder(R.drawable.profile_placeholder)
.error(R.drawable.profile_placeholder)
.into(sbUserImage)
}
sbUserName.text = it.fullname
sbBtn.text = getString(R.string.logout)
}
}
}
}
}
}

View File

@@ -7,7 +7,7 @@ data class UserData(
val child_detail: ChildDetail?,
val email: String?,
val fullname: String?,
val gender: Gender?,
val gender: String?,
val id: Int?,
val is_active: String?,
val language: Language?,

View File

@@ -1,23 +1,36 @@
package com.woka.onboard.fragments
import android.animation.Animator
import android.content.Intent
import android.media.MediaPlayer
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.animation.Animation
import android.view.animation.Animation.AnimationListener
import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer
import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.FragmentNavigatorExtras
import androidx.navigation.fragment.findNavController
import com.woka.R
import com.woka.WokaApp.Companion.userPrefs
import com.woka.databinding.FragmentSplashBinding
import com.woka.home.HomeActivity
import com.woka.mvvm.userDataModels.UserDataResponse
import com.woka.networking.ApiResult
import com.woka.utils.TAG
import com.woka.utils.UserType
import com.woka.utils.toast
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
/*
Root fragment to the launcher activity i.e. WelcomeActivity
*/
class SplashFragment : Fragment() {
class SplashFragment : Fragment(), Observer<ApiResult<UserDataResponse>> {
private lateinit var binding: FragmentSplashBinding
@@ -38,11 +51,10 @@ class SplashFragment : Fragment() {
animateLogo()
lifecycleScope.launch {
delay(6000)
val extras = FragmentNavigatorExtras(binding.logo to "logo")
findNavController().navigate(R.id.action_splashFragment_to_languageFragment,
null, null, extras)
if (userPrefs?.userType == UserType.CHILD || userPrefs?.userType == UserType.GUARDIAN){
// some type of user is logged in
// thus, loading data
userPrefs?.loadUserData()
}
}
@@ -54,6 +66,25 @@ class SplashFragment : Fragment() {
private fun animateLogo() {
binding.logo.animate().scaleXBy(1f).scaleYBy(1f)
.setDuration(2000)
.setListener(object : Animator.AnimatorListener{
override fun onAnimationStart(animation: Animator) {}
override fun onAnimationEnd(animation: Animator) {
lifecycleScope.launch {
delay(2000)
if (userPrefs?.userType == UserType.NONE || userPrefs?.userType == UserType.GUEST){
// no user or guest is logged in
goForward()
}else{
// some user is logged in listening to user data
userPrefs?.userLiveData?.removeObserver(this@SplashFragment)
userPrefs?.userLiveData?.observe(viewLifecycleOwner, this@SplashFragment)
}
}
}
override fun onAnimationCancel(animation: Animator) {}
override fun onAnimationRepeat(animation: Animator) {}
})
.start()
}
@@ -63,4 +94,35 @@ class SplashFragment : Fragment() {
player?.release()
player = null
}
private fun goForward(){
if (userPrefs?.userType == UserType.NONE){
// none of the user is logged in
// going through normal onboard process
val extras = FragmentNavigatorExtras(binding.logo to "logo")
findNavController().navigate(R.id.action_splashFragment_to_languageFragment,
null, null, extras)
}else{
// going to home activity as any of the user is logged in
activity?.let {
startActivity(Intent(it, HomeActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
})
it.finish()
}
}
}
override fun onChanged(value: ApiResult<UserDataResponse>) {
// on user data loaded
when (value){
is ApiResult.Error -> {
toast(value.errorMessage)
}
is ApiResult.Loading -> {}
is ApiResult.Success -> {
goForward()
}
}
}
}