Sunday, August 4, 2024

Hint of kotlin mvvmApi

 interface ApiInterFace {


@POST("Login/Login")
fun login(@Body loginRequest: LoginRequest): Call<LoginResponse>



@POST("Home/SyncAllData")
fun syncAll(@Body syncRequest:SyncAllRequest,
@Header("Authorization") authToken: String):Call<List<SyncAllReesponse>>
}


&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&    (Repository))

class LoginRepository(private val apiInterface: ApiInterFace) {

fun login(loginRequest: LoginRequest, onResult: (Result<LoginResponse>) -> Unit) {

apiInterface.login(loginRequest).enqueue(object : Callback<LoginResponse> {
override fun onResponse(call: Call<LoginResponse>, response: Response<LoginResponse>) {

if (response.isSuccessful) {

response.body()?.let {
onResult(Result.success(it))
} ?: onResult(Result.failure(Exception("Response body is null")))
} else {
onResult(Result.failure(Exception("Failed to login")))
}
}

override fun onFailure(call: Call<LoginResponse>, t: Throwable) {
onResult(Result.failure(t))
}
})
}




fun syncAll(syncAllRequest: SyncAllRequest, token:String , onResult: (Result<List<SyncAllReesponse>>) -> Unit) {

apiInterface.syncAll(syncAllRequest , "Bearer " +token).enqueue(object : Callback<List<SyncAllReesponse>> {
override fun onResponse(call: Call<List<SyncAllReesponse>>, response: Response<List<SyncAllReesponse>>) {

if (response.isSuccessful) {

response.body()?.let {
onResult(Result.success(it))
Log.i("checkcheck",response.message())
} ?: onResult(Result.failure(Exception("Response body is null")))
} else {
onResult(Result.failure(Exception("Failed to login")))
}
}

override fun onFailure(call: Call<List<SyncAllReesponse>>, t: Throwable) {
onResult(Result.failure(t))
}
})
}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& viewModel

class LoginViewModel : ViewModel() {

private val loginResponseLiveData: MutableLiveData<LoginResponse?> = MutableLiveData()
val syncResponseLiveData: MutableLiveData<List<SyncAllReesponse?>> = MutableLiveData()

val getHomeCollectionDataLiveData: MutableLiveData<List<SyncAllReesponse?>> = MutableLiveData()

private val loginRepository: LoginRepository = LoginRepository(ApiClient().getInstance().create(ApiInterFace::class.java))

fun getLoginResponseLiveData(): LiveData<LoginResponse?> {
return loginResponseLiveData
}

fun getSyncAllDataResponseLiveData(): LiveData<List<SyncAllReesponse?>> {
return syncResponseLiveData
}
fun GetHomeCollectionDataLiveData(): LiveData<List<SyncAllReesponse?>> {
return getHomeCollectionDataLiveData
}

fun login(loginRequest: LoginRequest) {

loginRepository.login(loginRequest) { result ->
result.fold(
onSuccess = { loginResponseLiveData.postValue(it) },
onFailure = { loginResponseLiveData.postValue(null) }
)
}
}


fun syncAllData(syncAllRequest: SyncAllRequest , token:String) {

loginRepository.syncAll(syncAllRequest , token) { result ->
result.fold(
onSuccess = { syncResponseLiveData.postValue(it) },
onFailure = { syncResponseLiveData.postValue(null) }
)
}
}

// fun GetHomeCollectionData(syncAllRequest: SyncAllRequest , token:String) {
//
// loginRepository.GetHomeCollectionData(syncAllRequest , token) { result ->
// result.fold(
// onSuccess = {getHomeCollectionDataLiveData.postValue(it) },
// onFailure = { getHomeCollectionDataLiveData.postValue(null) }
// )
// }
// }


fun GetHomeCollectionData(syncAllRequest: SyncAllRequest, token: String) {
loginRepository.GetHomeCollectionData(syncAllRequest, token) { result ->
result.fold(
onSuccess = { response ->
// Log the response here
//Log.d("Response", "GetHomeCollectionData response: ${response.getHomeCollectionDataLiveData}")
getHomeCollectionDataLiveData.postValue(response)
},
onFailure = {
// Log failure if needed
Log.e("Response", "GetHomeCollectionData failed: $it")
getHomeCollectionDataLiveData.postValue(null)
}
)
}
} &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& call mainActivity
loginViewModel = ViewModelProvider(this).get(LoginViewModel::class.java) /// oncreate mai

private fun setUpOserber() {

loginViewModel!!.getSyncAllDataResponseLiveData().observe(this) { response ->
response?.let {
if (response.isEmpty()) {

startActivity(Intent(this, LoginActivity::class.java))
Toast.makeText(this, "Prem is here", Toast.LENGTH_SHORT).show()
Log.i("alldatalisttt", it.toString())
setupRecyclerViewNew(it)

} else {
Toast.makeText(this, "prem where r u", Toast.LENGTH_SHORT).show()

}
private fun setupRecyclerViewNew(syncAllReesponses: List<SyncAllReesponse?>) {

binding.rvSyncData.setHasFixedSize(true);
binding.rvSyncData.setLayoutManager(LinearLayoutManager(getApplicationContext()))
binding.rvSyncData.setAdapter(SyncAllDataAdapter(getApplicationContext(), syncAllReesponses))


}
}
}
binding.btnGetCollectionData.setOnClickListener {

var syncAllRequest = SyncAllRequest(
22,
"22",
"22.3333",
"33.4455",
"701",
11,
"4er4",
"",
"15-March-2024"
)
loginViewModel.GetHomeCollectionData(syncAllRequest, token) }

} &&&&&&&&&&&&&&&&&&& retrofit ClientClass
package com.example.selfapimvvmkotlin

import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory

class ApiClient {

private val baseUrl = "http://uatlims.apollohl.in/homecollection/api/"

fun getInstance(): Retrofit {
val httpClient = OkHttpClient.Builder()

// Add logging interceptor
val loggingInterceptor = HttpLoggingInterceptor()
loggingInterceptor.level = HttpLoggingInterceptor.Level.BODY // Set your desired log level
httpClient.addInterceptor(loggingInterceptor)

// Add your other interceptors here
httpClient.addInterceptor { chain ->
val original = chain.request()

val requestBuilder = original.newBuilder()
.header("Your-Header-Name", "Your-Header-Value")

val request = requestBuilder.build()
chain.proceed(request)
}

return Retrofit.Builder().baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.client(httpClient.build()) // Set the custom OkHttpClient
.build()
}
} &&&&&&
  // retrofit

implementation ("com.squareup.retrofit2:retrofit:2.9.0")

// GSON

implementation ("com.squareup.retrofit2:converter-gson:2.9.0")

// coroutine

implementation ("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1")

implementation ("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4")

implementation ("com.squareup.okhttp3:logging-interceptor:4.11.0")
implementation ("com.google.android.gms:play-services-location:20.0.0") // Check for the latest version
implementation ("androidx.biometric:biometric:1.1.0") &&&&&&& Adapter

class SyncAllDataAdapter(var context: Context, var doctorList: List<SyncAllReesponse?>) :
RecyclerView.Adapter<SyncAllDataAdapter.ViewHolder>() {


override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view: View = LayoutInflater.from(context).inflate(R.layout.layout_sync_data, parent, false)
return ViewHolder(view)
}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {

holder.binding.pName.setText(doctorList[position]?.syncAllReesponse?.get(position)?.pName)
holder.binding.tvSampleTypeName.setText(doctorList[position]?.syncAllReesponse?.get(position)?.city)

}

override fun getItemCount(): Int {
return doctorList.size
}

inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
var binding: LayoutSyncDataBinding

init {
binding = LayoutSyncDataBinding.bind(itemView)
}
}
}