HomeActivity creation and connection

get user api integration in UserPreference.kte
This commit is contained in:
2024-05-14 20:41:17 +05:30
parent a57e46f01d
commit 6153339bea
31 changed files with 300 additions and 58 deletions

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
xmlns:tools="http://schemas.android.com/tools" >
<uses-permission android:name="android.permission.INTERNET" />
@@ -14,7 +14,7 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Woka"
tools:targetApi="31">
tools:targetApi="31" >
<activity
android:name=".home.HomeActivity"
android:exported="false" />
@@ -27,7 +27,7 @@
android:name=".onboard.WelcomeActivity"
android:exported="true"
android:screenOrientation="portrait"
android:theme="@style/Theme.App.Starting">
android:theme="@style/Theme.App.Starting" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

View File

@@ -1,13 +1,20 @@
package com.woka.home
import android.os.Bundle
import android.util.Log
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.lifecycle.lifecycleScope
import com.woka.R
import com.woka.WokaApp.Companion.userPrefs
import com.woka.networking.ApiResult
import com.woka.utils.TAG
import kotlinx.coroutines.launch
class HomeActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
@@ -17,5 +24,7 @@ class HomeActivity : AppCompatActivity() {
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
Log.d(TAG, "onCreate: ${userPrefs?.userType} ${userPrefs?.accessToken}")
}
}

View File

@@ -0,0 +1,12 @@
package com.woka.mvvm
import com.woka.mvvm.userDataModels.UserDataResponse
import com.woka.networking.ApiResponse
import retrofit2.Response
import retrofit2.http.GET
interface UserApiService {
@GET("get_user_data")
suspend fun getUserData(): Response<ApiResponse<UserDataResponse>>
}

View File

@@ -0,0 +1,14 @@
package com.woka.mvvm
import com.woka.mvvm.userDataModels.UserDataResponse
import com.woka.networking.ApiResult
import com.woka.networking.RetrofitHelper.handleApiCall
class UserRepository(private val userApiService: UserApiService) {
suspend fun getUserData(): ApiResult<UserDataResponse>{
return handleApiCall{
userApiService.getUserData()
}
}
}

View File

@@ -0,0 +1,8 @@
package com.woka.mvvm.userDataModels
data class ChildDetail(
val avatar_name: String?,
val id: Int?,
val interest_topic: List<InterestTopic?>?,
val user_id: Int?
)

View File

@@ -0,0 +1,6 @@
package com.woka.mvvm.userDataModels
data class Gender(
val gender_name: String?,
val id: Int?
)

View File

@@ -0,0 +1,6 @@
package com.woka.mvvm.userDataModels
data class InterestTopic(
val id: Int?,
val topic_name: String?
)

View File

@@ -0,0 +1,6 @@
package com.woka.mvvm.userDataModels
data class Language(
val id: Int?,
val language_name: String?
)

View File

