Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/add mvvm architecture #2

Merged
merged 6 commits into from
Apr 16, 2021
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
add mainviewmodle and main repositry
  • Loading branch information
mohamedebrahim96 committed Apr 16, 2021
commit 2896ba7b6cffe68ade26448e1768d1fe0e130dad
47 changes: 47 additions & 0 deletions app/src/main/java/com/tahmeel/task/repository/MainRepository.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package com.tahmeel.task.repository

import androidx.annotation.WorkerThread
import androidx.lifecycle.Transformations.map
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.flow
import javax.inject.Inject

/**
* Created by @mohamedebrahim96 on 16,April,2021
* ShopiniWorld, Inc
* ebrahimm131@gmail.com
*/

class MainRepository @Inject constructor(
private val tahmeelClient: TahmeelClient,
private val tahmeelDao: TahmeelDao
) : Repository {

@WorkerThread
fun fetchPokemonList(
page: Int,
onStart: () -> Unit,
onComplete: () -> Unit,
onError: (String?) -> Unit
) = flow {
var orders = tahmeelDao.getPokemonList(page)
if (orders.isEmpty()) {

val response = tahmeelClient.fetchPokemonList(page = page)
response.suspendOnSuccess {
data.whatIfNotNull { response ->
orders = response.results
orders.forEach { order -> order.page = page }
tahmeelDao.insertPokemonList(orders)
emit(tahmeelDao.getAllPokemonList(page))
}
}
.onError {
map(ErrorResponseMapper) { onError("[Code: $code]: $message") }
}
.onException { onError(message) }
} else {
emit(tahmeelDao.getAllPokemonList(page))
}
}.onStart { onStart() }.onCompletion { onComplete() }.flowOn(Dispatchers.IO)
}
9 changes: 9 additions & 0 deletions app/src/main/java/com/tahmeel/task/repository/Repository.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.tahmeel.task.repository

/**
* Created by @mohamedebrahim96 on 16,April,2021
* ShopiniWorld, Inc
* ebrahimm131@gmail.com
*/

interface Repository
5 changes: 3 additions & 2 deletions app/src/main/java/com/tahmeel/task/ui/main/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package com.tahmeel.task.ui.main

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.activity.viewModels
import androidx.annotation.VisibleForTesting
import com.skydoves.bindables.BindingActivity
import com.skydoves.transformationlayout.onTransformationStartContainer
import com.tahmeel.task.R
import com.tahmeel.task.databinding.ActivityMainBinding
import com.tahmeel.task.ui.main.adapter.OrdersAdapter
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
Expand All @@ -20,7 +21,7 @@ class MainActivity : BindingActivity<ActivityMainBinding>(R.layout.activity_main
super.onCreate(savedInstanceState)
binding {
lifecycleOwner = this@MainActivity
adapter = PokemonAdapter()
adapter = OrdersAdapter()
vm = viewModel
}
}
Expand Down
55 changes: 54 additions & 1 deletion app/src/main/java/com/tahmeel/task/ui/main/MainViewModel.kt
Original file line number Diff line number Diff line change
@@ -1,10 +1,63 @@
package com.tahmeel.task.ui.main

import androidx.annotation.MainThread
import androidx.databinding.Bindable
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.viewModelScope
import com.skydoves.bindables.BindingViewModel
import com.skydoves.bindables.bindingProperty
import com.tahmeel.task.model.Order
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.flatMapLatest
import timber.log.Timber
import javax.inject.Inject

/**
* Created by @mohamedebrahim96 on 16,April,2021
* ShopiniWorld, Inc
* ebrahimm131@gmail.com
*/

class MainViewModel {

@HiltViewModel
class MainViewModel @Inject constructor(
private val mainRepository: MainRepository,
private val savedStateHandle: SavedStateHandle
) : BindingViewModel() {

@get:Bindable
var isLoading: Boolean by bindingProperty(false)
private set

@get:Bindable
var toastMessage: String? by bindingProperty(null)
private set

private val pendingOrdersFetchingIndex: MutableStateFlow<Int> = MutableStateFlow(0)
private val pendingOrdersListFlow = pendingOrdersFetchingIndex.flatMapLatest { page ->
mainRepository.fetchPokemonList(
page = page,
onStart = { isLoading = true },
onComplete = { isLoading = false },
onError = { toastMessage = it }
)
}

@get:Bindable
val pendingOrdersList: List<Order> by pendingOrdersListFlow.asBindingProperty(
viewModelScope,
emptyList()
)

init {
Timber.d("init MainViewModel")
}

@MainThread
fun fetchNextPendingOrderList() {
if (!isLoading) {
pendingOrdersFetchingIndex.value++
}
}
}
2 changes: 1 addition & 1 deletion app/src/main/res/layout/activity_main.xml
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
app:layout_constraintTop_toBottomOf="@id/appBarLayout"
app:paginationPokemonList="@{vm}"
app:spanCount="2"
app:submitList="@{vm.pokemonList}"
app:submitList="@{vm.pendingOrdersList}"
app:toast="@{vm.toastMessage}"
tools:listitem="@layout/item_order" />

Expand Down