Skip to content

Commit e1c520d

Browse files
author
A.Badakhshan
committed
0.4.9
1 parent f939352 commit e1c520d

File tree

6 files changed

+80
-79
lines changed

6 files changed

+80
-79
lines changed

app/src/main/java/com/alirezabdn/whygoogle/MainActivity.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package com.alirezabdn.whygoogle
22

33
import android.os.Bundle
4+
import android.util.Log
45
import android.view.LayoutInflater
56
import com.alirezabdn.whygoogle.databinding.ActivityMainBinding
67
import ir.ayantech.whygoogle.activity.SwipableWhyGoogleActivity
8+
import ir.ayantech.whygoogle.fragment.WhyGoogleFragment
79
import ir.ayantech.whygoogle.widget.SwipeBackContainer
810

911
class MainActivity : SwipableWhyGoogleActivity<ActivityMainBinding>() {
@@ -19,6 +21,11 @@ class MainActivity : SwipableWhyGoogleActivity<ActivityMainBinding>() {
1921
override val fragmentHost: SwipeBackContainer
2022
get() = binding.containerVp
2123

24+
override fun onTopFragmentChanged(whyGoogleFragment: WhyGoogleFragment<*>) {
25+
super.onTopFragmentChanged(whyGoogleFragment)
26+
Log.d("WhG", "onTopFragmentChanged")
27+
}
28+
2229
// override val containerId: Int
2330
// get() = R.id.containerFl
2431
}

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// Top-level build file where you can add configuration options common to all sub-projects/modules.
22
buildscript {
3-
ext.kotlin_version = "1.5.31"
3+
ext.kotlin_version = "1.5.30"
44
repositories {
55
google()
66
jcenter()

whygoogle/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ android {
1111
minSdkVersion 17
1212
targetSdkVersion 30
1313
versionCode 1
14-
versionName "0.4.8"
14+
versionName "0.4.9"
1515
}
1616
buildFeatures {
1717
viewBinding true

whygoogle/src/main/java/ir/ayantech/whygoogle/activity/SwipableWhyGoogleActivity.kt

Lines changed: 19 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,9 @@ import androidx.fragment.app.Fragment
99
import androidx.viewbinding.ViewBinding
1010
import com.alirezabdn.whyfinal.adapter.FragmentStateAdapter
1111
import com.alirezabdn.whyfinal.adapter.FragmentViewHolder
12-
import com.alirezabdn.whyfinal.widget.NonFinalViewPager2
1312
import ir.ayantech.whygoogle.custom.AsyncLayoutInflater
1413
import ir.ayantech.whygoogle.fragment.WhyGoogleFragment
1514
import ir.ayantech.whygoogle.helper.changeToNeedsOfWhyGoogle
16-
import ir.ayantech.whygoogle.helper.setCurrentItem
1715
import ir.ayantech.whygoogle.helper.trying
1816
import ir.ayantech.whygoogle.helper.viewBinding
1917
import ir.ayantech.whygoogle.standard.IOSPageTransition
@@ -41,41 +39,30 @@ abstract class SwipableWhyGoogleActivity<T : ViewBinding> : AppCompatActivity(),
4139
}
4240
}
4341

44-
private var transitioning = false
45-
46-
val isTransitioning: Boolean by lazy {
47-
transitioning
48-
}
42+
private var lastKnownFragment: WhyGoogleFragment<*>? = null
4943

5044
override fun onCreate(savedInstanceState: Bundle?) {
5145
super.onCreate(savedInstanceState)
5246
setContentView(binding.root)
53-
fragmentHost.registerOnPageChangeCallback(object :
54-
NonFinalViewPager2.OnPageChangeCallback() {
55-
override fun onPageScrollStateChanged(state: Int) {
56-
super.onPageScrollStateChanged(state)
57-
if (state == NonFinalViewPager2.SCROLL_STATE_DRAGGING)
58-
transitioning = true
59-
if (state == NonFinalViewPager2.SCROLL_STATE_IDLE) {
60-
val previousCount = getFragmentCount()
61-
while (fragmentHost.currentItem <= getFragmentCount() - 2) {
62-
fragmentStack.removeLast()
63-
}
64-
if (previousCount >= fragmentHost.currentItem + 2) {
65-
whyGoogleFragmentAdapter.notifyItemRangeRemoved(
66-
fragmentHost.currentItem + 1,
67-
previousCount - fragmentHost.currentItem - 1
68-
)
69-
fragmentStack.lastOrNull()?.onBackToFragment()
70-
}
71-
onTopFragmentChanged(fragmentStack.last())
72-
fragmentStack.last().onFragmentVisible()
73-
if (transitioning)
74-
fragmentStack.lastOrNull()?.onEnterAnimationEnded()
75-
transitioning = false
76-
}
47+
fragmentHost.onPageSettled {
48+
val previousCount = getFragmentCount()
49+
while (fragmentHost.currentItem <= getFragmentCount() - 2) {
50+
fragmentStack.removeLast()
7751
}
78-
})
52+
if (previousCount >= fragmentHost.currentItem + 2) {
53+
whyGoogleFragmentAdapter.notifyItemRangeRemoved(
54+
fragmentHost.currentItem + 1,
55+
previousCount - fragmentHost.currentItem - 1
56+
)
57+
fragmentStack.lastOrNull()?.onFragmentVisible()
58+
fragmentStack.lastOrNull()?.onBackToFragment()
59+
onTopFragmentChanged(fragmentStack.last())
60+
}
61+
if (lastKnownFragment == fragmentStack.lastOrNull())
62+
return@onPageSettled
63+
fragmentStack.lastOrNull()?.onEnterAnimationEnded()
64+
lastKnownFragment = fragmentStack.lastOrNull()
65+
}
7966
}
8067

8168
fun accessViews(block: T.() -> Unit) {
Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
package ir.ayantech.whygoogle.helper
22

3-
import android.animation.Animator
4-
import android.animation.TimeInterpolator
5-
import android.animation.ValueAnimator
63
import android.view.View
7-
import android.view.animation.AccelerateDecelerateInterpolator
84
import androidx.recyclerview.widget.RecyclerView
95
import com.alirezabdn.whyfinal.widget.NonFinalViewPager2
106

@@ -25,39 +21,4 @@ fun RecyclerView.changeSnapSpeed() {
2521
} catch (e: Exception) {
2622
e.printStackTrace()
2723
}
28-
}
29-
30-
fun NonFinalViewPager2.setCurrentItem(
31-
item: Int,
32-
duration: Long,
33-
interpolator: TimeInterpolator = AccelerateDecelerateInterpolator(),
34-
pagePxWidth: Int = width // Default value taken from getWidth() from ViewPager2 view
35-
) {
36-
val pxToDrag: Int = pagePxWidth * (item - currentItem)
37-
val animator = ValueAnimator.ofInt(0, pxToDrag)
38-
var previousValue = 0
39-
animator.addUpdateListener { valueAnimator ->
40-
val currentValue = valueAnimator.animatedValue as Int
41-
val currentPxToDrag = (currentValue - previousValue).toFloat()
42-
fakeDragBy(-currentPxToDrag)
43-
previousValue = currentValue
44-
}
45-
animator.addListener(object : Animator.AnimatorListener {
46-
override fun onAnimationStart(animation: Animator?) {
47-
beginFakeDrag()
48-
}
49-
50-
override fun onAnimationEnd(animation: Animator?) {
51-
endFakeDrag()
52-
}
53-
54-
override fun onAnimationCancel(animation: Animator?) { /* Ignored */
55-
}
56-
57-
override fun onAnimationRepeat(animation: Animator?) { /* Ignored */
58-
}
59-
})
60-
animator.interpolator = interpolator
61-
animator.duration = duration
62-
animator.start()
6324
}

whygoogle/src/main/java/ir/ayantech/whygoogle/widget/SwipeBackContainer.kt

Lines changed: 52 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
11
package ir.ayantech.whygoogle.widget
22

3+
import android.animation.Animator
4+
import android.animation.TimeInterpolator
5+
import android.animation.ValueAnimator
36
import android.content.Context
47
import android.graphics.Rect
58
import android.os.Build
69
import android.util.AttributeSet
710
import android.view.MotionEvent
811
import android.view.View
9-
import android.view.ViewConfiguration
1012
import android.view.ViewGroup
13+
import android.view.animation.AccelerateDecelerateInterpolator
1114
import androidx.annotation.RequiresApi
1215
import com.alirezabdn.whyfinal.widget.NonFinalViewPager2
1316
import ir.ayantech.whygoogle.activity.SwipableWhyGoogleActivity
17+
import ir.ayantech.whygoogle.helper.SimpleCallBack
1418
import kotlin.math.abs
1519
import kotlin.math.sign
1620

@@ -31,7 +35,6 @@ class SwipeBackContainer : NonFinalViewPager2 {
3135
defStyleRes: Int
3236
) : super(context, attrs, defStyleAttr, defStyleRes)
3337

34-
private var touchSlop = 0
3538
private var initialX = 0f
3639
private var initialY = 0f
3740

@@ -61,10 +64,6 @@ class SwipeBackContainer : NonFinalViewPager2 {
6164
return null
6265
}
6366

64-
init {
65-
touchSlop = ViewConfiguration.get(context).scaledTouchSlop
66-
}
67-
6867
private fun canViewScroll(view: View?, orientation: Int, delta: Float): Boolean {
6968
val direction = -delta.sign.toInt()
7069
return when (orientation) {
@@ -120,4 +119,51 @@ class SwipeBackContainer : NonFinalViewPager2 {
120119
}
121120
}
122121
}
122+
123+
fun setCurrentItem(
124+
item: Int,
125+
duration: Long,
126+
interpolator: TimeInterpolator = AccelerateDecelerateInterpolator(),
127+
pagePxWidth: Int = width // Default value taken from getWidth() from ViewPager2 view
128+
) {
129+
val pxToDrag: Int = pagePxWidth * (item - currentItem)
130+
val animator = ValueAnimator.ofInt(0, pxToDrag)
131+
var previousValue = 0
132+
animator.addUpdateListener { valueAnimator ->
133+
val currentValue = valueAnimator.animatedValue as Int
134+
val currentPxToDrag = (currentValue - previousValue).toFloat()
135+
fakeDragBy(-currentPxToDrag)
136+
previousValue = currentValue
137+
}
138+
animator.addListener(object : Animator.AnimatorListener {
139+
override fun onAnimationStart(animation: Animator?) {
140+
beginFakeDrag()
141+
}
142+
143+
override fun onAnimationEnd(animation: Animator?) {
144+
endFakeDrag()
145+
}
146+
147+
override fun onAnimationCancel(animation: Animator?) { /* Ignored */
148+
}
149+
150+
override fun onAnimationRepeat(animation: Animator?) { /* Ignored */
151+
}
152+
})
153+
animator.interpolator = interpolator
154+
animator.duration = duration
155+
animator.start()
156+
}
157+
158+
fun onPageSettled(callback: SimpleCallBack) {
159+
this.registerOnPageChangeCallback(object :
160+
NonFinalViewPager2.OnPageChangeCallback() {
161+
override fun onPageScrollStateChanged(state: Int) {
162+
super.onPageScrollStateChanged(state)
163+
if (state == SCROLL_STATE_IDLE) {
164+
callback()
165+
}
166+
}
167+
})
168+
}
123169
}

0 commit comments

Comments
 (0)