@@ -1,10 +1,10 @@
package com.woka.onboard.models
package com.woka.mvvm.userDataModels
data class Result(
data class UserData(
val already_logged_in: Boolean,
val avtar: String?,
val birthdate: String?,
val child_detail: Any?,
val child_detail: ChildDetail?,
val email: String?,
val fullname: String?,
val gender: Gender?,
@@ -14,6 +14,6 @@ data class Result(
val language_master_id: Int?,
val last_login: String?,
val remember_token: String?,
val user_type: String?,
val user_type: Int?,
val username: String?
)

View File

@@ -0,0 +1,7 @@
package com.woka.mvvm.userDataModels
data class UserDataResponse(
val result: UserData?,
val userNotificationData: UserNotificationData?,
val userNotificationsCount: Int?
)

View File

@@ -0,0 +1,15 @@
package com.woka.mvvm.userDataModels
data class UserNotificationData(
val created_at: String?,
val description: String?,
val image_url: String?,
val is_home_notification_read: Int?,
val is_read: Int?,
val is_specific_time_notification: Int?,
val link: Any?,
val post_type: Int?,
val title: String?,
val type: String?,
val user_id: Int?
)

View File

@@ -8,6 +8,7 @@ import com.woka.WokaApp.Companion.userPrefs
import com.woka.onboard.models.LoginResponse
import com.woka.utils.NO_INTERNET_MESSAGE
import com.woka.utils.UNKNOWN_ERROR_MESSAGE
import com.woka.utils.UserType
import kotlinx.coroutines.delay
import okhttp3.Credentials
import okhttp3.Interceptor
@@ -41,6 +42,12 @@ object RetrofitHelper {
request.addHeader("device-id", userPrefs?.deviceId!!)
request.addHeader("Authorization", Credentials.basic(BuildConfig.WOKA_USER_NAME, BuildConfig.WOKA_PASSWORD))
if (userPrefs?.userType == UserType.CHILD || userPrefs?.userType == UserType.GUARDIAN){
userPrefs?.accessToken?.let {
request.addHeader("access-token", it)
}
}
chain.proceed(request.build())
})

View File

@@ -1,5 +1,6 @@
package com.woka.onboard.fragments
import android.content.Intent
import android.graphics.Color
import android.os.Bundle
import android.transition.TransitionInflater
@@ -8,16 +9,28 @@ import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.fragment.findNavController
import com.google.android.material.tabs.TabLayoutMediator
import com.woka.R
import com.woka.WokaApp.Companion.userPrefs
import com.woka.databinding.FragmentOnboardBinding
import com.woka.home.HomeActivity
import com.woka.networking.ApiResult
import com.woka.onboard.OnboardingAdapter
import com.woka.onboard.mvvm.OnboardViewModel
import com.woka.utils.ProgressView
import com.woka.utils.UserType
import com.woka.utils.toast
class OnboardFragment : Fragment() {
private lateinit var binding: FragmentOnboardBinding
private lateinit var viewModel: OnboardViewModel
private lateinit var progressView: ProgressView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
sharedElementEnterTransition = TransitionInflater.from(context).inflateTransition(android.R.transition.move)
@@ -28,8 +41,13 @@ class OnboardFragment : Fragment() {
savedInstanceState: Bundle?
): View? {
binding = FragmentOnboardBinding.inflate(inflater, container, false)
activity?.window?.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
activity?.window?.statusBarColor = Color.parseColor("#55cffe")
activity?.let {
it.window?.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
it.window?.statusBarColor = Color.parseColor("#55cffe")
viewModel = ViewModelProvider(it)[OnboardViewModel::class.java]
progressView = ProgressView(it)
}
return binding.root
}
@@ -39,6 +57,40 @@ class OnboardFragment : Fragment() {
initViews()
clickEvents()
viewModel.guestLogin.observe(viewLifecycleOwner){
when(it){
is ApiResult.Error -> {
progressView.hide()
toast(it.errorMessage)
}
is ApiResult.Loading -> {
progressView.show(getString(R.string.please_wait))
}
is ApiResult.Success -> {
progressView.hide()
it.data?.let {data ->
toast(it.message)
userPrefs?.userType = UserType.GUEST
userPrefs?.guestUserName = data.fullname
activity?.let { activity->
startActivity(Intent(activity, HomeActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
})
activity.finish()
}
}
}
null -> {}
}
}
}
override fun onDestroyView() {
super.onDestroyView()
viewModel.clearGuestLoginData()
}
private fun initViews() {
@@ -62,6 +114,10 @@ class OnboardFragment : Fragment() {
login.setOnClickListener {
findNavController().navigate(R.id.action_onboardFragment_to_signInFragment)
}
guest.setOnClickListener {
viewModel.guestLogin()
}
}
}
}

View File

@@ -21,6 +21,7 @@ import com.woka.onboard.models.RegisterRequestData
import com.woka.onboard.mvvm.OnboardViewModel
import com.woka.utils.Gender
import com.woka.utils.ProgressView
import com.woka.utils.UserType
import com.woka.utils.toast
import java.text.SimpleDateFormat
import java.util.Locale
@@ -136,8 +137,17 @@ class SelectAvatarFragment : Fragment() {
activity?.let {activity ->
toast(it.message)
startActivity(Intent(activity, HomeActivity::class.java))
activity.finish()
it.data?.result?.let { result->
// saving to user prefs
userPrefs?.accessToken = result.remember_token?:"no_token_received"
userPrefs?.userType = UserType.createUserType(result.user_type)
startActivity(Intent(activity, HomeActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
})
activity.finish()
}
}
}
null -> {}

View File

@@ -1,5 +1,6 @@
package com.woka.onboard.fragments
import android.content.Intent
import android.graphics.Color
import android.os.Bundle
import androidx.fragment.app.Fragment
@@ -11,12 +12,15 @@ import android.widget.Toast
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.fragment.findNavController
import com.woka.R
import com.woka.WokaApp.Companion.userPrefs
import com.woka.databinding.FragmentSignInBinding
import com.woka.home.HomeActivity
import com.woka.networking.ApiResult
import com.woka.onboard.fragments.GetEmailFragment.Companion.IS_RESET_PASSWORD_INTENT
import com.woka.onboard.mvvm.OnboardViewModel
import com.woka.utils.DecisionDialog
import com.woka.utils.ProgressView
import com.woka.utils.UserType
import com.woka.utils.toast
class SignInFragment : Fragment() {
@@ -80,6 +84,12 @@ class SignInFragment : Fragment() {
dialog.show()
}else{
toast(it.message)
// saving to user prefs
userPrefs?.accessToken = data.remember_token?:"no_value_received"
userPrefs?.userType = UserType.createUserType(data.user_type)
gotoHomeActivity()
}
}
}
@@ -100,6 +110,7 @@ class SignInFragment : Fragment() {
is ApiResult.Success -> {
progressView.hide()
toast(it.message)
gotoHomeActivity()
}
null -> {}
}
@@ -145,4 +156,13 @@ class SignInFragment : Fragment() {
}
}
}
private fun gotoHomeActivity(){
activity?.let { activity->
startActivity(Intent(activity, HomeActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
})
activity.finish()
}
}
}

