Networking setup
mvvm setup for onboard live data implementation
This commit is contained in:
10
app/src/main/java/com/woka/networking/ApiResponse.kt
Normal file
10
app/src/main/java/com/woka/networking/ApiResponse.kt
Normal 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
|
||||
)
|
||||
9
app/src/main/java/com/woka/networking/ApiResult.kt
Normal file
9
app/src/main/java/com/woka/networking/ApiResult.kt
Normal 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)
|
||||
|
||||
}
|
||||
53
app/src/main/java/com/woka/networking/RetrofitHelper.kt
Normal file
53
app/src/main/java/com/woka/networking/RetrofitHelper.kt
Normal 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()
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
package com.woka.onboard.models
|
||||
data class LoginResponse(
|
||||
val result: Result
|
||||
)
|
||||
6
app/src/main/java/com/woka/onboard/models/Result.kt
Normal file
6
app/src/main/java/com/woka/onboard/models/Result.kt
Normal file
@@ -0,0 +1,6 @@
|
||||
package com.woka.onboard.models
|
||||
|
||||
data class Result(
|
||||
val already_logged_in: Boolean,
|
||||
val is_deactive: Boolean
|
||||
)
|
||||
14
app/src/main/java/com/woka/onboard/mvvm/OnboardApiService.kt
Normal file
14
app/src/main/java/com/woka/onboard/mvvm/OnboardApiService.kt
Normal 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>>
|
||||
}
|
||||
27
app/src/main/java/com/woka/onboard/mvvm/OnboardRepository.kt
Normal file
27
app/src/main/java/com/woka/onboard/mvvm/OnboardRepository.kt
Normal 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)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
28
app/src/main/java/com/woka/onboard/mvvm/OnboardViewModel.kt
Normal file
28
app/src/main/java/com/woka/onboard/mvvm/OnboardViewModel.kt
Normal 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())
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
|
||||
33
app/src/main/java/com/woka/utils/ProgressView.kt
Normal file
33
app/src/main/java/com/woka/utils/ProgressView.kt
Normal 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
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user