geekdroid/src/main/java/com/geekorum/geekdroid/bindings/BindingAdapters.kt
changeset 1 831cffa9c991
child 20 5d8a0555733d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/geekdroid/src/main/java/com/geekorum/geekdroid/bindings/BindingAdapters.kt	Fri May 08 21:33:19 2020 -0400
@@ -0,0 +1,134 @@
+/**
+ * Geekdroid is a utility library for development on the Android
+ * Platform.
+ *
+ * Copyright (C) 2017-2020 by Frederic-Charles Barthelery.
+ *
+ * This file is part of Geekdroid.
+ *
+ * Geekdroid is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Geekdroid is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Geekdroid.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.geekorum.geekdroid.bindings
+
+import android.graphics.ColorMatrix
+import android.graphics.ColorMatrixColorFilter
+import android.graphics.Rect
+import android.graphics.Typeface
+import android.view.TouchDelegate
+import android.view.View
+import android.widget.ImageView
+import android.widget.TextView
+import androidx.databinding.BindingAdapter
+import androidx.databinding.adapters.ListenerUtil
+import androidx.viewpager.widget.ViewPager
+import androidx.viewpager.widget.ViewPager.OnPageChangeListener
+import com.geekorum.geekdroid.R
+import com.geekorum.geekdroid.views.CheckableImageView
+import com.squareup.picasso.Picasso
+
+/**
+ * Various adapters for the Android Data Binding library
+ */
+
+@BindingAdapter("imageUrl")
+fun setImageUrl(imageView: ImageView, url: String) {
+    val requestCreator = Picasso.with(imageView.context)
+            .load(url)
+    when (imageView.scaleType) {
+        ImageView.ScaleType.CENTER_CROP -> requestCreator.centerCrop()
+        ImageView.ScaleType.FIT_CENTER -> requestCreator.fit().centerInside()
+        ImageView.ScaleType.FIT_XY -> requestCreator.fit()
+        else -> Unit // do nothing for the others
+    }
+    requestCreator.into(imageView)
+}
+
+@BindingAdapter("srcResource")
+fun setImageResources(imageView: ImageView, resourceId: Int) {
+    imageView.setImageResource(resourceId)
+}
+
+@BindingAdapter("grayscale")
+fun setImageGrayscale(imageView: ImageView, greyscale: Boolean) {
+    if (greyscale) {
+        val colorMatrix = ColorMatrix()
+        colorMatrix.setSaturation(0f)
+        imageView.colorFilter = ColorMatrixColorFilter(colorMatrix)
+    } else {
+        imageView.clearColorFilter()
+    }
+}
+
+@BindingAdapter("backgroundResource")
+fun setBackgroundResource(view: View, resourceId: Int) {
+    view.setBackgroundResource(resourceId)
+}
+
+@BindingAdapter("textStyle")
+fun setTextStyle(view: TextView, style: Int) {
+    view.setTypeface(Typeface.create(view.typeface, style), style)
+}
+
+@BindingAdapter("touchHeight", "touchWidth")
+fun setTouchArea(view: View, touchHeight: Float, touchWidth: Float) {
+    val parent = view.parent
+    if (parent is View) {
+        val parentView = parent as View
+        parentView.post {
+            val delegateArea = Rect()
+            view.getHitRect(delegateArea)
+            val deltaLeftRight = (touchWidth - delegateArea.width()) / 2
+            delegateArea.right += deltaLeftRight.toInt()
+            delegateArea.left -= deltaLeftRight.toInt()
+            val deltaTopBottom = (touchHeight - delegateArea.height()) / 2
+            delegateArea.bottom += deltaTopBottom.toInt()
+            delegateArea.top -= deltaTopBottom.toInt()
+            val delegate = TouchDelegate(delegateArea, view)
+            parentView.touchDelegate = delegate
+        }
+    }
+}
+
+@BindingAdapter("onCheckedChanged")
+fun setListener(checkableImageView: CheckableImageView,
+                newListener: CheckableImageView.OnCheckedChangeListener?) {
+    checkableImageView.setOnCheckedChangeListener(newListener)
+}
+
+@BindingAdapter("onPageSelected")
+fun setListener(viewPager: ViewPager, listener: OnPageSelectedListener?) {
+    var newListener: OnPageChangeListener? = null
+    if (listener != null) {
+        newListener = object : OnPageChangeListener {
+            override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}
+            override fun onPageSelected(position: Int) {
+                listener.onPageSelected(position)
+            }
+
+            override fun onPageScrollStateChanged(state: Int) {}
+        }
+    }
+    val oldListener = ListenerUtil.trackListener(viewPager,
+            newListener, R.id.onPageSelectedListener)
+    if (oldListener != null) {
+        viewPager.removeOnPageChangeListener(oldListener)
+    }
+    if (newListener != null) {
+        viewPager.addOnPageChangeListener(newListener)
+    }
+}
+
+interface OnPageSelectedListener {
+    fun onPageSelected(position: Int)
+}