Further improvements to contacts

Signed-off-by: Mario Danic <mario@lovelyhq.com>
This commit is contained in:
Mario Danic 2020-02-01 23:34:03 +01:00
parent 6c73b6f70c
commit 4cefbc8b37
No known key found for this signature in database
GPG Key ID: CDE0BBD2738C4CC0
7 changed files with 37 additions and 41 deletions

View File

@ -85,7 +85,7 @@
android:name=".activities.MainActivity"
android:label="@string/nc_app_label"
android:launchMode="singleTask"
android:windowSoftInputMode="adjustResize">
android:windowSoftInputMode="adjustResize|stateUnchanged">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

View File

@ -65,6 +65,8 @@ abstract class BaseController : ButterKnifeController(), ComponentCallbacks {
val context: Context by inject()
val eventBus: EventBus by inject()
var transitionInProgress = false
protected val actionBar: ActionBar?
get() {
var actionBarProvider: ActionBarProvider? = null
@ -137,6 +139,7 @@ abstract class BaseController : ButterKnifeController(), ComponentCallbacks {
override fun onChangeStarted(changeHandler: ControllerChangeHandler, changeType: ControllerChangeType) {
actionBar?.setIcon(null)
transitionInProgress = true
setOptionsMenuHidden(true)
if (changeType == ControllerChangeType.POP_EXIT || changeType == ControllerChangeType.PUSH_EXIT) {
toolbarProgressBar?.isVisible = false
@ -149,6 +152,7 @@ abstract class BaseController : ButterKnifeController(), ComponentCallbacks {
override fun onChangeEnded(changeHandler: ControllerChangeHandler, changeType: ControllerChangeType) {
setOptionsMenuHidden(false)
transitionInProgress = false
super.onChangeEnded(changeHandler, changeType)
}

View File

@ -44,7 +44,6 @@ abstract class UseCase<Type, in Params>(private val apiErrorHandler: ApiErrorHan
onResult.onSuccess(it)
}
} catch (e: Exception) {
onResult.onError(apiErrorHandler?.traceErrorException(e))
}
}

View File

@ -143,6 +143,12 @@ class ContactsView(private val bundle: Bundle? = null) : BaseView() {
})
viewModel.apply {
searchQueryLiveData.observe(this@ContactsView) { query ->
if (!transitionInProgress) {
activity?.clearButton?.isVisible = !query.isNullOrEmpty()
}
}
selectedParticipantsLiveData.observe(this@ContactsView) { participants ->
view.selectedParticipantsRecyclerView.isVisible = participants.isNotEmpty()
view.divider.isVisible = participants.isNotEmpty()

View File

@ -23,10 +23,7 @@
package com.nextcloud.talk.newarch.features.contactsflow.contacts
import android.app.Application
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.distinctUntilChanged
import androidx.lifecycle.viewModelScope
import androidx.lifecycle.*
import com.nextcloud.talk.R
import com.nextcloud.talk.models.json.conversations.Conversation
import com.nextcloud.talk.models.json.conversations.ConversationOverall
@ -43,6 +40,7 @@ import com.nextcloud.talk.newarch.features.contactsflow.ContactsViewOperationSta
import com.nextcloud.talk.newarch.features.contactsflow.ParticipantElement
import com.nextcloud.talk.newarch.features.conversationslist.ConversationsListView
import com.nextcloud.talk.newarch.services.GlobalService
import kotlinx.coroutines.isActive
import kotlinx.coroutines.runBlocking
import org.koin.core.parameter.parametersOf
@ -60,7 +58,13 @@ class ContactsViewModel constructor(
private val _operationState = MutableLiveData(ContactsViewOperationStateWrapper(ContactsViewOperationState.WAITING, null, null))
val operationState: LiveData<ContactsViewOperationStateWrapper> = _operationState.distinctUntilChanged()
private var searchQuery: String? = null
private var searchQuery: MutableLiveData<String?> = MutableLiveData()
var searchQueryLiveData: LiveData<String?> = Transformations.switchMap(searchQuery) { searchQuery ->
if (initialized) {
loadContacts()
}
liveData<String?> { searchQuery }
}
private var conversationToken: String? = null
private var groupConversation: Boolean = false
private var initialized = false
@ -69,15 +73,12 @@ class ContactsViewModel constructor(
if (!initialized || conversationToken != this.conversationToken || groupConversation != this.groupConversation) {
this.conversationToken = conversationToken
this.groupConversation = groupConversation
loadContacts()
initialized = true
}
}
fun setSearchQuery(query: String?) {
if (query != searchQuery) {
searchQuery = query
loadContacts()
}
searchQuery.postValue(query)
}
fun selectParticipant(participant: Participant) {
@ -137,7 +138,7 @@ class ContactsViewModel constructor(
}
private fun loadContacts() {
getContactsUseCase.invoke(viewModelScope, parametersOf(globalService.currentUserLiveData.value, groupConversation, searchQuery, conversationToken), object :
getContactsUseCase.invoke(viewModelScope, parametersOf(globalService.currentUserLiveData.value, groupConversation, searchQuery.value, conversationToken), object :
UseCaseResponse<List<Participant>> {
override suspend fun onSuccess(result: List<Participant>) {
val sortPriority = mapOf("users" to 0, "groups" to 1, "emails" to 2, "circles" to 0)
@ -160,7 +161,7 @@ class ContactsViewModel constructor(
} as MutableList<ParticipantElement>
if (conversationToken.isNullOrEmpty() && searchQuery.isNullOrEmpty()) {
if (conversationToken.isNullOrEmpty() && searchQuery.value.isNullOrEmpty()) {
val newGroupElement = ParticipantElement(Pair(context.getString(R.string.nc_new_group), R.drawable.ic_people_group_white_24px), ParticipantElementType.PARTICIPANT_NEW_GROUP.ordinal)
participantElementsList.add(0, newGroupElement)
}

View File

@ -73,8 +73,6 @@ class ConversationsListView : BaseView() {
private lateinit var viewModel: ConversationsListViewModel
val factory: ConversationListViewModelFactory by inject()
private var transitionInProgress = false
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup
@ -225,16 +223,6 @@ class ConversationsListView : BaseView() {
}
}
override fun onChangeStarted(changeHandler: ControllerChangeHandler, changeType: ControllerChangeType) {
super.onChangeStarted(changeHandler, changeType)
transitionInProgress = true
}
override fun onChangeEnded(changeHandler: ControllerChangeHandler, changeType: ControllerChangeType) {
super.onChangeEnded(changeHandler, changeType)
transitionInProgress = false
}
override fun getLayoutId(): Int {
return R.layout.conversations_list_view
}

View File

@ -52,9 +52,9 @@
<ImageButton
android:id="@+id/leftButton"
android:layout_width="36dp"
android:layout_height="36dp"
android:padding="3dp"
android:layout_width="32dp"
android:layout_height="32dp"
android:padding="4dp"
android:layout_gravity="center"
android:background="?attr/selectableItemBackgroundBorderless"
android:scaleType="fitCenter"
@ -73,7 +73,6 @@
android:layout_centerVertical="true"
android:layout_toEndOf="@id/leftContainer"
android:layout_toStartOf="@id/rightContainer"
android:focusedByDefault="false"
android:layout_marginStart="4dp"
android:imeOptions="actionSearch|flagNoExtractUi"
android:inputType="textNoSuggestions"
@ -83,8 +82,7 @@
app:boxStrokeColor="@color/transparent"
app:errorEnabled="true"
app:helperTextEnabled="false"
app:hintEnabled="false"
tools:ignore="UnusedAttribute">
app:hintEnabled="false">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/inputEditText"
@ -110,9 +108,9 @@
<ImageButton
android:id="@+id/clearButton"
android:layout_width="36dp"
android:layout_height="36dp"
android:padding="3dp"
android:layout_width="32dp"
android:layout_height="32dp"
android:padding="4dp"
android:layout_gravity="center"
android:background="?attr/selectableItemBackgroundBorderless"
android:scaleType="fitCenter"
@ -124,9 +122,9 @@
<ImageButton
android:id="@+id/settingsButton"
android:layout_width="36dp"
android:layout_height="36dp"
android:padding="3dp"
android:layout_width="32dp"
android:layout_height="32dp"
android:padding="4dp"
android:layout_gravity="center"
android:background="?attr/selectableItemBackgroundBorderless"
android:scaleType="fitCenter"
@ -138,9 +136,9 @@
<ProgressBar
android:id="@+id/searchProgressBar"
android:layout_width="36dp"
android:layout_height="36dp"
android:padding="3dp"
android:layout_width="32dp"
android:layout_height="32dp"
android:padding="4dp"
android:layout_gravity="center"
android:indeterminate="true"
android:indeterminateTint="@color/colorPrimary"