mirror of
https://github.com/Kunzisoft/KeePassDX.git
synced 2025-12-04 15:49:33 +01:00
Dynamic height of filters
This commit is contained in:
@@ -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, _ ->
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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>
|
||||
Reference in New Issue
Block a user