Renames package and some other things

This commit is contained in:
Benoit Marty 2020-07-09 15:34:30 +02:00
parent 25e7bbcd79
commit 4c1d50d554
21 changed files with 99 additions and 94 deletions

View File

@ -23,6 +23,7 @@ import dagger.Binds
import dagger.Module import dagger.Module
import dagger.multibindings.IntoMap import dagger.multibindings.IntoMap
import im.vector.riotx.features.attachments.preview.AttachmentsPreviewFragment import im.vector.riotx.features.attachments.preview.AttachmentsPreviewFragment
import im.vector.riotx.features.contactsbook.ContactsBookFragment
import im.vector.riotx.features.crypto.keysbackup.settings.KeysBackupSettingsFragment import im.vector.riotx.features.crypto.keysbackup.settings.KeysBackupSettingsFragment
import im.vector.riotx.features.crypto.quads.SharedSecuredStorageKeyFragment import im.vector.riotx.features.crypto.quads.SharedSecuredStorageKeyFragment
import im.vector.riotx.features.crypto.quads.SharedSecuredStoragePassphraseFragment import im.vector.riotx.features.crypto.quads.SharedSecuredStoragePassphraseFragment
@ -103,7 +104,6 @@ import im.vector.riotx.features.share.IncomingShareFragment
import im.vector.riotx.features.signout.soft.SoftLogoutFragment import im.vector.riotx.features.signout.soft.SoftLogoutFragment
import im.vector.riotx.features.terms.ReviewTermsFragment import im.vector.riotx.features.terms.ReviewTermsFragment
import im.vector.riotx.features.userdirectory.KnownUsersFragment import im.vector.riotx.features.userdirectory.KnownUsersFragment
import im.vector.riotx.features.phonebook.PhoneBookFragment
import im.vector.riotx.features.userdirectory.UserDirectoryFragment import im.vector.riotx.features.userdirectory.UserDirectoryFragment
import im.vector.riotx.features.widgets.WidgetFragment import im.vector.riotx.features.widgets.WidgetFragment
@ -532,6 +532,6 @@ interface FragmentModule {
@Binds @Binds
@IntoMap @IntoMap
@FragmentKey(PhoneBookFragment::class) @FragmentKey(ContactsBookFragment::class)
fun bindPhoneBookFragment(fragment: PhoneBookFragment): Fragment fun bindPhoneBookFragment(fragment: ContactsBookFragment): Fragment
} }

View File

@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package im.vector.riotx.features.phonebook package im.vector.riotx.features.contactsbook
import android.widget.TextView import android.widget.TextView
import com.airbnb.epoxy.EpoxyAttribute import com.airbnb.epoxy.EpoxyAttribute

View File

@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package im.vector.riotx.features.phonebook package im.vector.riotx.features.contactsbook
import android.widget.ImageView import android.widget.ImageView
import android.widget.TextView import android.widget.TextView

View File

@ -14,11 +14,11 @@
* limitations under the License. * limitations under the License.
*/ */
package im.vector.riotx.features.phonebook package im.vector.riotx.features.contactsbook
import im.vector.riotx.core.platform.VectorViewModelAction import im.vector.riotx.core.platform.VectorViewModelAction
sealed class PhoneBookAction : VectorViewModelAction { sealed class ContactsBookAction : VectorViewModelAction {
data class FilterWith(val filter: String) : PhoneBookAction() data class FilterWith(val filter: String) : ContactsBookAction()
data class OnlyBoundContacts(val onlyBoundContacts: Boolean) : PhoneBookAction() data class OnlyBoundContacts(val onlyBoundContacts: Boolean) : ContactsBookAction()
} }

View File

