From afc87927d0d65a3cff9ea3958628f5bc206cba6d Mon Sep 17 00:00:00 2001 From: Hannes Achleitner Date: Sat, 4 Jan 2025 08:22:02 +0100 Subject: [PATCH 1/2] Rework panelState to Kotlin property --- .../hannes/slidingup/demo/tools/Matcher.kt | 2 +- .../slidinguppanel/demo/DemoActivity.kt | 12 ++-- .../slidinguppanel/SlidingUpPanelLayout.kt | 55 ++++++++++--------- 3 files changed, 35 insertions(+), 34 deletions(-) diff --git a/app/src/androidTest/kotlin/info/hannes/slidingup/demo/tools/Matcher.kt b/app/src/androidTest/kotlin/info/hannes/slidingup/demo/tools/Matcher.kt index 312a11d..651cee9 100644 --- a/app/src/androidTest/kotlin/info/hannes/slidingup/demo/tools/Matcher.kt +++ b/app/src/androidTest/kotlin/info/hannes/slidingup/demo/tools/Matcher.kt @@ -36,7 +36,7 @@ fun setValue(value: PanelState): ViewAction { override fun perform(uiController: UiController?, view: View) { val slidingUpPanelLayout = view as SlidingUpPanelLayout - slidingUpPanelLayout.setPanelState(value) + slidingUpPanelLayout.panelState = value } } } \ No newline at end of file diff --git a/app/src/main/kotlin/info/hannes/slidinguppanel/demo/DemoActivity.kt b/app/src/main/kotlin/info/hannes/slidinguppanel/demo/DemoActivity.kt index 8230dc3..ff2fa0d 100644 --- a/app/src/main/kotlin/info/hannes/slidinguppanel/demo/DemoActivity.kt +++ b/app/src/main/kotlin/info/hannes/slidinguppanel/demo/DemoActivity.kt @@ -80,7 +80,7 @@ class DemoActivity : AppCompatActivity() { } }) binding.slidingLayout.setFadeOnClickListener { - binding.slidingLayout.setPanelState(PanelState.COLLAPSED) + binding.slidingLayout.panelState = PanelState.COLLAPSED Log.i(tag, "FadeOnClickListener ${binding.slidingLayout.panelState}") } binding.nameMain.text = Html.fromHtml(getString(R.string.hello)) @@ -116,10 +116,10 @@ class DemoActivity : AppCompatActivity() { when (item.itemId) { R.id.action_toggle -> { if (binding.slidingLayout.panelState != PanelState.HIDDEN) { - binding.slidingLayout.setPanelState(PanelState.HIDDEN) + binding.slidingLayout.panelState = PanelState.HIDDEN item.setTitle(R.string.action_show) } else { - binding.slidingLayout.setPanelState(PanelState.COLLAPSED) + binding.slidingLayout.panelState = PanelState.COLLAPSED item.setTitle(R.string.action_hide) } return true @@ -128,11 +128,11 @@ class DemoActivity : AppCompatActivity() { R.id.action_anchor -> { if (binding.slidingLayout.anchorPoint == 1.0f) { binding.slidingLayout.anchorPoint = 0.7f - binding.slidingLayout.setPanelState(PanelState.ANCHORED) + binding.slidingLayout.panelState = PanelState.ANCHORED item.setTitle(R.string.action_anchor_disable) } else { binding.slidingLayout.anchorPoint = 1.0f - binding.slidingLayout.setPanelState(PanelState.COLLAPSED) + binding.slidingLayout.panelState = PanelState.COLLAPSED item.setTitle(R.string.action_anchor_enable) } return true @@ -144,7 +144,7 @@ class DemoActivity : AppCompatActivity() { @Deprecated("Deprecated in Java") override fun onBackPressed() { if ((binding.slidingLayout.panelState == PanelState.EXPANDED || binding.slidingLayout.panelState == PanelState.ANCHORED)) { - binding.slidingLayout.setPanelState(PanelState.COLLAPSED) + binding.slidingLayout.panelState = PanelState.COLLAPSED } else { super.onBackPressed() } diff --git a/library/src/main/kotlin/com/sothree/slidinguppanel/SlidingUpPanelLayout.kt b/library/src/main/kotlin/com/sothree/slidinguppanel/SlidingUpPanelLayout.kt index a992bc1..4c97440 100644 --- a/library/src/main/kotlin/com/sothree/slidinguppanel/SlidingUpPanelLayout.kt +++ b/library/src/main/kotlin/com/sothree/slidinguppanel/SlidingUpPanelLayout.kt @@ -186,39 +186,40 @@ open class SlidingUpPanelLayout @JvmOverloads constructor( private var slideState: PanelState = DEFAULT_SLIDE_STATE - val panelState: PanelState + var panelState: PanelState = DEFAULT_SLIDE_STATE get() = slideState - - fun setPanelState(value: PanelState) { - // Abort any running animation, to allow state change - if (dragHelper?.viewDragState == ViewDragHelper.STATE_SETTLING) { - dragHelper?.abort() - } - require(value !== PanelState.DRAGGING) { "Panel state can't be DRAGGING during state set" } - if (!isEnabled || - (!firstLayout && (slideableView == null)) || - (value === slideState) || (slideState === PanelState.DRAGGING) - ) return - if (firstLayout) { - setPanelStateInternal(value) - } else { - if (slideState === PanelState.HIDDEN) { - slideableView!!.visibility = VISIBLE - requestLayout() + set(value) { + slideState = value + field = value + // Abort any running animation, to allow state change + if (dragHelper?.viewDragState == ViewDragHelper.STATE_SETTLING) { + dragHelper?.abort() } - when (value) { - PanelState.ANCHORED -> smoothSlideTo(anchorPoint, 0) - PanelState.COLLAPSED -> smoothSlideTo(0f, 0) - PanelState.EXPANDED -> smoothSlideTo(maxSlideOffset, 0) - PanelState.HIDDEN -> { - val newTop = computePanelTopPosition(0.0f) + if (isSlidingUp) +panelHeight else -panelHeight - smoothSlideTo(computeSlideOffset(newTop), 0) + require(value !== PanelState.DRAGGING) { "Panel state can't be DRAGGING during state set" } + if (!isEnabled || + (!firstLayout && (slideableView == null)) || + (value === slideState) || (slideState === PanelState.DRAGGING) + ) return + if (firstLayout) { + setPanelStateInternal(value) + } else { + if (slideState === PanelState.HIDDEN) { + slideableView!!.visibility = VISIBLE + requestLayout() } + when (value) { + PanelState.ANCHORED -> smoothSlideTo(anchorPoint, 0) + PanelState.COLLAPSED -> smoothSlideTo(0f, 0) + PanelState.EXPANDED -> smoothSlideTo(maxSlideOffset, 0) + PanelState.HIDDEN -> { + val newTop = computePanelTopPosition(0.0f) + if (isSlidingUp) +panelHeight else -panelHeight + smoothSlideTo(computeSlideOffset(newTop), 0) + } - PanelState.DRAGGING -> Unit + PanelState.DRAGGING -> Unit + } } } - } /** * If the current slide state is DRAGGING, this will store the last non dragging state From 1b629dbc9e2c288f127b10da917212fd6c37118c Mon Sep 17 00:00:00 2001 From: Hannes Achleitner Date: Sat, 4 Jan 2025 15:23:41 +0100 Subject: [PATCH 2/2] Harmonize panelState --- .../slidinguppanel/SlidingUpPanelLayout.kt | 38 +++++++++---------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/library/src/main/kotlin/com/sothree/slidinguppanel/SlidingUpPanelLayout.kt b/library/src/main/kotlin/com/sothree/slidinguppanel/SlidingUpPanelLayout.kt index 4c97440..4b56d1f 100644 --- a/library/src/main/kotlin/com/sothree/slidinguppanel/SlidingUpPanelLayout.kt +++ b/library/src/main/kotlin/com/sothree/slidinguppanel/SlidingUpPanelLayout.kt @@ -184,13 +184,10 @@ open class SlidingUpPanelLayout @JvmOverloads constructor( */ private var mainView: View? = null - private var slideState: PanelState = DEFAULT_SLIDE_STATE +// private var slideState: PanelState = DEFAULT_SLIDE_STATE var panelState: PanelState = DEFAULT_SLIDE_STATE - get() = slideState set(value) { - slideState = value - field = value // Abort any running animation, to allow state change if (dragHelper?.viewDragState == ViewDragHelper.STATE_SETTLING) { dragHelper?.abort() @@ -198,12 +195,12 @@ open class SlidingUpPanelLayout @JvmOverloads constructor( require(value !== PanelState.DRAGGING) { "Panel state can't be DRAGGING during state set" } if (!isEnabled || (!firstLayout && (slideableView == null)) || - (value === slideState) || (slideState === PanelState.DRAGGING) + (value === panelState) || (panelState === PanelState.DRAGGING) ) return if (firstLayout) { setPanelStateInternal(value) } else { - if (slideState === PanelState.HIDDEN) { + if (panelState === PanelState.HIDDEN) { slideableView!!.visibility = VISIBLE requestLayout() } @@ -218,6 +215,7 @@ open class SlidingUpPanelLayout @JvmOverloads constructor( PanelState.DRAGGING -> Unit } + field = value } } @@ -341,7 +339,7 @@ open class SlidingUpPanelLayout @JvmOverloads constructor( clipPanel = ta.getBoolean(R.styleable.SlidingUpPanelLayout_umanoClipPanel, DEFAULT_CLIP_PANEL_FLAG) anchorPoint = ta.getFloat(R.styleable.SlidingUpPanelLayout_umanoAnchorPoint, DEFAULT_ANCHOR_POINT) maxSlideOffset = ta.getFloat(R.styleable.SlidingUpPanelLayout_umanoMaxSlidingOffset, DEFAULT_MAX_SLIDING_OFFSET) - slideState = PanelState.entries.toTypedArray()[ta.getInt(R.styleable.SlidingUpPanelLayout_umanoInitialState, DEFAULT_SLIDE_STATE.ordinal)] + panelState = PanelState.entries.toTypedArray()[ta.getInt(R.styleable.SlidingUpPanelLayout_umanoInitialState, DEFAULT_SLIDE_STATE.ordinal)] val interpolatorResId = ta.getResourceId(R.styleable.SlidingUpPanelLayout_umanoScrollInterpolator, -1) if (interpolatorResId != -1) { scrollerInterpolator = AnimationUtils.loadInterpolator(context, interpolatorResId) @@ -392,7 +390,7 @@ open class SlidingUpPanelLayout @JvmOverloads constructor( * Set sliding enabled flag */ var isTouchEnabled: Boolean - get() = touchEnabled && slideableView != null && slideState !== PanelState.HIDDEN + get() = touchEnabled && slideableView != null && panelState !== PanelState.HIDDEN set(enabled) { touchEnabled = enabled } @@ -474,8 +472,8 @@ open class SlidingUpPanelLayout @JvmOverloads constructor( it.isFocusableInTouchMode = false it.setOnClickListener(OnClickListener { if (!isEnabled || !isTouchEnabled) return@OnClickListener - slideState = - if (slideState !== PanelState.EXPANDED && slideState !== PanelState.ANCHORED) { + panelState = + if (panelState !== PanelState.EXPANDED && panelState !== PanelState.ANCHORED) { if (anchorPoint < DEFAULT_ANCHOR_POINT) { PanelState.ANCHORED } else { @@ -643,7 +641,7 @@ open class SlidingUpPanelLayout @JvmOverloads constructor( // If the sliding panel is not visible, then put the whole view in the hidden state if (slideableView?.visibility != VISIBLE) { - slideState = PanelState.HIDDEN + panelState = PanelState.HIDDEN } val layoutHeight = heightSize - paddingTop - paddingBottom val layoutWidth = widthSize - paddingLeft - paddingRight @@ -660,7 +658,7 @@ open class SlidingUpPanelLayout @JvmOverloads constructor( var height = layoutHeight var width = layoutWidth if (child === mainView) { - if (!overlayContent && slideState !== PanelState.HIDDEN) { + if (!overlayContent && panelState !== PanelState.HIDDEN) { height -= panelHeight } width -= lp.leftMargin + lp.rightMargin @@ -707,7 +705,7 @@ open class SlidingUpPanelLayout @JvmOverloads constructor( val paddingTop = paddingTop val childCount = childCount if (firstLayout) { - slideOffset = when (slideState) { + slideOffset = when (panelState) { PanelState.EXPANDED -> maxSlideOffset PanelState.ANCHORED -> anchorPoint PanelState.HIDDEN -> { @@ -947,9 +945,9 @@ open class SlidingUpPanelLayout @JvmOverloads constructor( } private fun setPanelStateInternal(state: PanelState) { - if (slideState === state) return - val oldState = slideState - slideState = state + if (panelState === state) return + val oldState = panelState + panelState = state dispatchOnPanelStateChanged(this, oldState, state) } @@ -965,8 +963,8 @@ open class SlidingUpPanelLayout @JvmOverloads constructor( } private fun onPanelDragged(newTop: Int) { - if (slideState !== PanelState.DRAGGING) { - lastNotDraggingSlideState = slideState + if (panelState !== PanelState.DRAGGING) { + lastNotDraggingSlideState = panelState } setPanelStateInternal(PanelState.DRAGGING) // Recompute the slide offset based on the new top position @@ -1134,7 +1132,7 @@ open class SlidingUpPanelLayout @JvmOverloads constructor( bundle.putParcelable("superState", super.onSaveInstanceState()) bundle.putSerializable( SLIDING_STATE, - if (slideState !== PanelState.DRAGGING) slideState else lastNotDraggingSlideState + if (panelState !== PanelState.DRAGGING) panelState else lastNotDraggingSlideState ) return bundle } @@ -1143,7 +1141,7 @@ open class SlidingUpPanelLayout @JvmOverloads constructor( var parcelable: Parcelable? = state if (parcelable is Bundle) { val bundle = parcelable - slideState = requireNotNull(bundle.getSerializable(SLIDING_STATE)) as PanelState + panelState = requireNotNull(bundle.getSerializable(SLIDING_STATE)) as PanelState parcelable = bundle.getParcelable("superState") } super.onRestoreInstanceState(parcelable)