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/build.gradle b/build.gradle index 9dc9efe..cd40eb5 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:7.0.4' 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..d1025a1 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -1,15 +1,15 @@ apply plugin: 'com.android.library' apply plugin: 'kotlin-android' -apply plugin: 'com.github.dcendents.android-maven' +apply plugin: 'maven-publish' group='com.erkutaras.statelayout' android { - compileSdkVersion 28 + compileSdkVersion 31 defaultConfig { minSdkVersion 14 - targetSdkVersion 28 + targetSdkVersion 31 versionCode 26 versionName "1.4.4" @@ -23,13 +23,27 @@ 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' + implementation 'androidx.core:core-ktx:1.7.0' + implementation 'androidx.appcompat:appcompat:1.4.1' } -repositories { - mavenCentral() + +project.afterEvaluate { + publishing { + publications { + release(MavenPublication) { + from components.release + groupId = 'com.erkutaras.statelayout' + artifactId = 'StateLayout' + version = '1.4.4' + } + } + } } 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/.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..76124b7 --- /dev/null +++ b/lottie-ext/build.gradle @@ -0,0 +1,53 @@ +apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-kapt' +apply plugin: 'maven-publish' + +group='com.erkutaras.statelayout' + +android { + compileSdkVersion 31 + + defaultConfig { + minSdkVersion 16 + targetSdkVersion 31 + 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 + } + + dataBinding { + enabled true + } +} + +dependencies { + implementation project(':library') + implementation 'androidx.core:core-ktx:1.7.0' + 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/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..c34f7f4 --- /dev/null +++ b/lottie-ext/src/main/AndroidManifest.xml @@ -0,0 +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..c2465b0 --- /dev/null +++ b/lottie-ext/src/main/java/com/erkutaras/statelayout/lottieext/Extension.kt @@ -0,0 +1,21 @@ +package com.erkutaras.statelayout.lottieext + +import android.view.View +import com.airbnb.lottie.LottieAnimationView +import com.erkutaras.statelayout.StateLayout + +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 new file mode 100644 index 0000000..7e75c69 --- /dev/null +++ b/lottie-ext/src/main/java/com/erkutaras/statelayout/lottieext/databinding/Adapter.kt @@ -0,0 +1,15 @@ +package com.erkutaras.statelayout.lottieext.databinding + +import androidx.databinding.BindingAdapter +import com.erkutaras.statelayout.StateLayout +import com.erkutaras.statelayout.lottieext.infoLottie + +@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/build.gradle b/sample/build.gradle index 358b60e..745b109 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -1,13 +1,13 @@ 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 +19,22 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + viewBinding { + 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/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 new file mode 100644 index 0000000..cfe8354 --- /dev/null +++ b/sample/src/main/java/com/erkutaras/statelayout/sample/InfoLottieSampleActivity.kt @@ -0,0 +1,33 @@ +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 com.erkutaras.statelayout.sample.databinding.ActivityInfoLottieSampleBinding + +class InfoLottieSampleActivity : SampleBaseActivity(), StateLayout.OnStateLayoutListener { + + private lateinit var binding: ActivityInfoLottieSampleBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivityInfoLottieSampleBinding.inflate(layoutInflater) + setContentView(binding.root) + + binding.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 + + override fun onStateLayoutInfoButtonClick() { + Toast.makeText(this, "Refreshing Page...", Toast.LENGTH_SHORT).show() + } +} 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..90e1a80 100644 --- a/sample/src/main/java/com/erkutaras/statelayout/sample/SampleBaseActivity.kt +++ b/sample/src/main/java/com/erkutaras/statelayout/sample/SampleBaseActivity.kt @@ -33,7 +33,11 @@ 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) } -} \ 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 e883022..1b9aacb 100644 --- a/sample/src/main/java/com/erkutaras/statelayout/sample/StateLayoutSampleActivity.kt +++ b/sample/src/main/java/com/erkutaras/statelayout/sample/StateLayoutSampleActivity.kt @@ -8,35 +8,39 @@ 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() } - 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 @@ -63,6 +67,5 @@ class StateLayoutSampleActivity : SampleBaseActivity(), StateLayout.OnStateLayou onStateLayoutListener.onStateLayoutInfoButtonClick() } } - } } 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..eba1108 --- /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_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"> + + + + + + + + + + + + + + + diff --git a/sample/src/main/res/menu/menu_sample.xml b/sample/src/main/res/menu/menu_sample.xml index 2889fee..b7abfea 100644 --- a/sample/src/main/res/menu/menu_sample.xml +++ b/sample/src/main/res/menu/menu_sample.xml @@ -9,4 +9,9 @@ android:id="@+id/menu_loading_animation" android:title="@string/loading_animation" app:showAsAction="never"/> + + \ 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 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'