Skip to content

Commit

Permalink
Removed all direct public live data mutablity access from all view mo…
Browse files Browse the repository at this point in the history
…dels
  • Loading branch information
roeiedri committed Jan 12, 2023
1 parent e0fa0ca commit ef092e5
Show file tree
Hide file tree
Showing 28 changed files with 463 additions and 292 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,11 @@ abstract class BaseFragment<out VM : BaseViewState> : Fragment(), BaseView<VM> {
}

override fun showError(@StringRes stringResId: Int) {
baseActivity.viewState.errorEvent.call(stringResId)
baseActivity.viewState.onError(stringResId)
}

override fun showMessage(@StringRes stringResId: Int) {
baseActivity.viewState.messageEvent.call(stringResId)
baseActivity.viewState.onMessage(stringResId)
}

override fun finish() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,34 @@
package com.chooloo.www.chooloolib.ui.base

import androidx.annotation.StringRes
import androidx.lifecycle.ViewModel
import com.chooloo.www.chooloolib.util.DataLiveEvent
import com.chooloo.www.chooloolib.util.LiveEvent
import com.chooloo.www.chooloolib.util.MutableDataLiveEvent
import com.chooloo.www.chooloolib.util.MutableLiveEvent

open class BaseViewState : ViewModel() {
val finishEvent = LiveEvent()
val errorEvent = DataLiveEvent<Int>()
val messageEvent = DataLiveEvent<Int>()
protected val _finishEvent = MutableLiveEvent()
protected val _errorEvent = MutableDataLiveEvent<Int>()
protected val _messageEvent = MutableDataLiveEvent<Int>()

val finishEvent = _finishEvent as LiveEvent
val errorEvent = _errorEvent as DataLiveEvent<Int>
val messageEvent = _messageEvent as DataLiveEvent<Int>


open fun attach() {}
open fun detach() {}

fun onFinish() {
_finishEvent.call()
}

fun onError(@StringRes errMessageRes: Int) {
_errorEvent.call(errMessageRes)
}

fun onMessage(@StringRes messageRes: Int) {
_messageEvent.call(messageRes)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -62,10 +62,10 @@ open class BottomFragment<FragmentType : BaseFragment<BaseViewState>>(
}

override fun showError(@StringRes stringResId: Int) {
baseActivity.viewState.errorEvent.call(stringResId)
baseActivity.viewState.onError(stringResId)
}

override fun showMessage(@StringRes stringResId: Int) {
baseActivity.viewState.messageEvent.call(stringResId)
baseActivity.viewState.onMessage(stringResId)
}
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,20 @@
package com.chooloo.www.chooloolib.ui.base.menu

import android.view.MenuItem
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.chooloo.www.chooloolib.ui.base.BaseViewState

abstract class BaseMenuViewState : BaseViewState() {
val title = MutableLiveData<String>()
val subtitle = MutableLiveData<String>()
protected open val _title = MutableLiveData<String>()
protected open val _subtitle = MutableLiveData<String>()

val title = _title as LiveData<String>
val subtitle = _subtitle as LiveData<String>

abstract val menuResList: List<Int>


open fun onMenuItemClick(menuItem: MenuItem) {
onMenuItemClick(menuItem.itemId)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,13 +58,13 @@ open class BriefContactFragment @Inject constructor() : BaseFragment<BriefContac

viewState.apply {
isFavorite.observe(this@BriefContactFragment) {
menuViewState.isFavorite.value = it
menuViewState.onIsFavorite(it)
binding.briefContactIconFav.isVisible = it
}

contactName.observe(this@BriefContactFragment) {
binding.briefContactTextName.text = it
it?.let(menuViewState.contactName::setValue)
it?.let(menuViewState::onContactName)
}

contactNumber.observe(this@BriefContactFragment) {
Expand All @@ -90,7 +90,8 @@ open class BriefContactFragment @Inject constructor() : BaseFragment<BriefContac
}

onContactId(args.getLong(ARG_CONTACT_ID))
menuViewState.contactId.value = args.getLong(ARG_CONTACT_ID)

menuViewState.onContactId(args.getLong(ARG_CONTACT_ID))
}

childFragmentManager
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.chooloo.www.chooloolib.ui.briefcontact

import android.net.Uri
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
import com.chooloo.www.chooloolib.R
Expand All @@ -12,6 +13,8 @@ import com.chooloo.www.chooloolib.interactor.phoneaccounts.PhonesInteractor
import com.chooloo.www.chooloolib.ui.base.BaseViewState
import com.chooloo.www.chooloolib.util.DataLiveEvent
import com.chooloo.www.chooloolib.util.LiveEvent
import com.chooloo.www.chooloolib.util.MutableDataLiveEvent
import com.chooloo.www.chooloolib.util.MutableLiveEvent
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.launch
import javax.inject.Inject
Expand All @@ -21,20 +24,26 @@ class BriefContactViewState @Inject constructor(
private val phones: PhonesInteractor,
private val contacts: ContactsInteractor,
private val navigations: NavigationsInteractor,
private val permissions: PermissionsInteractor
) : BaseViewState() {
val contactId = MutableLiveData<Long>()
val contactImage = MutableLiveData<Uri>()
val isFavorite = MutableLiveData<Boolean>()
val contactName = MutableLiveData<String?>()
val contactNumber = MutableLiveData<String?>()

val showMoreEvent = LiveEvent()
val callEvent = DataLiveEvent<String>()

private var firstNumber: String? = null
private var contact: ContactAccount? = null

private val _contactId = MutableLiveData<Long>()
private val _contactImage = MutableLiveData<Uri>()
private val _isFavorite = MutableLiveData<Boolean>()
private val _contactName = MutableLiveData<String?>()
private val _contactNumber = MutableLiveData<String?>()
private val _showMoreEvent = MutableLiveEvent()
private val _callEvent = MutableDataLiveEvent<String>()

val contactId = _contactId as LiveData<Long>
val contactImage = _contactImage as LiveData<Uri>
val isFavorite = _isFavorite as LiveData<Boolean>
val contactName = _contactName as LiveData<String?>
val contactNumber = _contactNumber as LiveData<String?>
val showMoreEvent = _showMoreEvent as LiveEvent
val callEvent = _callEvent as DataLiveEvent<String>


private fun withFirstNumber(callback: (String?) -> Unit) {
if (firstNumber != null) {
Expand All @@ -50,24 +59,24 @@ class BriefContactViewState @Inject constructor(
}

fun onContactId(contactId: Long) {
this.contactId.value = contactId
_contactId.value = contactId
viewModelScope.launch {
contacts.getContact(contactId).collect {
contact = it
contactName.value = it?.name
isFavorite.value = it?.starred == true
withFirstNumber { contactNumber.value = it }
_contactName.value = it?.name
_isFavorite.value = it?.starred == true
withFirstNumber { _contactNumber.value = it }
it?.photoUri?.let { uri ->
contactImage.value = Uri.parse(uri)
_contactImage.value = Uri.parse(uri)
}
}
}
}

fun onCallClick() {
withFirstNumber {
it?.let(callEvent::call) ?: run {
errorEvent.call(R.string.error_no_number_to_call)
it?.let(_callEvent::call) ?: run {
onError(R.string.error_no_number_to_call)
}
}
}
Expand All @@ -80,14 +89,7 @@ class BriefContactViewState @Inject constructor(
contactId.value?.let(navigations::editContact)
}

fun onDelete() {
permissions.runWithWriteContactsPermissions {
contactId.value?.let(contacts::deleteContact)
finishEvent.call()
}
}

fun onMoreClick() {
showMoreEvent.call()
_showMoreEvent.call()
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.chooloo.www.chooloolib.ui.briefcontact.menu

import android.view.MenuItem
import androidx.fragment.app.activityViewModels
import com.chooloo.www.chooloolib.R
import com.chooloo.www.chooloolib.interactor.dialog.DialogsInteractor
Expand All @@ -13,30 +12,34 @@ import javax.inject.Inject
class BriefContactMenuFragment @Inject constructor() : BaseMenuFragment() {
override val viewState: BriefContactMenuViewState by activityViewModels()

@Inject lateinit var dialogs: DialogsInteractor
@Inject lateinit var prompts: PromptsInteractor
@Inject
lateinit var dialogs: DialogsInteractor

@Inject
lateinit var prompts: PromptsInteractor


override fun onSetup() {
super.onSetup()
viewState.apply {
showHistoryEvent.observe(this@BriefContactMenuFragment) { ev ->
ev.ifNew?.let { prompts.showFragment(fragmentFactory.getRecentsFragment(viewState.contactName.value)) }
}

isFavorite.observe(this@BriefContactMenuFragment) {
changeItemVisibility(R.id.menu_brief_contact_set_favorite, !it)
changeItemVisibility(R.id.menu_brief_contact_unset_favorite, it)
}
}
}

override fun onMenuItemClick(menuItem: MenuItem) {
if (menuItem.itemId == R.id.menu_brief_contact_delete) {
dialogs.askForValidation(R.string.explain_delete_contact) { bl ->
if (bl) viewState.onDelete()
showHistoryEvent.observe(this@BriefContactMenuFragment) {
it.ifNew?.let {
prompts.showFragment(fragmentFactory.getRecentsFragment(viewState.contactName.value))
}
}

confirmDeleteEvent.observe(this@BriefContactMenuFragment) {
it.ifNew?.let {
dialogs.askForValidation(R.string.explain_delete_contact) { bl ->
if (bl) viewState.onDelete()
}
}
}
}
super.onMenuItemClick(menuItem)
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package com.chooloo.www.chooloolib.ui.briefcontact.menu

import android.Manifest
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.chooloo.www.chooloolib.R
import com.chooloo.www.chooloolib.interactor.contacts.ContactsInteractor
import com.chooloo.www.chooloolib.interactor.permission.PermissionsInteractor
import com.chooloo.www.chooloolib.ui.base.menu.BaseMenuViewState
import com.chooloo.www.chooloolib.util.DataLiveEvent
import com.chooloo.www.chooloolib.util.LiveEvent
import com.chooloo.www.chooloolib.util.MutableLiveEvent
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject

Expand All @@ -17,32 +19,55 @@ class BriefContactMenuViewState @Inject constructor(
) : BaseMenuViewState() {
override val menuResList = listOf(R.menu.menu_brief_contact_extra)

val contactId = MutableLiveData<Long>()
val contactName = MutableLiveData<String>()
val isFavorite = MutableLiveData<Boolean>()
val showHistoryEvent = LiveEvent()
private val _contactId = MutableLiveData<Long>()
private val _contactName = MutableLiveData<String>()
private val _isFavorite = MutableLiveData<Boolean>()
private val _showHistoryEvent = MutableLiveEvent()
private val _confirmDeleteEvent = MutableLiveEvent()

val contactId = _contactId as LiveData<Long>
val isFavorite = _isFavorite as LiveData<Boolean>
val contactName = _contactName as LiveData<String>
val showHistoryEvent = _showHistoryEvent as LiveEvent
val confirmDeleteEvent = _confirmDeleteEvent as LiveEvent


override fun onMenuItemClick(itemId: Int) {
when (itemId) {
R.id.menu_brief_contact_show_history -> onShowHistory()
R.id.menu_brief_contact_delete -> _confirmDeleteEvent.call()
R.id.menu_brief_contact_set_favorite -> onSetFavorite(true)
R.id.menu_brief_contact_unset_favorite -> onSetFavorite(false)
}
}

fun onDelete() {
permissions.runWithWriteContactsPermissions {
permissions.runWithPermissions(arrayOf(Manifest.permission.WRITE_CONTACTS), {
contactId.value?.let(contacts::deleteContact)
finishEvent.call()
}
onFinish()
}, {
onError(R.string.error_no_permissions_edit_contacts)
})
}

fun onShowHistory() {
showHistoryEvent.call()
_showHistoryEvent.call()
}

fun onSetFavorite(isFavorite: Boolean) {
contactId.value?.let { contacts.toggleContactFavorite(it, isFavorite) }
finishEvent.call()
onFinish()
}

fun onIsFavorite(isFavorite: Boolean) {
_isFavorite.value = isFavorite
}

fun onContactId(contactId: Long) {
_contactId.value = contactId
}

fun onContactName(contactName: String) {
_contactName.value = contactName
}
}
Loading

0 comments on commit ef092e5

Please sign in to comment.