@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package im.vector.riotx.features.phonebook package im.vector.riotx.features.contactsbook
import com.airbnb.epoxy.EpoxyController import com.airbnb.epoxy.EpoxyController
import com.airbnb.mvrx.Fail import com.airbnb.mvrx.Fail
@ -32,12 +32,12 @@ import im.vector.riotx.core.resources.StringProvider
import im.vector.riotx.features.home.AvatarRenderer import im.vector.riotx.features.home.AvatarRenderer
import javax.inject.Inject import javax.inject.Inject
class PhoneBookController @Inject constructor( class ContactsBookController @Inject constructor(
private val stringProvider: StringProvider, private val stringProvider: StringProvider,
private val avatarRenderer: AvatarRenderer, private val avatarRenderer: AvatarRenderer,
private val errorFormatter: ErrorFormatter) : EpoxyController() { private val errorFormatter: ErrorFormatter) : EpoxyController() {
private var state: PhoneBookViewState? = null private var state: ContactsBookViewState? = null
var callback: Callback? = null var callback: Callback? = null
@ -45,7 +45,7 @@ class PhoneBookController @Inject constructor(
requestModelBuild() requestModelBuild()
} }
fun setData(state: PhoneBookViewState) { fun setData(state: ContactsBookViewState) {
this.state = state this.state = state
requestModelBuild() requestModelBuild()
} }
@ -64,6 +64,7 @@ class PhoneBookController @Inject constructor(
private fun renderLoading() { private fun renderLoading() {
loadingItem { loadingItem {
id("loading") id("loading")
loadingText(stringProvider.getString(R.string.loading_contact_book))
} }
} }
@ -96,7 +97,7 @@ class PhoneBookController @Inject constructor(
if (onlyBoundContacts && it.matrixId == null) return@forEachIndexed if (onlyBoundContacts && it.matrixId == null) return@forEachIndexed
contactDetailItem { contactDetailItem {
id("${mappedContact.id}-$index-${it.email}") id("${mappedContact.id}-e-$index-${it.email}")
threePid(it.email) threePid(it.email)
matrixId(it.matrixId) matrixId(it.matrixId)
clickListener { clickListener {
@ -113,7 +114,7 @@ class PhoneBookController @Inject constructor(
if (onlyBoundContacts && it.matrixId == null) return@forEachIndexed if (onlyBoundContacts && it.matrixId == null) return@forEachIndexed
contactDetailItem { contactDetailItem {
id("${mappedContact.id}-$index-${it.phoneNumber}") id("${mappedContact.id}-m-$index-${it.phoneNumber}")
threePid(it.phoneNumber) threePid(it.phoneNumber)
matrixId(it.matrixId) matrixId(it.matrixId)
clickListener { clickListener {
@ -132,7 +133,7 @@ class PhoneBookController @Inject constructor(
val noResultRes = if (hasSearch) { val noResultRes = if (hasSearch) {
R.string.no_result_placeholder R.string.no_result_placeholder
} else { } else {
R.string.empty_phone_book R.string.empty_contact_book
} }
noResultItem { noResultItem {
id("noResult") id("noResult")

View File

@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package im.vector.riotx.features.phonebook package im.vector.riotx.features.contactsbook
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
@ -35,20 +35,20 @@ import im.vector.riotx.features.userdirectory.UserDirectoryAction
import im.vector.riotx.features.userdirectory.UserDirectorySharedAction import im.vector.riotx.features.userdirectory.UserDirectorySharedAction
import im.vector.riotx.features.userdirectory.UserDirectorySharedActionViewModel import im.vector.riotx.features.userdirectory.UserDirectorySharedActionViewModel
import im.vector.riotx.features.userdirectory.UserDirectoryViewModel import im.vector.riotx.features.userdirectory.UserDirectoryViewModel
import kotlinx.android.synthetic.main.fragment_phonebook.* import kotlinx.android.synthetic.main.fragment_contacts_book.*
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
import javax.inject.Inject import javax.inject.Inject
class PhoneBookFragment @Inject constructor( class ContactsBookFragment @Inject constructor(
val phoneBookViewModelFactory: PhoneBookViewModel.Factory, val contactsBookViewModelFactory: ContactsBookViewModel.Factory,
private val phoneBookController: PhoneBookController private val contactsBookController: ContactsBookController
) : VectorBaseFragment(), PhoneBookController.Callback { ) : VectorBaseFragment(), ContactsBookController.Callback {
override fun getLayoutResId() = R.layout.fragment_phonebook override fun getLayoutResId() = R.layout.fragment_contacts_book
private val viewModel: UserDirectoryViewModel by activityViewModel() private val viewModel: UserDirectoryViewModel by activityViewModel()
// Use activityViewModel to avoid loading several times the data // Use activityViewModel to avoid loading several times the data
private val phoneBookViewModel: PhoneBookViewModel by activityViewModel() private val contactsBookViewModel: ContactsBookViewModel by activityViewModel()
private lateinit var sharedActionViewModel: UserDirectorySharedActionViewModel private lateinit var sharedActionViewModel: UserDirectorySharedActionViewModel
@ -64,7 +64,7 @@ class PhoneBookFragment @Inject constructor(
private fun setupOnlyBoundContactsView() { private fun setupOnlyBoundContactsView() {
phoneBookOnlyBoundContacts.checkedChanges() phoneBookOnlyBoundContacts.checkedChanges()
.subscribe { .subscribe {
phoneBookViewModel.handle(PhoneBookAction.OnlyBoundContacts(it)) contactsBookViewModel.handle(ContactsBookAction.OnlyBoundContacts(it))
} }
.disposeOnDestroyView() .disposeOnDestroyView()
} }
@ -75,20 +75,20 @@ class PhoneBookFragment @Inject constructor(
.skipInitialValue() .skipInitialValue()
.debounce(300, TimeUnit.MILLISECONDS) .debounce(300, TimeUnit.MILLISECONDS)
.subscribe { .subscribe {
phoneBookViewModel.handle(PhoneBookAction.FilterWith(it.toString())) contactsBookViewModel.handle(ContactsBookAction.FilterWith(it.toString()))
} }
.disposeOnDestroyView() .disposeOnDestroyView()
} }
override fun onDestroyView() { override fun onDestroyView() {
phoneBookRecyclerView.cleanup() phoneBookRecyclerView.cleanup()
phoneBookController.callback = null contactsBookController.callback = null
super.onDestroyView() super.onDestroyView()
} }
private fun setupRecyclerView() { private fun setupRecyclerView() {
phoneBookController.callback = this contactsBookController.callback = this
phoneBookRecyclerView.configureWith(phoneBookController) phoneBookRecyclerView.configureWith(contactsBookController)
} }
private fun setupCloseView() { private fun setupCloseView() {
@ -97,9 +97,9 @@ class PhoneBookFragment @Inject constructor(
} }
} }
override fun invalidate() = withState(phoneBookViewModel) { state -> override fun invalidate() = withState(contactsBookViewModel) { state ->
phoneBookOnlyBoundContacts.isVisible = state.isBoundRetrieved phoneBookOnlyBoundContacts.isVisible = state.isBoundRetrieved
phoneBookController.setData(state) contactsBookController.setData(state)
} }
override fun onMatrixIdClick(matrixId: String) { override fun onMatrixIdClick(matrixId: String) {

View File

@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package im.vector.riotx.features.phonebook package im.vector.riotx.features.contactsbook
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
@ -43,26 +43,26 @@ import timber.log.Timber
private typealias PhoneBookSearch = String private typealias PhoneBookSearch = String
class PhoneBookViewModel @AssistedInject constructor(@Assisted class ContactsBookViewModel @AssistedInject constructor(@Assisted
initialState: PhoneBookViewState, initialState: ContactsBookViewState,
private val contactsDataSource: ContactsDataSource, private val contactsDataSource: ContactsDataSource,
private val session: Session) private val session: Session)
: VectorViewModel<PhoneBookViewState, PhoneBookAction, EmptyViewEvents>(initialState) { : VectorViewModel<ContactsBookViewState, ContactsBookAction, EmptyViewEvents>(initialState) {
@AssistedInject.Factory @AssistedInject.Factory
interface Factory { interface Factory {
fun create(initialState: PhoneBookViewState): PhoneBookViewModel fun create(initialState: ContactsBookViewState): ContactsBookViewModel
} }
companion object : MvRxViewModelFactory<PhoneBookViewModel, PhoneBookViewState> { companion object : MvRxViewModelFactory<ContactsBookViewModel, ContactsBookViewState> {
override fun create(viewModelContext: ViewModelContext, state: PhoneBookViewState): PhoneBookViewModel? { override fun create(viewModelContext: ViewModelContext, state: ContactsBookViewState): ContactsBookViewModel? {
return when (viewModelContext) { return when (viewModelContext) {
is FragmentViewModelContext -> (viewModelContext.fragment() as PhoneBookFragment).phoneBookViewModelFactory.create(state) is FragmentViewModelContext -> (viewModelContext.fragment() as ContactsBookFragment).contactsBookViewModelFactory.create(state)
is ActivityViewModelContext -> { is ActivityViewModelContext -> {
when (viewModelContext.activity<FragmentActivity>()) { when (viewModelContext.activity<FragmentActivity>()) {
is CreateDirectRoomActivity -> viewModelContext.activity<CreateDirectRoomActivity>().phoneBookViewModelFactory.create(state) is CreateDirectRoomActivity -> viewModelContext.activity<CreateDirectRoomActivity>().contactsBookViewModelFactory.create(state)
is InviteUsersToRoomActivity -> viewModelContext.activity<InviteUsersToRoomActivity>().phoneBookViewModelFactory.create(state) is InviteUsersToRoomActivity -> viewModelContext.activity<InviteUsersToRoomActivity>().contactsBookViewModelFactory.create(state)
else -> error("Wrong activity or fragment") else -> error("Wrong activity or fragment")
} }
} }
@ -77,7 +77,7 @@ class PhoneBookViewModel @AssistedInject constructor(@Assisted
init { init {
loadContacts() loadContacts()
selectSubscribe(PhoneBookViewState::searchTerm, PhoneBookViewState::onlyBoundContacts) { _, _ -> selectSubscribe(ContactsBookViewState::searchTerm, ContactsBookViewState::onlyBoundContacts) { _, _ ->
updateFilteredMappedContacts() updateFilteredMappedContacts()
} }
} }
@ -163,14 +163,14 @@ class PhoneBookViewModel @AssistedInject constructor(@Assisted
} }
} }
override fun handle(action: PhoneBookAction) { override fun handle(action: ContactsBookAction) {
when (action) { when (action) {
is PhoneBookAction.FilterWith -> handleFilterWith(action) is ContactsBookAction.FilterWith -> handleFilterWith(action)
is PhoneBookAction.OnlyBoundContacts -> handleOnlyBoundContacts(action) is ContactsBookAction.OnlyBoundContacts -> handleOnlyBoundContacts(action)
}.exhaustive }.exhaustive
} }
private fun handleOnlyBoundContacts(action: PhoneBookAction.OnlyBoundContacts) { private fun handleOnlyBoundContacts(action: ContactsBookAction.OnlyBoundContacts) {
setState { setState {
copy( copy(
onlyBoundContacts = action.onlyBoundContacts onlyBoundContacts = action.onlyBoundContacts
@ -178,7 +178,7 @@ class PhoneBookViewModel @AssistedInject constructor(@Assisted
} }
} }
private fun handleFilterWith(action: PhoneBookAction.FilterWith) { private fun handleFilterWith(action: ContactsBookAction.FilterWith) {
setState { setState {
copy( copy(
searchTerm = action.filter searchTerm = action.filter

View File

@ -14,14 +14,14 @@
* limitations under the License. * limitations under the License.
*/ */
package im.vector.riotx.features.phonebook package im.vector.riotx.features.contactsbook
import com.airbnb.mvrx.Async import com.airbnb.mvrx.Async
import com.airbnb.mvrx.Loading import com.airbnb.mvrx.Loading
import com.airbnb.mvrx.MvRxState import com.airbnb.mvrx.MvRxState
import im.vector.riotx.core.contacts.MappedContact import im.vector.riotx.core.contacts.MappedContact
data class PhoneBookViewState( data class ContactsBookViewState(
// All the contacts on the phone // All the contacts on the phone
val mappedContacts: Async<List<MappedContact>> = Loading(), val mappedContacts: Async<List<MappedContact>> = Loading(),
// Use to filter contacts by display name // Use to filter contacts by display name

View File

@ -20,5 +20,5 @@ import im.vector.riotx.core.platform.VectorViewModelAction
import im.vector.riotx.features.userdirectory.PendingInvitee import im.vector.riotx.features.userdirectory.PendingInvitee
sealed class CreateDirectRoomAction : VectorViewModelAction { sealed class CreateDirectRoomAction : VectorViewModelAction {
data class CreateRoomAndInviteSelectedUsers(val selectedUsers: Set<PendingInvitee>) : CreateDirectRoomAction() data class CreateRoomAndInviteSelectedUsers(val invitees: Set<PendingInvitee>) : CreateDirectRoomAction()
} }

View File

@ -42,8 +42,8 @@ import im.vector.riotx.core.utils.PERMISSIONS_FOR_MEMBERS_SEARCH
import im.vector.riotx.core.utils.PERMISSION_REQUEST_CODE_READ_CONTACTS import im.vector.riotx.core.utils.PERMISSION_REQUEST_CODE_READ_CONTACTS
import im.vector.riotx.core.utils.allGranted import im.vector.riotx.core.utils.allGranted
import im.vector.riotx.core.utils.checkPermissions import im.vector.riotx.core.utils.checkPermissions
import im.vector.riotx.features.phonebook.PhoneBookFragment import im.vector.riotx.features.contactsbook.ContactsBookFragment
import im.vector.riotx.features.phonebook.PhoneBookViewModel import im.vector.riotx.features.contactsbook.ContactsBookViewModel
import im.vector.riotx.features.userdirectory.KnownUsersFragment import im.vector.riotx.features.userdirectory.KnownUsersFragment
import im.vector.riotx.features.userdirectory.KnownUsersFragmentArgs import im.vector.riotx.features.userdirectory.KnownUsersFragmentArgs
import im.vector.riotx.features.userdirectory.UserDirectoryFragment import im.vector.riotx.features.userdirectory.UserDirectoryFragment
@ -60,7 +60,7 @@ class CreateDirectRoomActivity : SimpleFragmentActivity() {
private lateinit var sharedActionViewModel: UserDirectorySharedActionViewModel private lateinit var sharedActionViewModel: UserDirectorySharedActionViewModel
@Inject lateinit var userDirectoryViewModelFactory: UserDirectoryViewModel.Factory @Inject lateinit var userDirectoryViewModelFactory: UserDirectoryViewModel.Factory
@Inject lateinit var createDirectRoomViewModelFactory: CreateDirectRoomViewModel.Factory @Inject lateinit var createDirectRoomViewModelFactory: CreateDirectRoomViewModel.Factory
@Inject lateinit var phoneBookViewModelFactory: PhoneBookViewModel.Factory @Inject lateinit var contactsBookViewModelFactory: ContactsBookViewModel.Factory
@Inject lateinit var errorFormatter: ErrorFormatter @Inject lateinit var errorFormatter: ErrorFormatter
override fun injectWith(injector: ScreenComponent) { override fun injectWith(injector: ScreenComponent) {
@ -106,21 +106,21 @@ class CreateDirectRoomActivity : SimpleFragmentActivity() {
this, this,
PERMISSION_REQUEST_CODE_READ_CONTACTS, PERMISSION_REQUEST_CODE_READ_CONTACTS,
0)) { 0)) {
addFragmentToBackstack(R.id.container, PhoneBookFragment::class.java) addFragmentToBackstack(R.id.container, ContactsBookFragment::class.java)
} }
} }
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) { override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
if (allGranted(grantResults)) { if (allGranted(grantResults)) {
if (requestCode == PERMISSION_REQUEST_CODE_READ_CONTACTS) { if (requestCode == PERMISSION_REQUEST_CODE_READ_CONTACTS) {
addFragmentToBackstack(R.id.container, PhoneBookFragment::class.java) addFragmentToBackstack(R.id.container, ContactsBookFragment::class.java)
} }
} }
} }
private fun onMenuItemSelected(action: UserDirectorySharedAction.OnMenuItemSelected) { private fun onMenuItemSelected(action: UserDirectorySharedAction.OnMenuItemSelected) {
if (action.itemId == R.id.action_create_direct_room) { if (action.itemId == R.id.action_create_direct_room) {
viewModel.handle(CreateDirectRoomAction.CreateRoomAndInviteSelectedUsers(action.selectedUsers)) viewModel.handle(CreateDirectRoomAction.CreateRoomAndInviteSelectedUsers(action.invitees))
} }
} }

View File

@ -49,14 +49,14 @@ class CreateDirectRoomViewModel @AssistedInject constructor(@Assisted
override fun handle(action: CreateDirectRoomAction) { override fun handle(action: CreateDirectRoomAction) {
when (action) { when (action) {
is CreateDirectRoomAction.CreateRoomAndInviteSelectedUsers -> createRoomAndInviteSelectedUsers(action.selectedUsers) is CreateDirectRoomAction.CreateRoomAndInviteSelectedUsers -> createRoomAndInviteSelectedUsers(action.invitees)
} }
} }
private fun createRoomAndInviteSelectedUsers(selectedUsers: Set<PendingInvitee>) { private fun createRoomAndInviteSelectedUsers(invitees: Set<PendingInvitee>) {
val roomParams = CreateRoomParamsBuilder() val roomParams = CreateRoomParamsBuilder()
.apply { .apply {
selectedUsers.forEach { invitees.forEach {
when (it) { when (it) {
is PendingInvitee.UserPendingInvitee -> invitedUserIds.add(it.user.userId) is PendingInvitee.UserPendingInvitee -> invitedUserIds.add(it.user.userId)
is PendingInvitee.ThreePidPendingInvitee -> invite3pids.add(it.threePid) is PendingInvitee.ThreePidPendingInvitee -> invite3pids.add(it.threePid)

View File

@ -20,5 +20,5 @@ import im.vector.riotx.core.platform.VectorViewModelAction
import im.vector.riotx.features.userdirectory.PendingInvitee import im.vector.riotx.features.userdirectory.PendingInvitee
sealed class InviteUsersToRoomAction : VectorViewModelAction { sealed class InviteUsersToRoomAction : VectorViewModelAction {
data class InviteSelectedUsers(val selectedUsers: Set<PendingInvitee>) : InviteUsersToRoomAction() data class InviteSelectedUsers(val invitees: Set<PendingInvitee>) : InviteUsersToRoomAction()
} }

View File

@ -38,8 +38,8 @@ import im.vector.riotx.core.utils.PERMISSION_REQUEST_CODE_READ_CONTACTS
import im.vector.riotx.core.utils.allGranted import im.vector.riotx.core.utils.allGranted
import im.vector.riotx.core.utils.checkPermissions import im.vector.riotx.core.utils.checkPermissions
import im.vector.riotx.core.utils.toast import im.vector.riotx.core.utils.toast
import im.vector.riotx.features.phonebook.PhoneBookFragment import im.vector.riotx.features.contactsbook.ContactsBookFragment
import im.vector.riotx.features.phonebook.PhoneBookViewModel import im.vector.riotx.features.contactsbook.ContactsBookViewModel
import im.vector.riotx.features.userdirectory.KnownUsersFragment import im.vector.riotx.features.userdirectory.KnownUsersFragment
import im.vector.riotx.features.userdirectory.KnownUsersFragmentArgs import im.vector.riotx.features.userdirectory.KnownUsersFragmentArgs
import im.vector.riotx.features.userdirectory.UserDirectoryFragment import im.vector.riotx.features.userdirectory.UserDirectoryFragment
@ -60,7 +60,7 @@ class InviteUsersToRoomActivity : SimpleFragmentActivity() {
private lateinit var sharedActionViewModel: UserDirectorySharedActionViewModel private lateinit var sharedActionViewModel: UserDirectorySharedActionViewModel
@Inject lateinit var userDirectoryViewModelFactory: UserDirectoryViewModel.Factory @Inject lateinit var userDirectoryViewModelFactory: UserDirectoryViewModel.Factory
@Inject lateinit var inviteUsersToRoomViewModelFactory: InviteUsersToRoomViewModel.Factory @Inject lateinit var inviteUsersToRoomViewModelFactory: InviteUsersToRoomViewModel.Factory
@Inject lateinit var phoneBookViewModelFactory: PhoneBookViewModel.Factory @Inject lateinit var contactsBookViewModelFactory: ContactsBookViewModel.Factory
@Inject lateinit var errorFormatter: ErrorFormatter @Inject lateinit var errorFormatter: ErrorFormatter
override fun injectWith(injector: ScreenComponent) { override fun injectWith(injector: ScreenComponent) {
@ -107,21 +107,21 @@ class InviteUsersToRoomActivity : SimpleFragmentActivity() {
this, this,
PERMISSION_REQUEST_CODE_READ_CONTACTS, PERMISSION_REQUEST_CODE_READ_CONTACTS,
0)) { 0)) {
addFragmentToBackstack(R.id.container, PhoneBookFragment::class.java) addFragmentToBackstack(R.id.container, ContactsBookFragment::class.java)
} }
} }
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) { override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
if (allGranted(grantResults)) { if (allGranted(grantResults)) {
if (requestCode == PERMISSION_REQUEST_CODE_READ_CONTACTS) { if (requestCode == PERMISSION_REQUEST_CODE_READ_CONTACTS) {
addFragmentToBackstack(R.id.container, PhoneBookFragment::class.java) addFragmentToBackstack(R.id.container, ContactsBookFragment::class.java)
} }
} }
} }
private fun onMenuItemSelected(action: UserDirectorySharedAction.OnMenuItemSelected) { private fun onMenuItemSelected(action: UserDirectorySharedAction.OnMenuItemSelected) {
if (action.itemId == R.id.action_invite_users_to_room_invite) { if (action.itemId == R.id.action_invite_users_to_room_invite) {
viewModel.handle(InviteUsersToRoomAction.InviteSelectedUsers(action.selectedUsers)) viewModel.handle(InviteUsersToRoomAction.InviteSelectedUsers(action.invitees))
} }
} }

View File

@ -53,30 +53,30 @@ class InviteUsersToRoomViewModel @AssistedInject constructor(@Assisted
override fun handle(action: InviteUsersToRoomAction) { override fun handle(action: InviteUsersToRoomAction) {
when (action) { when (action) {
is InviteUsersToRoomAction.InviteSelectedUsers -> inviteUsersToRoom(action.selectedUsers) is InviteUsersToRoomAction.InviteSelectedUsers -> inviteUsersToRoom(action.invitees)
} }
} }
private fun inviteUsersToRoom(selectedUsers: Set<PendingInvitee>) { private fun inviteUsersToRoom(invitees: Set<PendingInvitee>) {
_viewEvents.post(InviteUsersToRoomViewEvents.Loading) _viewEvents.post(InviteUsersToRoomViewEvents.Loading)
Observable.fromIterable(selectedUsers).flatMapCompletable { user -> Observable.fromIterable(invitees).flatMapCompletable { user ->
when (user) { when (user) {
is PendingInvitee.UserPendingInvitee -> room.rx().invite(user.user.userId, null) is PendingInvitee.UserPendingInvitee -> room.rx().invite(user.user.userId, null)
is PendingInvitee.ThreePidPendingInvitee -> room.rx().invite3pid(user.threePid) is PendingInvitee.ThreePidPendingInvitee -> room.rx().invite3pid(user.threePid)
} }
}.subscribe( }.subscribe(
{ {
val successMessage = when (selectedUsers.size) { val successMessage = when (invitees.size) {
1 -> stringProvider.getString(R.string.invitation_sent_to_one_user, 1 -> stringProvider.getString(R.string.invitation_sent_to_one_user,
selectedUsers.first().getBestName()) invitees.first().getBestName())
2 -> stringProvider.getString(R.string.invitations_sent_to_two_users, 2 -> stringProvider.getString(R.string.invitations_sent_to_two_users,
selectedUsers.first().getBestName(), invitees.first().getBestName(),
selectedUsers.last().getBestName()) invitees.last().getBestName())
else -> stringProvider.getQuantityString(R.plurals.invitations_sent_to_one_and_more_users, else -> stringProvider.getQuantityString(R.plurals.invitations_sent_to_one_and_more_users,
selectedUsers.size - 1, invitees.size - 1,
selectedUsers.first().getBestName(), invitees.first().getBestName(),
selectedUsers.size - 1) invitees.size - 1)
} }
_viewEvents.post(InviteUsersToRoomViewEvents.Success(successMessage)) _viewEvents.post(InviteUsersToRoomViewEvents.Success(successMessage))
}, },

View File

@ -65,7 +65,7 @@ class KnownUsersFragment @Inject constructor(
setupAddByMatrixIdView() setupAddByMatrixIdView()
setupAddFromPhoneBookView() setupAddFromPhoneBookView()
setupCloseView() setupCloseView()
viewModel.selectSubscribe(this, UserDirectoryViewState::selectedUsers) { viewModel.selectSubscribe(this, UserDirectoryViewState::pendingInvitees) {
renderSelectedUsers(it) renderSelectedUsers(it)
} }
} }
@ -78,7 +78,7 @@ class KnownUsersFragment @Inject constructor(
override fun onPrepareOptionsMenu(menu: Menu) { override fun onPrepareOptionsMenu(menu: Menu) {
withState(viewModel) { withState(viewModel) {
val showMenuItem = it.selectedUsers.isNotEmpty() val showMenuItem = it.pendingInvitees.isNotEmpty()
menu.forEach { menuItem -> menu.forEach { menuItem ->
menuItem.isVisible = showMenuItem menuItem.isVisible = showMenuItem
} }
@ -87,7 +87,7 @@ class KnownUsersFragment @Inject constructor(
} }
override fun onOptionsItemSelected(item: MenuItem): Boolean = withState(viewModel) { override fun onOptionsItemSelected(item: MenuItem): Boolean = withState(viewModel) {
sharedActionViewModel.post(UserDirectorySharedAction.OnMenuItemSelected(item.itemId, it.selectedUsers)) sharedActionViewModel.post(UserDirectorySharedAction.OnMenuItemSelected(item.itemId, it.pendingInvitees))
return@withState true return@withState true
} }
@ -139,14 +139,14 @@ class KnownUsersFragment @Inject constructor(
knownUsersController.setData(it) knownUsersController.setData(it)
} }
private fun renderSelectedUsers(selectedUsers: Set<PendingInvitee>) { private fun renderSelectedUsers(invitees: Set<PendingInvitee>) {
invalidateOptionsMenu() invalidateOptionsMenu()
val currentNumberOfChips = chipGroup.childCount val currentNumberOfChips = chipGroup.childCount
val newNumberOfChips = selectedUsers.size val newNumberOfChips = invitees.size
chipGroup.removeAllViews() chipGroup.removeAllViews()
selectedUsers.forEach { addChipToGroup(it) } invitees.forEach { addChipToGroup(it) }
// Scroll to the bottom when adding chips. When removing chips, do not scroll // Scroll to the bottom when adding chips. When removing chips, do not scroll
if (newNumberOfChips >= currentNumberOfChips) { if (newNumberOfChips >= currentNumberOfChips) {

View File

@ -23,5 +23,5 @@ sealed class UserDirectorySharedAction : VectorSharedAction {
object OpenPhoneBook : UserDirectorySharedAction() object OpenPhoneBook : UserDirectorySharedAction()
object Close : UserDirectorySharedAction() object Close : UserDirectorySharedAction()
object GoBack : UserDirectorySharedAction() object GoBack : UserDirectorySharedAction()
data class OnMenuItemSelected(val itemId: Int, val selectedUsers: Set<PendingInvitee>) : UserDirectorySharedAction() data class OnMenuItemSelected(val itemId: Int, val invitees: Set<PendingInvitee>) : UserDirectorySharedAction()
} }

View File

@ -86,15 +86,15 @@ class UserDirectoryViewModel @AssistedInject constructor(@Assisted
} }
private fun handleRemoveSelectedUser(action: UserDirectoryAction.RemovePendingInvitee) = withState { state -> private fun handleRemoveSelectedUser(action: UserDirectoryAction.RemovePendingInvitee) = withState { state ->
val selectedUsers = state.selectedUsers.minus(action.pendingInvitee) val selectedUsers = state.pendingInvitees.minus(action.pendingInvitee)
setState { copy(selectedUsers = selectedUsers) } setState { copy(pendingInvitees = selectedUsers) }
} }
private fun handleSelectUser(action: UserDirectoryAction.SelectPendingInvitee) = withState { state -> private fun handleSelectUser(action: UserDirectoryAction.SelectPendingInvitee) = withState { state ->
// Reset the filter asap // Reset the filter asap
directoryUsersSearch.accept("") directoryUsersSearch.accept("")
val selectedUsers = state.selectedUsers.toggle(action.pendingInvitee) val selectedUsers = state.pendingInvitees.toggle(action.pendingInvitee)
setState { copy(selectedUsers = selectedUsers) } setState { copy(pendingInvitees = selectedUsers) }
} }
private fun observeDirectoryUsers() = withState { state -> private fun observeDirectoryUsers() = withState { state ->

View File

@ -27,7 +27,7 @@ data class UserDirectoryViewState(
val excludedUserIds: Set<String>? = null, val excludedUserIds: Set<String>? = null,
val knownUsers: Async<PagedList<User>> = Uninitialized, val knownUsers: Async<PagedList<User>> = Uninitialized,
val directoryUsers: Async<List<User>> = Uninitialized, val directoryUsers: Async<List<User>> = Uninitialized,
val selectedUsers: Set<PendingInvitee> = emptySet(), val pendingInvitees: Set<PendingInvitee> = emptySet(),
val createAndInviteState: Async<String> = Uninitialized, val createAndInviteState: Async<String> = Uninitialized,
val directorySearchTerm: String = "", val directorySearchTerm: String = "",
val filterKnownUsersValue: Option<String> = Option.empty() val filterKnownUsersValue: Option<String> = Option.empty()
@ -36,7 +36,7 @@ data class UserDirectoryViewState(
constructor(args: KnownUsersFragmentArgs) : this(excludedUserIds = args.excludedUserIds) constructor(args: KnownUsersFragmentArgs) : this(excludedUserIds = args.excludedUserIds)
fun getSelectedMatrixId(): List<String> { fun getSelectedMatrixId(): List<String> {
return selectedUsers return pendingInvitees
.mapNotNull { .mapNotNull {
when (it) { when (it) {
is PendingInvitee.UserPendingInvitee -> it.user.userId is PendingInvitee.UserPendingInvitee -> it.user.userId

View File

@ -45,7 +45,7 @@
android:layout_marginEnd="8dp" android:layout_marginEnd="8dp"
android:ellipsize="end" android:ellipsize="end"
android:maxLines="1" android:maxLines="1"
android:text="@string/phone_book_title" android:text="@string/contacts_book_title"
android:textColor="?riotx_text_primary" android:textColor="?riotx_text_primary"
android:textSize="18sp" android:textSize="18sp"
android:textStyle="bold" android:textStyle="bold"
@ -97,7 +97,7 @@
android:id="@+id/phoneBookFilterDivider" android:id="@+id/phoneBookFilterDivider"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="1dp" android:layout_height="1dp"
android:layout_marginTop="16dp" android:layout_marginTop="4dp"
android:background="?attr/vctr_list_divider_color" android:background="?attr/vctr_list_divider_color"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"

View File

@ -132,7 +132,7 @@
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
android:layout_marginBottom="8dp" android:layout_marginBottom="8dp"
android:minHeight="@dimen/layout_touch_size" android:minHeight="@dimen/layout_touch_size"
android:text="@string/add_from_phone_book" android:text="@string/search_in_my_contacts"
android:visibility="visible" android:visibility="visible"
app:icon="@drawable/ic_plus_circle" app:icon="@drawable/ic_plus_circle"
app:iconPadding="13dp" app:iconPadding="13dp"

View File

@ -2545,4 +2545,8 @@ Not all features in Riot are implemented in RiotX yet. Main missing (and coming
<string name="add_from_phone_book">Add from my phone book</string> <string name="add_from_phone_book">Add from my phone book</string>
<string name="empty_phone_book">Your phone book is empty</string> <string name="empty_phone_book">Your phone book is empty</string>
<string name="phone_book_title">Phone book</string> <string name="phone_book_title">Phone book</string>
<string name="search_in_my_contacts">Search in my contacts</string>
<string name="loading_contact_book">Retrieving your contacts…</string>
<string name="empty_contact_book">Your contact book is empty</string>
<string name="contacts_book_title">Contacts book</string>
</resources> </resources>