diff --git a/presentation/src/main/java/com/moez/QKSMS/feature/contacts/ContactsActivity.kt b/presentation/src/main/java/com/moez/QKSMS/feature/contacts/ContactsActivity.kt index 424ae592..c0680d7e 100644 --- a/presentation/src/main/java/com/moez/QKSMS/feature/contacts/ContactsActivity.kt +++ b/presentation/src/main/java/com/moez/QKSMS/feature/contacts/ContactsActivity.kt @@ -21,7 +21,9 @@ package com.moez.QKSMS.feature.contacts import android.app.Activity import android.content.Intent import android.os.Bundle +import androidx.core.view.isVisible import androidx.lifecycle.ViewModelProviders +import com.jakewharton.rxbinding2.view.clicks import com.jakewharton.rxbinding2.widget.editorActions import com.jakewharton.rxbinding2.widget.textChanges import com.moez.QKSMS.R @@ -53,7 +55,7 @@ class ContactsActivity : QkThemedActivity(), ContactsContract { @Inject lateinit var viewModelFactory: ViewModelFactory override val queryChangedIntent: Observable by lazy { search.textChanges() } - override val queryBackspaceIntent: Observable<*> by lazy { search.backspaces } + override val queryClearedIntent: Observable<*> by lazy { cancel.clicks() } override val queryEditorActionIntent: Observable by lazy { search.editorActions() } override val composeItemPressedIntent: Subject by lazy { contactsAdapter.clicks } override val composeItemLongPressedIntent: Subject by lazy { contactsAdapter.longClicks } @@ -86,6 +88,8 @@ class ContactsActivity : QkThemedActivity(), ContactsContract { } override fun render(state: ContactsState) { + cancel.isVisible = state.query.length > 1 + contactsAdapter.data = state.composeItems if (state.selectedContact != null && !phoneNumberDialog.isShowing) { @@ -97,6 +101,10 @@ class ContactsActivity : QkThemedActivity(), ContactsContract { } } + override fun clearQuery() { + search.text = null + } + override fun openKeyboard() { search.postDelayed({ search.showKeyboard() diff --git a/presentation/src/main/java/com/moez/QKSMS/feature/contacts/ContactsContract.kt b/presentation/src/main/java/com/moez/QKSMS/feature/contacts/ContactsContract.kt index 65ed5ebe..cf6c5509 100644 --- a/presentation/src/main/java/com/moez/QKSMS/feature/contacts/ContactsContract.kt +++ b/presentation/src/main/java/com/moez/QKSMS/feature/contacts/ContactsContract.kt @@ -28,13 +28,14 @@ import io.reactivex.subjects.Subject interface ContactsContract : QkView { val queryChangedIntent: Observable - val queryBackspaceIntent: Observable<*> + val queryClearedIntent: Observable<*> val queryEditorActionIntent: Observable val composeItemPressedIntent: Subject val composeItemLongPressedIntent: Subject val phoneNumberSelectedIntent: Subject> val phoneNumberActionIntent: Subject + fun clearQuery() fun openKeyboard() fun finish(result: HashMap) diff --git a/presentation/src/main/java/com/moez/QKSMS/feature/contacts/ContactsState.kt b/presentation/src/main/java/com/moez/QKSMS/feature/contacts/ContactsState.kt index 9d5baad0..9829d905 100644 --- a/presentation/src/main/java/com/moez/QKSMS/feature/contacts/ContactsState.kt +++ b/presentation/src/main/java/com/moez/QKSMS/feature/contacts/ContactsState.kt @@ -22,6 +22,7 @@ import com.moez.QKSMS.feature.compose.editing.ComposeItem import com.moez.QKSMS.model.Contact data class ContactsState( + val query: String = "", val composeItems: List = ArrayList(), val selectedContact: Contact? = null // For phone number picker ) diff --git a/presentation/src/main/java/com/moez/QKSMS/feature/contacts/ContactsViewModel.kt b/presentation/src/main/java/com/moez/QKSMS/feature/contacts/ContactsViewModel.kt index 3a52671d..39ad99af 100644 --- a/presentation/src/main/java/com/moez/QKSMS/feature/contacts/ContactsViewModel.kt +++ b/presentation/src/main/java/com/moez/QKSMS/feature/contacts/ContactsViewModel.kt @@ -85,6 +85,16 @@ class ContactsViewModel @Inject constructor( shouldOpenKeyboard = false } + // Update the state's query, so we know if we should show the cancel button + view.queryChangedIntent + .autoDisposable(view.scope()) + .subscribe { query -> newState { copy(query = query.toString()) } } + + // Clear the query + view.queryClearedIntent + .autoDisposable(view.scope()) + .subscribe { view.clearQuery() } + // Update the list of contact suggestions based on the query input, while also filtering out any contacts // that have already been selected Observables diff --git a/presentation/src/main/res/layout/contacts_activity.xml b/presentation/src/main/res/layout/contacts_activity.xml index 1bbcbb50..89181ebf 100644 --- a/presentation/src/main/res/layout/contacts_activity.xml +++ b/presentation/src/main/res/layout/contacts_activity.xml @@ -47,21 +47,47 @@ style="@style/Toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" + app:contentInsetStartWithNavigation="0dp" app:layout_constrainedHeight="true" app:layout_constraintTop_toTopOf="parent"> - + android:animateLayoutChanges="true"> + + + + + + diff --git a/presentation/src/main/res/layout/main_activity.xml b/presentation/src/main/res/layout/main_activity.xml index 0e52fde0..ab58cee8 100644 --- a/presentation/src/main/res/layout/main_activity.xml +++ b/presentation/src/main/res/layout/main_activity.xml @@ -53,7 +53,7 @@ android:layout_marginEnd="8dp" android:layout_marginBottom="8dp" android:background="@drawable/rounded_rectangle_24dp" - android:backgroundTint="?android:attr/queryBackground" + android:backgroundTint="?attr/bubbleColor" android:hint="@string/title_conversations" android:paddingStart="16dp" android:paddingEnd="16dp" diff --git a/presentation/src/main/res/values-night/themes.xml b/presentation/src/main/res/values-night/themes.xml index 37deb86e..cf5054e5 100644 --- a/presentation/src/main/res/values-night/themes.xml +++ b/presentation/src/main/res/values-night/themes.xml @@ -24,7 +24,7 @@