Skip to content

Commit

Permalink
Merge pull request #115 from AlanCheen/feature/dsl-databinding
Browse files Browse the repository at this point in the history
Feature/dsl databinding
  • Loading branch information
AlanCheen authored Sep 21, 2022
2 parents a2a771c + ffb6f1e commit 6be6b1b
Show file tree
Hide file tree
Showing 11 changed files with 200 additions and 1 deletion.
1 change: 1 addition & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ dependencies {

implementation project(':flap')
implementation project(':flap-dsl-viewbinding')
implementation project(':flap-dsl-databinding')
implementation project(':flap-annotations')
// implementation project(':flap-gradle-plugin')
kapt project(':flap-compiler')
Expand Down
13 changes: 12 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.databinding.adapterDelegateDataBinding
import me.yifeiyuan.flap.dsl.viewbinding.adapterDelegateViewBinding
import me.yifeiyuan.flap.ext.*
import me.yifeiyuan.flapdev.R
import me.yifeiyuan.flapdev.components.SimpleDataBindingModel
import me.yifeiyuan.flapdev.components.SimpleImageModel
import me.yifeiyuan.flapdev.components.SimpleTextModel
import me.yifeiyuan.flapdev.components.TestAllModel
import me.yifeiyuan.flapdev.databinding.FlapItemSimpleDatabindingBinding
import me.yifeiyuan.flapdev.mockMultiTypeModels
import me.yifeiyuan.ktx.foundation.othermodule.databinding.FlapItemVbBinding
import me.yifeiyuan.ktx.foundation.othermodule.vb.ViewBindingModel
Expand Down Expand Up @@ -180,7 +183,15 @@ class DSLTestcase : BaseTestcaseFragment() {
}
}

adapter.registerAdapterDelegates(simpleTextDelegate, simpleImageDelegate, testAllDelegate, viewBindingDelegate)
val dataBindingDelegate = adapterDelegateDataBinding<SimpleDataBindingModel, FlapItemSimpleDatabindingBinding>(R.layout.flap_item_simple_databinding) {

onBind { model ->
binding.model = model
binding.executePendingBindings()
}
}

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

adapter.registerAdapterHook(hook)
}
Expand Down
1 change: 1 addition & 0 deletions flap-dsl-databinding/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/build
53 changes: 53 additions & 0 deletions flap-dsl-databinding/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 {
dataBinding 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-databinding/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.databinding

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.databinding.test", appContext.packageName)
}
}
5 changes: 5 additions & 0 deletions flap-dsl-databinding/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.databinding">

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

import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.annotation.LayoutRes
import androidx.databinding.DataBindingUtil
import androidx.databinding.ViewDataBinding
import androidx.recyclerview.widget.RecyclerView
import me.yifeiyuan.flap.delegate.AdapterDelegate
import me.yifeiyuan.flap.dsl.DslComponent

/**
* 支持 AdapterDelegate DataBinding DSL 功能
* Created by 程序亦非猿 on 2022/9/20.
* @since 3.1.4
*/
inline fun <reified T, reified D : ViewDataBinding> adapterDelegateDataBinding(
@LayoutRes layoutId: Int,
noinline dataBinding: ((layoutInflater: LayoutInflater, parent: ViewGroup) -> D) = { l, p -> DataBindingUtil.inflate(l, layoutId, p, false) },
noinline isDelegateFor: ((model: Any) -> Boolean) = { m -> m.javaClass == T::class.java },
itemId: Long = RecyclerView.NO_ID,
noinline componentInitializer: DataBindingDslComponent<T, D>.() -> Unit): DataBindingDslAdapterDelegate<T, D> {
return DataBindingDslAdapterDelegate(T::class.java, dataBinding, layoutId, itemId, isDelegateFor, componentInitializer)
}

/**
* 支持 AdapterDelegate DataBinding DSL 功能
* Created by 程序亦非猿 on 2022/9/20.
* @since 3.1.4
*/
class DataBindingDslAdapterDelegate<T, D : ViewDataBinding>(
private var modelClass: Class<T>,
private var dataBinding: ((layoutInflater: LayoutInflater, parent: ViewGroup) -> D) = { l, p -> DataBindingUtil.inflate(l, layoutId, p, false) },
@LayoutRes private var layoutId: Int,
private var itemId: Long = RecyclerView.NO_ID,
private var isDelegateFor: ((model: Any) -> Boolean) = { m -> m.javaClass == modelClass },
private var block: DataBindingDslComponent<T, D>.() -> Unit,
) : AdapterDelegate<T, DataBindingDslComponent<T, D>> {

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

override fun onCreateViewHolder(inflater: LayoutInflater, parent: ViewGroup, viewType: Int): DataBindingDslComponent<T, D> {
val viewDataBinding = dataBinding.invoke(inflater, parent)
val component = DataBindingDslComponent<T, D>(viewDataBinding)
block.invoke(component)
return component
}

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

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

/**
* 支持 AdapterDelegate DataBinding DSL 功能
* Created by 程序亦非猿 on 2022/9/20.
* @since 3.1.4
*/
class DataBindingDslComponent<T, V : ViewDataBinding>(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.databinding

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: 1 addition & 0 deletions settings.gradle
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
include ':flap-dsl-databinding'
include ':flap-dsl-viewbinding'
include ':ktmodule'
include ':othermodule'
Expand Down

0 comments on commit 6be6b1b

Please sign in to comment.