Skip to content

Commit

Permalink
Merge pull request #114 from AlanCheen/feature/dsl-viewbinding
Browse files Browse the repository at this point in the history
🎨增加 ViewBinding DSL 功能支持
  • Loading branch information
AlanCheen authored Sep 20, 2022
2 parents aaa2fa0 + d0aa86d commit 022b9ca
Show file tree
Hide file tree
Showing 13 changed files with 214 additions and 3 deletions.
1 change: 1 addition & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ dependencies {
implementation project(':ktmodule')

implementation project(':flap')
implementation project(':flap-dsl-viewbinding')
implementation project(':flap-annotations')
// implementation project(':flap-gradle-plugin')
kapt project(':flap-compiler')
Expand Down
28 changes: 27 additions & 1 deletion app/src/main/java/me/yifeiyuan/flapdev/testcases/DSLTestcase.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,15 @@ import android.widget.ImageView
import me.yifeiyuan.flap.FlapAdapter
import me.yifeiyuan.flap.dsl.adapterDelegate
import me.yifeiyuan.flap.dsl.adapterHook
import me.yifeiyuan.flap.dsl.viewbinding.adapterDelegateViewBinding
import me.yifeiyuan.flap.ext.*
import me.yifeiyuan.flapdev.R
import me.yifeiyuan.flapdev.components.SimpleImageModel
import me.yifeiyuan.flapdev.components.SimpleTextModel
import me.yifeiyuan.flapdev.components.TestAllModel
import me.yifeiyuan.flapdev.mockMultiTypeModels
import me.yifeiyuan.ktx.foundation.othermodule.databinding.FlapItemVbBinding
import me.yifeiyuan.ktx.foundation.othermodule.vb.ViewBindingModel

private const val TAG = "DSLTestcase"

Expand Down Expand Up @@ -156,7 +159,30 @@ class DSLTestcase : BaseTestcaseFragment() {
// model: TestBinderModel, position: Int, payloads: List<Any>, adapter: FlapAdapter ->
// }

adapter.registerAdapterDelegates(simpleTextDelegate, simpleImageDelegate, testAllDelegate)
val viewBindingDelegate = adapterDelegateViewBinding<ViewBindingModel, FlapItemVbBinding>(
{ layoutInflater, parent ->
FlapItemVbBinding.inflate(layoutInflater, parent, false)
}
) {

onBind { model ->
binding.tvContent.text = "这是个用 adapterDelegateViewBinding DSL 处理的组件"
}

onClick { model, position, adapter ->
toast("viewBindingDelegate onClick() called with: component = $this, model = $model, position = $position")
}

onResume {
Log.d(TAG, "viewBindingDelegate onResume() called")
}

onPause {
Log.d(TAG, "viewBindingDelegate onPause() called")
}
}

adapter.registerAdapterDelegates(simpleTextDelegate, simpleImageDelegate, testAllDelegate, viewBindingDelegate)

adapter.registerAdapterHook(hook)
}
Expand Down
1 change: 1 addition & 0 deletions flap-dsl-viewbinding/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/build
53 changes: 53 additions & 0 deletions flap-dsl-viewbinding/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
plugins {
id 'com.android.library'
id 'kotlin-android'
}

apply plugin: 'com.github.dcendents.android-maven'

group = 'me.yifeiyuan'

android {
compileSdkVersion 29

defaultConfig {
minSdkVersion 17
targetSdkVersion 29
versionCode 1
versionName "1.0"

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles "consumer-rules.pro"
}

buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
// compileOptions {
// sourceCompatibility JavaVersion.VERSION_1_8
// targetCompatibility JavaVersion.VERSION_1_8
// }
// kotlinOptions {
// jvmTarget = '1.8'
// }

buildFeatures {
viewBinding true
}
}

dependencies {

testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'

implementation 'androidx.recyclerview:recyclerview:1.2.1'
implementation "androidx.core:core-ktx:1.6.0"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"

implementation project(':flap')
}
Empty file.
21 changes: 21 additions & 0 deletions flap-dsl-viewbinding/proguard-rules.pro
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package me.yifeiyuan.flap.dsl.viewbinding

import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.ext.junit.runners.AndroidJUnit4

import org.junit.Test
import org.junit.runner.RunWith

import org.junit.Assert.*

/**
* Instrumented test, which will execute on an Android device.
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
@Test
fun useAppContext() {
// Context of the app under test.
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("me.yifeiyuan.flap.dsl.viewbinding.test", appContext.packageName)
}
}
5 changes: 5 additions & 0 deletions flap-dsl-viewbinding/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="me.yifeiyuan.flap.dsl.viewbinding">

</manifest>
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package me.yifeiyuan.flap.dsl.viewbinding

import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import androidx.viewbinding.ViewBinding
import me.yifeiyuan.flap.delegate.AdapterDelegate
import me.yifeiyuan.flap.dsl.DslComponent

/**
* 支持 AdapterDelegate ViewBinding DSL 功能
* Created by 程序亦非猿 on 2022/9/20.
* @since 3.1.3
*/
inline fun <reified T, reified V : ViewBinding> adapterDelegateViewBinding(
noinline viewBinding: (layoutInflater: LayoutInflater, parent: ViewGroup) -> V,
itemViewType: Int = 0,
noinline isDelegateFor: ((model: Any) -> Boolean) = { m -> m.javaClass == T::class.java },
itemId: Long = RecyclerView.NO_ID,
noinline componentInitializer: ViewBindingDslComponent<T, V>.() -> Unit): ViewBindingDslAdapterDelegate<T, V> {
return ViewBindingDslAdapterDelegate(T::class.java, viewBinding, itemViewType, itemId, isDelegateFor = isDelegateFor, block = componentInitializer)
}

/**
* 支持 AdapterDelegate ViewBinding DSL 功能
* Created by 程序亦非猿 on 2022/9/20.
* @since 3.1.3
*/
class ViewBindingDslAdapterDelegate<T, V : ViewBinding>(
private var modelClass: Class<T>,
private var viewBinding: (layoutInflater: LayoutInflater, parent: ViewGroup) -> V,
private var itemViewType: Int,
private var itemId: Long = RecyclerView.NO_ID,
private var isDelegateFor: ((model: Any) -> Boolean) = { m -> m.javaClass == modelClass },
private var block: ViewBindingDslComponent<T, V>.() -> Unit,
) : AdapterDelegate<T, ViewBindingDslComponent<T, V>> {

override fun delegate(model: Any): Boolean {
return isDelegateFor.invoke(model)
}

override fun onCreateViewHolder(inflater: LayoutInflater, parent: ViewGroup, viewType: Int): ViewBindingDslComponent<T, V> {
val binding = viewBinding(inflater, parent)
val component = ViewBindingDslComponent<T, V>(binding)
block.invoke(component)
return component
}

override fun getItemId(model: Any, position: Int): Long {
return itemId
}

override fun getItemViewType(model: Any): Int {
return itemViewType
}
}

/**
* 支持 AdapterDelegate ViewBinding DSL 功能
* Created by 程序亦非猿 on 2022/9/20.
* @since 3.1.3
*/
class ViewBindingDslComponent<T, V : ViewBinding>(val binding: V) : DslComponent<T>(binding.root)
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package me.yifeiyuan.flap.dsl.viewbinding

import org.junit.Test

import org.junit.Assert.*

/**
* Example local unit test, which will execute on the development machine (host).
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
class ExampleUnitTest {
@Test
fun addition_isCorrect() {
assertEquals(4, 2 + 2)
}
}
1 change: 0 additions & 1 deletion flap/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ android {
versionName "1.0"

testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'

}

buildTypes {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ class DslAdapterDelegate<T>(
*
* @since 3.0.9
*/
class DslComponent<T>(view: View) : Component<T>(view) {
open class DslComponent<T>(view: View) : Component<T>(view) {

/**
* 更多参数的 onBind
Expand Down
1 change: 1 addition & 0 deletions settings.gradle
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
include ':flap-dsl-viewbinding'
include ':ktmodule'
include ':othermodule'
include ':flap-gradle-plugin'
Expand Down

0 comments on commit 022b9ca

Please sign in to comment.