View File

@@ -1,6 +0,0 @@
package com.woka.onboard.models
data class Gender(
val gender_name: String,
val id: Int
)

View File

@@ -1,6 +0,0 @@
package com.woka.onboard.models
data class GenderX(
val gender_name: String,
val id: Int
)

View File

@@ -0,0 +1,6 @@
package com.woka.onboard.models
data class Guest(
val fullname: String?,
val username: String?
)

View File

@@ -1,6 +0,0 @@
package com.woka.onboard.models
data class Language(
val id: Int,
val language_name: String
)

View File

@@ -1,6 +0,0 @@
package com.woka.onboard.models
data class LanguageX(
val id: Int,
val language_name: String
)

View File

@@ -1,4 +1,7 @@
package com.woka.onboard.models
import com.woka.mvvm.userDataModels.UserData
data class LoginResponse(
val result: Result?
val result: UserData?
)

View File

@@ -1,18 +0,0 @@
package com.woka.onboard.models
data class RegisterData(
val already_logged_in: Boolean,
val avtar: String,
val birthdate: String,
val child_detail: Any,
val email: String,
val fullname: String,
val gender: GenderX,
val id: Int,
val language: LanguageX,
val language_master_id: Int,
val last_login: String,
val remember_token: String,
val user_type: String,
val username: String
)

View File

@@ -1,5 +1,7 @@
package com.woka.onboard.models
import com.woka.mvvm.userDataModels.UserData
data class RegisterResponse(
val result: RegisterData
val result: UserData
)

View File

@@ -4,6 +4,7 @@ import com.woka.networking.ApiResponse
import com.woka.onboard.models.AvatarList
import com.woka.onboard.models.ChildListResponse
import com.woka.onboard.models.ForgotPasswrodOTPResponse
import com.woka.onboard.models.Guest
import com.woka.onboard.models.InterestTopicResponse
import com.woka.onboard.models.LoginResponse
import com.woka.onboard.models.RegisterRequestData
@@ -56,4 +57,7 @@ interface OnboardApiService {
@POST("update_password")
suspend fun updatePassword(@Body body: FormBody): Response<ApiResponse<Any>>
@POST("guest_login")
suspend fun guestLogin(@Body body: FormBody): Response<ApiResponse<Guest>>
}

View File

@@ -1,5 +1,6 @@
package com.woka.onboard.mvvm
import com.woka.WokaApp
import com.woka.networking.ApiResponse
import com.woka.networking.ApiResult
import com.woka.networking.RetrofitHelper.handleApiCall
@@ -7,6 +8,7 @@ import com.woka.networking.RetrofitHelper.handleApiResponse
import com.woka.onboard.models.AvatarList
import com.woka.onboard.models.ChildListResponse
import com.woka.onboard.models.ForgotPasswrodOTPResponse
import com.woka.onboard.models.Guest
import com.woka.onboard.models.InterestTopicResponse
import com.woka.onboard.models.LoginResponse
import com.woka.onboard.models.RegisterRequestData
@@ -148,4 +150,17 @@ class OnboardRepository(private val apiService: OnboardApiService) {
}
}
suspend fun guestLogin(): ApiResult<Guest>{
return handleApiCall {
apiService.guestLogin(
FormBody.Builder()
.add("language_id", if (WokaApp.userPrefs?.appLanguage == "hi") "2" else "1")
.add("user_type", "3")
.add("one_signal_player_id", "test")
.add("device_type", "1")
.build()
)
}
}
}

View File

