Dynamic height of filters

This commit is contained in:
J-Jamet
2022-02-03 14:56:05 +01:00
parent 5f4ab201af
commit fac6fd7926
5 changed files with 63 additions and 35 deletions

View File

@@ -240,6 +240,8 @@ class GroupActivity : DatabaseLockActivity(),
toolbar?.title = ""
setSupportActionBar(toolbar)
searchFiltersView?.visibility = View.GONE
mBreadcrumbAdapter = BreadcrumbAdapter(this).apply {
// Open group on breadcrumb click
onItemClickListener = { node, _ ->

View File

@@ -19,7 +19,7 @@ class SearchFiltersView @JvmOverloads constructor(context: Context,
: LinearLayout(context, attrs, defStyle) {
private var searchContainer: ViewGroup
private var searchAdvanceFiltersContainer: ViewGroup
private var searchAdvanceFiltersContainer: ViewGroup? = null
private var searchExpandButton: ImageView
private var searchNumbers: TextView
private var searchCurrentGroup: CompoundButton
@@ -56,8 +56,8 @@ class SearchFiltersView @JvmOverloads constructor(context: Context,
}
set(value) {
field = value
val tempListener = onParametersChangeListener
onParametersChangeListener = null
val tempListener = mOnParametersChangeListener
mOnParametersChangeListener = null
searchCurrentGroup.isChecked = value.searchInCurrentGroup
searchCaseSensitive.isChecked = value.caseSensitive
searchTitle.isChecked = value.searchInTitles
@@ -71,10 +71,20 @@ class SearchFiltersView @JvmOverloads constructor(context: Context,
searchTag.isChecked = value.searchInTags
searchRecycleBin.isChecked = value.searchInRecycleBin
searchTemplate.isChecked = value.searchInTemplates
onParametersChangeListener = tempListener
mOnParametersChangeListener = tempListener
}
var onParametersChangeListener: ((searchParameters: SearchParameters) -> Unit)? = null
private var mOnParametersChangeListener: ((searchParameters: SearchParameters) -> Unit)? = {
// To recalculate height
if (searchAdvanceFiltersContainer?.visibility == View.VISIBLE) {
searchAdvanceFiltersContainer?.expand(
false,
searchAdvanceFiltersContainer?.getFullHeight()
)
}
onParametersChangeListener?.invoke(searchParameters)
}
init {
val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater?
@@ -100,7 +110,7 @@ class SearchFiltersView @JvmOverloads constructor(context: Context,
// Expand menu with button
searchExpandButton.setOnClickListener {
val isVisible = searchAdvanceFiltersContainer.visibility == View.VISIBLE
val isVisible = searchAdvanceFiltersContainer?.visibility == View.VISIBLE
if (isVisible)
closeAdvancedFilters()
else
@@ -109,55 +119,55 @@ class SearchFiltersView @JvmOverloads constructor(context: Context,
searchCurrentGroup.setOnCheckedChangeListener { _, isChecked ->
searchParameters.searchInCurrentGroup = isChecked
onParametersChangeListener?.invoke(searchParameters)
mOnParametersChangeListener?.invoke(searchParameters)
}
searchCaseSensitive.setOnCheckedChangeListener { _, isChecked ->
searchParameters.caseSensitive = isChecked
onParametersChangeListener?.invoke(searchParameters)
mOnParametersChangeListener?.invoke(searchParameters)
}
searchTitle.setOnCheckedChangeListener { _, isChecked ->
searchParameters.searchInTitles = isChecked
onParametersChangeListener?.invoke(searchParameters)
mOnParametersChangeListener?.invoke(searchParameters)
}
searchUsername.setOnCheckedChangeListener { _, isChecked ->
searchParameters.searchInUsernames = isChecked
onParametersChangeListener?.invoke(searchParameters)
mOnParametersChangeListener?.invoke(searchParameters)
}
searchPassword.setOnCheckedChangeListener { _, isChecked ->
searchParameters.searchInPasswords = isChecked
onParametersChangeListener?.invoke(searchParameters)
mOnParametersChangeListener?.invoke(searchParameters)
}
searchURL.setOnCheckedChangeListener { _, isChecked ->
searchParameters.searchInUrls = isChecked
onParametersChangeListener?.invoke(searchParameters)
mOnParametersChangeListener?.invoke(searchParameters)
}
searchExpires.setOnCheckedChangeListener { _, isChecked ->
searchParameters.excludeExpired = !isChecked
onParametersChangeListener?.invoke(searchParameters)
mOnParametersChangeListener?.invoke(searchParameters)
}
searchNotes.setOnCheckedChangeListener { _, isChecked ->
searchParameters.searchInNotes = isChecked
onParametersChangeListener?.invoke(searchParameters)
mOnParametersChangeListener?.invoke(searchParameters)
}
searchUUID.setOnCheckedChangeListener { _, isChecked ->
searchParameters.searchInUUIDs = isChecked
onParametersChangeListener?.invoke(searchParameters)
mOnParametersChangeListener?.invoke(searchParameters)
}
searchOther.setOnCheckedChangeListener { _, isChecked ->
searchParameters.searchInOther = isChecked
onParametersChangeListener?.invoke(searchParameters)
mOnParametersChangeListener?.invoke(searchParameters)
}
searchTag.setOnCheckedChangeListener { _, isChecked ->
searchParameters.searchInTags = isChecked
onParametersChangeListener?.invoke(searchParameters)
mOnParametersChangeListener?.invoke(searchParameters)
}
searchRecycleBin.setOnCheckedChangeListener { _, isChecked ->
searchParameters.searchInRecycleBin = isChecked
onParametersChangeListener?.invoke(searchParameters)
mOnParametersChangeListener?.invoke(searchParameters)
}
searchTemplate.setOnCheckedChangeListener { _, isChecked ->
searchParameters.searchInTemplates = isChecked
onParametersChangeListener?.invoke(searchParameters)
mOnParametersChangeListener?.invoke(searchParameters)
}
}
@@ -182,27 +192,26 @@ class SearchFiltersView @JvmOverloads constructor(context: Context,
}
fun closeAdvancedFilters() {
searchAdvanceFiltersContainer.collapse()
searchAdvanceFiltersContainer?.collapse()
}
fun openAdvancedFilters() {
searchAdvanceFiltersContainer.expand(true,
resources.getDimension(R.dimen.advanced_search_height).toInt()
private fun openAdvancedFilters() {
searchAdvanceFiltersContainer?.expand(true,
searchAdvanceFiltersContainer?.getFullHeight()
)
}
override fun setVisibility(visibility: Int) {
//super.setVisibility(visibility)
when (visibility) {
View.VISIBLE -> {
searchAdvanceFiltersContainer.visibility = View.GONE
searchAdvanceFiltersContainer?.visibility = View.GONE
searchContainer.showByFading()
}
else -> {
searchContainer.hideByFading()
if (searchAdvanceFiltersContainer.visibility == View.VISIBLE) {
searchAdvanceFiltersContainer.visibility = View.INVISIBLE
searchAdvanceFiltersContainer.collapse()
if (searchAdvanceFiltersContainer?.visibility == View.VISIBLE) {
searchAdvanceFiltersContainer?.visibility = View.INVISIBLE
searchAdvanceFiltersContainer?.collapse()
}
}
}

View File

@@ -51,6 +51,8 @@ import androidx.appcompat.widget.ActionMenuView
import androidx.core.graphics.drawable.DrawableCompat
import android.graphics.drawable.Drawable
import android.view.ViewGroup
import android.widget.LinearLayout
import com.google.android.material.appbar.CollapsingToolbarLayout
@@ -113,8 +115,7 @@ fun View.collapse(animate: Boolean = true,
onCollapseFinished: (() -> Unit)? = null) {
val recordViewHeight = layoutParams.height
val slideAnimator = ValueAnimator.ofInt(height, 0)
if (animate)
slideAnimator.duration = 300L
slideAnimator.duration = if (animate) 300L else 0L
slideAnimator.addUpdateListener { animation ->
layoutParams.height = animation.animatedValue as Int
requestLayout()
@@ -143,8 +144,7 @@ fun View.expand(animate: Boolean = true,
layoutParams.height = 0
val slideAnimator = ValueAnimator
.ofInt(0, viewHeight)
if (animate)
slideAnimator.duration = 300L
slideAnimator.duration = if (animate) 300L else 0L
var alreadyVisible = false
slideAnimator.addUpdateListener { animation ->
layoutParams.height = animation.animatedValue as Int
@@ -168,6 +168,25 @@ fun View.expand(animate: Boolean = true,
}.start()
}
/***
* This function returns the actual height the layout.
* The getHeight() function returns the current height which might be zero if
* the layout's visibility is GONE
*/
fun ViewGroup.getFullHeight(): Int {
measure(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
val initialVisibility = visibility
visibility = LinearLayout.VISIBLE
val desiredWidth = View.MeasureSpec.makeMeasureSpec(
width,
View.MeasureSpec.AT_MOST
)
measure(desiredWidth, View.MeasureSpec.UNSPECIFIED)
val totalHeight = measuredHeight
visibility = initialVisibility
return totalHeight
}
fun View.hideByFading() {
alpha = 1f
animate()

View File

@@ -73,10 +73,9 @@
<LinearLayout
android:id="@+id/search_advance_filters"
android:layout_width="match_parent"
android:layout_height="@dimen/advanced_search_height"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:orientation="vertical"
android:visibility="gone">
android:orientation="vertical">
<com.google.android.material.chip.ChipGroup
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@@ -34,6 +34,5 @@
<dimen name="hidden_lock_button_size">0dp</dimen>
<dimen name="content_percent">1</dimen>
<dimen name="toolbar_parallax_height">160dp</dimen>
<dimen name="advanced_search_height">280dp</dimen>
<integer name="animation_duration">260</integer>
</resources>