From 028405ecce72f45a024e2c7f031fc4c0d5f1376f Mon Sep 17 00:00:00 2001 From: FooIbar <118464521+FooIbar@users.noreply.github.com> Date: Thu, 22 Jun 2023 02:40:55 +0800 Subject: [PATCH] Convert MarginItemDecoration, SimpleSmoothScroller and WindowInsetsAnimationHelper to kotlin --- .../ehviewer/ui/legacy/LayoutManagerUtils.kt | 4 +- .../ui/legacy/MarginItemDecoration.kt | 71 +++++----- .../ui/legacy/SimpleSmoothScroller.kt | 30 ++--- .../ui/legacy/WindowInsetsAnimationHelper.kt | 124 ++++++++---------- 4 files changed, 112 insertions(+), 117 deletions(-) diff --git a/app/src/main/java/com/hippo/ehviewer/ui/legacy/LayoutManagerUtils.kt b/app/src/main/java/com/hippo/ehviewer/ui/legacy/LayoutManagerUtils.kt index d7aea84c7..9c68fb88a 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/legacy/LayoutManagerUtils.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/legacy/LayoutManagerUtils.kt @@ -59,7 +59,7 @@ object LayoutManagerUtils { @JvmOverloads fun smoothScrollToPosition( layoutManager: RecyclerView.LayoutManager, - context: Context?, + context: Context, position: Int, millisecondsPerInch: Int = -1, ) { @@ -106,7 +106,7 @@ object LayoutManagerUtils { fun scrollToPositionProperly( layoutManager: RecyclerView.LayoutManager, - context: Context?, + context: Context, position: Int, listener: OnScrollToPositionListener?, ) { diff --git a/app/src/main/java/com/hippo/ehviewer/ui/legacy/MarginItemDecoration.kt b/app/src/main/java/com/hippo/ehviewer/ui/legacy/MarginItemDecoration.kt index b3a3c15a3..16daf77b2 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/legacy/MarginItemDecoration.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/legacy/MarginItemDecoration.kt @@ -13,31 +13,37 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +package com.hippo.ehviewer.ui.legacy -package com.hippo.ehviewer.ui.legacy; +import android.graphics.Rect +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.RecyclerView.ItemDecoration -import android.graphics.Rect; -import android.view.View; +class MarginItemDecoration( + margin: Int, + paddingLeft: Int, + paddingTop: Int, + paddingRight: Int, + paddingBottom: Int, +) : ItemDecoration() { + private var mMargin = 0 + private var mPaddingLeft = 0 + private var mPaddingTop = 0 + private var mPaddingRight = 0 + private var mPaddingBottom = 0 -import androidx.recyclerview.widget.RecyclerView; - -public class MarginItemDecoration extends RecyclerView.ItemDecoration { - - private int mMargin; - private int mPaddingLeft; - private int mPaddingTop; - private int mPaddingRight; - private int mPaddingBottom; - - public MarginItemDecoration(int margin, int paddingLeft, int paddingTop, - int paddingRight, int paddingBottom) { - setMargin(margin, paddingLeft, paddingTop, paddingRight, paddingBottom); + init { + setMargin(margin, paddingLeft, paddingTop, paddingRight, paddingBottom) } - @Override - public void getItemOffsets(Rect outRect, View view, - RecyclerView parent, RecyclerView.State state) { - outRect.set(mMargin, mMargin, mMargin, mMargin); + override fun getItemOffsets( + outRect: Rect, + view: View, + parent: RecyclerView, + state: RecyclerView.State, + ) { + outRect[mMargin, mMargin, mMargin] = mMargin } /** @@ -47,17 +53,22 @@ public class MarginItemDecoration extends RecyclerView.ItemDecoration { * @param paddingRight gap between RecyclerView right and right item right * @param paddingBottom gap between RecyclerView bottom and bottom item bottom */ - public void setMargin(int margin, int paddingLeft, int paddingTop, - int paddingRight, int paddingBottom) { - int halfMargin = margin / 2; - mMargin = halfMargin; - mPaddingLeft = paddingLeft - halfMargin; - mPaddingTop = paddingTop - halfMargin; - mPaddingRight = paddingRight - halfMargin; - mPaddingBottom = paddingBottom - halfMargin; + fun setMargin( + margin: Int, + paddingLeft: Int, + paddingTop: Int, + paddingRight: Int, + paddingBottom: Int, + ) { + val halfMargin = margin / 2 + mMargin = halfMargin + mPaddingLeft = paddingLeft - halfMargin + mPaddingTop = paddingTop - halfMargin + mPaddingRight = paddingRight - halfMargin + mPaddingBottom = paddingBottom - halfMargin } - public void applyPaddings(View view) { - view.setPadding(mPaddingLeft, mPaddingTop, mPaddingRight, mPaddingBottom); + fun applyPaddings(view: View) { + view.setPadding(mPaddingLeft, mPaddingTop, mPaddingRight, mPaddingBottom) } } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/legacy/SimpleSmoothScroller.kt b/app/src/main/java/com/hippo/ehviewer/ui/legacy/SimpleSmoothScroller.kt index a358fa684..8dbaf46f6 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/legacy/SimpleSmoothScroller.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/legacy/SimpleSmoothScroller.kt @@ -13,28 +13,26 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +package com.hippo.ehviewer.ui.legacy -package com.hippo.ehviewer.ui.legacy; +import android.content.Context +import androidx.recyclerview.widget.LinearSmoothScroller +import kotlin.math.abs +import kotlin.math.ceil -import android.content.Context; +abstract class SimpleSmoothScroller(context: Context, millisecondsPerInch: Float) : + LinearSmoothScroller(context) { + private val mMillisecondsPerPx: Float -import androidx.recyclerview.widget.LinearSmoothScroller; - -public abstract class SimpleSmoothScroller extends LinearSmoothScroller { - - private final float mMillisecondsPerPx; - - public SimpleSmoothScroller(Context context, float millisecondsPerInch) { - super(context); - mMillisecondsPerPx = millisecondsPerInch / context.getResources().getDisplayMetrics().densityDpi; + init { + mMillisecondsPerPx = millisecondsPerInch / context.resources.displayMetrics.densityDpi } - @Override - protected int calculateTimeForScrolling(int dx) { - if (mMillisecondsPerPx <= 0) { - return super.calculateTimeForScrolling(dx); + override fun calculateTimeForScrolling(dx: Int): Int { + return if (mMillisecondsPerPx <= 0) { + super.calculateTimeForScrolling(dx) } else { - return (int) Math.ceil(Math.abs(dx) * mMillisecondsPerPx); + ceil((abs(dx) * mMillisecondsPerPx).toDouble()).toInt() } } } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/legacy/WindowInsetsAnimationHelper.kt b/app/src/main/java/com/hippo/ehviewer/ui/legacy/WindowInsetsAnimationHelper.kt index e352391de..04f29c67a 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/legacy/WindowInsetsAnimationHelper.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/legacy/WindowInsetsAnimationHelper.kt @@ -15,95 +15,81 @@ * You should have received a copy of the GNU General Public License along with EhViewer. * If not, see . */ +package com.hippo.ehviewer.ui.legacy -package com.hippo.ehviewer.ui.legacy; +import android.view.View +import androidx.core.view.WindowInsetsAnimationCompat +import androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat +import androidx.core.view.WindowInsetsCompat +import com.google.android.material.math.MathUtils -import android.view.View; +class WindowInsetsAnimationHelper(dispatchMode: Int, vararg views: View) : + WindowInsetsAnimationCompat.Callback(dispatchMode) { + private val views: Array + private val startPaddings = HashMap() + private val endPaddings = HashMap() + var animation: WindowInsetsAnimationCompat? = null -import androidx.annotation.NonNull; -import androidx.core.view.WindowInsetsAnimationCompat; -import androidx.core.view.WindowInsetsCompat; - -import com.google.android.material.math.MathUtils; - -import java.util.HashMap; -import java.util.List; - -public class WindowInsetsAnimationHelper extends WindowInsetsAnimationCompat.Callback { - private final View[] views; - private final HashMap startPaddings = new HashMap<>(); - private final HashMap endPaddings = new HashMap<>(); - WindowInsetsAnimationCompat animation; - - public WindowInsetsAnimationHelper(int dispatchMode, View... views) { - super(dispatchMode); - this.views = views; + init { + this.views = arrayOf(*views) } - @Override - public void onPrepare(@NonNull WindowInsetsAnimationCompat animation) { - super.onPrepare(animation); - this.animation = animation; - for (View view : views) { - if (view == null) { - continue; - } - startPaddings.put(view, view.getPaddingBottom()); + override fun onPrepare(animation: WindowInsetsAnimationCompat) { + super.onPrepare(animation) + this.animation = animation + for (view in views) { + startPaddings[view] = view.paddingBottom } } - @NonNull - @Override - public WindowInsetsAnimationCompat.BoundsCompat onStart(@NonNull WindowInsetsAnimationCompat animation, @NonNull WindowInsetsAnimationCompat.BoundsCompat bounds) { - this.animation = animation; - for (View view : views) { - if (view == null) { - continue; - } - endPaddings.put(view, view.getPaddingBottom()); - int startPadding = startPaddings.containsKey(view) ? startPaddings.get(view) : 0; - view.setTranslationY(-(startPadding - view.getPaddingBottom())); + override fun onStart( + animation: WindowInsetsAnimationCompat, + bounds: BoundsCompat, + ): BoundsCompat { + this.animation = animation + for (view in views) { + endPaddings[view] = view.paddingBottom + val startPadding = if (startPaddings.containsKey(view)) startPaddings[view]!! else 0 + view.translationY = -(startPadding - view.paddingBottom).toFloat() } - return bounds; + return bounds } - @NonNull - @Override - public WindowInsetsCompat onProgress(@NonNull WindowInsetsCompat insets, @NonNull List runningAnimations) { + override fun onProgress( + insets: WindowInsetsCompat, + runningAnimations: List, + ): WindowInsetsCompat { if (animation == null) { - return insets; + return insets } - WindowInsetsAnimationCompat imeAnimation = null; - for (WindowInsetsAnimationCompat animation : runningAnimations) { - if ((animation.getTypeMask() & WindowInsetsCompat.Type.ime()) != 0) { - imeAnimation = animation; - break; + var imeAnimation: WindowInsetsAnimationCompat? = null + for (animation in runningAnimations) { + if (animation.typeMask and WindowInsetsCompat.Type.ime() != 0) { + imeAnimation = animation + break } } if (imeAnimation != null) { - for (View view : views) { - if (view == null) { - continue; - } - int startPadding = startPaddings.containsKey(view) ? startPaddings.get(view) : 0; - int endPadding = endPaddings.containsKey(view) ? endPaddings.get(view) : 0; - view.setTranslationY(MathUtils.lerp(endPadding - startPadding, 0, animation.getInterpolatedFraction())); + for (view in views) { + val startPadding = if (startPaddings.containsKey(view)) startPaddings[view]!! else 0 + val endPadding = if (endPaddings.containsKey(view)) endPaddings[view]!! else 0 + view.translationY = MathUtils.lerp( + (endPadding - startPadding).toFloat(), + 0f, + animation!!.interpolatedFraction, + ) } } - return insets; + return insets } - @Override - public void onEnd(@NonNull WindowInsetsAnimationCompat animation) { - super.onEnd(animation); - startPaddings.clear(); - endPaddings.clear(); - this.animation = null; - for (View view : views) { - if (view == null) { - continue; - } - view.setTranslationY(0); + override fun onEnd(animation: WindowInsetsAnimationCompat) { + super.onEnd(animation) + startPaddings.clear() + endPaddings.clear() + this.animation = null + for (view in views) { + view.translationY = 0f } } }