mirror of
https://github.com/nextcloud/talk-android
synced 2025-06-21 20:49:36 +01:00
Further improvements to contacts
Signed-off-by: Mario Danic <mario@lovelyhq.com>
This commit is contained in:
parent
6c73b6f70c
commit
4cefbc8b37
@ -85,7 +85,7 @@
|
|||||||
android:name=".activities.MainActivity"
|
android:name=".activities.MainActivity"
|
||||||
android:label="@string/nc_app_label"
|
android:label="@string/nc_app_label"
|
||||||
android:launchMode="singleTask"
|
android:launchMode="singleTask"
|
||||||
android:windowSoftInputMode="adjustResize">
|
android:windowSoftInputMode="adjustResize|stateUnchanged">
|
||||||
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
@ -65,6 +65,8 @@ abstract class BaseController : ButterKnifeController(), ComponentCallbacks {
|
|||||||
val context: Context by inject()
|
val context: Context by inject()
|
||||||
val eventBus: EventBus by inject()
|
val eventBus: EventBus by inject()
|
||||||
|
|
||||||
|
var transitionInProgress = false
|
||||||
|
|
||||||
protected val actionBar: ActionBar?
|
protected val actionBar: ActionBar?
|
||||||
get() {
|
get() {
|
||||||
var actionBarProvider: ActionBarProvider? = null
|
var actionBarProvider: ActionBarProvider? = null
|
||||||
@ -137,6 +139,7 @@ abstract class BaseController : ButterKnifeController(), ComponentCallbacks {
|
|||||||
|
|
||||||
override fun onChangeStarted(changeHandler: ControllerChangeHandler, changeType: ControllerChangeType) {
|
override fun onChangeStarted(changeHandler: ControllerChangeHandler, changeType: ControllerChangeType) {
|
||||||
actionBar?.setIcon(null)
|
actionBar?.setIcon(null)
|
||||||
|
transitionInProgress = true
|
||||||
setOptionsMenuHidden(true)
|
setOptionsMenuHidden(true)
|
||||||
if (changeType == ControllerChangeType.POP_EXIT || changeType == ControllerChangeType.PUSH_EXIT) {
|
if (changeType == ControllerChangeType.POP_EXIT || changeType == ControllerChangeType.PUSH_EXIT) {
|
||||||
toolbarProgressBar?.isVisible = false
|
toolbarProgressBar?.isVisible = false
|
||||||
@ -149,6 +152,7 @@ abstract class BaseController : ButterKnifeController(), ComponentCallbacks {
|
|||||||
|
|
||||||
override fun onChangeEnded(changeHandler: ControllerChangeHandler, changeType: ControllerChangeType) {
|
override fun onChangeEnded(changeHandler: ControllerChangeHandler, changeType: ControllerChangeType) {
|
||||||
setOptionsMenuHidden(false)
|
setOptionsMenuHidden(false)
|
||||||
|
transitionInProgress = false
|
||||||
super.onChangeEnded(changeHandler, changeType)
|
super.onChangeEnded(changeHandler, changeType)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -44,7 +44,6 @@ abstract class UseCase<Type, in Params>(private val apiErrorHandler: ApiErrorHan
|
|||||||
onResult.onSuccess(it)
|
onResult.onSuccess(it)
|
||||||
}
|
}
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
|
|
||||||
onResult.onError(apiErrorHandler?.traceErrorException(e))
|
onResult.onError(apiErrorHandler?.traceErrorException(e))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -143,6 +143,12 @@ class ContactsView(private val bundle: Bundle? = null) : BaseView() {
|
|||||||
})
|
})
|
||||||
|
|
||||||
viewModel.apply {
|
viewModel.apply {
|
||||||
|
searchQueryLiveData.observe(this@ContactsView) { query ->
|
||||||
|
if (!transitionInProgress) {
|
||||||
|
activity?.clearButton?.isVisible = !query.isNullOrEmpty()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
selectedParticipantsLiveData.observe(this@ContactsView) { participants ->
|
selectedParticipantsLiveData.observe(this@ContactsView) { participants ->
|
||||||
view.selectedParticipantsRecyclerView.isVisible = participants.isNotEmpty()
|
view.selectedParticipantsRecyclerView.isVisible = participants.isNotEmpty()
|
||||||
view.divider.isVisible = participants.isNotEmpty()
|
view.divider.isVisible = participants.isNotEmpty()
|
||||||
|
@ -23,10 +23,7 @@
|
|||||||
package com.nextcloud.talk.newarch.features.contactsflow.contacts
|
package com.nextcloud.talk.newarch.features.contactsflow.contacts
|
||||||
|
|
||||||
import android.app.Application
|
import android.app.Application
|
||||||
import androidx.lifecycle.LiveData
|
import androidx.lifecycle.*
|
||||||
import androidx.lifecycle.MutableLiveData
|
|
||||||
import androidx.lifecycle.distinctUntilChanged
|
|
||||||
import androidx.lifecycle.viewModelScope
|
|
||||||
import com.nextcloud.talk.R
|
import com.nextcloud.talk.R
|
||||||
import com.nextcloud.talk.models.json.conversations.Conversation
|
import com.nextcloud.talk.models.json.conversations.Conversation
|
||||||
import com.nextcloud.talk.models.json.conversations.ConversationOverall
|
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.contactsflow.ParticipantElement
|
||||||
import com.nextcloud.talk.newarch.features.conversationslist.ConversationsListView
|
import com.nextcloud.talk.newarch.features.conversationslist.ConversationsListView
|
||||||
import com.nextcloud.talk.newarch.services.GlobalService
|
import com.nextcloud.talk.newarch.services.GlobalService
|
||||||
|
import kotlinx.coroutines.isActive
|
||||||
import kotlinx.coroutines.runBlocking
|
import kotlinx.coroutines.runBlocking
|
||||||
import org.koin.core.parameter.parametersOf
|
import org.koin.core.parameter.parametersOf
|
||||||
|
|
||||||
@ -60,7 +58,13 @@ class ContactsViewModel constructor(
|
|||||||
private val _operationState = MutableLiveData(ContactsViewOperationStateWrapper(ContactsViewOperationState.WAITING, null, null))
|
private val _operationState = MutableLiveData(ContactsViewOperationStateWrapper(ContactsViewOperationState.WAITING, null, null))
|
||||||
val operationState: LiveData<ContactsViewOperationStateWrapper> = _operationState.distinctUntilChanged()
|
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 conversationToken: String? = null
|
||||||
private var groupConversation: Boolean = false
|
private var groupConversation: Boolean = false
|
||||||
private var initialized = false
|
private var initialized = false
|
||||||
@ -69,15 +73,12 @@ class ContactsViewModel constructor(
|
|||||||
if (!initialized || conversationToken != this.conversationToken || groupConversation != this.groupConversation) {
|
if (!initialized || conversationToken != this.conversationToken || groupConversation != this.groupConversation) {
|
||||||
this.conversationToken = conversationToken
|
this.conversationToken = conversationToken
|
||||||
this.groupConversation = groupConversation
|
this.groupConversation = groupConversation
|
||||||
loadContacts()
|
initialized = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setSearchQuery(query: String?) {
|
fun setSearchQuery(query: String?) {
|
||||||
if (query != searchQuery) {
|
searchQuery.postValue(query)
|
||||||
searchQuery = query
|
|
||||||
loadContacts()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun selectParticipant(participant: Participant) {
|
fun selectParticipant(participant: Participant) {
|
||||||
@ -137,7 +138,7 @@ class ContactsViewModel constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun loadContacts() {
|
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>> {
|
UseCaseResponse<List<Participant>> {
|
||||||
override suspend fun onSuccess(result: List<Participant>) {
|
override suspend fun onSuccess(result: List<Participant>) {
|
||||||
val sortPriority = mapOf("users" to 0, "groups" to 1, "emails" to 2, "circles" to 0)
|
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>
|
} 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)
|
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)
|
participantElementsList.add(0, newGroupElement)
|
||||||
}
|
}
|
||||||
|
@ -73,8 +73,6 @@ class ConversationsListView : BaseView() {
|
|||||||
private lateinit var viewModel: ConversationsListViewModel
|
private lateinit var viewModel: ConversationsListViewModel
|
||||||
val factory: ConversationListViewModelFactory by inject()
|
val factory: ConversationListViewModelFactory by inject()
|
||||||
|
|
||||||
private var transitionInProgress = false
|
|
||||||
|
|
||||||
override fun onCreateView(
|
override fun onCreateView(
|
||||||
inflater: LayoutInflater,
|
inflater: LayoutInflater,
|
||||||
container: ViewGroup
|
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 {
|
override fun getLayoutId(): Int {
|
||||||
return R.layout.conversations_list_view
|
return R.layout.conversations_list_view
|
||||||
}
|
}
|
||||||
|
@ -52,9 +52,9 @@
|
|||||||
|
|
||||||
<ImageButton
|
<ImageButton
|
||||||
android:id="@+id/leftButton"
|
android:id="@+id/leftButton"
|
||||||
android:layout_width="36dp"
|
android:layout_width="32dp"
|
||||||
android:layout_height="36dp"
|
android:layout_height="32dp"
|
||||||
android:padding="3dp"
|
android:padding="4dp"
|
||||||
android:layout_gravity="center"
|
android:layout_gravity="center"
|
||||||
android:background="?attr/selectableItemBackgroundBorderless"
|
android:background="?attr/selectableItemBackgroundBorderless"
|
||||||
android:scaleType="fitCenter"
|
android:scaleType="fitCenter"
|
||||||
@ -73,7 +73,6 @@
|
|||||||
android:layout_centerVertical="true"
|
android:layout_centerVertical="true"
|
||||||
android:layout_toEndOf="@id/leftContainer"
|
android:layout_toEndOf="@id/leftContainer"
|
||||||
android:layout_toStartOf="@id/rightContainer"
|
android:layout_toStartOf="@id/rightContainer"
|
||||||
android:focusedByDefault="false"
|
|
||||||
android:layout_marginStart="4dp"
|
android:layout_marginStart="4dp"
|
||||||
android:imeOptions="actionSearch|flagNoExtractUi"
|
android:imeOptions="actionSearch|flagNoExtractUi"
|
||||||
android:inputType="textNoSuggestions"
|
android:inputType="textNoSuggestions"
|
||||||
@ -83,8 +82,7 @@
|
|||||||
app:boxStrokeColor="@color/transparent"
|
app:boxStrokeColor="@color/transparent"
|
||||||
app:errorEnabled="true"
|
app:errorEnabled="true"
|
||||||
app:helperTextEnabled="false"
|
app:helperTextEnabled="false"
|
||||||
app:hintEnabled="false"
|
app:hintEnabled="false">
|
||||||
tools:ignore="UnusedAttribute">
|
|
||||||
|
|
||||||
<com.google.android.material.textfield.TextInputEditText
|
<com.google.android.material.textfield.TextInputEditText
|
||||||
android:id="@+id/inputEditText"
|
android:id="@+id/inputEditText"
|
||||||
@ -110,9 +108,9 @@
|
|||||||
|
|
||||||
<ImageButton
|
<ImageButton
|
||||||
android:id="@+id/clearButton"
|
android:id="@+id/clearButton"
|
||||||
android:layout_width="36dp"
|
android:layout_width="32dp"
|
||||||
android:layout_height="36dp"
|
android:layout_height="32dp"
|
||||||
android:padding="3dp"
|
android:padding="4dp"
|
||||||
android:layout_gravity="center"
|
android:layout_gravity="center"
|
||||||
android:background="?attr/selectableItemBackgroundBorderless"
|
android:background="?attr/selectableItemBackgroundBorderless"
|
||||||
android:scaleType="fitCenter"
|
android:scaleType="fitCenter"
|
||||||
@ -124,9 +122,9 @@
|
|||||||
|
|
||||||
<ImageButton
|
<ImageButton
|
||||||
android:id="@+id/settingsButton"
|
android:id="@+id/settingsButton"
|
||||||
android:layout_width="36dp"
|
android:layout_width="32dp"
|
||||||
android:layout_height="36dp"
|
android:layout_height="32dp"
|
||||||
android:padding="3dp"
|
android:padding="4dp"
|
||||||
android:layout_gravity="center"
|
android:layout_gravity="center"
|
||||||
android:background="?attr/selectableItemBackgroundBorderless"
|
android:background="?attr/selectableItemBackgroundBorderless"
|
||||||
android:scaleType="fitCenter"
|
android:scaleType="fitCenter"
|
||||||
@ -138,9 +136,9 @@
|
|||||||
|
|
||||||
<ProgressBar
|
<ProgressBar
|
||||||
android:id="@+id/searchProgressBar"
|
android:id="@+id/searchProgressBar"
|
||||||
android:layout_width="36dp"
|
android:layout_width="32dp"
|
||||||
android:layout_height="36dp"
|
android:layout_height="32dp"
|
||||||
android:padding="3dp"
|
android:padding="4dp"
|
||||||
android:layout_gravity="center"
|
android:layout_gravity="center"
|
||||||
android:indeterminate="true"
|
android:indeterminate="true"
|
||||||
android:indeterminateTint="@color/colorPrimary"
|
android:indeterminateTint="@color/colorPrimary"
|
||||||
|
Loading…
Reference in New Issue
Block a user