Most work on search done

What remains is animation of toolbar on back button

Signed-off-by: Mario Danic <mario@lovelyhq.com>
This commit is contained in:
Mario Danic 2020-01-09 13:46:34 +01:00
parent 689b8e93af
commit 27829eb1d8
No known key found for this signature in database
GPG Key ID: CDE0BBD2738C4CC0
13 changed files with 268 additions and 152 deletions

View File

@ -29,6 +29,7 @@ import android.view.ViewGroup
import androidx.annotation.RequiresApi
import butterknife.BindView
import butterknife.ButterKnife
import butterknife.OnClick
import com.bluelinelabs.conductor.Conductor
import com.bluelinelabs.conductor.Router
import com.bluelinelabs.conductor.RouterTransaction
@ -70,7 +71,6 @@ class MainActivity : BaseActivity(), ActionBarProvider {
setContentView(R.layout.activity_main)
ButterKnife.bind(this)
setSupportActionBar(toolbar)
router = Conductor.attachRouter(this, container, savedInstanceState)
@ -107,6 +107,17 @@ class MainActivity : BaseActivity(), ActionBarProvider {
}
}
@OnClick(R.id.floatingActionButton)
fun onFloatingActionButtonClick() {
val bundle = Bundle()
bundle.putBoolean(BundleKeys.KEY_NEW_CONVERSATION, true)
router?.pushController(
RouterTransaction.with(ContactsController(bundle))
.pushChangeHandler(HorizontalChangeHandler())
.popChangeHandler(HorizontalChangeHandler()))
}
@RequiresApi(api = Build.VERSION_CODES.M)
fun checkIfWeAreSecure() {
val keyguardManager = getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager

View File

@ -49,6 +49,8 @@ import butterknife.OnClick
import coil.api.load
import coil.target.Target
import coil.transform.CircleCropTransformation
import com.bluelinelabs.conductor.ControllerChangeHandler
import com.bluelinelabs.conductor.ControllerChangeType
import com.bluelinelabs.conductor.RouterTransaction
import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler
import com.bluelinelabs.conductor.changehandler.VerticalChangeHandler
@ -710,13 +712,14 @@ class ChatController(args: Bundle) : BaseController(), MessagesListAdapter
}
}
override fun onChangeStarted(changeHandler: ControllerChangeHandler, changeType: ControllerChangeType) {
actionBar?.setIcon(null)
super.onChangeStarted(changeHandler, changeType)
}
override fun onDetach(view: View) {
eventBus.unregister(this)
if (actionBar != null) {
actionBar?.setIcon(null)
}
if (activity != null) {
activity?.findViewById<View>(R.id.toolbar)
?.setOnClickListener(null)

View File

@ -20,14 +20,11 @@
package com.nextcloud.talk.controllers.base
import android.app.Activity
import android.content.ComponentCallbacks
import android.content.Context
import android.content.res.Configuration
import android.os.Build
import android.util.Log
import android.util.TypedValue
import android.view.LayoutInflater
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
@ -37,11 +34,10 @@ import android.widget.EditText
import androidx.annotation.RequiresApi
import androidx.appcompat.app.ActionBar
import androidx.core.view.isVisible
import androidx.core.view.marginBottom
import androidx.core.view.updatePadding
import com.bluelinelabs.conductor.ControllerChangeHandler
import com.bluelinelabs.conductor.ControllerChangeType
import com.bluelinelabs.conductor.autodispose.ControllerScopeProvider
import com.google.android.material.appbar.AppBarLayout
import com.google.android.material.appbar.MaterialToolbar
import com.nextcloud.talk.R
import com.nextcloud.talk.activities.MainActivity
import com.nextcloud.talk.controllers.AccountVerificationController
@ -94,25 +90,23 @@ abstract class BaseController : ButterKnifeController(), ComponentCallbacks {
activity?.let {
if (it is MainActivity) {
it.searchCardView.isVisible = value
it.floatingActionButton.isVisible = value
it.inputEditText.hint = getSearchHint()
val layoutParams = it.toolbar.layoutParams as AppBarLayout.LayoutParams
if (value) {
layoutParams.scrollFlags = AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL or AppBarLayout.LayoutParams.SCROLL_FLAG_SNAP or AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS
it.appBar.setBackgroundResource(R.color.transparent)
//it.toolbar.setContentInsetsAbsolute(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 16f, resources?.displayMetrics).toInt(), 0)
//layoutParams.scrollFlags = AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL or AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS or AppBarLayout.LayoutParams.SCROLL_FLAG_SNAP
it.toolbar.layoutParams = layoutParams
} else {
it.appBar.setBackgroundResource(R.color.colorPrimary)
//it.toolbar.setContentInsetsAbsolute(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 24f, resources?.displayMetrics).toInt(), 0)
layoutParams.scrollFlags = 0
it.toolbar.layoutParams = layoutParams
it.appBar.setBackgroundResource(R.color.colorPrimary)
}
it.toolbar.layoutParams = layoutParams
}
}
}
private fun cleanTempCertPreference() {
val temporaryClassNames = ArrayList<String>()
temporaryClassNames.add(ServerSelectionController::class.java.name)
@ -126,6 +120,7 @@ abstract class BaseController : ButterKnifeController(), ComponentCallbacks {
}
override fun onViewBound(view: View) {
super.onViewBound(view)
cleanTempCertPreference()
@ -142,11 +137,10 @@ abstract class BaseController : ButterKnifeController(), ComponentCallbacks {
}
override fun onAttach(view: View) {
super.onAttach(view)
showSearchOrToolbar()
setTitle()
actionBar?.setDisplayHomeAsUpEnabled(parentController != null || router.backstackSize > 1)
showSearchOrToolbar()
super.onAttach(view)
}
override fun onDetach(view: View) {

View File

@ -57,9 +57,9 @@ class ConversationsRepositoryImpl(val conversationsDao: ConversationsDao) :
.deleteConversation(userId, conversationId)
}
override fun getConversationsForUser(userId: Long, filter: String?): LiveData<List<Conversation>> {
override fun getConversationsForUser(userId: Long, filter: CharSequence?): LiveData<List<Conversation>> {
filter?.let {
return conversationsDao.getConversationsForUserWithFilter(userId, it).distinctUntilChanged().map { data ->
return conversationsDao.getConversationsForUserWithFilter(userId, it.toString()).distinctUntilChanged().map { data ->
data.map {conversationEntity ->
conversationEntity.toConversation()
}

View File

@ -24,7 +24,7 @@ import androidx.lifecycle.LiveData
import com.nextcloud.talk.models.json.conversations.Conversation
interface ConversationsRepository {
fun getConversationsForUser(userId: Long, filter: String?): LiveData<List<Conversation>>
fun getConversationsForUser(userId: Long, filter: CharSequence?): LiveData<List<Conversation>>
fun getShortcutTargetConversations(userId: Long): LiveData<List<Conversation>>
suspend fun getConversationForUserWithToken(userId: Long, token: String): Conversation?

View File

@ -21,17 +21,14 @@
package com.nextcloud.talk.newarch.features.conversationsList
import android.content.Context
import android.content.res.Configuration
import android.os.Bundle
import android.view.*
import androidx.appcompat.widget.SearchView
import androidx.core.view.isVisible
import androidx.lifecycle.observe
import butterknife.OnClick
import com.afollestad.materialdialogs.LayoutMode
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.bottomsheets.BottomSheet
import com.bluelinelabs.conductor.ControllerChangeHandler
import com.bluelinelabs.conductor.ControllerChangeType
import com.bluelinelabs.conductor.RouterTransaction
import com.bluelinelabs.conductor.autodispose.ControllerScopeProvider
import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler
@ -39,7 +36,6 @@ import com.bluelinelabs.conductor.changehandler.TransitionChangeHandlerCompat
import com.bluelinelabs.conductor.changehandler.VerticalChangeHandler
import com.nextcloud.talk.R
import com.nextcloud.talk.R.drawable
import com.nextcloud.talk.activities.MainActivity
import com.nextcloud.talk.controllers.ContactsController
import com.nextcloud.talk.controllers.SettingsController
import com.nextcloud.talk.controllers.bottomsheet.items.BasicListItemWithImage
@ -47,6 +43,7 @@ import com.nextcloud.talk.controllers.bottomsheet.items.listItemsWithImage
import com.nextcloud.talk.models.json.conversations.Conversation
import com.nextcloud.talk.newarch.conversationsList.mvp.BaseView
import com.nextcloud.talk.newarch.data.presenters.AdvancedEmptyPresenter
import com.nextcloud.talk.newarch.features.search.DebouncingTextWatcher
import com.nextcloud.talk.newarch.mvvm.ext.initRecyclerView
import com.nextcloud.talk.utils.ConductorRemapping
import com.nextcloud.talk.utils.DisplayUtils
@ -55,15 +52,11 @@ import com.nextcloud.talk.utils.bundle.BundleKeys
import com.otaliastudios.elements.*
import com.uber.autodispose.lifecycle.LifecycleScopeProvider
import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.activity_main.view.*
import kotlinx.android.synthetic.main.controller_conversations_rv.view.*
import kotlinx.android.synthetic.main.message_state.view.*
import kotlinx.android.synthetic.main.search_layout.*
import kotlinx.android.synthetic.main.search_layout.view.*
import org.koin.android.ext.android.inject
import org.parceler.Parcels
import java.util.*
class ConversationsListView : BaseView() {
@ -72,34 +65,6 @@ class ConversationsListView : BaseView() {
private lateinit var viewModel: ConversationsListViewModel
val factory: ConversationListViewModelFactory by inject()
/*private fun initSearchView() {
val searchManager = activity!!.getSystemService(Context.SEARCH_SERVICE) as SearchManager
searchView = MenuItemCompat.getActionView(searchItem) as SearchView
searchView!!.maxWidth = Integer.MAX_VALUE
searchView!!.inputType = InputType.TYPE_TEXT_VARIATION_FILTER
var imeOptions = EditorInfo.IME_ACTION_DONE or EditorInfo.IME_FLAG_NO_FULLSCREEN
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && appPreferences.isKeyboardIncognito) {
imeOptions = imeOptions or EditorInfo.IME_FLAG_NO_PERSONALIZED_LEARNING
}
searchView!!.imeOptions = imeOptions
searchView!!.queryHint = resources?.getString(R.string.nc_search)
searchView!!.setSearchableInfo(searchManager.getSearchableInfo(activity!!.componentName))
searchView!!.setOnQueryTextListener(this)
}
override fun onQueryTextSubmit(query: String?): Boolean {
if (!viewModel.searchQuery.value.equals(query)) {
viewModel.searchQuery.value = query
}
return true
}
override fun onQueryTextChange(newText: String?): Boolean {
return onQueryTextSubmit(newText)
}*/
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup
@ -131,7 +96,11 @@ class ConversationsListView : BaseView() {
swipeRefreshLayoutView.setColorSchemeResources(R.color.colorPrimary)
}
activity?.rightButton?.setOnClickListener {
activity?.inputEditText?.addTextChangedListener(DebouncingTextWatcher(lifecycle, ::setSearchQuery))
activity?.clearButton?.setOnClickListener {
activity?.inputEditText?.text = null
}
activity?.settingsButton?.setOnClickListener {
val settingsTransitionName = "userAvatar.transitionTag"
router.pushController(
RouterTransaction.with(SettingsController())
@ -150,12 +119,20 @@ class ConversationsListView : BaseView() {
}
viewModel.avatar.observe(this@ConversationsListView) { avatar ->
activity?.rightButton?.setImageDrawable(avatar)
activity?.settingsButton?.setImageDrawable(avatar)
}
viewModel.filterLiveData.observe(this@ConversationsListView) {query ->
activity?.settingsButton?.isVisible = query.isNullOrEmpty()
activity?.clearButton?.isVisible = !query.isNullOrEmpty()
}
return view
}
private fun setSearchQuery(query: CharSequence?) {
viewModel.filterLiveData.value = query
}
private fun onElementClick(page: Page, holder: Presenter.Holder, element: Element<Conversation>) {
val conversation = element.data
val user = viewModel.globalService.currentUserLiveData.value
@ -234,10 +211,10 @@ class ConversationsListView : BaseView() {
return R.layout.controller_conversations_rv
}
@OnClick(R.id.floatingActionButton)
/*@OnClick(R.id.floatingActionButton)
fun onFloatingActionButtonClick() {
openNewConversationScreen()
}
}*/
private fun openNewConversationScreen() {
val bundle = Bundle()

View File

@ -66,7 +66,7 @@ class ConversationsListViewModel constructor(
var messageData: String? = null
val networkStateLiveData: MutableLiveData<ConversationsListViewNetworkState> = MutableLiveData(ConversationsListViewNetworkState.LOADING)
val avatar: MutableLiveData<Drawable> = MutableLiveData(DisplayUtils.getRoundedDrawable(context.getDrawable(R.drawable.ic_settings_white_24dp)))
val filterLiveData: MutableLiveData<String?> = MutableLiveData(null)
val filterLiveData: MutableLiveData<CharSequence?> = MutableLiveData(null)
val conversationsLiveData = Transformations.switchMap(globalService.currentUserLiveData) { user ->
if (networkStateLiveData.value != ConversationsListViewNetworkState.LOADING) {
networkStateLiveData.postValue(ConversationsListViewNetworkState.LOADING)
@ -75,7 +75,7 @@ class ConversationsListViewModel constructor(
loadAvatar()
filterLiveData.value = null
Transformations.switchMap(filterLiveData.distinctUntilChanged()) { filter ->
Transformations.switchMap(filterLiveData) { filter ->
conversationsRepository.getConversationsForUser(user.id!!, filter)
}
}

View File

@ -22,35 +22,38 @@
package com.nextcloud.talk.newarch.features.search
import androidx.appcompat.widget.SearchView.OnQueryTextListener
import android.text.Editable
import android.text.TextWatcher
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.coroutineScope
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
class DebouncingQueryTextListener(
class DebouncingTextWatcher(
lifecycle: Lifecycle,
private val onDebouncingQueryTextChange: (String?) -> Unit
) : OnQueryTextListener {
private val onDebouncingTextWatcherChange: (CharSequence?) -> Unit
) : TextWatcher {
private var debouncePeriod: Long = 500
private val coroutineScope = lifecycle.coroutineScope
private var searchJob: Job? = null
override fun onQueryTextSubmit(query: String?): Boolean {
return false
override fun afterTextChanged(s: Editable?) {
}
override fun onQueryTextChange(newText: String?): Boolean {
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
searchJob?.cancel()
searchJob = coroutineScope.launch {
newText?.let {
s.let {
delay(debouncePeriod)
onDebouncingQueryTextChange(newText)
onDebouncingTextWatcherChange(s)
}
}
return false
}
}

View File

@ -0,0 +1,66 @@
/*
*
* * Nextcloud Talk application
* *
* * @author Mario Danic
* * Copyright (C) 2017-2020 Mario Danic <mario@lovelyhq.com>
* *
* * This program is free software: you can redistribute it and/or modify
* * it under the terms of the GNU General Public License as published by
* * the Free Software Foundation, either version 3 of the License, or
* * at your option) any later version.
* *
* * This program is distributed in the hope that it will be useful,
* * but WITHOUT ANY WARRANTY; without even the implied warranty of
* * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* * GNU General Public License for more details.
* *
* * You should have received a copy of the GNU General Public License
* * along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.nextcloud.talk.newarch.utils
import android.annotation.TargetApi
import android.content.Context
import android.os.Build
import android.util.AttributeSet
import android.view.MotionEvent
import android.view.ViewGroup
import android.view.WindowInsets
import androidx.annotation.AttrRes
import androidx.coordinatorlayout.widget.CoordinatorLayout
import com.bluelinelabs.conductor.Controller
import com.bluelinelabs.conductor.ControllerChangeHandler
import com.bluelinelabs.conductor.ControllerChangeHandler.ControllerChangeListener
import com.nextcloud.talk.activities.MainActivity
import com.nextcloud.talk.newarch.features.conversationsList.ConversationsListView
class ChangeHandlerCoordinatorLayout : CoordinatorLayout, ControllerChangeListener {
private var inProgressTransactionCount = 0
constructor(context: Context) : super(context) {}
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {}
constructor(context: Context, attrs: AttributeSet?, @AttrRes defStyleAttr: Int) : super(context, attrs, defStyleAttr) {}
override fun onInterceptTouchEvent(ev: MotionEvent): Boolean {
return inProgressTransactionCount > 0 || super.onInterceptTouchEvent(ev)
}
override fun onChangeStarted(to: Controller?, from: Controller?, isPush: Boolean, container: ViewGroup, handler: ControllerChangeHandler) {
inProgressTransactionCount++
}
override fun onChangeCompleted(to: Controller?, from: Controller?, isPush: Boolean, container: ViewGroup, handler: ControllerChangeHandler) {
inProgressTransactionCount--
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
override fun onApplyWindowInsets(insets: WindowInsets): WindowInsets {
for (i in 0 until childCount) {
getChildAt(i).dispatchApplyWindowInsets(insets)
}
return super.onApplyWindowInsets(insets)
}
}

View File

@ -21,39 +21,50 @@
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/mainActivityCoordinatorLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activities.MainActivity">
<com.bluelinelabs.conductor.ChangeHandlerFrameLayout
android:id="@+id/controller_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="0dp"
android:id="@+id/appBar"
app:elevation="0dp"
>
android:layout_width="match_parent"
android:layout_height="56dp"
android:background="@color/transparent"
app:elevation="0dp">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:theme="@style/ThemeOverlay.MaterialComponents.Dark.ActionBar"
android:layout_height="?android:attr/actionBarSize"
android:background="@color/transparent"
app:elevation="0dp"
app:contentInsetEnd="12dp"
app:contentInsetStart="12dp"
app:contentInsetStartWithNavigation="0dp"
app:elevation="0dp"
app:layout_scrollFlags="scroll|enterAlways|snap"
app:popupTheme="@style/appActionBarPopupMenu">
<include layout="@layout/search_layout"/>
</com.google.android.material.appbar.MaterialToolbar>>
<include layout="@layout/search_layout"/>
</com.google.android.material.appbar.MaterialToolbar>
</com.google.android.material.appbar.AppBarLayout>
<com.nextcloud.talk.newarch.utils.ChangeHandlerCoordinatorLayout
android:id="@+id/controller_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_behavior="com.nextcloud.talk.utils.FABAwareScrollingViewBehavior"
/>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/floatingActionButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="16dp"
app:backgroundTint="@color/colorPrimary"
app:srcCompat="@drawable/ic_add_white_24px"
app:tint="@color/white" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ /*
~ * Nextcloud Talk application
~ *
~ * @author Mario Danic
~ * Copyright (C) 2017-2020 Mario Danic <mario@lovelyhq.com>
~ *
~ * This program is free software: you can redistribute it and/or modify
~ * it under the terms of the GNU General Public License as published by
~ * the Free Software Foundation, either version 3 of the License, or
~ * at your option) any later version.
~ *
~ * This program is distributed in the hope that it will be useful,
~ * but WITHOUT ANY WARRANTY; without even the implied warranty of
~ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
~ * GNU General Public License for more details.
~ *
~ * You should have received a copy of the GNU General Public License
~ * along with this program. If not, see <http://www.gnu.org/licenses/>.
~ */
-->
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appBarToolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:elevation="0dp">
<com.google.android.material.appbar.MaterialToolbar
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_scrollFlags="enterAlways|scroll|snap"
>
<include layout="@layout/search_layout"
android:layout_height="match_parent"
android:layout_width="64dp"
/>
</com.google.android.material.appbar.MaterialToolbar>
</com.google.android.material.appbar.AppBarLayout>
</merge>

View File

@ -30,8 +30,7 @@
android:id="@+id/swipeRefreshLayoutView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="visible"
app:layout_behavior="com.nextcloud.talk.utils.FABAwareScrollingViewBehavior">
android:visibility="visible">
<androidx.recyclerview.widget.RecyclerView
@ -44,14 +43,4 @@
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/floatingActionButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="16dp"
app:backgroundTint="@color/colorPrimary"
app:srcCompat="@drawable/ic_add_white_24px"
app:tint="@color/white" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@ -22,43 +22,40 @@
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
>
xmlns:tools="http://schemas.android.com/tools">
<androidx.cardview.widget.CardView
android:id="@+id/searchCardView"
android:layout_width="match_parent"
android:layout_height="48dp"
android:clickable="true"
android:focusable="true"
android:layout_marginVertical="8dp"
android:layout_centerHorizontal="true"
android:layout_marginHorizontal="12dp"
android:background="@color/transparent"
app:cardUseCompatPadding="false"
app:cardBackgroundColor="@color/transparent"
app:cardElevation="0dp"
android:clickable="true"
android:elevation="0dp"
android:focusable="true"
app:cardBackgroundColor="@color/transparent"
app:cardCornerRadius="4dp"
app:cardElevation="0dp"
app:cardUseCompatPadding="false"
tools:cardCornerRadius="4dp"
tools:cardElevation="0dp"
android:clipToPadding="true"
android:clipChildren="true"
android:animateLayoutChanges="true"
android:layout_centerHorizontal="true">
>
<RelativeLayout
android:layout_width="match_parent"
android:clipToPadding="true"
android:layout_height="wrap_content"
android:background="@color/colorPrimary">
android:layout_height="match_parent"
android:background="@color/colorPrimary"
android:clipToPadding="true">
<FrameLayout
android:id="@+id/leftContainer"
android:visibility="gone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:layout_marginStart="16dp"
android:layout_centerVertical="true">
android:visibility="gone">
<ImageButton
android:id="@+id/leftButton"
@ -67,8 +64,8 @@
android:layout_gravity="center"
android:background="?attr/selectableItemBackgroundBorderless"
android:scaleType="fitCenter"
android:tint="@color/fg_inverse"
android:src="@drawable/ic_arrow_back_black_24dp"
android:tint="@color/fg_inverse"
android:visibility="visible"
tools:src="@drawable/ic_arrow_back_black_24dp" />
@ -85,38 +82,58 @@
<EditText
android:id="@+id/inputEditText"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="start|center"
android:layout_toEndOf="@id/leftContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignWithParentIfMissing="true"
android:inputType="textNoSuggestions"
android:layout_marginStart="16dp"
android:imeOptions="actionSearch|flagNoExtractUi"
android:lines="1"
android:layout_marginEnd="16dp"
android:maxLines="1"
android:layout_toStartOf="@id/rightContainer"
android:layout_toEndOf="@id/leftContainer"
android:background="@null"
android:textSize="16sp"
tools:hint="Search"
android:layout_toStartOf="@id/rightButton"/>
<ImageView
android:id="@+id/rightButton"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_marginEnd="16dp"
android:layout_alignParentEnd="true"
android:transitionName="userAvatar.transitionTag"
android:layout_centerVertical="true"
android:scaleType="fitCenter"
android:imeOptions="actionSearch|flagNoExtractUi"
android:inputType="textNoSuggestions"
android:lines="1"
android:maxLines="1"
android:textCursorDrawable="@null"
android:textSize="16sp"
tools:hint="Search" />
<FrameLayout
android:id="@+id/rightContainer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_marginEnd="16dp">
<ImageView
android:id="@+id/clearButton"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center"
android:background="?attr/selectableItemBackgroundBorderless"
android:scaleType="fitCenter"
android:src="@drawable/ic_baseline_clear_24"
android:tint="@color/white"
android:transitionName="userAvatar.transitionTag"
android:visibility="gone"
tools:src="@tools:sample/avatars[0]" />
<ImageView
android:id="@+id/settingsButton"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center"
android:background="?attr/selectableItemBackgroundBorderless"
android:scaleType="fitCenter"
android:src="@drawable/ic_settings_white_24dp"
tools:src="@tools:sample/avatars[0]"
android:visibility="visible" />
android:transitionName="userAvatar.transitionTag"
android:visibility="visible"
tools:src="@tools:sample/avatars[0]" />
</RelativeLayout>
</FrameLayout>
</RelativeLayout>
</androidx.cardview.widget.CardView>
</merge>
</androidx.cardview.widget.CardView></merge>