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))&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& viewModel
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))
}
})
}
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 mainActivityloginViewModel = ViewModelProvider(this).get(LoginViewModel::class.java) /// oncreate maiprivate 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 ClientClasspackage 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)
}
}
}
