From 259955ed5db3c94631790a8648a5556974deda0f Mon Sep 17 00:00:00 2001 From: Carlos Martinez Date: Mon, 3 Feb 2020 13:01:55 -0300 Subject: [PATCH] implement viewmodel, domain layer and view layer for userlist --- app/build.gradle | 3 + app/src/main/AndroidManifest.xml | 2 + .../com/hako/friendlists/MainApplication.kt | 6 +- .../com/hako/friendlists/di/AppModules.kt | 18 ++++++ base/build.gradle | 2 - .../main/java/com/hako/base/di/BaseModules.kt | 16 ------ .../main/java/com/hako/base/domain/Either.kt | 33 +++++++++++ .../main/java/com/hako/base/domain/UseCase.kt | 5 ++ .../base/domain/database/DatabaseClient.kt | 17 ++++++ .../{room => domain/database}/dao/AlbumDao.kt | 4 +- .../{room => domain/database}/dao/PhotoDao.kt | 4 +- .../{room => domain/database}/dao/UserDao.kt | 7 ++- .../database}/entities/Album.kt | 2 +- .../database}/entities/Photos.kt | 2 +- .../database}/entities/User.kt | 2 +- .../hako/base/domain/network/RemoteClient.kt | 35 ++++++++++++ .../hako/base/domain/network/RequestStatus.kt | 7 +++ .../base/extensions/LiveDataExtensions.kt | 13 +++++ .../java/com/hako/base/room/BaseDatabase.kt | 17 ------ .../com/hako/friendlist/di/UserlistModules.kt | 17 ++++++ .../domain/datasource/UserlistDatasource.kt | 13 +++++ .../domain/datasource/UserlistRemoteApi.kt | 11 ++++ .../friendlist/domain/usecase/GetUsers.kt | 43 ++++++++++++++ .../friendlist/feature/UserlistFragment.kt | 56 ++++++++++--------- .../com/hako/friendlist/model/UserModels.kt | 10 ++-- .../friendlist/viewmodel/UserlistViewmodel.kt | 36 ++++++++++++ 26 files changed, 305 insertions(+), 76 deletions(-) create mode 100644 app/src/main/java/com/hako/friendlists/di/AppModules.kt delete mode 100644 base/src/main/java/com/hako/base/di/BaseModules.kt create mode 100644 base/src/main/java/com/hako/base/domain/Either.kt create mode 100644 base/src/main/java/com/hako/base/domain/UseCase.kt create mode 100644 base/src/main/java/com/hako/base/domain/database/DatabaseClient.kt rename base/src/main/java/com/hako/base/{room => domain/database}/dao/AlbumDao.kt (85%) rename base/src/main/java/com/hako/base/{room => domain/database}/dao/PhotoDao.kt (85%) rename base/src/main/java/com/hako/base/{room => domain/database}/dao/UserDao.kt (75%) rename base/src/main/java/com/hako/base/{room => domain/database}/entities/Album.kt (88%) rename base/src/main/java/com/hako/base/{room => domain/database}/entities/Photos.kt (89%) rename base/src/main/java/com/hako/base/{room => domain/database}/entities/User.kt (90%) create mode 100644 base/src/main/java/com/hako/base/domain/network/RemoteClient.kt create mode 100644 base/src/main/java/com/hako/base/domain/network/RequestStatus.kt create mode 100644 base/src/main/java/com/hako/base/extensions/LiveDataExtensions.kt delete mode 100644 base/src/main/java/com/hako/base/room/BaseDatabase.kt create mode 100644 userlist/src/main/java/com/hako/friendlist/di/UserlistModules.kt create mode 100644 userlist/src/main/java/com/hako/friendlist/domain/datasource/UserlistDatasource.kt create mode 100644 userlist/src/main/java/com/hako/friendlist/domain/datasource/UserlistRemoteApi.kt create mode 100644 userlist/src/main/java/com/hako/friendlist/domain/usecase/GetUsers.kt create mode 100644 userlist/src/main/java/com/hako/friendlist/viewmodel/UserlistViewmodel.kt diff --git a/app/build.gradle b/app/build.gradle index 4a238fd..2f3e31f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,6 +15,9 @@ android { versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + + buildConfigField "String", "DB_NAME", '"friendlists.db"' + buildConfigField "String", "BASE_ENDPOINT", '"https://jsonplaceholder.typicode.com/"' } buildTypes { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 779efa4..c89e347 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,6 +1,8 @@ + + ().userDao() } + factory { get().albumDao() } + factory { get().photoDao() } + + // Retrofit + single { RemoteClient(BuildConfig.BASE_ENDPOINT) } +} \ No newline at end of file diff --git a/base/build.gradle b/base/build.gradle index 57e4157..88cc65c 100644 --- a/base/build.gradle +++ b/base/build.gradle @@ -12,8 +12,6 @@ android { minSdkVersion build_versions.min_sdk targetSdkVersion build_versions.target_sdk testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - - buildConfigField "String", "DB_NAME", '"friendlists.db"' } compileOptions { diff --git a/base/src/main/java/com/hako/base/di/BaseModules.kt b/base/src/main/java/com/hako/base/di/BaseModules.kt deleted file mode 100644 index e535755..0000000 --- a/base/src/main/java/com/hako/base/di/BaseModules.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.hako.base.di - -import androidx.room.Room -import com.hako.base.BuildConfig -import com.hako.base.room.BaseDatabase -import org.koin.dsl.module - -val baseModule = module { - - // Room database - single { Room.databaseBuilder(get(), BaseDatabase::class.java, BuildConfig.DB_NAME).build() } - factory { get().userDao() } - factory { get().albumDao() } - factory { get().photoDao() } - -} \ No newline at end of file diff --git a/base/src/main/java/com/hako/base/domain/Either.kt b/base/src/main/java/com/hako/base/domain/Either.kt new file mode 100644 index 0000000..2c90b33 --- /dev/null +++ b/base/src/main/java/com/hako/base/domain/Either.kt @@ -0,0 +1,33 @@ +package com.hako.base.domain + +sealed class Either { + + data class Left(val a: L) : Either() + data class Right(val b: R) : Either() + + val isRight get() = this is Right + val isLeft get() = this is Left + + fun left(a: L) = Left(a) + fun right(b: R) = Right(b) + + fun either(fnL: (L) -> Any, fnR: (R) -> Any): Any = + when (this) { + is Left -> fnL(a) + is Right -> fnR(b) + } +} + +fun ((A) -> B).c(f: (B) -> C): (A) -> C = { + f(this(it)) +} + +fun Either.flatMap(fn: (R) -> Either): Either = + when (this) { + is Either.Left -> Either.Left( + a + ) + is Either.Right -> fn(b) + } + +fun Either.map(fn: (R) -> (T)): Either = this.flatMap(fn.c(::right)) diff --git a/base/src/main/java/com/hako/base/domain/UseCase.kt b/base/src/main/java/com/hako/base/domain/UseCase.kt new file mode 100644 index 0000000..d9e178c --- /dev/null +++ b/base/src/main/java/com/hako/base/domain/UseCase.kt @@ -0,0 +1,5 @@ +package com.hako.base.domain + +interface UseCase { + fun execute(onSuccess: (List) -> Unit, onError: (Throwable) -> Unit, onLoading: () -> Unit) +} \ No newline at end of file diff --git a/base/src/main/java/com/hako/base/domain/database/DatabaseClient.kt b/base/src/main/java/com/hako/base/domain/database/DatabaseClient.kt new file mode 100644 index 0000000..b78a001 --- /dev/null +++ b/base/src/main/java/com/hako/base/domain/database/DatabaseClient.kt @@ -0,0 +1,17 @@ +package com.hako.base.domain.database + +import androidx.room.Database +import androidx.room.RoomDatabase +import com.hako.base.domain.database.dao.AlbumDao +import com.hako.base.domain.database.dao.PhotoDao +import com.hako.base.domain.database.dao.UserDao +import com.hako.base.domain.database.entities.AlbumEntity +import com.hako.base.domain.database.entities.PhotoEntity +import com.hako.base.domain.database.entities.UserEntity + +@Database(entities = [UserEntity::class, AlbumEntity::class, PhotoEntity::class], version = 1, exportSchema = false) +abstract class DatabaseClient : RoomDatabase() { + abstract fun userDao(): UserDao + abstract fun albumDao(): AlbumDao + abstract fun photoDao(): PhotoDao +} \ No newline at end of file diff --git a/base/src/main/java/com/hako/base/room/dao/AlbumDao.kt b/base/src/main/java/com/hako/base/domain/database/dao/AlbumDao.kt similarity index 85% rename from base/src/main/java/com/hako/base/room/dao/AlbumDao.kt rename to base/src/main/java/com/hako/base/domain/database/dao/AlbumDao.kt index 5d452c4..3a395de 100644 --- a/base/src/main/java/com/hako/base/room/dao/AlbumDao.kt +++ b/base/src/main/java/com/hako/base/domain/database/dao/AlbumDao.kt @@ -1,10 +1,10 @@ -package com.hako.base.room.dao +package com.hako.base.domain.database.dao import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query -import com.hako.base.room.entities.AlbumEntity +import com.hako.base.domain.database.entities.AlbumEntity @Dao interface AlbumDao { diff --git a/base/src/main/java/com/hako/base/room/dao/PhotoDao.kt b/base/src/main/java/com/hako/base/domain/database/dao/PhotoDao.kt similarity index 85% rename from base/src/main/java/com/hako/base/room/dao/PhotoDao.kt rename to base/src/main/java/com/hako/base/domain/database/dao/PhotoDao.kt index b61d826..0fc562b 100644 --- a/base/src/main/java/com/hako/base/room/dao/PhotoDao.kt +++ b/base/src/main/java/com/hako/base/domain/database/dao/PhotoDao.kt @@ -1,10 +1,10 @@ -package com.hako.base.room.dao +package com.hako.base.domain.database.dao import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query -import com.hako.base.room.entities.PhotoEntity +import com.hako.base.domain.database.entities.PhotoEntity @Dao interface PhotoDao { diff --git a/base/src/main/java/com/hako/base/room/dao/UserDao.kt b/base/src/main/java/com/hako/base/domain/database/dao/UserDao.kt similarity index 75% rename from base/src/main/java/com/hako/base/room/dao/UserDao.kt rename to base/src/main/java/com/hako/base/domain/database/dao/UserDao.kt index 69879cc..217fe87 100644 --- a/base/src/main/java/com/hako/base/room/dao/UserDao.kt +++ b/base/src/main/java/com/hako/base/domain/database/dao/UserDao.kt @@ -1,10 +1,10 @@ -package com.hako.base.room.dao +package com.hako.base.domain.database.dao import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query -import com.hako.base.room.entities.UserEntity +import com.hako.base.domain.database.entities.UserEntity @Dao interface UserDao { @@ -18,6 +18,9 @@ interface UserDao { @get:Query("SELECT * FROM ${UserEntity.TABLE_NAME}") val all: List + @Query("SELECT * FROM ${UserEntity.TABLE_NAME}") + fun getAllUsers(): List + @Query("SELECT COUNT(*) FROM ${UserEntity.TABLE_NAME}") fun count(): Int diff --git a/base/src/main/java/com/hako/base/room/entities/Album.kt b/base/src/main/java/com/hako/base/domain/database/entities/Album.kt similarity index 88% rename from base/src/main/java/com/hako/base/room/entities/Album.kt rename to base/src/main/java/com/hako/base/domain/database/entities/Album.kt index 48d664a..a6174ad 100644 --- a/base/src/main/java/com/hako/base/room/entities/Album.kt +++ b/base/src/main/java/com/hako/base/domain/database/entities/Album.kt @@ -1,4 +1,4 @@ -package com.hako.base.room.entities +package com.hako.base.domain.database.entities import androidx.room.Entity import androidx.room.Index diff --git a/base/src/main/java/com/hako/base/room/entities/Photos.kt b/base/src/main/java/com/hako/base/domain/database/entities/Photos.kt similarity index 89% rename from base/src/main/java/com/hako/base/room/entities/Photos.kt rename to base/src/main/java/com/hako/base/domain/database/entities/Photos.kt index 01c840a..68432f7 100644 --- a/base/src/main/java/com/hako/base/room/entities/Photos.kt +++ b/base/src/main/java/com/hako/base/domain/database/entities/Photos.kt @@ -1,4 +1,4 @@ -package com.hako.base.room.entities +package com.hako.base.domain.database.entities import androidx.room.Entity import androidx.room.Index diff --git a/base/src/main/java/com/hako/base/room/entities/User.kt b/base/src/main/java/com/hako/base/domain/database/entities/User.kt similarity index 90% rename from base/src/main/java/com/hako/base/room/entities/User.kt rename to base/src/main/java/com/hako/base/domain/database/entities/User.kt index 7f847bc..c359911 100644 --- a/base/src/main/java/com/hako/base/room/entities/User.kt +++ b/base/src/main/java/com/hako/base/domain/database/entities/User.kt @@ -1,4 +1,4 @@ -package com.hako.base.room.entities +package com.hako.base.domain.database.entities import androidx.room.Entity import androidx.room.Index diff --git a/base/src/main/java/com/hako/base/domain/network/RemoteClient.kt b/base/src/main/java/com/hako/base/domain/network/RemoteClient.kt new file mode 100644 index 0000000..e24863d --- /dev/null +++ b/base/src/main/java/com/hako/base/domain/network/RemoteClient.kt @@ -0,0 +1,35 @@ +package com.hako.base.domain.network + +import com.hako.base.BuildConfig +import okhttp3.OkHttpClient +import okhttp3.logging.HttpLoggingInterceptor +import retrofit2.Retrofit +import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory +import retrofit2.converter.gson.GsonConverterFactory +import timber.log.Timber + +class RemoteClient(endpoint: String) { + private val logger = HttpLoggingInterceptor(object : HttpLoggingInterceptor.Logger { + override fun log(message: String) { + Timber.d(message) + } + }).setLevel(getLoggerLevel()) + + private val client = OkHttpClient.Builder() + .addInterceptor(logger) + .build() + + private val retrofit: Retrofit = Retrofit.Builder() + .baseUrl(endpoint) + .addConverterFactory(GsonConverterFactory.create()) + .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) + .client(client) + .build() + + fun getClient(api: Class): T = retrofit.create(api) + + private fun getLoggerLevel() = when (BuildConfig.DEBUG) { + true -> HttpLoggingInterceptor.Level.BASIC + false -> HttpLoggingInterceptor.Level.NONE + } +} \ No newline at end of file diff --git a/base/src/main/java/com/hako/base/domain/network/RequestStatus.kt b/base/src/main/java/com/hako/base/domain/network/RequestStatus.kt new file mode 100644 index 0000000..d34b084 --- /dev/null +++ b/base/src/main/java/com/hako/base/domain/network/RequestStatus.kt @@ -0,0 +1,7 @@ +package com.hako.base.domain.network + +sealed class RequestStatus { + object Ready : RequestStatus() + object Loading : RequestStatus() + object Errored : RequestStatus() +} diff --git a/base/src/main/java/com/hako/base/extensions/LiveDataExtensions.kt b/base/src/main/java/com/hako/base/extensions/LiveDataExtensions.kt new file mode 100644 index 0000000..8aa5111 --- /dev/null +++ b/base/src/main/java/com/hako/base/extensions/LiveDataExtensions.kt @@ -0,0 +1,13 @@ +package com.hako.base.extensions + +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.LiveData +import androidx.lifecycle.Observer + +fun LiveData.observeNonNull(owner: LifecycleOwner, func: (T) -> Unit) { + observe(owner, Observer { + it?.let { + func(it) + } + }) +} \ No newline at end of file diff --git a/base/src/main/java/com/hako/base/room/BaseDatabase.kt b/base/src/main/java/com/hako/base/room/BaseDatabase.kt deleted file mode 100644 index 47648b7..0000000 --- a/base/src/main/java/com/hako/base/room/BaseDatabase.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.hako.base.room - -import androidx.room.Database -import androidx.room.RoomDatabase -import com.hako.base.room.dao.AlbumDao -import com.hako.base.room.dao.PhotoDao -import com.hako.base.room.dao.UserDao -import com.hako.base.room.entities.AlbumEntity -import com.hako.base.room.entities.PhotoEntity -import com.hako.base.room.entities.UserEntity - -@Database(entities = [UserEntity::class, AlbumEntity::class, PhotoEntity::class], version = 1, exportSchema = false) -abstract class BaseDatabase : RoomDatabase() { - abstract fun userDao(): UserDao - abstract fun albumDao(): AlbumDao - abstract fun photoDao(): PhotoDao -} \ No newline at end of file diff --git a/userlist/src/main/java/com/hako/friendlist/di/UserlistModules.kt b/userlist/src/main/java/com/hako/friendlist/di/UserlistModules.kt new file mode 100644 index 0000000..ccb1b20 --- /dev/null +++ b/userlist/src/main/java/com/hako/friendlist/di/UserlistModules.kt @@ -0,0 +1,17 @@ +package com.hako.friendlist.di + +import com.hako.base.domain.network.RemoteClient +import com.hako.friendlist.domain.datasource.UserlistDatasource +import com.hako.friendlist.domain.datasource.UserlistRemoteApi +import com.hako.friendlist.domain.usecase.GetUsers +import com.hako.friendlist.viewmodel.UserlistViewmodel +import org.koin.androidx.viewmodel.dsl.viewModel +import org.koin.dsl.module + +val userlistModules = module { + factory { get().getClient(UserlistRemoteApi::class.java) } + factory { UserlistDatasource() } + factory { GetUsers(get()) } + + viewModel { UserlistViewmodel() } +} \ No newline at end of file diff --git a/userlist/src/main/java/com/hako/friendlist/domain/datasource/UserlistDatasource.kt b/userlist/src/main/java/com/hako/friendlist/domain/datasource/UserlistDatasource.kt new file mode 100644 index 0000000..b7ebfa2 --- /dev/null +++ b/userlist/src/main/java/com/hako/friendlist/domain/datasource/UserlistDatasource.kt @@ -0,0 +1,13 @@ +package com.hako.friendlist.domain.datasource + +import com.hako.friendlist.model.User +import io.reactivex.Single +import org.koin.core.KoinComponent +import org.koin.core.get + +class UserlistDatasource : KoinComponent, UserlistRemoteApi { + + private val api: UserlistRemoteApi = get() + + override fun getUsers(): Single> = api.getUsers() +} \ No newline at end of file diff --git a/userlist/src/main/java/com/hako/friendlist/domain/datasource/UserlistRemoteApi.kt b/userlist/src/main/java/com/hako/friendlist/domain/datasource/UserlistRemoteApi.kt new file mode 100644 index 0000000..00ff807 --- /dev/null +++ b/userlist/src/main/java/com/hako/friendlist/domain/datasource/UserlistRemoteApi.kt @@ -0,0 +1,11 @@ +package com.hako.friendlist.domain.datasource + +import com.hako.friendlist.model.User +import io.reactivex.Single +import retrofit2.http.GET + +interface UserlistRemoteApi { + + @GET("/users") + fun getUsers(): Single> +} \ No newline at end of file diff --git a/userlist/src/main/java/com/hako/friendlist/domain/usecase/GetUsers.kt b/userlist/src/main/java/com/hako/friendlist/domain/usecase/GetUsers.kt new file mode 100644 index 0000000..bf5e094 --- /dev/null +++ b/userlist/src/main/java/com/hako/friendlist/domain/usecase/GetUsers.kt @@ -0,0 +1,43 @@ +package com.hako.friendlist.domain.usecase + +import com.hako.base.domain.UseCase +import com.hako.base.domain.database.dao.UserDao +import com.hako.friendlist.domain.datasource.UserlistDatasource +import com.hako.friendlist.model.UserViewable +import com.hako.friendlist.model.toUserEntity +import com.hako.friendlist.model.toUserViewable +import io.reactivex.Single +import io.reactivex.schedulers.Schedulers +import org.koin.core.KoinComponent +import org.koin.core.get + +class GetUsers(private val dao: UserDao) : KoinComponent, + UseCase { + + private val api: UserlistDatasource = get() + + override fun execute( + onSuccess: (List) -> Unit, + onError: (Throwable) -> Unit, + onLoading: () -> Unit + ) { + Single.fromCallable { dao.getAllUsers() } + .subscribeOn(Schedulers.io()) + .doOnError { onError(it) } + .doOnSuccess { dbUsers -> + if (dbUsers.isEmpty() || dbUsers.count() == 0) { + api.getUsers() + .doOnSuccess { + dao.saveAll(it.map { user -> user.toUserEntity() }) + onSuccess(dao.getAllUsers().map { user -> user.toUserViewable() }) + } + .doOnSubscribe { onLoading() } + .subscribeOn(Schedulers.io()) + .subscribe({}, { onError(it) }) + } else { + onSuccess(dbUsers.map { it.toUserViewable() }) + } + } + .subscribe() + } +} diff --git a/userlist/src/main/java/com/hako/friendlist/feature/UserlistFragment.kt b/userlist/src/main/java/com/hako/friendlist/feature/UserlistFragment.kt index f83776b..9d2f4c3 100644 --- a/userlist/src/main/java/com/hako/friendlist/feature/UserlistFragment.kt +++ b/userlist/src/main/java/com/hako/friendlist/feature/UserlistFragment.kt @@ -6,14 +6,20 @@ import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.recyclerview.widget.LinearLayoutManager +import com.hako.base.domain.network.RequestStatus +import com.hako.base.extensions.observeNonNull import com.hako.base.extensions.toast import com.hako.friendlist.model.UserViewable +import com.hako.friendlist.viewmodel.UserlistViewmodel import com.hako.friendlist.widget.UserlistAdapter import com.hako.friendlist_userlist.R import kotlinx.android.synthetic.main.fragment_userlist.* +import org.koin.androidx.viewmodel.ext.android.viewModel +import timber.log.Timber class UserlistFragment : Fragment() { + private val viewModel: UserlistViewmodel by viewModel() private val chatAdapter by lazy { UserlistAdapter() } override fun onCreateView( @@ -23,37 +29,37 @@ class UserlistFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) setRecycler() + setObservers() + viewModel.fetchUsers() + } + + private fun setObservers() { + viewModel.data.observeNonNull(this) { + it.either(::handleFetchError, ::handleFetchSuccess) + } + + viewModel.requestStatus.observeNonNull(this) { + when (it) { + RequestStatus.Ready -> { context?.toast("Ready") } + RequestStatus.Loading -> { context?.toast("Loading") } + RequestStatus.Errored -> { context?.toast("Errored") } + } + } + } + + private fun handleFetchError(throwable: Throwable) { + context?.toast("Could't get data") + Timber.e(throwable) + } + + private fun handleFetchSuccess(users: List) { + chatAdapter.addAll(users) } private fun setRecycler() { fragment_userlist_recycler_container.apply { layoutManager = LinearLayoutManager(context) adapter = chatAdapter.apply { - addAll( - listOf( - UserViewable(1, "Carlos Martinez", "carlitos"), - UserViewable(2, "Carlos Martinez", "carlitos"), - UserViewable(3, "Carlos Martinez", "carlitos"), - UserViewable(4, "Carlos Martinez", "carlitos"), - UserViewable(5, "Carlos Martinez", "carlitos"), - UserViewable(6, "Carlos Martinez", "carlitos"), - UserViewable(7, "Carlos Martinez", "carlitos"), - UserViewable(8, "Carlos Martinez", "carlitos"), - UserViewable(9, "Carlos Martinez", "carlitos"), - UserViewable(10, "Carlos Martinez", "carlitos"), - UserViewable(11, "Carlos Martinez", "carlitos"), - UserViewable(12, "Carlos Martinez", "carlitos"), - UserViewable(13, "Carlos Martinez", "carlitos"), - UserViewable(14, "Carlos Martinez", "carlitos"), - UserViewable(15, "Carlos Martinez", "carlitos"), - UserViewable(16, "Carlos Martinez", "carlitos"), - UserViewable(17, "Carlos Martinez", "carlitos"), - UserViewable(18, "Carlos Martinez", "carlitos"), - UserViewable(19, "Carlos Martinez", "carlitos"), - UserViewable(20, "Carlos Martinez", "carlitos") - ) - ) - onItemClick = { context.toast(it.realName) } diff --git a/userlist/src/main/java/com/hako/friendlist/model/UserModels.kt b/userlist/src/main/java/com/hako/friendlist/model/UserModels.kt index 6c6992a..5dfa108 100644 --- a/userlist/src/main/java/com/hako/friendlist/model/UserModels.kt +++ b/userlist/src/main/java/com/hako/friendlist/model/UserModels.kt @@ -2,7 +2,7 @@ package com.hako.friendlist.model import android.os.Parcelable import com.google.gson.annotations.SerializedName -import com.hako.base.room.entities.UserEntity +import com.hako.base.domain.database.entities.UserEntity import kotlinx.android.parcel.Parcelize @Parcelize @@ -20,9 +20,9 @@ data class UserViewable( val realName: String, val userName: String, var isFavorite: Boolean = false -) { - fun User.toUserViewable() = UserViewable(this.id, this.realName, this.userName) +) - fun UserEntity.toUserViewable() = UserViewable(this.id, this.realName, this.userName) -} +fun User.toUserEntity() = UserEntity(this.id, this.realName, this.userName, this.email, this.phone, this.website) + +fun UserEntity.toUserViewable() = UserViewable(this.id, this.realName, this.userName) diff --git a/userlist/src/main/java/com/hako/friendlist/viewmodel/UserlistViewmodel.kt b/userlist/src/main/java/com/hako/friendlist/viewmodel/UserlistViewmodel.kt new file mode 100644 index 0000000..dd6b938 --- /dev/null +++ b/userlist/src/main/java/com/hako/friendlist/viewmodel/UserlistViewmodel.kt @@ -0,0 +1,36 @@ +package com.hako.friendlist.viewmodel + +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import com.hako.base.domain.network.RequestStatus +import com.hako.base.domain.network.RequestStatus.Ready +import com.hako.base.domain.network.RequestStatus.Loading +import com.hako.base.domain.network.RequestStatus.Errored +import com.hako.base.domain.Either +import com.hako.friendlist.domain.usecase.GetUsers +import com.hako.friendlist.model.UserViewable +import org.koin.core.KoinComponent +import org.koin.core.get + +class UserlistViewmodel : ViewModel(), KoinComponent { + + val data = MutableLiveData>>() + val requestStatus = MutableLiveData() + + private val getUsers: GetUsers = get() + + fun fetchUsers() { + getUsers.execute( + onSuccess = { + requestStatus.postValue(Ready) + data.postValue(Either.Right(it)) + }, + onLoading = { + requestStatus.postValue(Loading) + }, + onError = { + requestStatus.postValue(Errored) + data.postValue(Either.Left(it)) + }) + } +}