From 27829eb1d8eec50312b16c27fe55cce495f72aa6 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Thu, 9 Jan 2020 13:46:34 +0100 Subject: [PATCH] Most work on search done What remains is animation of toolbar on back button Signed-off-by: Mario Danic --- .../nextcloud/talk/activities/MainActivity.kt | 13 ++- .../talk/controllers/ChatController.kt | 11 +- .../talk/controllers/base/BaseController.kt | 26 ++--- .../offline/ConversationsRepositoryImpl.kt | 4 +- .../offline/ConversationsRepository.kt | 2 +- .../ConversationsListView.kt | 59 +++------- .../ConversationsListViewModel.kt | 4 +- .../search/DebouncingQueryTextListener.kt | 23 ++-- .../utils/ChangeHandlerCoordinatorLayout.kt | 66 +++++++++++ app/src/main/res/layout/activity_main.xml | 49 ++++---- .../res/layout/complete_search_layout.xml | 45 ++++++++ .../layout/controller_conversations_rv.xml | 13 +-- app/src/main/res/layout/search_layout.xml | 105 ++++++++++-------- 13 files changed, 268 insertions(+), 152 deletions(-) create mode 100644 app/src/main/java/com/nextcloud/talk/newarch/utils/ChangeHandlerCoordinatorLayout.kt create mode 100644 app/src/main/res/layout/complete_search_layout.xml diff --git a/app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt b/app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt index b5094d254..f0880cbad 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/activities/MainActivity.kt @@ -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 diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index 6b12af6f3..cdf3ee1b4 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt @@ -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(R.id.toolbar) ?.setOnClickListener(null) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/base/BaseController.kt b/app/src/main/java/com/nextcloud/talk/controllers/base/BaseController.kt index 5d17c274a..1f6abda5e 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/base/BaseController.kt +++ b/app/src/main/java/com/nextcloud/talk/controllers/base/BaseController.kt @@ -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() 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) { diff --git a/app/src/main/java/com/nextcloud/talk/newarch/data/repository/offline/ConversationsRepositoryImpl.kt b/app/src/main/java/com/nextcloud/talk/newarch/data/repository/offline/ConversationsRepositoryImpl.kt index 59e28cda5..f48b06e5a 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/data/repository/offline/ConversationsRepositoryImpl.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/data/repository/offline/ConversationsRepositoryImpl.kt @@ -57,9 +57,9 @@ class ConversationsRepositoryImpl(val conversationsDao: ConversationsDao) : .deleteConversation(userId, conversationId) } - override fun getConversationsForUser(userId: Long, filter: String?): LiveData> { + override fun getConversationsForUser(userId: Long, filter: CharSequence?): LiveData> { filter?.let { - return conversationsDao.getConversationsForUserWithFilter(userId, it).distinctUntilChanged().map { data -> + return conversationsDao.getConversationsForUserWithFilter(userId, it.toString()).distinctUntilChanged().map { data -> data.map {conversationEntity -> conversationEntity.toConversation() } diff --git a/app/src/main/java/com/nextcloud/talk/newarch/domain/repository/offline/ConversationsRepository.kt b/app/src/main/java/com/nextcloud/talk/newarch/domain/repository/offline/ConversationsRepository.kt index b91217c62..78a07a152 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/domain/repository/offline/ConversationsRepository.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/domain/repository/offline/ConversationsRepository.kt @@ -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> + fun getConversationsForUser(userId: Long, filter: CharSequence?): LiveData> fun getShortcutTargetConversations(userId: Long): LiveData> suspend fun getConversationForUserWithToken(userId: Long, token: String): Conversation? diff --git a/app/src/main/java/com/nextcloud/talk/newarch/features/conversationsList/ConversationsListView.kt b/app/src/main/java/com/nextcloud/talk/newarch/features/conversationsList/ConversationsListView.kt index 7d82e66c9..cca14d747 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/features/conversationsList/ConversationsListView.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/features/conversationsList/ConversationsListView.kt @@ -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) { 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() diff --git a/app/src/main/java/com/nextcloud/talk/newarch/features/conversationsList/ConversationsListViewModel.kt b/app/src/main/java/com/nextcloud/talk/newarch/features/conversationsList/ConversationsListViewModel.kt index 73acf8bbb..4b227f5f4 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/features/conversationsList/ConversationsListViewModel.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/features/conversationsList/ConversationsListViewModel.kt @@ -66,7 +66,7 @@ class ConversationsListViewModel constructor( var messageData: String? = null val networkStateLiveData: MutableLiveData = MutableLiveData(ConversationsListViewNetworkState.LOADING) val avatar: MutableLiveData = MutableLiveData(DisplayUtils.getRoundedDrawable(context.getDrawable(R.drawable.ic_settings_white_24dp))) - val filterLiveData: MutableLiveData = MutableLiveData(null) + val filterLiveData: MutableLiveData = 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) } } diff --git a/app/src/main/java/com/nextcloud/talk/newarch/features/search/DebouncingQueryTextListener.kt b/app/src/main/java/com/nextcloud/talk/newarch/features/search/DebouncingQueryTextListener.kt index e53ee3895..6f43ef399 100644 --- a/app/src/main/java/com/nextcloud/talk/newarch/features/search/DebouncingQueryTextListener.kt +++ b/app/src/main/java/com/nextcloud/talk/newarch/features/search/DebouncingQueryTextListener.kt @@ -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 } } \ No newline at end of file diff --git a/app/src/main/java/com/nextcloud/talk/newarch/utils/ChangeHandlerCoordinatorLayout.kt b/app/src/main/java/com/nextcloud/talk/newarch/utils/ChangeHandlerCoordinatorLayout.kt new file mode 100644 index 000000000..1e1b68ac2 --- /dev/null +++ b/app/src/main/java/com/nextcloud/talk/newarch/utils/ChangeHandlerCoordinatorLayout.kt @@ -0,0 +1,66 @@ +/* + * + * * Nextcloud Talk application + * * + * * @author Mario Danic + * * Copyright (C) 2017-2020 Mario Danic + * * + * * 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 . + * + */ + +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) + } +} diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index aadb3ff55..450db6064 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -21,39 +21,50 @@ - - + android:layout_width="match_parent" + android:layout_height="56dp" + android:background="@color/transparent" + app:elevation="0dp"> + - - - > - - + + + + + + diff --git a/app/src/main/res/layout/complete_search_layout.xml b/app/src/main/res/layout/complete_search_layout.xml new file mode 100644 index 000000000..2e2068a24 --- /dev/null +++ b/app/src/main/res/layout/complete_search_layout.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/controller_conversations_rv.xml b/app/src/main/res/layout/controller_conversations_rv.xml index 5b51d8cac..e4e3d5bc8 100644 --- a/app/src/main/res/layout/controller_conversations_rv.xml +++ b/app/src/main/res/layout/controller_conversations_rv.xml @@ -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"> - - diff --git a/app/src/main/res/layout/search_layout.xml b/app/src/main/res/layout/search_layout.xml index a28bde9aa..cb5dcf553 100644 --- a/app/src/main/res/layout/search_layout.xml +++ b/app/src/main/res/layout/search_layout.xml @@ -22,43 +22,40 @@ + xmlns:tools="http://schemas.android.com/tools"> + > + android:layout_height="match_parent" + android:background="@color/colorPrimary" + android:clipToPadding="true"> + android:visibility="gone"> @@ -85,38 +82,58 @@ - - - + + + + + + + + android:transitionName="userAvatar.transitionTag" + android:visibility="visible" + tools:src="@tools:sample/avatars[0]" /> - + + - - \ No newline at end of file + \ No newline at end of file