Networking setup

mvvm setup for onboard
live data implementation
This commit is contained in:
2024-05-06 20:59:43 +05:30
parent 55e654b073
commit 65c6f4fff1
17 changed files with 277 additions and 6 deletions

View File

@@ -0,0 +1,10 @@
package com.woka.networking
/*
This is the basic structure of api response
*/
data class ApiResponse<T>(
val success: Int? = null,
val message: String? = null,
val data: T? = null
)

View File

@@ -0,0 +1,9 @@
package com.woka.networking
sealed class ApiResult<T>(data: T? = null, errorMessage: String? = null) {
class Loading<T>: ApiResult<T>()
class Success<T>(data: T? = null): ApiResult<T>(data)
class Error<T>(errorMessage: String? = null): ApiResult<T>(errorMessage = errorMessage)
}

View File

@@ -0,0 +1,53 @@
package com.woka.networking
import android.annotation.SuppressLint
import android.content.Context
import android.provider.Settings
import com.woka.BuildConfig
import com.woka.WokaApp.Companion.userPrefs
import okhttp3.Credentials
import okhttp3.Interceptor
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
object RetrofitHelper {
private var retrofit: Retrofit? = null
@SuppressLint("HardwareIds")
private fun createRetrofit(): Retrofit{
val clientBuilder = OkHttpClient.Builder()
if (BuildConfig.DEBUG){
clientBuilder.addInterceptor(HttpLoggingInterceptor().apply {
level = HttpLoggingInterceptor.Level.BODY
})
}
// adding static headers for api calls
clientBuilder.addInterceptor(
Interceptor { chain ->
val request = chain.request().newBuilder()
request.addHeader("Accept-Language", if (userPrefs?.appLanguage == "hi") "Hindi" else "English")
request.addHeader("device-id", userPrefs?.deviceId!!)
request.addHeader("Authorization", Credentials.basic(BuildConfig.WOKA_USER_NAME, BuildConfig.WOKA_PASSWORD))
chain.proceed(request.build())
})
retrofit = Retrofit.Builder()
.baseUrl(BuildConfig.WOKA_STAGINNG_BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(clientBuilder.build())
.build()
return retrofit!!
}
fun getRetrofit(): Retrofit{
return retrofit ?: createRetrofit()
}
}

View File

@@ -8,16 +8,15 @@ import android.view.View
import android.view.ViewGroup
import androidx.core.app.ActivityOptionsCompat
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.FragmentNavigatorExtras
import androidx.navigation.fragment.findNavController
import com.woka.R
import com.woka.databinding.FragmentLanguageBinding
import com.woka.onboard.OnboardActivity
import com.woka.utils.ProgressView
import com.woka.utils.changeLocale
class LanguageFragment : Fragment() {
private lateinit var binding: FragmentLanguageBinding
private lateinit var progressView: ProgressView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -29,12 +28,12 @@ class LanguageFragment : Fragment() {
savedInstanceState: Bundle?
): View? {
binding = FragmentLanguageBinding.inflate(inflater, container, false)
progressView = ProgressView(requireContext(), "please wait...")
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
clickEvents()
}

View File

@@ -0,0 +1,4 @@
package com.woka.onboard.models
data class LoginResponse(
val result: Result
)

View File

@@ -0,0 +1,6 @@
package com.woka.onboard.models
data class Result(
val already_logged_in: Boolean,
val is_deactive: Boolean
)

View File

@@ -0,0 +1,14 @@
package com.woka.onboard.mvvm
import com.woka.networking.ApiResponse
import com.woka.onboard.models.LoginResponse
import okhttp3.FormBody
import retrofit2.Response
import retrofit2.http.Body
import retrofit2.http.GET
interface OnboardApiService {
@GET("login")
suspend fun login(@Body body: FormBody): Response<ApiResponse<LoginResponse>>
}

View File

@@ -0,0 +1,27 @@
package com.woka.onboard.mvvm
import com.woka.networking.ApiResult
import com.woka.onboard.models.LoginResponse
import okhttp3.FormBody
class OnboardRepository(private val apiService: OnboardApiService) {
suspend fun login(userName: String, password: String): ApiResult<LoginResponse> {
return try {
val response = apiService.login(
FormBody.Builder()
.add("username", userName)
.add("password", password)
.build()
)
if (response.body()?.success == 1)
ApiResult.Success(response.body()?.data)
else
ApiResult.Error(errorMessage = response.body()?.message)
} catch (e: Exception) {
ApiResult.Error(errorMessage = e.message)
}
}
}

View File

@@ -0,0 +1,28 @@
package com.woka.onboard.mvvm
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.woka.networking.ApiResult
import com.woka.networking.RetrofitHelper
import com.woka.onboard.models.LoginResponse
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
class OnboardViewModel: ViewModel(){
private val repository: OnboardRepository = OnboardRepository(RetrofitHelper.getRetrofit().create(OnboardApiService::class.java))
private val _signInLiveData = MutableLiveData<ApiResult<LoginResponse>>()
val signInLiveData: LiveData<ApiResult<LoginResponse>>
get() = _signInLiveData
fun login(userName: String, password: String){
viewModelScope.launch {
_signInLiveData.postValue(ApiResult.Loading())
delay(6000)
_signInLiveData.postValue(ApiResult.Success())
}
}
}

View File

@@ -1,8 +1,11 @@
package com.woka.userPreference
import android.annotation.SuppressLint
import android.content.Context
import android.content.Context.MODE_PRIVATE
import android.content.SharedPreferences
import android.provider.Settings
import android.provider.Settings.Secure
class UserPreference(context: Context) {
@@ -12,6 +15,8 @@ class UserPreference(context: Context) {
}
private val userPrefs: SharedPreferences = context.getSharedPreferences(USER_PREFERENCE, MODE_PRIVATE)
@SuppressLint("HardwareIds")
val deviceId: String = Secure.getString(context.contentResolver, Secure.ANDROID_ID)
var appLanguage: String
get() = userPrefs.getString(APP_LANGUAGE, "en")?:"en"

View File

@@ -0,0 +1,33 @@
package com.woka.utils
import android.app.Dialog
import android.content.Context
import android.content.ContextWrapper
import android.view.LayoutInflater
import com.woka.databinding.LayoutProgressViewBinding
class ProgressView(context: Context, title: String): ContextWrapper(context) {
private val dialog: Dialog = Dialog(this)
private var binding: LayoutProgressViewBinding = LayoutProgressViewBinding.inflate(LayoutInflater.from(this))
init {
// init dialog
dialog.setContentView(binding.root)
dialog.setCancelable(false)
// transparent background
dialog.window?.setBackgroundDrawableResource(android.R.color.transparent)
// init views
binding.title.text = title
}
fun show() = dialog.show()
fun hide() = dialog.dismiss()
fun setTitle(title: String) {
binding.title.text = title
}
}