@@ -11,6 +11,7 @@ import com.woka.onboard.models.AvatarList
import com.woka.onboard.models.Child
import com.woka.onboard.models.ChildListResponse
import com.woka.onboard.models.ForgotPasswrodOTPResponse
import com.woka.onboard.models.Guest
import com.woka.onboard.models.InterestTopicResponse
import com.woka.onboard.models.LoginResponse
import com.woka.onboard.models.RegisterRequestData
@@ -39,6 +40,12 @@ class OnboardViewModel: ViewModel(){
val interestTopics = mutableSetOf<Int>()
// live_data
// onboard fragment
private val _guestLogin = MutableLiveData<ApiResult<Guest>?>()
fun clearGuestLoginData() = _guestLogin.postValue(null)
val guestLogin: LiveData<ApiResult<Guest>?>
get() = _guestLogin
/*
Login Fragment
*/
@@ -118,6 +125,14 @@ class OnboardViewModel: ViewModel(){
val updatePasswordLiveData: LiveData<ApiResult<Any>?>
get() = _updatePasswordLiveData
fun guestLogin(){
viewModelScope.launch {
_guestLogin.postValue(ApiResult.Loading())
val response = repository.guestLogin()
_guestLogin.postValue(response)
}
}
fun login(userName: String, password: String){
viewModelScope.launch {
_loginLiveData.postValue(ApiResult.Loading())

View File

@@ -6,12 +6,27 @@ import android.content.Context.MODE_PRIVATE
import android.content.SharedPreferences
import android.provider.Settings
import android.provider.Settings.Secure
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.woka.mvvm.UserApiService
import com.woka.mvvm.UserRepository
import com.woka.mvvm.userDataModels.UserData
import com.woka.mvvm.userDataModels.UserDataResponse
import com.woka.networking.ApiResult
import com.woka.networking.RetrofitHelper
import com.woka.utils.UserType
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
class UserPreference(context: Context) {
companion object{
private const val USER_PREFERENCE = "woka_user_preferences"
private const val APP_LANGUAGE = "app_language"
private const val ACCESS_TOKEN = "access_token"
private const val USER_TYPE = "user_type"
private const val GUEST_USER_NAME = "guest_user_name"
}
private val userPrefs: SharedPreferences = context.getSharedPreferences(USER_PREFERENCE, MODE_PRIVATE)
@@ -21,4 +36,29 @@ class UserPreference(context: Context) {
var appLanguage: String
get() = userPrefs.getString(APP_LANGUAGE, "en")?:"en"
set(value) = userPrefs.edit().putString(APP_LANGUAGE, value).apply()
var accessToken: String?
get() = userPrefs.getString(ACCESS_TOKEN, null)
set(value) = userPrefs.edit().putString(ACCESS_TOKEN, value).apply()
var userType: UserType
get() = UserType.createUserType(userPrefs.getInt(USER_TYPE, -1))
set(value) = userPrefs.edit().putInt(USER_TYPE, value.id).apply()
var guestUserName: String?
get() = userPrefs.getString(GUEST_USER_NAME, null)
set(value) = userPrefs.edit().putString(GUEST_USER_NAME, value).apply()
private val userRepository = UserRepository(RetrofitHelper.getRetrofit().create(UserApiService::class.java))
private val _userLiveData = MutableLiveData<ApiResult<UserDataResponse>>()
val userLiveData: LiveData<ApiResult<UserDataResponse>>
get() = _userLiveData
fun loadUserData(){
CoroutineScope(Dispatchers.IO).launch {
_userLiveData.postValue(ApiResult.Loading())
_userLiveData.postValue(userRepository.getUserData())
}
}
}

View File

@@ -1,5 +1,7 @@
package com.woka.utils
const val TAG = "aditya_testing"
const val PARENT_TYPE = "2"
const val CHILD_TYPE = "1"

View File

@@ -0,0 +1,19 @@
package com.woka.utils
enum class UserType(val id: Int) {
CHILD(1),
GUARDIAN(2),
GUEST(3),
NONE(-1);
companion object{
fun createUserType(id: Int?): UserType{
return when(id){
1 -> CHILD
2 -> GUARDIAN
3 -> GUEST
else -> NONE
}
}
}
}

View File

@@ -1,10 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
<androidx.constraintlayout.widget.ConstraintLayout
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:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".home.HomeActivity">
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -45,6 +45,7 @@
android:layout_marginVertical="10dp"
android:fontFamily="@font/exo_2_medium"
android:textSize="@dimen/_14ssp"
android:textAlignment="center"
android:textColor="@color/color_primary"
tools:text="This is message that will be shown as subtitle"