diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 0000000..1d00f26 --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,43 @@ +version: 2 +jobs: + build: + working_directory: ~/code + docker: + - image: circleci/android:api-28-alpha + environment: + JVM_OPTS: -Xmx3200m + steps: + - checkout + - restore_cache: + key: jars-{{ checksum "build.gradle" }}-{{ checksum "app/build.gradle" }} + # - run: + # name: Chmod permissions #if permission for Gradlew Dependencies fail, use this. + # command: sudo chmod +x ./gradlew + - run: + name: Download Dependencies + command: ./gradlew androidDependencies + - save_cache: + paths: + - ~/.gradle + key: jars-{{ checksum "build.gradle" }}-{{ checksum "app/build.gradle" }} + - run: + name: Run Tests + command: ./gradlew test + - store_artifacts: # for display in Artifacts: https://circleci.com/docs/2.0/artifacts/ + path: app/build/reports + destination: reports + - store_test_results: # for display in Test Summary: https://circleci.com/docs/2.0/collect-test-data/ + path: app/build/test-results + - deploy: + command: | + if [ "${CIRCLE_BRANCH}" == "master" ]; then + echo "$MAVEN_CENTRAL_SEC_RING" | base64 -d > $HOME/secring.gpg + gpg --import --batch $HOME/secring.gpg + ./gradlew publish -Psonatype.username="$SONATYPE_USERNAME" -Psonatype.password="$SONATYPE_PASSWORD" -Psigning.keyId=34BCD878 -Psigning.password="$MAVEN_CENTRAL_KEY_PASSPHRASE" -Psigning.secretKeyRingFile=$HOME/secring.gpg -Porg.gradle.parallel=false + fi +workflows: + version: 2 + build: + jobs: + - build: + context: opensource-maven diff --git a/CHANGELOG.md b/CHANGELOG.md index 2da1049..66bad8d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -### Unreleased +### 3.0.0 - Removed `LayoutManagers`. RecyclerView has support setting the LayoutManager in xml using it's class name that doesn't rely on databinding. - Added `AsyncDiffObservableList` which is based on `AsyncListDiffer`. You should prefer this over diff --git a/README.md b/README.md index 42da633..a421ef6 100644 --- a/README.md +++ b/README.md @@ -5,25 +5,26 @@ Easy way to bind collections to listviews and recyclerviews with the new [Androi ## Download +If you are using androidx use version `3.0.0`, this also uses databinding v2 + ```groovy -compile 'me.tatarka.bindingcollectionadapter2:bindingcollectionadapter:2.2.0' -compile 'me.tatarka.bindingcollectionadapter2:bindingcollectionadapter-recyclerview:2.2.0' +compile 'me.tatarka.bindingcollectionadapter2:bindingcollectionadapter:3.0.0' +compile 'me.tatarka.bindingcollectionadapter2:bindingcollectionadapter-recyclerview:3.0.0' ``` -requires at least android gradle plugin `2.3.0`. -If you want to try out [databinding v2](https://developer.android.com/topic/libraries/data-binding/start#preview-compiler) -you can use version `2.3.0-beta3` +otherwise, you can try out [databinding v2](https://developer.android.com/topic/libraries/data-binding/start#preview-compiler) +with version `2.3.0-beta3` ```groovy compile 'me.tatarka.bindingcollectionadapter2:bindingcollectionadapter:2.3.0-beta3' compile 'me.tatarka.bindingcollectionadapter2:bindingcollectionadapter-recyclerview:2.3.0-beta3' ``` -If you are using androidx use version `3.0.0-beta3`, this also uses databinding v2 +or use the previous stable version ```groovy -compile 'me.tatarka.bindingcollectionadapter2:bindingcollectionadapter:3.0.0-beta3' -compile 'me.tatarka.bindingcollectionadapter2:bindingcollectionadapter-recyclerview:3.0.0-beta3' +compile 'me.tatarka.bindingcollectionadapter2:bindingcollectionadapter:2.2.0' +compile 'me.tatarka.bindingcollectionadapter2:bindingcollectionadapter-recyclerview:2.2.0' ``` ## Usage diff --git a/bindingcollectionadapter-ktx/build.gradle b/bindingcollectionadapter-ktx/build.gradle index 506a7d9..1bb52f9 100644 --- a/bindingcollectionadapter-ktx/build.gradle +++ b/bindingcollectionadapter-ktx/build.gradle @@ -1,7 +1,4 @@ apply plugin: 'com.android.library' -apply plugin: 'com.github.dcendents.android-maven' -apply plugin: 'com.jfrog.bintray' -apply plugin: 'signing' apply plugin: 'kotlin-android' android { diff --git a/bindingcollectionadapter-paging/build.gradle b/bindingcollectionadapter-paging/build.gradle index b27fa06..49c80dd 100644 --- a/bindingcollectionadapter-paging/build.gradle +++ b/bindingcollectionadapter-paging/build.gradle @@ -1,6 +1,4 @@ apply plugin: 'com.android.library' -apply plugin: 'com.github.dcendents.android-maven' -apply plugin: 'com.jfrog.bintray' apply plugin: 'signing' android { @@ -34,17 +32,17 @@ android { dependencies { implementation project(':bindingcollectionadapter-recyclerview') - implementation 'androidx.paging:paging-runtime:2.0.0-rc01' + implementation 'androidx.paging:paging-runtime:2.0.0' testImplementation 'junit:junit:4.12' testImplementation 'org.assertj:assertj-core:3.6.2' testImplementation 'org.mockito:mockito-core:2.19.0' - androidTestImplementation 'androidx.test:runner:1.1.0-alpha4' - androidTestImplementation 'androidx.test:rules:1.1.0-alpha4' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0-alpha4' + androidTestImplementation 'androidx.test:runner:1.1.0' + androidTestImplementation 'androidx.test:rules:1.1.0' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0' androidTestImplementation 'com.squareup.assertj:assertj-android:1.1.0' - androidTestImplementation 'androidx.core:core:1.0.0-rc02' + androidTestImplementation 'androidx.core:core:1.0.0' } apply from: '../publish.gradle' diff --git a/bindingcollectionadapter-paging/src/test/java/me/tatarka/bindingcollectionadapter2/DiffObservableListTest.java b/bindingcollectionadapter-paging/src/test/java/me/tatarka/bindingcollectionadapter2/DiffObservableListTest.java index 1de2399..55c3fb9 100644 --- a/bindingcollectionadapter-paging/src/test/java/me/tatarka/bindingcollectionadapter2/DiffObservableListTest.java +++ b/bindingcollectionadapter-paging/src/test/java/me/tatarka/bindingcollectionadapter2/DiffObservableListTest.java @@ -8,6 +8,8 @@ import java.util.Arrays; +import me.tatarka.bindingcollectionadapter2.collections.DiffObservableList; + import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; @@ -40,7 +42,7 @@ public void removeOneItem() { assertThat(list).isEmpty(); verify(callback).onItemRangeRemoved(list, 0, 1); } - + @Test public void moveOneItem() { DiffObservableList list = new DiffObservableList<>(Item.DIFF_CALLBACK); @@ -54,7 +56,7 @@ public void moveOneItem() { .containsExactly(new Item("2", "b"), new Item("1", "a")); verify(callback).onItemRangeMoved(list, 1, 0, 1); } - + @Test public void changeItem() { DiffObservableList list = new DiffObservableList<>(Item.DIFF_CALLBACK); @@ -68,7 +70,7 @@ public void changeItem() { .containsExactly(new Item("1", "b")); verify(callback).onItemRangeChanged(list, 0, 1); } - + static class Item { diff --git a/bindingcollectionadapter-recyclerview/build.gradle b/bindingcollectionadapter-recyclerview/build.gradle index 02719d5..c80b6d9 100644 --- a/bindingcollectionadapter-recyclerview/build.gradle +++ b/bindingcollectionadapter-recyclerview/build.gradle @@ -1,7 +1,4 @@ apply plugin: 'com.android.library' -apply plugin: 'com.github.dcendents.android-maven' -apply plugin: 'com.jfrog.bintray' -apply plugin: 'signing' android { compileSdkVersion 28 @@ -34,17 +31,17 @@ android { dependencies { api project(':bindingcollectionadapter') - api 'androidx.recyclerview:recyclerview:1.0.0-rc02' + api 'androidx.recyclerview:recyclerview:1.0.0' testImplementation 'junit:junit:4.12' testImplementation 'org.assertj:assertj-core:3.6.2' testImplementation 'org.mockito:mockito-core:2.19.0' - androidTestImplementation 'androidx.test:runner:1.1.0-alpha4' - androidTestImplementation 'androidx.test:rules:1.1.0-alpha4' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0-alpha4' + androidTestImplementation 'androidx.test:runner:1.1.0' + androidTestImplementation 'androidx.test:rules:1.1.0' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0' androidTestImplementation 'com.squareup.assertj:assertj-android:1.1.0' - androidTestImplementation 'androidx.core:core:1.0.0-rc02' + androidTestImplementation 'androidx.core:core:1.0.0' } apply from: '../publish.gradle' diff --git a/bindingcollectionadapter-recyclerview/src/main/java/me/tatarka/bindingcollectionadapter2/BindingRecyclerViewAdapter.java b/bindingcollectionadapter-recyclerview/src/main/java/me/tatarka/bindingcollectionadapter2/BindingRecyclerViewAdapter.java index b49e61c..a813b6c 100644 --- a/bindingcollectionadapter-recyclerview/src/main/java/me/tatarka/bindingcollectionadapter2/BindingRecyclerViewAdapter.java +++ b/bindingcollectionadapter-recyclerview/src/main/java/me/tatarka/bindingcollectionadapter2/BindingRecyclerViewAdapter.java @@ -108,7 +108,9 @@ public ViewDataBinding onCreateBinding(@NonNull LayoutInflater inflater, @Layout @Override public void onBindBinding(@NonNull ViewDataBinding binding, int variableId, @LayoutRes int layoutRes, int position, T item) { - if (itemBinding.bind(binding, item)) { + boolean bound = itemBinding.bind(binding, item); + binding.setLifecycleOwner(lifecycleOwner); + if (bound) { binding.executePendingBindings(); } } @@ -195,8 +197,6 @@ public void onBindViewHolder(@NonNull ViewHolder holder, int position, @NonNull if (isForDataBinding(payloads)) { binding.executePendingBindings(); } else { - binding.setLifecycleOwner(lifecycleOwner); - T item = items.get(position); onBindBinding(binding, itemBinding.variableId(), itemBinding.layoutRes(), position, item); } diff --git a/bindingcollectionadapter/build.gradle b/bindingcollectionadapter/build.gradle index 7ccd924..38efba6 100644 --- a/bindingcollectionadapter/build.gradle +++ b/bindingcollectionadapter/build.gradle @@ -1,7 +1,4 @@ apply plugin: 'com.android.library' -apply plugin: 'com.github.dcendents.android-maven' -apply plugin: 'com.jfrog.bintray' -apply plugin: 'signing' android { compileSdkVersion 28 @@ -33,16 +30,16 @@ android { } dependencies { - implementation 'androidx.core:core:1.0.0-rc02' - implementation 'androidx.legacy:legacy-support-core-ui:1.0.0-rc02' + implementation 'androidx.core:core:1.0.0' + implementation 'androidx.legacy:legacy-support-core-ui:1.0.0' testImplementation 'junit:junit:4.12' testImplementation 'org.assertj:assertj-core:3.6.2' testImplementation 'org.mockito:mockito-core:2.19.0' - androidTestImplementation 'androidx.test:runner:1.1.0-alpha4' - androidTestImplementation 'androidx.test:rules:1.1.0-alpha4' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0-alpha4' + androidTestImplementation 'androidx.test:runner:1.1.0' + androidTestImplementation 'androidx.test:rules:1.1.0' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0' androidTestImplementation 'com.squareup.assertj:assertj-android:1.1.0' } diff --git a/bindingcollectionadapter/src/main/java/me/tatarka/bindingcollectionadapter2/BindingListViewAdapter.java b/bindingcollectionadapter/src/main/java/me/tatarka/bindingcollectionadapter2/BindingListViewAdapter.java index af590da..3dbeda8 100644 --- a/bindingcollectionadapter/src/main/java/me/tatarka/bindingcollectionadapter2/BindingListViewAdapter.java +++ b/bindingcollectionadapter/src/main/java/me/tatarka/bindingcollectionadapter2/BindingListViewAdapter.java @@ -106,7 +106,9 @@ public ViewDataBinding onCreateBinding(@NonNull LayoutInflater inflater, @Layout @Override public void onBindBinding(@NonNull ViewDataBinding binding, int variableId, @LayoutRes int layoutRes, int position, T item) { - if (itemBinding.bind(binding, item)) { + boolean bound = itemBinding.bind(binding, item); + binding.setLifecycleOwner(lifecycleOwner); + if (bound) { binding.executePendingBindings(); } } @@ -166,7 +168,6 @@ public final View getView(int position, @Nullable View convertView, @NonNull Vie } View view = binding.getRoot(); - binding.setLifecycleOwner(lifecycleOwner); T item = items.get(position); onBindBinding(binding, itemBinding.variableId(), layoutRes, position, item); @@ -194,7 +195,6 @@ public final View getDropDownView(int position, @Nullable View convertView, @Non } View view = binding.getRoot(); - binding.setLifecycleOwner(lifecycleOwner); T item = items.get(position); onBindBinding(binding, itemBinding.variableId(), layoutRes, position, item); diff --git a/bindingcollectionadapter/src/main/java/me/tatarka/bindingcollectionadapter2/BindingViewPagerAdapter.java b/bindingcollectionadapter/src/main/java/me/tatarka/bindingcollectionadapter2/BindingViewPagerAdapter.java index baa280b..d89f5be 100644 --- a/bindingcollectionadapter/src/main/java/me/tatarka/bindingcollectionadapter2/BindingViewPagerAdapter.java +++ b/bindingcollectionadapter/src/main/java/me/tatarka/bindingcollectionadapter2/BindingViewPagerAdapter.java @@ -93,7 +93,9 @@ public ViewDataBinding onCreateBinding(@NonNull LayoutInflater inflater, @Layout @Override public void onBindBinding(@NonNull ViewDataBinding binding, int variableId, @LayoutRes int layoutRes, int position, T item) { - if (itemBinding.bind(binding, item)) { + boolean bound = itemBinding.bind(binding, item); + binding.setLifecycleOwner(lifecycleOwner); + if (bound) { binding.executePendingBindings(); binding.setLifecycleOwner(lifecycleOwner); } diff --git a/build.gradle b/build.gradle index de55d72..61da62c 100644 --- a/build.gradle +++ b/build.gradle @@ -1,16 +1,15 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.2.61' - ext.agp_version = '3.2.0-rc02' + ext.kotlin_version = '1.3.0' + ext.agp_version = '3.3.0' repositories { google() jcenter() } dependencies { classpath "com.android.tools.build:gradle:$agp_version" - classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1' - classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3' + classpath 'digital.wup:android-maven-publish:3.6.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } diff --git a/gradle.properties b/gradle.properties index 22176d4..7587b4b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,7 +18,7 @@ # org.gradle.parallel=true group=me.tatarka.bindingcollectionadapter2 -version=3.0.0-SNAPSHOT +version=3.0.0 android.databinding.enableV2=true android.useAndroidX=true android.enableJetifier=true diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index bd0df24..e8fcf6a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip diff --git a/publish.gradle b/publish.gradle index a150a49..db59676 100644 --- a/publish.gradle +++ b/publish.gradle @@ -1,97 +1,68 @@ -task androidJavadocs(type: Javadoc) { - source = android.sourceSets.main.java.srcDirs -} +apply plugin: 'signing' +apply plugin: 'digital.wup.android-maven-publish' -task androidJavadocsJar(type: Jar) { - classifier = 'javadoc' - from androidJavadocs.destinationDir -} -task androidSourcesJar(type: Jar) { +task sourcesJar(type: Jar) { classifier = 'sources' - from android.sourceSets.main.java.srcDirs + from(android.sourceSets.main.java.srcDirs) } -artifacts { - archives androidSourcesJar - archives androidJavadocsJar +task androidJavadocs(type: Javadoc) { + source = android.sourceSets.main.java.srcDirs + failOnError = false } -if (project.hasProperty('sonatype.username') || project.hasProperty('bintray.username')) { - - signing { - sign configurations.archives - } - - def siteUrl = 'https://github.com/evant/binding-collection-adapter' - def gitUrl = 'https://github.com/evantlemaddaluno/binding-collection-adapter.git' - - uploadArchives { - repositories { - mavenDeployer { - beforeDeployment { deployment -> signing.signPom(deployment) } - - def repoUrl - if (project.version.endsWith("SNAPSHOT")) { - repoUrl = "https://oss.sonatype.org/content/repositories/snapshots" - } else { - repoUrl = "https://oss.sonatype.org/service/local/staging/deploy/maven2/" - } - - repository(url: repoUrl) { - authentication( - userName: project.getProperty('sonatype.username'), - password: project.getProperty('sonatype.password')) - } +task javadocsJar(type: Jar) { + classifier = 'javadoc' + from(androidJavadocs) +} - pom.project { - name project.name - packaging 'aar' - description 'Easy way to bind collections to listviews and recyclerviews with the new Android Data Binding framework' - url siteUrl +def siteUrl = 'https://github.com/evant/binding-collection-adapter' +def gitUrl = 'https://github.com/evantlemaddaluno/binding-collection-adapter.git' - scm { - url siteUrl - connection gitUrl - developerConnection gitUrl - } +publishing { + publications { + lib(MavenPublication) { + from components.android + artifact sourcesJar + artifact javadocsJar - licenses { - license { - name 'The Apache Software License, Version 2.0' - url 'http://www.apache.org/licenses/LICENSE-2.0.txt' - distribution 'repo' - } + pom { + name = project.name + description = 'Easy way to bind collections to listviews and recyclerviews with the new Android Data Binding framework' + url = siteUrl + licenses { + license { + name = 'The Apache License, Version 2.0' + url = 'http://www.apache.org/licenses/LICENSE-2.0.txt' } - - developers { - developer { - id 'evant' - name 'Evan Tatarka' - } + } + developers { + developer { + id = 'evant' + name = 'Evan Tatarka' } } + scm { + connection = gitUrl + developerConnection = gitUrl + url = siteUrl + } } } } - - if (project.hasProperty('bintray.username')) { - bintray { - user = project.property('bintray.username') - key = project.property('bintray.apikey') - configurations = ['archives'] - pkg { - repo = 'maven' - name = 'binding-collection-adapter' - websiteUrl = siteUrl - vcsUrl = gitUrl - licenses = ["Apache-2.0"] - version { - gpg { - sign = true - passphrase = project.getProperty('signing.password') - } - } + repositories { + maven { + def releasesRepoUrl = 'https://oss.sonatype.org/service/local/staging/deploy/maven2/' + def snapshotsRepoUrl = 'https://oss.sonatype.org/content/repositories/snapshots' + url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl + credentials { + username project.findProperty('sonatype.username') + password project.findProperty('sonatype.password') } } } } + +signing { + sign publishing.publications.lib +}