From 82acf8e8d99466857d588d231fae31c6db16135f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0brahim=20S=C3=BCren?= Date: Mon, 21 Feb 2022 12:34:13 +0300 Subject: [PATCH 1/5] Create module lottie-ext --- .gitignore | 3 ++ lottie-ext/.gitignore | 1 + lottie-ext/build.gradle | 37 +++++++++++++++++++++++++ lottie-ext/proguard-rules.pro | 21 ++++++++++++++ lottie-ext/src/main/AndroidManifest.xml | 5 ++++ settings.gradle | 2 +- 6 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 lottie-ext/.gitignore create mode 100644 lottie-ext/build.gradle create mode 100644 lottie-ext/proguard-rules.pro create mode 100644 lottie-ext/src/main/AndroidManifest.xml diff --git a/.gitignore b/.gitignore index 948ff57..59ea13e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +# Idea +/.idea + # Built application files *.apk *.ap_ diff --git a/lottie-ext/.gitignore b/lottie-ext/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/lottie-ext/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/lottie-ext/build.gradle b/lottie-ext/build.gradle new file mode 100644 index 0000000..2ca8256 --- /dev/null +++ b/lottie-ext/build.gradle @@ -0,0 +1,37 @@ +apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' +apply plugin: 'com.github.dcendents.android-maven' + +group='com.erkutaras.statelayout' + +android { + compileSdkVersion 28 + + defaultConfig { + minSdkVersion 14 + targetSdkVersion 28 + versionCode 26 + versionName "1.4.4" + } + + 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' + } +} + +dependencies { + implementation 'androidx.core:core-ktx:1.7.0' +} +repositories { + mavenCentral() +} diff --git a/lottie-ext/proguard-rules.pro b/lottie-ext/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/lottie-ext/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 \ No newline at end of file diff --git a/lottie-ext/src/main/AndroidManifest.xml b/lottie-ext/src/main/AndroidManifest.xml new file mode 100644 index 0000000..e8ba2e3 --- /dev/null +++ b/lottie-ext/src/main/AndroidManifest.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 52baf7e..c8378f5 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':sample', ':library' +include ':sample', ':library', ':lottie-ext' From 8535ca51058adff5e47b04775abeb57b6aedc4f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0brahim=20S=C3=BCren?= Date: Mon, 28 Feb 2022 15:52:23 +0300 Subject: [PATCH 2/5] Implement lottie --- build.gradle | 9 ++- gradle/wrapper/gradle-wrapper.properties | 2 +- library/build.gradle | 16 ++--- library/src/main/AndroidManifest.xml | 4 +- .../com/erkutaras/statelayout/StateLayout.kt | 4 ++ lottie-ext/build.gradle | 20 +++--- lottie-ext/src/main/AndroidManifest.xml | 4 +- .../statelayout/lottieext/Extension.kt | 10 +++ .../lottieext/databinding/Adapter.kt | 10 +++ sample/build.gradle | 26 +++++--- sample/src/main/AndroidManifest.xml | 37 +++++++---- sample/src/main/assets/like_heart.json | 1 + .../sample/InfoLottieSampleActivity.kt | 19 ++++++ .../layout/activity_info_lottie_sample.xml | 19 ++++++ .../res/layout/layout_state_info_lottie.xml | 63 +++++++++++++++++++ 15 files changed, 197 insertions(+), 47 deletions(-) create mode 100644 lottie-ext/src/main/java/com/erkutaras/statelayout/lottieext/Extension.kt create mode 100644 lottie-ext/src/main/java/com/erkutaras/statelayout/lottieext/databinding/Adapter.kt create mode 100644 sample/src/main/assets/like_heart.json create mode 100644 sample/src/main/java/com/erkutaras/statelayout/sample/InfoLottieSampleActivity.kt create mode 100644 sample/src/main/res/layout/activity_info_lottie_sample.xml create mode 100644 sample/src/main/res/layout/layout_state_info_lottie.xml diff --git a/build.gradle b/build.gradle index 9dc9efe..baae24a 100644 --- a/build.gradle +++ b/build.gradle @@ -1,15 +1,14 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.3.41' + ext.kotlin_version = '1.6.10' repositories { google() - jcenter() + mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:3.4.2' + classpath 'com.android.tools.build:gradle:3.4.3' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files @@ -19,7 +18,7 @@ buildscript { allprojects { repositories { google() - jcenter() + mavenCentral() } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a1e6491..493bae0 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-5.1.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.1-bin.zip diff --git a/library/build.gradle b/library/build.gradle index b88a3a2..1fdeb56 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -1,15 +1,14 @@ apply plugin: 'com.android.library' apply plugin: 'kotlin-android' -apply plugin: 'com.github.dcendents.android-maven' group='com.erkutaras.statelayout' android { - compileSdkVersion 28 + compileSdkVersion 31 defaultConfig { minSdkVersion 14 - targetSdkVersion 28 + targetSdkVersion 31 versionCode 26 versionName "1.4.4" @@ -23,13 +22,14 @@ android { } } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - implementation 'androidx.appcompat:appcompat:1.0.2' -} -repositories { - mavenCentral() + implementation 'androidx.core:core-ktx:1.7.0' + implementation 'androidx.appcompat:appcompat:1.4.1' } diff --git a/library/src/main/AndroidManifest.xml b/library/src/main/AndroidManifest.xml index df0879e..28a7a4f 100644 --- a/library/src/main/AndroidManifest.xml +++ b/library/src/main/AndroidManifest.xml @@ -1 +1,3 @@ - + + + diff --git a/library/src/main/java/com/erkutaras/statelayout/StateLayout.kt b/library/src/main/java/com/erkutaras/statelayout/StateLayout.kt index bff720e..c43ce5e 100644 --- a/library/src/main/java/com/erkutaras/statelayout/StateLayout.kt +++ b/library/src/main/java/com/erkutaras/statelayout/StateLayout.kt @@ -320,6 +320,10 @@ class StateLayout: FrameLayout { } } + fun getInfoLayout(): View? { + return infoLayout + } + companion object { @JvmStatic fun provideLoadingStateInfo() = StateInfo(state = LOADING) diff --git a/lottie-ext/build.gradle b/lottie-ext/build.gradle index 2ca8256..bf52ddd 100644 --- a/lottie-ext/build.gradle +++ b/lottie-ext/build.gradle @@ -1,15 +1,15 @@ apply plugin: 'com.android.library' apply plugin: 'kotlin-android' -apply plugin: 'com.github.dcendents.android-maven' +apply plugin: 'kotlin-kapt' group='com.erkutaras.statelayout' android { - compileSdkVersion 28 + compileSdkVersion 31 defaultConfig { - minSdkVersion 14 - targetSdkVersion 28 + minSdkVersion 16 + targetSdkVersion 31 versionCode 26 versionName "1.4.4" } @@ -20,18 +20,20 @@ android { proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } + compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } - kotlinOptions { - jvmTarget = '1.8' + + dataBinding { + enabled true } } dependencies { + implementation project(':library') implementation 'androidx.core:core-ktx:1.7.0' -} -repositories { - mavenCentral() + implementation 'androidx.appcompat:appcompat:1.4.1' + api 'com.airbnb.android:lottie:4.2.2' } diff --git a/lottie-ext/src/main/AndroidManifest.xml b/lottie-ext/src/main/AndroidManifest.xml index e8ba2e3..c34f7f4 100644 --- a/lottie-ext/src/main/AndroidManifest.xml +++ b/lottie-ext/src/main/AndroidManifest.xml @@ -1,5 +1,5 @@ - + + \ No newline at end of file diff --git a/lottie-ext/src/main/java/com/erkutaras/statelayout/lottieext/Extension.kt b/lottie-ext/src/main/java/com/erkutaras/statelayout/lottieext/Extension.kt new file mode 100644 index 0000000..aae4c2e --- /dev/null +++ b/lottie-ext/src/main/java/com/erkutaras/statelayout/lottieext/Extension.kt @@ -0,0 +1,10 @@ +package com.erkutaras.statelayout.lottieext + +import com.airbnb.lottie.LottieAnimationView +import com.erkutaras.statelayout.StateLayout + +fun StateLayout.setLottieAsset(assetName: String) { + getInfoLayout()?.findViewById(R.id.imageView_state_layout_info)?.run { + setAnimation(assetName) + } +} diff --git a/lottie-ext/src/main/java/com/erkutaras/statelayout/lottieext/databinding/Adapter.kt b/lottie-ext/src/main/java/com/erkutaras/statelayout/lottieext/databinding/Adapter.kt new file mode 100644 index 0000000..882d18d --- /dev/null +++ b/lottie-ext/src/main/java/com/erkutaras/statelayout/lottieext/databinding/Adapter.kt @@ -0,0 +1,10 @@ +package com.erkutaras.statelayout.lottieext.databinding + +import androidx.databinding.BindingAdapter +import com.erkutaras.statelayout.StateLayout +import com.erkutaras.statelayout.lottieext.setLottieAsset + +@BindingAdapter("sl_lottieAsset") +fun setLottieAsset(view: StateLayout, assetName: String) { + view.setLottieAsset(assetName) +} diff --git a/sample/build.gradle b/sample/build.gradle index 358b60e..daf3cc8 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -1,13 +1,14 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' +apply plugin: 'kotlin-kapt' android { - compileSdkVersion 28 + compileSdkVersion 31 defaultConfig { applicationId "com.erkutaras.statelayout.sample" - minSdkVersion 14 - targetSdkVersion 28 + minSdkVersion 16 + targetSdkVersion 31 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -19,15 +20,22 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + dataBinding { + enabled true + } } dependencies { implementation project(':library') - implementation fileTree(include: ['*.jar'], dir: 'libs') - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - implementation 'androidx.appcompat:appcompat:1.0.2' - implementation 'androidx.constraintlayout:constraintlayout:1.1.3' - implementation 'com.google.android.material:material:1.1.0-alpha06' - implementation 'androidx.vectordrawable:vectordrawable:1.1.0-rc01' + implementation project(':lottie-ext') + implementation 'androidx.core:core-ktx:1.7.0' + implementation 'androidx.appcompat:appcompat:1.4.1' + implementation 'androidx.constraintlayout:constraintlayout:2.1.3' + implementation 'com.google.android.material:material:1.6.0-alpha02' + implementation 'androidx.vectordrawable:vectordrawable:1.2.0-alpha02' implementation 'androidx.legacy:legacy-support-v4:1.0.0' } diff --git a/sample/src/main/AndroidManifest.xml b/sample/src/main/AndroidManifest.xml index 4f64810..77431fa 100644 --- a/sample/src/main/AndroidManifest.xml +++ b/sample/src/main/AndroidManifest.xml @@ -1,9 +1,10 @@ - + - + - + + + - + - + - - + + + + + + \ No newline at end of file diff --git a/sample/src/main/assets/like_heart.json b/sample/src/main/assets/like_heart.json new file mode 100644 index 0000000..c2ce222 --- /dev/null +++ b/sample/src/main/assets/like_heart.json @@ -0,0 +1 @@ +{"v":"4.6.6","fr":25,"ip":0,"op":50,"w":18,"h":18,"nm":"2.0 A-首页-inline播放","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"形状图层 1","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[9,9,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[3.0405405405405403,3.0405405405405403,100]}},"ao":0,"shapes":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0"],"t":2,"s":[0,0],"e":[29,29]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0"],"t":7,"s":[29,29],"e":[0,0]},{"t":16}]},"p":{"a":1,"k":[{"i":{"x":0.52,"y":1},"o":{"x":0.6,"y":0},"n":"0p52_1_0p6_0","t":1,"s":[0,0],"e":[0,189],"to":[0,31.5],"ti":[0,-40]},{"i":{"x":0.38,"y":1},"o":{"x":0.333,"y":0},"n":"0p38_1_0p333_0","t":6,"s":[0,189],"e":[0,240],"to":[0,40],"ti":[0,-8.5]},{"t":15}]},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"fl","c":{"a":0,"k":[0.2901960784313726,0.5647058823529412,0.8862745098039215,1]},"o":{"a":0,"k":100},"r":1,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"rp","c":{"a":0,"k":8,"ix":1},"o":{"a":0,"k":0,"ix":2},"m":1,"ix":3,"tr":{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":45,"ix":4},"so":{"a":0,"k":100,"ix":5},"eo":{"a":0,"k":100,"ix":6},"nm":"变换"},"nm":"中继器 1","mn":"ADBE Vector Filter - Repeater"}],"ip":0,"op":250,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":2,"ty":4,"nm":"Explosion Vol.1 08 / 1","cl":"1","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[9,9,0]},"a":{"a":0,"k":[-120.395,32.605,0]},"s":{"a":1,"k":[{"i":{"x":[0,0,0.667],"y":[1.002,1.002,0.667]},"o":{"x":[1,1,0.333],"y":[0,0,0.333]},"n":["0_1p002_1_0","0_1p002_1_0","0p667_0p667_0p333_0p333"],"t":2,"s":[0,0,100],"e":[2.9189189189189184,2.9189189189189184,100]},{"t":14}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[367.211,367.211]},"p":{"a":0,"k":[0,0]},"nm":"椭圆路径 1","mn":"ADBE Vector Shape - Ellipse"},{"ty":"st","c":{"a":0,"k":[0.2901960784313726,0.5647058823529412,0.8862745098039215,1]},"o":{"a":0,"k":100},"w":{"a":1,"k":[{"i":{"x":[0.297],"y":[1]},"o":{"x":[0.588],"y":[0]},"n":["0p297_1_0p588_0"],"t":2,"s":[240],"e":[0]},{"t":14}]},"lc":1,"lj":1,"ml":4,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tr","p":{"a":0,"k":[-120.395,32.605],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":30,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":3,"ty":4,"nm":"“喜欢”轮廓","ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0,"x":"var $bm_rt;\n$bm_rt = transform.rotation;"},"p":{"a":0,"k":[9,9,0],"x":"var $bm_rt;\n$bm_rt = transform.position;"},"a":{"a":0,"k":[25,22.5,0]},"s":{"a":1,"k":[{"i":{"x":[0.48,0.48,0.667],"y":[1,1,0.667]},"o":{"x":[0.333,0.333,0.167],"y":[0.115,0.115,0.167]},"n":["0p48_1_0p333_0p115","0p48_1_0p333_0p115","0p667_0p667_0p167_0p167"],"t":0,"s":[12.162162162162161,12.162162162162161,100],"e":[7.2972972972972965,7.2972972972972965,100]},{"i":{"x":[0.516,0.516,0.667],"y":[1,1,0.667]},"o":{"x":[0.264,0.264,0.333],"y":[0,0,0.333]},"n":["0p516_1_0p264_0","0p516_1_0p264_0","0p667_0p667_0p333_0p333"],"t":2,"s":[7.2972972972972965,7.2972972972972965,100],"e":[15.81081081081081,15.81081081081081,100]},{"i":{"x":[0.605,0.605,0.667],"y":[1.005,1.005,0.667]},"o":{"x":[0.373,0.373,0.333],"y":[0,0,0.333]},"n":["0p605_1p005_0p373_0","0p605_1p005_0p373_0","0p667_0p667_0p333_0p333"],"t":7,"s":[15.81081081081081,15.81081081081081,100],"e":[12.162162162162161,12.162162162162161,100]},{"i":{"x":[0.663,0.663,0.833],"y":[0.978,0.978,0.833]},"o":{"x":[0.32,0.32,0.167],"y":[0,0,0.167]},"n":["0p663_0p978_0p32_0","0p663_0p978_0p32_0","0p833_0p833_0p167_0p167"],"t":11,"s":[12.162162162162161,12.162162162162161,100],"e":[12.77027027027027,12.77027027027027,100]},{"i":{"x":[0.64,0.64,0.833],"y":[0.973,0.973,0.833]},"o":{"x":[0.29,0.29,0.167],"y":[0.002,0.002,0.167]},"n":["0p64_0p973_0p29_0p002","0p64_0p973_0p29_0p002","0p833_0p833_0p167_0p167"],"t":14,"s":[12.77027027027027,12.77027027027027,100],"e":[12.162162162162161,12.162162162162161,100]},{"t":19}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.401,0],[2.068,-3.674],[4.874,0],[0,-6.245],[-0.912,-0.537],[-0.234,0],[-0.209,0.124],[0,14.79]],"o":[[-4.875,0],[-2.067,-3.674],[-7.402,0],[0,14.79],[0.209,0.124],[0.234,0],[0.912,-0.537],[0,-6.245]],"v":[[11.176,-20.5],[0,-14.302],[-11.175,-20.5],[-23,-7.795],[-0.676,20.315],[0,20.5],[0.676,20.315],[23,-7.795]],"c":true}},"nm":"路径 1","mn":"ADBE Vector Shape - Group"},{"ty":"fl","c":{"a":0,"k":[0.2901960784313726,0.5647058823529412,0.8862745098039215,1]},"o":{"a":0,"k":100},"r":1,"nm":"填充 1","mn":"ADBE Vector Graphic - Fill"},{"ty":"st","c":{"a":0,"k":[0.2901960784313726,0.5647058823529412,0.8862745098039215,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3.6},"lc":2,"lj":2,"nm":"描边 1","mn":"ADBE Vector Graphic - Stroke"},{"ty":"tr","p":{"a":0,"k":[25,22.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"变换"}],"nm":"组 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group"}],"ip":0,"op":250,"st":0,"bm":0,"sr":1}]} \ No newline at end of file diff --git a/sample/src/main/java/com/erkutaras/statelayout/sample/InfoLottieSampleActivity.kt b/sample/src/main/java/com/erkutaras/statelayout/sample/InfoLottieSampleActivity.kt new file mode 100644 index 0000000..a0fac6b --- /dev/null +++ b/sample/src/main/java/com/erkutaras/statelayout/sample/InfoLottieSampleActivity.kt @@ -0,0 +1,19 @@ +package com.erkutaras.statelayout.sample + +import android.os.Bundle +import android.widget.Toast +import com.erkutaras.statelayout.StateLayout + +class InfoLottieSampleActivity : SampleBaseActivity(), StateLayout.OnStateLayoutListener { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.layout_state_info_lottie) + } + + override fun getMenuResId(): Int = R.menu.menu_sample + + override fun onStateLayoutInfoButtonClick() { + Toast.makeText(this, "Refreshing Page...", Toast.LENGTH_SHORT).show() + } +} diff --git a/sample/src/main/res/layout/activity_info_lottie_sample.xml b/sample/src/main/res/layout/activity_info_lottie_sample.xml new file mode 100644 index 0000000..8b46d96 --- /dev/null +++ b/sample/src/main/res/layout/activity_info_lottie_sample.xml @@ -0,0 +1,19 @@ + + + + + + + + \ No newline at end of file diff --git a/sample/src/main/res/layout/layout_state_info_lottie.xml b/sample/src/main/res/layout/layout_state_info_lottie.xml new file mode 100644 index 0000000..20615ab --- /dev/null +++ b/sample/src/main/res/layout/layout_state_info_lottie.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + From ca5dc1744cbe161192d910d4bb65e83966019d28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0brahim=20S=C3=BCren?= Date: Mon, 28 Feb 2022 16:49:42 +0300 Subject: [PATCH 3/5] Create lottie sample pages --- build.gradle | 2 +- .../statelayout/lottieext/Extension.kt | 13 ++++++++- .../lottieext/databinding/Adapter.kt | 13 ++++++--- .../sample/InfoLottieSampleActivity.kt | 13 ++++++++- .../statelayout/sample/SampleBaseActivity.kt | 4 +++ .../layout/activity_info_lottie_sample.xml | 29 ++++++++++--------- .../res/layout/layout_state_info_lottie.xml | 11 ++++--- sample/src/main/res/menu/menu_sample.xml | 5 ++++ sample/src/main/res/values/strings.xml | 1 + 9 files changed, 67 insertions(+), 24 deletions(-) diff --git a/build.gradle b/build.gradle index baae24a..cd40eb5 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:3.4.3' + classpath 'com.android.tools.build:gradle:7.0.4' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong diff --git a/lottie-ext/src/main/java/com/erkutaras/statelayout/lottieext/Extension.kt b/lottie-ext/src/main/java/com/erkutaras/statelayout/lottieext/Extension.kt index aae4c2e..c2465b0 100644 --- a/lottie-ext/src/main/java/com/erkutaras/statelayout/lottieext/Extension.kt +++ b/lottie-ext/src/main/java/com/erkutaras/statelayout/lottieext/Extension.kt @@ -1,10 +1,21 @@ package com.erkutaras.statelayout.lottieext +import android.view.View import com.airbnb.lottie.LottieAnimationView import com.erkutaras.statelayout.StateLayout -fun StateLayout.setLottieAsset(assetName: String) { +fun StateLayout.infoLottie(assetName: String): StateLayout { getInfoLayout()?.findViewById(R.id.imageView_state_layout_info)?.run { setAnimation(assetName) + visibility = View.VISIBLE } + return this +} + +fun StateLayout.infoLottie(rawRes: Int): StateLayout { + getInfoLayout()?.findViewById(R.id.imageView_state_layout_info)?.run { + setAnimation(rawRes) + visibility = View.VISIBLE + } + return this } diff --git a/lottie-ext/src/main/java/com/erkutaras/statelayout/lottieext/databinding/Adapter.kt b/lottie-ext/src/main/java/com/erkutaras/statelayout/lottieext/databinding/Adapter.kt index 882d18d..7e75c69 100644 --- a/lottie-ext/src/main/java/com/erkutaras/statelayout/lottieext/databinding/Adapter.kt +++ b/lottie-ext/src/main/java/com/erkutaras/statelayout/lottieext/databinding/Adapter.kt @@ -2,9 +2,14 @@ package com.erkutaras.statelayout.lottieext.databinding import androidx.databinding.BindingAdapter import com.erkutaras.statelayout.StateLayout -import com.erkutaras.statelayout.lottieext.setLottieAsset +import com.erkutaras.statelayout.lottieext.infoLottie -@BindingAdapter("sl_lottieAsset") -fun setLottieAsset(view: StateLayout, assetName: String) { - view.setLottieAsset(assetName) +@BindingAdapter("sl_infoLottieAsset") +fun setInfoLottieAsset(view: StateLayout, assetName: String) { + view.infoLottie(assetName) +} + +@BindingAdapter("sl_infoLottieRawRes") +fun setInfoLottieRawRes(view: StateLayout, rawRes: Int) { + view.infoLottie(rawRes) } diff --git a/sample/src/main/java/com/erkutaras/statelayout/sample/InfoLottieSampleActivity.kt b/sample/src/main/java/com/erkutaras/statelayout/sample/InfoLottieSampleActivity.kt index a0fac6b..ea861f7 100644 --- a/sample/src/main/java/com/erkutaras/statelayout/sample/InfoLottieSampleActivity.kt +++ b/sample/src/main/java/com/erkutaras/statelayout/sample/InfoLottieSampleActivity.kt @@ -3,12 +3,23 @@ package com.erkutaras.statelayout.sample import android.os.Bundle import android.widget.Toast import com.erkutaras.statelayout.StateLayout +import com.erkutaras.statelayout.lottieext.infoLottie +import kotlinx.android.synthetic.main.activity_info_lottie_sample.stateLayout class InfoLottieSampleActivity : SampleBaseActivity(), StateLayout.OnStateLayoutListener { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.layout_state_info_lottie) + setContentView(R.layout.activity_info_lottie_sample) + + stateLayout + .infoTitle("Ooops.... :(") + .infoMessage("Unexpected error occurred. Please refresh the page!") + .infoButtonText("Refresh") + //.infoLottie("like_heart.json") + .infoButtonListener { + onStateLayoutInfoButtonClick() + } } override fun getMenuResId(): Int = R.menu.menu_sample diff --git a/sample/src/main/java/com/erkutaras/statelayout/sample/SampleBaseActivity.kt b/sample/src/main/java/com/erkutaras/statelayout/sample/SampleBaseActivity.kt index 84e9c31..bd5f4a9 100644 --- a/sample/src/main/java/com/erkutaras/statelayout/sample/SampleBaseActivity.kt +++ b/sample/src/main/java/com/erkutaras/statelayout/sample/SampleBaseActivity.kt @@ -33,6 +33,10 @@ abstract class SampleBaseActivity : AppCompatActivity() { startActivity(Intent(this, AnimationLoadingSampleActivity::class.java)) return true } + R.id.menu_info_lottie -> { + startActivity(Intent(this, InfoLottieSampleActivity::class.java)) + return true + } } return super.onOptionsItemSelected(item) } diff --git a/sample/src/main/res/layout/activity_info_lottie_sample.xml b/sample/src/main/res/layout/activity_info_lottie_sample.xml index 8b46d96..b608941 100644 --- a/sample/src/main/res/layout/activity_info_lottie_sample.xml +++ b/sample/src/main/res/layout/activity_info_lottie_sample.xml @@ -1,19 +1,22 @@ - + - - app:sl_infoLayout="@layout/layout_state_info_lottie" - app:sl_state="info"> + - + - \ No newline at end of file + + + diff --git a/sample/src/main/res/layout/layout_state_info_lottie.xml b/sample/src/main/res/layout/layout_state_info_lottie.xml index 20615ab..9248427 100644 --- a/sample/src/main/res/layout/layout_state_info_lottie.xml +++ b/sample/src/main/res/layout/layout_state_info_lottie.xml @@ -1,9 +1,9 @@ - + + \ No newline at end of file diff --git a/sample/src/main/res/values/strings.xml b/sample/src/main/res/values/strings.xml index 6d25a08..8ee1784 100644 --- a/sample/src/main/res/values/strings.xml +++ b/sample/src/main/res/values/strings.xml @@ -4,4 +4,5 @@ Simple Usage Custom Usage Loading Animation + Info Lottie From cbe47875298bfa0373fb452771627a46619b09f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0brahim=20S=C3=BCren?= Date: Mon, 28 Feb 2022 17:25:01 +0300 Subject: [PATCH 4/5] Implement viewBinding --- sample/build.gradle | 3 +- .../sample/AnimationLoadingSampleActivity.kt | 18 ++++---- .../sample/CustomSampleActivity.kt | 44 ++++++++++++------- .../sample/InfoLottieSampleActivity.kt | 11 +++-- .../sample/StateLayoutSampleActivity.kt | 15 ++++--- .../layout/activity_info_lottie_sample.xml | 29 ++++++------ .../main/res/layout/layout_custom_info.xml | 4 +- 7 files changed, 69 insertions(+), 55 deletions(-) diff --git a/sample/build.gradle b/sample/build.gradle index daf3cc8..745b109 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -1,6 +1,5 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' -apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-kapt' android { @@ -24,7 +23,7 @@ android { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } - dataBinding { + viewBinding { enabled true } } diff --git a/sample/src/main/java/com/erkutaras/statelayout/sample/AnimationLoadingSampleActivity.kt b/sample/src/main/java/com/erkutaras/statelayout/sample/AnimationLoadingSampleActivity.kt index d5ecbc2..32ded2d 100644 --- a/sample/src/main/java/com/erkutaras/statelayout/sample/AnimationLoadingSampleActivity.kt +++ b/sample/src/main/java/com/erkutaras/statelayout/sample/AnimationLoadingSampleActivity.kt @@ -8,7 +8,7 @@ import android.webkit.WebView import android.webkit.WebViewClient import android.widget.Toast import com.erkutaras.statelayout.StateLayout -import kotlinx.android.synthetic.main.activity_state_layout_sample.* +import com.erkutaras.statelayout.sample.databinding.ActivityAnimationLoadingSampleBinding /** * Created by erkutaras on 2.02.2019. @@ -17,23 +17,26 @@ private const val WEB_URL = "https://github.com/erkutaras" class AnimationLoadingSampleActivity : SampleBaseActivity(), StateLayout.OnStateLayoutListener { + private lateinit var binding: ActivityAnimationLoadingSampleBinding + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_animation_loading_sample) + binding = ActivityAnimationLoadingSampleBinding.inflate(layoutInflater) + setContentView(binding.root) - webView.webViewClient = SampleWebViewClient(stateLayout, this) - webView.loadUrl(WEB_URL) + binding.webView.webViewClient = SampleWebViewClient(binding.stateLayout, this) + binding.webView.loadUrl(WEB_URL) } override fun getMenuResId(): Int = R.menu.menu_animation_loading override fun onStateLayoutInfoButtonClick() { - webView.loadUrl(WEB_URL) + binding.webView.loadUrl(WEB_URL) Toast.makeText(this, "Refreshing Page...", Toast.LENGTH_SHORT).show() } override fun onBackPressed() { - if (webView.canGoBack()) webView.goBack() + if (binding.webView.canGoBack()) binding.webView.goBack() else super.onBackPressed() } @@ -66,6 +69,5 @@ class AnimationLoadingSampleActivity : SampleBaseActivity(), StateLayout.OnState onStateLayoutListener.onStateLayoutInfoButtonClick() } } - } -} \ No newline at end of file +} diff --git a/sample/src/main/java/com/erkutaras/statelayout/sample/CustomSampleActivity.kt b/sample/src/main/java/com/erkutaras/statelayout/sample/CustomSampleActivity.kt index 17f7bbf..f028761 100644 --- a/sample/src/main/java/com/erkutaras/statelayout/sample/CustomSampleActivity.kt +++ b/sample/src/main/java/com/erkutaras/statelayout/sample/CustomSampleActivity.kt @@ -8,9 +8,9 @@ import android.webkit.* import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import com.erkutaras.statelayout.StateLayout -import kotlinx.android.synthetic.main.activity_custom_sample.* -import kotlinx.android.synthetic.main.layout_custom_info.* -import kotlinx.android.synthetic.main.layout_custom_loading.* +import com.erkutaras.statelayout.sample.databinding.ActivityCustomSampleBinding +import com.erkutaras.statelayout.sample.databinding.LayoutCustomInfoBinding +import com.erkutaras.statelayout.sample.databinding.LayoutCustomLoadingBinding /** * Created by erkutaras on 21.12.2018. @@ -19,19 +19,29 @@ private const val WEB_URL = "https://medium.com/@erkutaras" class CustomSampleActivity : SampleBaseActivity() { + private lateinit var binding: ActivityCustomSampleBinding + + private lateinit var layoutCustomInfoBinding: LayoutCustomInfoBinding + + private lateinit var layoutCustomLoadingBinding: LayoutCustomLoadingBinding + private var hasError: Boolean = false override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_custom_sample) + binding = ActivityCustomSampleBinding.inflate(layoutInflater) + setContentView(binding.root) + + layoutCustomInfoBinding = LayoutCustomInfoBinding.inflate(layoutInflater) + layoutCustomLoadingBinding = LayoutCustomLoadingBinding.inflate(layoutInflater) - webView.webViewClient = object : WebViewClient() { + binding.webView.webViewClient = object : WebViewClient() { override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) { super.onPageStarted(view, url, favicon) hasError = false - if (url.equals(WEB_URL)) stateLayout.loading() - else stateLayout.loadingWithContent() + if (url.equals(WEB_URL)) binding.stateLayout.loading() + else binding.stateLayout.loadingWithContent() } override fun onReceivedError(view: WebView?, request: WebResourceRequest?, error: WebResourceError?) { @@ -40,13 +50,13 @@ class CustomSampleActivity : SampleBaseActivity() { showInfoState() } } - webView.webChromeClient = object : WebChromeClient() { + binding.webView.webChromeClient = object : WebChromeClient() { override fun onProgressChanged(view: WebView?, newProgress: Int) { super.onProgressChanged(view, newProgress) - contentLoadingProgressBar.progress = newProgress - textView_progress.text = "$newProgress%" + layoutCustomLoadingBinding.contentLoadingProgressBar.progress = newProgress + layoutCustomLoadingBinding.textViewProgress.text = "$newProgress%" - if (!hasError && newProgress == 100) stateLayout.content() + if (!hasError && newProgress == 100) binding.stateLayout.content() if (hasError && newProgress == 100) showInfoState() } } @@ -56,17 +66,17 @@ class CustomSampleActivity : SampleBaseActivity() { override fun getMenuResId(): Int = R.menu.menu_custom private fun showInfoState() { - stateLayout.info() - button_refresh.setOnClickListener { loadUrl() } - button_close.setOnClickListener { finish() } + binding.stateLayout.info() + layoutCustomInfoBinding.buttonRefresh.setOnClickListener { loadUrl() } + layoutCustomInfoBinding.buttonClose.setOnClickListener { finish() } } private fun loadUrl() { - webView.loadUrl(WEB_URL) + binding.webView.loadUrl(WEB_URL) } override fun onBackPressed() { - if (webView.canGoBack()) webView.goBack() + if (binding.webView.canGoBack()) binding.webView.goBack() else super.onBackPressed() } -} \ No newline at end of file +} diff --git a/sample/src/main/java/com/erkutaras/statelayout/sample/InfoLottieSampleActivity.kt b/sample/src/main/java/com/erkutaras/statelayout/sample/InfoLottieSampleActivity.kt index ea861f7..cfe8354 100644 --- a/sample/src/main/java/com/erkutaras/statelayout/sample/InfoLottieSampleActivity.kt +++ b/sample/src/main/java/com/erkutaras/statelayout/sample/InfoLottieSampleActivity.kt @@ -4,19 +4,22 @@ import android.os.Bundle import android.widget.Toast import com.erkutaras.statelayout.StateLayout import com.erkutaras.statelayout.lottieext.infoLottie -import kotlinx.android.synthetic.main.activity_info_lottie_sample.stateLayout +import com.erkutaras.statelayout.sample.databinding.ActivityInfoLottieSampleBinding class InfoLottieSampleActivity : SampleBaseActivity(), StateLayout.OnStateLayoutListener { + private lateinit var binding: ActivityInfoLottieSampleBinding + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_info_lottie_sample) + binding = ActivityInfoLottieSampleBinding.inflate(layoutInflater) + setContentView(binding.root) - stateLayout + binding.stateLayout .infoTitle("Ooops.... :(") .infoMessage("Unexpected error occurred. Please refresh the page!") .infoButtonText("Refresh") - //.infoLottie("like_heart.json") + .infoLottie("like_heart.json") .infoButtonListener { onStateLayoutInfoButtonClick() } diff --git a/sample/src/main/java/com/erkutaras/statelayout/sample/StateLayoutSampleActivity.kt b/sample/src/main/java/com/erkutaras/statelayout/sample/StateLayoutSampleActivity.kt index e883022..defdcfd 100644 --- a/sample/src/main/java/com/erkutaras/statelayout/sample/StateLayoutSampleActivity.kt +++ b/sample/src/main/java/com/erkutaras/statelayout/sample/StateLayoutSampleActivity.kt @@ -8,29 +8,32 @@ import android.webkit.WebView import android.webkit.WebViewClient import android.widget.Toast import com.erkutaras.statelayout.StateLayout -import kotlinx.android.synthetic.main.activity_state_layout_sample.* +import com.erkutaras.statelayout.sample.databinding.ActivityStateLayoutSampleBinding private const val WEB_URL = "http://www.erkutaras.com/" class StateLayoutSampleActivity : SampleBaseActivity(), StateLayout.OnStateLayoutListener { + private lateinit var binding: ActivityStateLayoutSampleBinding + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_state_layout_sample) + binding = ActivityStateLayoutSampleBinding.inflate(layoutInflater) + setContentView(binding.root) - webView.webViewClient = SampleWebViewClient(stateLayout, this) - webView.loadUrl(WEB_URL) + binding.webView.webViewClient = SampleWebViewClient(binding.stateLayout, this) + binding.webView.loadUrl(WEB_URL) } override fun getMenuResId(): Int = R.menu.menu_sample override fun onStateLayoutInfoButtonClick() { - webView.loadUrl(WEB_URL) + binding.webView.loadUrl(WEB_URL) Toast.makeText(this, "Refreshing Page...", Toast.LENGTH_SHORT).show() } override fun onBackPressed() { - if (webView.canGoBack()) webView.goBack() + if (binding.webView.canGoBack()) binding.webView.goBack() else super.onBackPressed() } diff --git a/sample/src/main/res/layout/activity_info_lottie_sample.xml b/sample/src/main/res/layout/activity_info_lottie_sample.xml index b608941..eba1108 100644 --- a/sample/src/main/res/layout/activity_info_lottie_sample.xml +++ b/sample/src/main/res/layout/activity_info_lottie_sample.xml @@ -1,22 +1,19 @@ - - + android:layout_height="match_parent" + android:layout_marginBottom="8dp" + android:layout_marginTop="8dp" + app:sl_infoLayout="@layout/layout_state_info_lottie" + app:sl_state="info"> - + - - - - - + \ No newline at end of file diff --git a/sample/src/main/res/layout/layout_custom_info.xml b/sample/src/main/res/layout/layout_custom_info.xml index 5926e58..71c085c 100644 --- a/sample/src/main/res/layout/layout_custom_info.xml +++ b/sample/src/main/res/layout/layout_custom_info.xml @@ -2,8 +2,8 @@ - + android:layout_width="match_parent" + android:layout_height="match_parent"> Date: Mon, 28 Feb 2022 17:32:14 +0300 Subject: [PATCH 5/5] Update maven publish plugin --- library/build.gradle | 14 ++++++++++++++ lottie-ext/build.gradle | 14 ++++++++++++++ .../statelayout/sample/SampleBaseActivity.kt | 2 +- .../sample/StateLayoutSampleActivity.kt | 8 ++++---- 4 files changed, 33 insertions(+), 5 deletions(-) diff --git a/library/build.gradle b/library/build.gradle index 1fdeb56..d1025a1 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -1,5 +1,6 @@ apply plugin: 'com.android.library' apply plugin: 'kotlin-android' +apply plugin: 'maven-publish' group='com.erkutaras.statelayout' @@ -33,3 +34,16 @@ dependencies { implementation 'androidx.core:core-ktx:1.7.0' implementation 'androidx.appcompat:appcompat:1.4.1' } + +project.afterEvaluate { + publishing { + publications { + release(MavenPublication) { + from components.release + groupId = 'com.erkutaras.statelayout' + artifactId = 'StateLayout' + version = '1.4.4' + } + } + } +} diff --git a/lottie-ext/build.gradle b/lottie-ext/build.gradle index bf52ddd..76124b7 100644 --- a/lottie-ext/build.gradle +++ b/lottie-ext/build.gradle @@ -1,6 +1,7 @@ apply plugin: 'com.android.library' apply plugin: 'kotlin-android' apply plugin: 'kotlin-kapt' +apply plugin: 'maven-publish' group='com.erkutaras.statelayout' @@ -37,3 +38,16 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.4.1' api 'com.airbnb.android:lottie:4.2.2' } + +project.afterEvaluate { + publishing { + publications { + release(MavenPublication) { + from components.release + groupId = 'com.erkutaras.statelayout' + artifactId = 'LottieExt' + version = '1.4.4' + } + } + } +} diff --git a/sample/src/main/java/com/erkutaras/statelayout/sample/SampleBaseActivity.kt b/sample/src/main/java/com/erkutaras/statelayout/sample/SampleBaseActivity.kt index bd5f4a9..90e1a80 100644 --- a/sample/src/main/java/com/erkutaras/statelayout/sample/SampleBaseActivity.kt +++ b/sample/src/main/java/com/erkutaras/statelayout/sample/SampleBaseActivity.kt @@ -40,4 +40,4 @@ abstract class SampleBaseActivity : AppCompatActivity() { } return super.onOptionsItemSelected(item) } -} \ No newline at end of file +} diff --git a/sample/src/main/java/com/erkutaras/statelayout/sample/StateLayoutSampleActivity.kt b/sample/src/main/java/com/erkutaras/statelayout/sample/StateLayoutSampleActivity.kt index defdcfd..1b9aacb 100644 --- a/sample/src/main/java/com/erkutaras/statelayout/sample/StateLayoutSampleActivity.kt +++ b/sample/src/main/java/com/erkutaras/statelayout/sample/StateLayoutSampleActivity.kt @@ -37,9 +37,10 @@ class StateLayoutSampleActivity : SampleBaseActivity(), StateLayout.OnStateLayou else super.onBackPressed() } - private class SampleWebViewClient(val stateLayout: StateLayout, - val onStateLayoutListener: StateLayout.OnStateLayoutListener) - : WebViewClient() { + private class SampleWebViewClient( + val stateLayout: StateLayout, + val onStateLayoutListener: StateLayout.OnStateLayoutListener, + ) : WebViewClient() { var hasError: Boolean = false @@ -66,6 +67,5 @@ class StateLayoutSampleActivity : SampleBaseActivity(), StateLayout.OnStateLayou onStateLayoutListener.onStateLayoutInfoButtonClick() } } - } }