From c253ae07a96ba91fa4801039358a2bef52881c53 Mon Sep 17 00:00:00 2001 From: Allan Wang Date: Sat, 19 Oct 2019 23:17:04 -0700 Subject: Update plugin version --- buildSrc/src/main/kotlin/kau/Versions.kt | 2 +- sample/build.gradle | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/buildSrc/src/main/kotlin/kau/Versions.kt b/buildSrc/src/main/kotlin/kau/Versions.kt index 882104d..e987f38 100644 --- a/buildSrc/src/main/kotlin/kau/Versions.kt +++ b/buildSrc/src/main/kotlin/kau/Versions.kt @@ -71,7 +71,7 @@ object Versions { const val bugsnagPlugin="4.7.0" // https://mvnrepository.com/artifact/com.android.tools.build/gradle?repo=google - const val gradlePlugin = "3.5.0" + const val gradlePlugin = "3.6.0-beta01" // https://github.com/dcendents/android-maven-gradle-plugin/releases const val mavenPlugin = "2.1" // https://github.com/Triple-T/gradle-play-publisher/releases diff --git a/sample/build.gradle b/sample/build.gradle index ab98695..b710998 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -28,6 +28,9 @@ android { multiDexEnabled true testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } + viewBinding { + enabled = true + } def releaseSigning = file("../files/kau.properties") def hasSigning = releaseSigning.exists() -- cgit v1.2.3 From 2e13634663cb3c511e4aed556db06a20d8bff6f4 Mon Sep 17 00:00:00 2001 From: Allan Wang Date: Sun, 20 Oct 2019 00:09:20 -0700 Subject: Generify data binding to view binding --- fastadapter-databinding/.gitignore | 1 - fastadapter-databinding/build.gradle | 21 --- fastadapter-databinding/consumer-rules.pro | 0 fastadapter-databinding/proguard-rules.pro | 21 --- .../src/main/AndroidManifest.xml | 1 - .../fastadapter/databinding/BindingItem.kt | 123 ---------------- fastadapter-viewbinding/.gitignore | 1 + fastadapter-viewbinding/build.gradle | 24 ++++ fastadapter-viewbinding/consumer-rules.pro | 0 fastadapter-viewbinding/proguard-rules.pro | 21 +++ .../src/main/AndroidManifest.xml | 1 + .../fastadapter/viewbinding/BindingItem.kt | 154 +++++++++++++++++++++ .../src/main/res/values/ids.xml | 5 + .../ca/allanwang/kau/sample/SwipeActivity.kt | 2 + settings.gradle | 2 +- 15 files changed, 209 insertions(+), 168 deletions(-) delete mode 100644 fastadapter-databinding/.gitignore delete mode 100644 fastadapter-databinding/build.gradle delete mode 100644 fastadapter-databinding/consumer-rules.pro delete mode 100644 fastadapter-databinding/proguard-rules.pro delete mode 100644 fastadapter-databinding/src/main/AndroidManifest.xml delete mode 100644 fastadapter-databinding/src/main/kotlin/ca/allanwang/fastadapter/databinding/BindingItem.kt create mode 100644 fastadapter-viewbinding/.gitignore create mode 100644 fastadapter-viewbinding/build.gradle create mode 100644 fastadapter-viewbinding/consumer-rules.pro create mode 100644 fastadapter-viewbinding/proguard-rules.pro create mode 100644 fastadapter-viewbinding/src/main/AndroidManifest.xml create mode 100644 fastadapter-viewbinding/src/main/kotlin/ca/allanwang/fastadapter/viewbinding/BindingItem.kt create mode 100644 fastadapter-viewbinding/src/main/res/values/ids.xml diff --git a/fastadapter-databinding/.gitignore b/fastadapter-databinding/.gitignore deleted file mode 100644 index 796b96d..0000000 --- a/fastadapter-databinding/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/fastadapter-databinding/build.gradle b/fastadapter-databinding/build.gradle deleted file mode 100644 index aefb22e..0000000 --- a/fastadapter-databinding/build.gradle +++ /dev/null @@ -1,21 +0,0 @@ -import kau.Dependencies -import kau.Versions - -ext.kauSubModuleMinSdk = Versions.coreMinSdk - -apply from: '../android-lib.gradle' - -android { - dataBinding { - enabled = true - } -} - -dependencies { - implementation project(':core') - - api Dependencies.fastAdapter - api Dependencies.fastAdapter("utils") -} - -apply from: '../artifacts.gradle' diff --git a/fastadapter-databinding/consumer-rules.pro b/fastadapter-databinding/consumer-rules.pro deleted file mode 100644 index e69de29..0000000 diff --git a/fastadapter-databinding/proguard-rules.pro b/fastadapter-databinding/proguard-rules.pro deleted file mode 100644 index f1b4245..0000000 --- a/fastadapter-databinding/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile diff --git a/fastadapter-databinding/src/main/AndroidManifest.xml b/fastadapter-databinding/src/main/AndroidManifest.xml deleted file mode 100644 index acd1012..0000000 --- a/fastadapter-databinding/src/main/AndroidManifest.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/fastadapter-databinding/src/main/kotlin/ca/allanwang/fastadapter/databinding/BindingItem.kt b/fastadapter-databinding/src/main/kotlin/ca/allanwang/fastadapter/databinding/BindingItem.kt deleted file mode 100644 index b2b0f26..0000000 --- a/fastadapter-databinding/src/main/kotlin/ca/allanwang/fastadapter/databinding/BindingItem.kt +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright 2019 Allan Wang - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package ca.allanwang.fastadapter.databinding - -import android.content.Context -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.databinding.DataBindingUtil -import androidx.databinding.ViewDataBinding -import androidx.recyclerview.widget.RecyclerView -import ca.allanwang.kau.logging.KL -import com.mikepenz.fastadapter.FastAdapter -import com.mikepenz.fastadapter.GenericItem -import com.mikepenz.fastadapter.items.AbstractItem -import com.mikepenz.fastadapter.listeners.ClickEventHook - -interface VhModel { - fun vh(): GenericItem -} - -abstract class BindingItem(open val data: Any?) : - AbstractItem(), - BindingLayout { - - override val type: Int - get() = layoutRes - - override fun createView(ctx: Context, parent: ViewGroup?): View { - val binding: ViewDataBinding = DataBindingUtil.inflate( - LayoutInflater.from(ctx), - layoutRes, parent, - false - ) - return binding.root - } - - fun getBinding(holder: ViewHolder): Binding? = - DataBindingUtil.getBinding(holder.itemView) - - final override fun bindView(holder: ViewHolder, payloads: MutableList) { - super.bindView(holder, payloads) - val binding = getBinding(holder) ?: return - binding.bindView(holder, payloads) - binding.executePendingBindings() - } - - abstract fun Binding.bindView(holder: ViewHolder, payloads: MutableList) - - final override fun unbindView(holder: ViewHolder) { - super.unbindView(holder) - val binding = DataBindingUtil.getBinding(holder.itemView) ?: return - binding.unbindView(holder) - binding.unbind() - } - - open fun Binding.unbindView(holder: ViewHolder) {} - - final override fun getViewHolder(v: View): ViewHolder = ViewHolder(v, layoutRes) - - override fun failedToRecycle(holder: ViewHolder): Boolean { - KL.e { "Failed to recycle" } - return super.failedToRecycle(holder) - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (other !is BindingItem<*>) return false - return identifier == other.identifier && data == other.data - } - - override fun hashCode(): Int = data.hashCode() - - class ViewHolder(itemView: View, internal val layoutRes: Int) : - RecyclerView.ViewHolder(itemView) -} - -interface BindingLayout { - val layoutRes: Int -} - -abstract class BindingClickEventHook>(val identifier: BindingLayout) : - ClickEventHook() { - - private fun RecyclerView.ViewHolder.binding(): Binding? { - val holder = this as? BindingItem.ViewHolder ?: return null - if (holder.layoutRes != identifier.layoutRes) { - return null - } - return DataBindingUtil.getBinding(itemView) - } - - final override fun onBind(viewHolder: RecyclerView.ViewHolder): View? = - viewHolder.binding()?.onBind(viewHolder) ?: super.onBind(viewHolder) - - open fun Binding.onBind(viewHolder: RecyclerView.ViewHolder): View? = super.onBind(viewHolder) - - final override fun onBindMany(viewHolder: RecyclerView.ViewHolder): List? = - viewHolder.binding()?.onBindMany(viewHolder) ?: super.onBindMany(viewHolder) - - open fun Binding.onBindMany(viewHolder: RecyclerView.ViewHolder): List? = - super.onBindMany(viewHolder) - - final override fun onClick(v: View, position: Int, fastAdapter: FastAdapter, item: Item) { - val binding: Binding = DataBindingUtil.findBinding(v) ?: return - binding.onClick(v, position, fastAdapter, item) - } - - abstract fun Binding.onClick(v: View, position: Int, fastAdapter: FastAdapter, item: Item) -} diff --git a/fastadapter-viewbinding/.gitignore b/fastadapter-viewbinding/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/fastadapter-viewbinding/.gitignore @@ -0,0 +1 @@ +/build diff --git a/fastadapter-viewbinding/build.gradle b/fastadapter-viewbinding/build.gradle new file mode 100644 index 0000000..d9de6d5 --- /dev/null +++ b/fastadapter-viewbinding/build.gradle @@ -0,0 +1,24 @@ +import kau.Dependencies +import kau.Versions + +ext.kauSubModuleMinSdk = Versions.coreMinSdk + +apply from: '../android-lib.gradle' + +android { + dataBinding { + enabled = true + } + viewBinding { + enabled = true + } +} + +dependencies { + implementation project(':core') + + api Dependencies.fastAdapter + api Dependencies.fastAdapter("utils") +} + +apply from: '../artifacts.gradle' diff --git a/fastadapter-viewbinding/consumer-rules.pro b/fastadapter-viewbinding/consumer-rules.pro new file mode 100644 index 0000000..e69de29 diff --git a/fastadapter-viewbinding/proguard-rules.pro b/fastadapter-viewbinding/proguard-rules.pro new file mode 100644 index 0000000..f1b4245 --- /dev/null +++ b/fastadapter-viewbinding/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/fastadapter-viewbinding/src/main/AndroidManifest.xml b/fastadapter-viewbinding/src/main/AndroidManifest.xml new file mode 100644 index 0000000..acd1012 --- /dev/null +++ b/fastadapter-viewbinding/src/main/AndroidManifest.xml @@ -0,0 +1 @@ + diff --git a/fastadapter-viewbinding/src/main/kotlin/ca/allanwang/fastadapter/viewbinding/BindingItem.kt b/fastadapter-viewbinding/src/main/kotlin/ca/allanwang/fastadapter/viewbinding/BindingItem.kt new file mode 100644 index 0000000..2d1834f --- /dev/null +++ b/fastadapter-viewbinding/src/main/kotlin/ca/allanwang/fastadapter/viewbinding/BindingItem.kt @@ -0,0 +1,154 @@ +/* + * Copyright 2019 Allan Wang + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package ca.allanwang.fastadapter.viewbinding + +import android.content.Context +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import androidx.viewbinding.ViewBinding +import ca.allanwang.kau.fastadapter.databinding.R +import ca.allanwang.kau.logging.KL +import com.mikepenz.fastadapter.FastAdapter +import com.mikepenz.fastadapter.GenericItem +import com.mikepenz.fastadapter.items.AbstractItem +import com.mikepenz.fastadapter.listeners.ClickEventHook + +interface VhModel { + fun vh(): GenericItem +} + +interface BindingLayout { + val layoutRes: Int + fun createBinding(context: Context, parent: ViewGroup?): Binding + fun Binding.bindView(holder: ViewHolder, payloads: MutableList) + fun Binding.unbindView(holder: ViewHolder) + + class ViewHolder(itemView: View, internal val layoutRes: Int) : + RecyclerView.ViewHolder(itemView) { + + /** + * Retrieves a binding. + * + * It is assumed that the binding is set on view holder creation, + * and that its type matches the supplied generic. + */ + fun getBinding(): T = getBinding(itemView) + } + + companion object { + fun setBinding(view: View, binding: Any) { + view.setTag(R.id.kau_view_binding_model, binding) + } + + @Suppress("UNCHECKED_CAST") + fun getBinding(view: View): T = view.getTag(R.id.kau_view_binding_model) as T + } +} + +abstract class BindingItem(open val data: Any?) : + AbstractItem(), + BindingLayout { + + override val type: Int + get() = layoutRes + + override fun createView(ctx: Context, parent: ViewGroup?): View { + val binding = createBinding(ctx, parent) + BindingLayout.setBinding(binding.root, binding) + return binding.root + } + + final override fun bindView(holder: BindingLayout.ViewHolder, payloads: MutableList) { + super.bindView(holder, payloads) + val binding = holder.getBinding() + binding.bindView(holder, payloads) + } + + final override fun unbindView(holder: BindingLayout.ViewHolder) { + super.unbindView(holder) + val binding = holder.getBinding() + binding.unbindView(holder) + } + + override fun Binding.unbindView(holder: BindingLayout.ViewHolder) {} + + final override fun getViewHolder(v: View): BindingLayout.ViewHolder = + BindingLayout.ViewHolder(v, layoutRes) + + override fun failedToRecycle(holder: BindingLayout.ViewHolder): Boolean { + KL.e { "Failed to recycle" } + return super.failedToRecycle(holder) + } + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is BindingItem<*>) return false + return identifier == other.identifier && data == other.data + } + + override fun hashCode(): Int = data.hashCode() +} + +abstract class BindingClickEventHook>(val identifier: BindingLayout) : + ClickEventHook() { + + private fun RecyclerView.ViewHolder.binding(): Binding? { + val holder = this as? BindingLayout.ViewHolder ?: return null + if (holder.layoutRes != identifier.layoutRes) { + return null + } + return getBinding() + } + + /** + * All bound views must set the view root, which will be used to find the binding. + * We avoid attaching the binding directly + */ + private fun View.setRoot(root: View) { + setTag(R.id.kau_view_binding_root, root) + } + + private fun View.findBinding(): Binding { + val root = getTag(R.id.kau_view_binding_root) as View + return BindingLayout.getBinding(root) + } + + final override fun onBind(viewHolder: RecyclerView.ViewHolder): View? { + val binding = viewHolder.binding() ?: return super.onBind(viewHolder) + val view = binding.onBind(viewHolder) ?: return super.onBind(viewHolder) + view.setRoot(binding.root) + return view + } + + open fun Binding.onBind(viewHolder: RecyclerView.ViewHolder): View? = super.onBind(viewHolder) + + final override fun onBindMany(viewHolder: RecyclerView.ViewHolder): List? { + val binding = viewHolder.binding() ?: return super.onBindMany(viewHolder) + val views = binding.onBindMany(viewHolder) ?: return super.onBindMany(viewHolder) + views.forEach { it.setRoot(binding.root) } + return views + } + + open fun Binding.onBindMany(viewHolder: RecyclerView.ViewHolder): List? = + super.onBindMany(viewHolder) + + final override fun onClick(v: View, position: Int, fastAdapter: FastAdapter, item: Item) { + v.findBinding().onClick(v, position, fastAdapter, item) + } + + abstract fun Binding.onClick(v: View, position: Int, fastAdapter: FastAdapter, item: Item) +} diff --git a/fastadapter-viewbinding/src/main/res/values/ids.xml b/fastadapter-viewbinding/src/main/res/values/ids.xml new file mode 100644 index 0000000..550ae02 --- /dev/null +++ b/fastadapter-viewbinding/src/main/res/values/ids.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/sample/src/main/kotlin/ca/allanwang/kau/sample/SwipeActivity.kt b/sample/src/main/kotlin/ca/allanwang/kau/sample/SwipeActivity.kt index 5107e18..14b67e2 100644 --- a/sample/src/main/kotlin/ca/allanwang/kau/sample/SwipeActivity.kt +++ b/sample/src/main/kotlin/ca/allanwang/kau/sample/SwipeActivity.kt @@ -17,7 +17,9 @@ package ca.allanwang.kau.sample import android.app.Activity import android.os.Bundle +import androidx.viewbinding.ViewBinding import ca.allanwang.kau.internal.KauBaseActivity +import ca.allanwang.kau.sample.databinding.ActivitySwipeBinding import ca.allanwang.kau.swipe.SWIPE_EDGE_BOTTOM import ca.allanwang.kau.swipe.SWIPE_EDGE_LEFT import ca.allanwang.kau.swipe.SWIPE_EDGE_RIGHT diff --git a/settings.gradle b/settings.gradle index 0ec0606..43c5974 100644 --- a/settings.gradle +++ b/settings.gradle @@ -4,7 +4,7 @@ include ':core', ':about', ':adapter', ':fastadapter', - ':fastadapter-databinding', + ':fastadapter-viewbinding', ':colorpicker', ':mediapicker', ':kpref-activity', -- cgit v1.2.3 From 7c421439d69895053d90a44236059f8baf57a853 Mon Sep 17 00:00:00 2001 From: Allan Wang Date: Sun, 20 Oct 2019 00:10:51 -0700 Subject: Update imports --- fastadapter-viewbinding/build.gradle | 3 --- fastadapter-viewbinding/src/main/AndroidManifest.xml | 2 +- .../main/kotlin/ca/allanwang/fastadapter/viewbinding/BindingItem.kt | 2 +- sample/src/main/kotlin/ca/allanwang/kau/sample/SwipeActivity.kt | 2 -- 4 files changed, 2 insertions(+), 7 deletions(-) diff --git a/fastadapter-viewbinding/build.gradle b/fastadapter-viewbinding/build.gradle index d9de6d5..a786edb 100644 --- a/fastadapter-viewbinding/build.gradle +++ b/fastadapter-viewbinding/build.gradle @@ -6,9 +6,6 @@ ext.kauSubModuleMinSdk = Versions.coreMinSdk apply from: '../android-lib.gradle' android { - dataBinding { - enabled = true - } viewBinding { enabled = true } diff --git a/fastadapter-viewbinding/src/main/AndroidManifest.xml b/fastadapter-viewbinding/src/main/AndroidManifest.xml index acd1012..3c1cd7f 100644 --- a/fastadapter-viewbinding/src/main/AndroidManifest.xml +++ b/fastadapter-viewbinding/src/main/AndroidManifest.xml @@ -1 +1 @@ - + diff --git a/fastadapter-viewbinding/src/main/kotlin/ca/allanwang/fastadapter/viewbinding/BindingItem.kt b/fastadapter-viewbinding/src/main/kotlin/ca/allanwang/fastadapter/viewbinding/BindingItem.kt index 2d1834f..d1ae65f 100644 --- a/fastadapter-viewbinding/src/main/kotlin/ca/allanwang/fastadapter/viewbinding/BindingItem.kt +++ b/fastadapter-viewbinding/src/main/kotlin/ca/allanwang/fastadapter/viewbinding/BindingItem.kt @@ -20,7 +20,7 @@ import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import androidx.viewbinding.ViewBinding -import ca.allanwang.kau.fastadapter.databinding.R +import ca.allanwang.kau.fastadapter.viewbinding.R import ca.allanwang.kau.logging.KL import com.mikepenz.fastadapter.FastAdapter import com.mikepenz.fastadapter.GenericItem diff --git a/sample/src/main/kotlin/ca/allanwang/kau/sample/SwipeActivity.kt b/sample/src/main/kotlin/ca/allanwang/kau/sample/SwipeActivity.kt index 14b67e2..5107e18 100644 --- a/sample/src/main/kotlin/ca/allanwang/kau/sample/SwipeActivity.kt +++ b/sample/src/main/kotlin/ca/allanwang/kau/sample/SwipeActivity.kt @@ -17,9 +17,7 @@ package ca.allanwang.kau.sample import android.app.Activity import android.os.Bundle -import androidx.viewbinding.ViewBinding import ca.allanwang.kau.internal.KauBaseActivity -import ca.allanwang.kau.sample.databinding.ActivitySwipeBinding import ca.allanwang.kau.swipe.SWIPE_EDGE_BOTTOM import ca.allanwang.kau.swipe.SWIPE_EDGE_LEFT import ca.allanwang.kau.swipe.SWIPE_EDGE_RIGHT -- cgit v1.2.3 From 8e73e46e9ebbec9ac452cd670538736ad0dacb03 Mon Sep 17 00:00:00 2001 From: Allan Wang Date: Sun, 20 Oct 2019 00:11:58 -0700 Subject: Update changelog --- docs/Changelog.md | 1 + sample/src/main/res/xml/kau_changelog.xml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/Changelog.md b/docs/Changelog.md index f629f4c..37e355e 100644 --- a/docs/Changelog.md +++ b/docs/Changelog.md @@ -7,6 +7,7 @@ * :core: Remove statusBarLight toggle * :core: Remove kau_status_bar_height; height should be found programmatically * :fastadapter: Migrate fastadapter to v4.x.x +* :fastadapter-viewbinding: Create helper items for ViewBinding ## v5.1.0 * :adapter: Moved fastadapter elements to new module, :fastadapter:. To migrate, simply rename the dependency. If you don't use fast adapter, no changes are necessary diff --git a/sample/src/main/res/xml/kau_changelog.xml b/sample/src/main/res/xml/kau_changelog.xml index 5b4ff9c..d8c167f 100644 --- a/sample/src/main/res/xml/kau_changelog.xml +++ b/sample/src/main/res/xml/kau_changelog.xml @@ -13,7 +13,7 @@ - + -- cgit v1.2.3 From 302d3351e9866b71b1e525c0e5ba883fe022ba5c Mon Sep 17 00:00:00 2001 From: Allan Wang Date: Sun, 20 Oct 2019 01:51:18 -0700 Subject: Update binding definitions --- .../fastadapter/viewbinding/BindingItem.kt | 91 ++++++++++------------ 1 file changed, 41 insertions(+), 50 deletions(-) diff --git a/fastadapter-viewbinding/src/main/kotlin/ca/allanwang/fastadapter/viewbinding/BindingItem.kt b/fastadapter-viewbinding/src/main/kotlin/ca/allanwang/fastadapter/viewbinding/BindingItem.kt index d1ae65f..d40be3d 100644 --- a/fastadapter-viewbinding/src/main/kotlin/ca/allanwang/fastadapter/viewbinding/BindingItem.kt +++ b/fastadapter-viewbinding/src/main/kotlin/ca/allanwang/fastadapter/viewbinding/BindingItem.kt @@ -31,65 +31,48 @@ interface VhModel { fun vh(): GenericItem } +/** + * Layout container. Should be implemented in a [BindingItem] companion. + */ interface BindingLayout { val layoutRes: Int - fun createBinding(context: Context, parent: ViewGroup?): Binding - fun Binding.bindView(holder: ViewHolder, payloads: MutableList) - fun Binding.unbindView(holder: ViewHolder) - - class ViewHolder(itemView: View, internal val layoutRes: Int) : - RecyclerView.ViewHolder(itemView) { - - /** - * Retrieves a binding. - * - * It is assumed that the binding is set on view holder creation, - * and that its type matches the supplied generic. - */ - fun getBinding(): T = getBinding(itemView) - } - - companion object { - fun setBinding(view: View, binding: Any) { - view.setTag(R.id.kau_view_binding_model, binding) - } - - @Suppress("UNCHECKED_CAST") - fun getBinding(view: View): T = view.getTag(R.id.kau_view_binding_model) as T - } } abstract class BindingItem(open val data: Any?) : - AbstractItem(), + AbstractItem(), BindingLayout { override val type: Int get() = layoutRes + abstract fun createBinding(context: Context, parent: ViewGroup?): Binding + override fun createView(ctx: Context, parent: ViewGroup?): View { val binding = createBinding(ctx, parent) - BindingLayout.setBinding(binding.root, binding) + setBinding(binding.root, binding) return binding.root } - final override fun bindView(holder: BindingLayout.ViewHolder, payloads: MutableList) { + final override fun bindView(holder: ViewHolder, payloads: MutableList) { super.bindView(holder, payloads) val binding = holder.getBinding() binding.bindView(holder, payloads) } - final override fun unbindView(holder: BindingLayout.ViewHolder) { + abstract fun Binding.bindView(holder: ViewHolder, payloads: MutableList) + + final override fun unbindView(holder: ViewHolder) { super.unbindView(holder) val binding = holder.getBinding() binding.unbindView(holder) } - override fun Binding.unbindView(holder: BindingLayout.ViewHolder) {} + open fun Binding.unbindView(holder: ViewHolder) {} - final override fun getViewHolder(v: View): BindingLayout.ViewHolder = - BindingLayout.ViewHolder(v, layoutRes) + final override fun getViewHolder(v: View): ViewHolder = + ViewHolder(v, layoutRes) - override fun failedToRecycle(holder: BindingLayout.ViewHolder): Boolean { + override fun failedToRecycle(holder: ViewHolder): Boolean { KL.e { "Failed to recycle" } return super.failedToRecycle(holder) } @@ -101,36 +84,44 @@ abstract class BindingItem(open val data: Any?) : } override fun hashCode(): Int = data.hashCode() + + class ViewHolder(itemView: View, internal val layoutRes: Int) : + RecyclerView.ViewHolder(itemView) { + + /** + * Retrieves a binding. + * + * It is assumed that the binding is set prior to this call, + * and that its type matches the supplied generic. + */ + fun getBinding(): T = getBinding(itemView) + } + + companion object { + fun setBinding(view: View, binding: Any) { + view.setTag(R.id.kau_view_binding_model, binding) + } + + @Suppress("UNCHECKED_CAST") + fun getBinding(view: View): T = view.getTag(R.id.kau_view_binding_model) as T + } } abstract class BindingClickEventHook>(val identifier: BindingLayout) : ClickEventHook() { private fun RecyclerView.ViewHolder.binding(): Binding? { - val holder = this as? BindingLayout.ViewHolder ?: return null + val holder = this as? BindingItem.ViewHolder ?: return null if (holder.layoutRes != identifier.layoutRes) { return null } return getBinding() } - /** - * All bound views must set the view root, which will be used to find the binding. - * We avoid attaching the binding directly - */ - private fun View.setRoot(root: View) { - setTag(R.id.kau_view_binding_root, root) - } - - private fun View.findBinding(): Binding { - val root = getTag(R.id.kau_view_binding_root) as View - return BindingLayout.getBinding(root) - } - final override fun onBind(viewHolder: RecyclerView.ViewHolder): View? { val binding = viewHolder.binding() ?: return super.onBind(viewHolder) val view = binding.onBind(viewHolder) ?: return super.onBind(viewHolder) - view.setRoot(binding.root) + BindingItem.setBinding(view, binding) return view } @@ -139,7 +130,7 @@ abstract class BindingClickEventHook? { val binding = viewHolder.binding() ?: return super.onBindMany(viewHolder) val views = binding.onBindMany(viewHolder) ?: return super.onBindMany(viewHolder) - views.forEach { it.setRoot(binding.root) } + views.forEach { BindingItem.setBinding(it, binding) } return views } @@ -147,8 +138,8 @@ abstract class BindingClickEventHook, item: Item) { - v.findBinding().onClick(v, position, fastAdapter, item) + BindingItem.getBinding(v).onClick(v, position, fastAdapter, item) } abstract fun Binding.onClick(v: View, position: Int, fastAdapter: FastAdapter, item: Item) -} +} \ No newline at end of file -- cgit v1.2.3 From 955643f7c42603153ff69b4e4bb6a5ed7c9de96b Mon Sep 17 00:00:00 2001 From: Allan Wang Date: Sun, 20 Oct 2019 02:15:24 -0700 Subject: Use view binding for sample checkbox and fix pref header --- core/src/main/res/values/constraintLayout_attr.xml | 10 ++++ .../fastadapter/viewbinding/BindingItem.kt | 5 +- .../src/main/res/layout/kau_pref_header.xml | 4 +- sample/build.gradle | 1 + .../kotlin/ca/allanwang/kau/sample/AnimActivity.kt | 14 ++--- .../ca/allanwang/kau/sample/PermissionCheckbox.kt | 67 ++++++++++++++++++++++ .../ca/allanwang/kau/sample/SwipeActivity.kt | 55 +++++++++++------- sample/src/main/res/values/strings_sample.xml | 2 +- 8 files changed, 122 insertions(+), 36 deletions(-) create mode 100644 core/src/main/res/values/constraintLayout_attr.xml diff --git a/core/src/main/res/values/constraintLayout_attr.xml b/core/src/main/res/values/constraintLayout_attr.xml new file mode 100644 index 0000000..e3624e4 --- /dev/null +++ b/core/src/main/res/values/constraintLayout_attr.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/fastadapter-viewbinding/src/main/kotlin/ca/allanwang/fastadapter/viewbinding/BindingItem.kt b/fastadapter-viewbinding/src/main/kotlin/ca/allanwang/fastadapter/viewbinding/BindingItem.kt index d40be3d..a475615 100644 --- a/fastadapter-viewbinding/src/main/kotlin/ca/allanwang/fastadapter/viewbinding/BindingItem.kt +++ b/fastadapter-viewbinding/src/main/kotlin/ca/allanwang/fastadapter/viewbinding/BindingItem.kt @@ -16,6 +16,7 @@ package ca.allanwang.fastadapter.viewbinding import android.content.Context +import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView @@ -45,10 +46,10 @@ abstract class BindingItem(open val data: Any?) : override val type: Int get() = layoutRes - abstract fun createBinding(context: Context, parent: ViewGroup?): Binding + abstract fun createBinding(layoutInflater: LayoutInflater, parent: ViewGroup?): Binding override fun createView(ctx: Context, parent: ViewGroup?): View { - val binding = createBinding(ctx, parent) + val binding = createBinding(LayoutInflater.from(ctx), parent) setBinding(binding.root, binding) return binding.root } diff --git a/kpref-activity/src/main/res/layout/kau_pref_header.xml b/kpref-activity/src/main/res/layout/kau_pref_header.xml index 65504a3..27ef74c 100644 --- a/kpref-activity/src/main/res/layout/kau_pref_header.xml +++ b/kpref-activity/src/main/res/layout/kau_pref_header.xml @@ -3,8 +3,10 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="8dip" - android:paddingEnd="?android:attr/listPreferredItemPaddingRight" + android:clickable="false" + android:focusable="false" android:paddingStart="?android:attr/listPreferredItemPaddingLeft" android:paddingTop="16dip" + android:paddingEnd="?android:attr/listPreferredItemPaddingRight" android:textColor="?colorAccent" android:textSize="14sp" /> \ No newline at end of file diff --git a/sample/build.gradle b/sample/build.gradle index b710998..47baed2 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -124,6 +124,7 @@ android { dependencies { implementation project(':about') implementation project(':fastadapter') + implementation project(':fastadapter-viewbinding') implementation project(':colorpicker') implementation project(':core') implementation project(':core-ui') diff --git a/sample/src/main/kotlin/ca/allanwang/kau/sample/AnimActivity.kt b/sample/src/main/kotlin/ca/allanwang/kau/sample/AnimActivity.kt index a5ef8c3..50b3cf3 100644 --- a/sample/src/main/kotlin/ca/allanwang/kau/sample/AnimActivity.kt +++ b/sample/src/main/kotlin/ca/allanwang/kau/sample/AnimActivity.kt @@ -16,6 +16,7 @@ package ca.allanwang.kau.sample import android.os.Bundle +import ca.allanwang.kau.adapters.SingleFastAdapter import ca.allanwang.kau.internal.KauBaseActivity import ca.allanwang.kau.logging.KL import ca.allanwang.kau.permissions.PERMISSION_ACCESS_COARSE_LOCATION @@ -42,7 +43,7 @@ class AnimActivity : KauBaseActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - val adapter = FastItemAdapter() + val adapter = SingleFastAdapter() setContentView(fullLinearRecycler(adapter).apply { setBackgroundColor( KPrefSample.bgColor.withAlpha(255) @@ -53,15 +54,8 @@ class AnimActivity : KauBaseActivity() { PERMISSION_ACCESS_COARSE_LOCATION, PERMISSION_ACCESS_FINE_LOCATION, PERMISSION_CAMERA - ).map { PermissionCheckbox(it) }) - adapter.onClickListener = { _, _, item, _ -> - KL.d { "Perm Click" } - kauRequestPermissions(item.permission) { granted, _ -> - toast("${item.permission} enabled: $granted") - adapter.notifyAdapterDataSetChanged() - } - true - } + ).map { PermissionCheckboxModel(it).vh() }) + adapter.addEventHook(PermissionCheckboxViewBinding.clickHook()) kauSwipeOnCreate { edgeFlag = SWIPE_EDGE_LEFT } diff --git a/sample/src/main/kotlin/ca/allanwang/kau/sample/PermissionCheckbox.kt b/sample/src/main/kotlin/ca/allanwang/kau/sample/PermissionCheckbox.kt index 68dde2a..40ad663 100644 --- a/sample/src/main/kotlin/ca/allanwang/kau/sample/PermissionCheckbox.kt +++ b/sample/src/main/kotlin/ca/allanwang/kau/sample/PermissionCheckbox.kt @@ -15,12 +15,26 @@ */ package ca.allanwang.kau.sample +import android.Manifest +import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup import android.widget.CheckBox import android.widget.TextView import androidx.recyclerview.widget.RecyclerView +import ca.allanwang.fastadapter.viewbinding.BindingClickEventHook +import ca.allanwang.fastadapter.viewbinding.BindingItem +import ca.allanwang.fastadapter.viewbinding.BindingLayout +import ca.allanwang.fastadapter.viewbinding.VhModel import ca.allanwang.kau.iitems.KauIItem +import ca.allanwang.kau.logging.KL +import ca.allanwang.kau.permissions.kauRequestPermissions +import ca.allanwang.kau.sample.databinding.PermissionCheckboxBinding import ca.allanwang.kau.utils.hasPermission +import ca.allanwang.kau.utils.toast +import com.mikepenz.fastadapter.FastAdapter +import com.mikepenz.fastadapter.GenericItem +import com.mikepenz.fastadapter.listeners.EventHook /** * Created by Allan Wang on 2017-07-03. @@ -41,3 +55,56 @@ class PermissionCheckbox(val permission: String) : KauIItem(data), + BindingLayout by Companion { + + override fun createBinding( + layoutInflater: LayoutInflater, + parent: ViewGroup? + ): PermissionCheckboxBinding = + PermissionCheckboxBinding.inflate(layoutInflater, parent, false) + + override fun PermissionCheckboxBinding.bindView( + holder: ViewHolder, + payloads: MutableList + ) { + permText.text = data.permission + permCheckbox.apply { + isChecked = holder.itemView.context.hasPermission(data.permission) + isFocusable = false + isClickable = false + jumpDrawablesToCurrentState() // Cancel the animation + } + } + + companion object : BindingLayout { + override val layoutRes: Int + get() = R.layout.permission_checkbox + + fun clickHook(): EventHook = object : BindingClickEventHook(this) { + override fun PermissionCheckboxBinding.onBind(viewHolder: RecyclerView.ViewHolder): View? = root + + override fun PermissionCheckboxBinding.onClick( + v: View, + position: Int, + fastAdapter: FastAdapter, + item: PermissionCheckboxViewBinding + ) { + KL.d { "Perm Click" } + with (v.context) { + kauRequestPermissions(item.data.permission) { granted, _ -> + toast("${item.data.permission} enabled: $granted") + fastAdapter.notifyAdapterDataSetChanged() + } + } + } + } + } +} \ No newline at end of file diff --git a/sample/src/main/kotlin/ca/allanwang/kau/sample/SwipeActivity.kt b/sample/src/main/kotlin/ca/allanwang/kau/sample/SwipeActivity.kt index 5107e18..3976ae3 100644 --- a/sample/src/main/kotlin/ca/allanwang/kau/sample/SwipeActivity.kt +++ b/sample/src/main/kotlin/ca/allanwang/kau/sample/SwipeActivity.kt @@ -18,6 +18,7 @@ package ca.allanwang.kau.sample import android.app.Activity import android.os.Bundle import ca.allanwang.kau.internal.KauBaseActivity +import ca.allanwang.kau.sample.databinding.ActivitySwipeBinding import ca.allanwang.kau.swipe.SWIPE_EDGE_BOTTOM import ca.allanwang.kau.swipe.SWIPE_EDGE_LEFT import ca.allanwang.kau.swipe.SWIPE_EDGE_RIGHT @@ -30,7 +31,6 @@ import ca.allanwang.kau.utils.navigationBarColor import ca.allanwang.kau.utils.rndColor import ca.allanwang.kau.utils.startActivity import ca.allanwang.kau.utils.statusBarColor -import kotlinx.android.synthetic.main.activity_swipe.* /** * Created by Allan Wang on 2017-08-05. @@ -45,29 +45,40 @@ fun Activity.startActivityWithEdge(flag: Int) { class SwipeActivity : KauBaseActivity() { + private lateinit var binding: ActivitySwipeBinding + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_swipe) - listOf(swipe_from_left, swipe_from_right, swipe_from_top, swipe_from_bottom) - .zip(listOf(SWIPE_EDGE_LEFT, SWIPE_EDGE_RIGHT, SWIPE_EDGE_TOP, SWIPE_EDGE_BOTTOM)) - .forEach { (button, edge) -> button.setOnClickListener { startActivityWithEdge(edge) } } - val flag = intent.getIntExtra(SWIPE_EDGE, -1) - swipe_toolbar.title = when (flag) { - SWIPE_EDGE_LEFT -> "Left Edge Swipe" - SWIPE_EDGE_RIGHT -> "Right Edge Swipe" - SWIPE_EDGE_TOP -> "Top Edge Swipe" - SWIPE_EDGE_BOTTOM -> "Bottom Edge Swipe" - else -> "Invalid Edge Swipe" - } - setSupportActionBar(swipe_toolbar) - val headerColor = rndColor.darken(0.6f) - swipe_toolbar.setBackgroundColor(headerColor) - statusBarColor = headerColor - val bg = headerColor.darken(0.2f) - swipe_container.setBackgroundColor(bg) - navigationBarColor = bg - kauSwipeOnCreate { - edgeFlag = flag + binding = ActivitySwipeBinding.inflate(layoutInflater) + setContentView(binding.root) + + binding.apply { + mapOf( + swipeFromLeft to SWIPE_EDGE_LEFT, + swipeFromRight to SWIPE_EDGE_RIGHT, + swipeFromTop to SWIPE_EDGE_TOP, + swipeFromBottom to SWIPE_EDGE_BOTTOM + ).forEach { (button, edge) -> + button.setOnClickListener { startActivityWithEdge(edge) } + } + val flag = intent.getIntExtra(SWIPE_EDGE, -1) + swipeToolbar.title = when (flag) { + SWIPE_EDGE_LEFT -> "Left Edge Swipe" + SWIPE_EDGE_RIGHT -> "Right Edge Swipe" + SWIPE_EDGE_TOP -> "Top Edge Swipe" + SWIPE_EDGE_BOTTOM -> "Bottom Edge Swipe" + else -> "Invalid Edge Swipe" + } + setSupportActionBar(swipeToolbar) + val headerColor = rndColor.darken(0.6f) + swipeToolbar.setBackgroundColor(headerColor) + statusBarColor = headerColor + val bg = headerColor.darken(0.2f) + swipeContainer.setBackgroundColor(bg) + navigationBarColor = bg + kauSwipeOnCreate { + edgeFlag = flag + } } } diff --git a/sample/src/main/res/values/strings_sample.xml b/sample/src/main/res/values/strings_sample.xml index 46a8140..cd2b3d1 100644 --- a/sample/src/main/res/values/strings_sample.xml +++ b/sample/src/main/res/values/strings_sample.xml @@ -1,4 +1,4 @@ - + This is a header This is a description Checkbox 1 -- cgit v1.2.3 From 8a0c3769b8960282befbaea7d61a0cb4249f9a98 Mon Sep 17 00:00:00 2001 From: Allan Wang Date: Wed, 13 Nov 2019 13:29:45 -0800 Subject: Update android plugin --- buildSrc/src/main/kotlin/kau/Versions.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/kotlin/kau/Versions.kt b/buildSrc/src/main/kotlin/kau/Versions.kt index 7552139..df0aa3a 100644 --- a/buildSrc/src/main/kotlin/kau/Versions.kt +++ b/buildSrc/src/main/kotlin/kau/Versions.kt @@ -77,7 +77,7 @@ object Versions { const val bugsnagPlugin="4.7.0" // https://mvnrepository.com/artifact/com.android.tools.build/gradle?repo=google - const val gradlePlugin = "3.6.0-beta01" + const val gradlePlugin = "3.6.0-beta03" // https://github.com/dcendents/android-maven-gradle-plugin/releases const val mavenPlugin = "2.1" // https://github.com/Triple-T/gradle-play-publisher/releases -- cgit v1.2.3 From b8ca2b0c07a72149e531a55de0269fba8d5d28b6 Mon Sep 17 00:00:00 2001 From: Allan Wang Date: Wed, 13 Nov 2019 14:28:03 -0800 Subject: Add unbind functions --- core-ui/src/main/res-public/values/public.xml | 6 ++-- core/src/main/res-public/values/public.xml | 34 +++++++++++----------- .../fastadapter/viewbinding/BindingItem.kt | 22 ++++++++++---- 3 files changed, 36 insertions(+), 26 deletions(-) diff --git a/core-ui/src/main/res-public/values/public.xml b/core-ui/src/main/res-public/values/public.xml index c8c2e56..f62ed25 100644 --- a/core-ui/src/main/res-public/values/public.xml +++ b/core-ui/src/main/res-public/values/public.xml @@ -1,10 +1,10 @@ - - - + + + \ No newline at end of file diff --git a/core/src/main/res-public/values/public.xml b/core/src/main/res-public/values/public.xml index 9f8780e..a912019 100644 --- a/core/src/main/res-public/values/public.xml +++ b/core/src/main/res-public/values/public.xml @@ -1,20 +1,25 @@ - - + - - - - + - - - + + + + + + + + + + + + @@ -99,6 +104,7 @@ + @@ -106,12 +112,6 @@ - - - - - - - - + + \ No newline at end of file diff --git a/fastadapter-viewbinding/src/main/kotlin/ca/allanwang/fastadapter/viewbinding/BindingItem.kt b/fastadapter-viewbinding/src/main/kotlin/ca/allanwang/fastadapter/viewbinding/BindingItem.kt index a475615..543a9ef 100644 --- a/fastadapter-viewbinding/src/main/kotlin/ca/allanwang/fastadapter/viewbinding/BindingItem.kt +++ b/fastadapter-viewbinding/src/main/kotlin/ca/allanwang/fastadapter/viewbinding/BindingItem.kt @@ -19,6 +19,8 @@ import android.content.Context import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import androidx.viewbinding.ViewBinding import ca.allanwang.kau.fastadapter.viewbinding.R @@ -40,8 +42,8 @@ interface BindingLayout { } abstract class BindingItem(open val data: Any?) : - AbstractItem(), - BindingLayout { + AbstractItem(), + BindingLayout { override val type: Int get() = layoutRes @@ -62,6 +64,14 @@ abstract class BindingItem(open val data: Any?) : abstract fun Binding.bindView(holder: ViewHolder, payloads: MutableList) + protected fun unbind(vararg textViews: TextView) { + textViews.forEach { it.text = null } + } + + protected fun unbind(vararg imageViews: ImageView) { + imageViews.forEach { it.setImageDrawable(null) } + } + final override fun unbindView(holder: ViewHolder) { super.unbindView(holder) val binding = holder.getBinding() @@ -71,7 +81,7 @@ abstract class BindingItem(open val data: Any?) : open fun Binding.unbindView(holder: ViewHolder) {} final override fun getViewHolder(v: View): ViewHolder = - ViewHolder(v, layoutRes) + ViewHolder(v, layoutRes) override fun failedToRecycle(holder: ViewHolder): Boolean { KL.e { "Failed to recycle" } @@ -87,7 +97,7 @@ abstract class BindingItem(open val data: Any?) : override fun hashCode(): Int = data.hashCode() class ViewHolder(itemView: View, internal val layoutRes: Int) : - RecyclerView.ViewHolder(itemView) { + RecyclerView.ViewHolder(itemView) { /** * Retrieves a binding. @@ -109,7 +119,7 @@ abstract class BindingItem(open val data: Any?) : } abstract class BindingClickEventHook>(val identifier: BindingLayout) : - ClickEventHook() { + ClickEventHook() { private fun RecyclerView.ViewHolder.binding(): Binding? { val holder = this as? BindingItem.ViewHolder ?: return null @@ -136,7 +146,7 @@ abstract class BindingClickEventHook? = - super.onBindMany(viewHolder) + super.onBindMany(viewHolder) final override fun onClick(v: View, position: Int, fastAdapter: FastAdapter, item: Item) { BindingItem.getBinding(v).onClick(v, position, fastAdapter, item) -- cgit v1.2.3 From cbdb7b55c894da4655644c4d3db2def2b89cd989 Mon Sep 17 00:00:00 2001 From: Allan Wang Date: Mon, 25 Nov 2019 11:04:47 -0800 Subject: Update to as 3.6 beta 4 --- buildSrc/src/main/kotlin/kau/Versions.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/kotlin/kau/Versions.kt b/buildSrc/src/main/kotlin/kau/Versions.kt index df0aa3a..ae8a812 100644 --- a/buildSrc/src/main/kotlin/kau/Versions.kt +++ b/buildSrc/src/main/kotlin/kau/Versions.kt @@ -77,7 +77,7 @@ object Versions { const val bugsnagPlugin="4.7.0" // https://mvnrepository.com/artifact/com.android.tools.build/gradle?repo=google - const val gradlePlugin = "3.6.0-beta03" + const val gradlePlugin = "3.6.0-beta04" // https://github.com/dcendents/android-maven-gradle-plugin/releases const val mavenPlugin = "2.1" // https://github.com/Triple-T/gradle-play-publisher/releases -- cgit v1.2.3