From 409d30bc3d25044187664434b50b74f690110f3c Mon Sep 17 00:00:00 2001 From: Vladimir Jovanovic Date: Wed, 4 Apr 2018 22:34:16 +0200 Subject: [PATCH] Fixed problem with restoring view's state Small code optimization --- CHANGELOG.md | 6 + README.md | 2 +- build.gradle | 4 +- gradle/wrapper/gradle-wrapper.properties | 4 +- lemniscate/build.gradle | 12 +- .../lemniscate/base/BaseCurveProgressView.kt | 83 +++++------ .../lemniscate/base/models/DrawState.kt | 7 +- .../lemniscate/base/models/LineLength.kt | 6 +- .../vlad1m1r/lemniscate/base/models/Point.kt | 9 +- .../vlad1m1r/lemniscate/base/models/Points.kt | 4 +- .../base/settings/AnimationSettings.kt | 19 ++- .../roulette/BaseRouletteProgressView.kt | 37 +++-- .../settings/RouletteCurveSettings.kt | 41 +++--- .../lemniscate/base/models/PointsTest.kt | 7 - .../settings/CurveSettingsParcelableTest.kt | 11 +- .../base/settings/CurveSettingsTest.kt | 3 +- sample/build.gradle | 6 +- .../vlad1m1r/lemniscate/sample/CurveData.kt | 71 +++++---- .../lemniscate/sample/FragmentCurve.kt | 35 +++-- .../lemniscate/sample/FragmentSettings.kt | 139 +++++++++--------- .../lemniscate/sample/MainActivity.kt | 3 +- 21 files changed, 249 insertions(+), 260 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 11b17f9..e367eea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ Change Log ========== +Version 1.4.3 *(2018-04-04)* +---------------------------- + +* Fixed problem with restoring view's state +* Small code optimization + Version 1.4.2 *(2018-01-16)* ---------------------------- diff --git a/README.md b/README.md index 13064e0..40bfcc4 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ Add to your module's build.gradle: and to your app build.gradle: dependencies { - compile 'com.github.vlad1m1r990:Lemniscate:1.4.2' + compile 'com.github.vlad1m1r990:Lemniscate:1.4.3' } Usage diff --git a/build.gradle b/build.gradle index 1e91f81..b15249b 100644 --- a/build.gradle +++ b/build.gradle @@ -1,11 +1,11 @@ buildscript { - ext.kotlin_version = '1.2.21' + ext.kotlin_version = '1.2.31' repositories { jcenter() google() } dependencies { - classpath 'com.android.tools.build:gradle:3.0.1' + classpath 'com.android.tools.build:gradle:3.1.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a2cc20d..801f2f0 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Wed Oct 25 23:03:04 CEST 2017 +#Wed Apr 04 19:49:25 CEST 2018 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip diff --git a/lemniscate/build.gradle b/lemniscate/build.gradle index 9492be0..700de7e 100644 --- a/lemniscate/build.gradle +++ b/lemniscate/build.gradle @@ -13,8 +13,8 @@ android { defaultConfig { minSdkVersion 14 targetSdkVersion 27 - versionCode 142 - versionName "1.4.2" + versionCode 143 + versionName "1.4.3" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { @@ -65,11 +65,11 @@ task jacocoDebugReport(type: JacocoReport, dependsOn: ['testDebugUnitTest', 'cre dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') testImplementation 'junit:junit:4.12' - testImplementation 'org.mockito:mockito-core:2.11.0' + testImplementation 'org.mockito:mockito-core:2.17.0' testImplementation 'com.nhaarman:mockito-kotlin:1.5.0' - testImplementation 'com.google.truth:truth:0.39' - testImplementation 'org.robolectric:robolectric:3.6.1' - implementation 'com.android.support:appcompat-v7:27.0.2' + testImplementation 'com.google.truth:truth:0.40' + testImplementation 'org.robolectric:robolectric:3.8' + implementation 'com.android.support:appcompat-v7:27.1.0' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" } repositories { diff --git a/lemniscate/src/main/java/com/vlad1m1r/lemniscate/base/BaseCurveProgressView.kt b/lemniscate/src/main/java/com/vlad1m1r/lemniscate/base/BaseCurveProgressView.kt index c56bb72..bb50d92 100644 --- a/lemniscate/src/main/java/com/vlad1m1r/lemniscate/base/BaseCurveProgressView.kt +++ b/lemniscate/src/main/java/com/vlad1m1r/lemniscate/base/BaseCurveProgressView.kt @@ -44,7 +44,6 @@ abstract class BaseCurveProgressView : View, IBaseCurveView { Points()) private var valueAnimator: ValueAnimator? = null - private val interpolator = LinearInterpolator() constructor(context: Context) : super(context) @@ -126,41 +125,22 @@ abstract class BaseCurveProgressView : View, IBaseCurveView { } private fun animateLemniscate() { - if (valueAnimator != null) valueAnimator!!.end() - valueAnimator = ValueAnimator.ofInt(presenter.curveSettings.precision - 1, 0) - valueAnimator!!.duration = presenter.animationSettings.duration.toLong() - valueAnimator!!.repeatCount = -1 - valueAnimator!!.repeatMode = ValueAnimator.RESTART - valueAnimator!!.interpolator = interpolator - valueAnimator!!.addUpdateListener { animation -> - presenter.updateStartingPointOnCurve(animation.animatedValue as Int) + valueAnimator?.end() + valueAnimator = ValueAnimator.ofInt(presenter.curveSettings.precision - 1, 0).apply { + duration = presenter.animationSettings.duration.toLong() + repeatCount = -1 + repeatMode = ValueAnimator.RESTART + interpolator = LinearInterpolator() + addUpdateListener { animation -> + presenter.updateStartingPointOnCurve(animation.animatedValue as Int) + } + start() } - valueAnimator!!.start() } override fun onDetachedFromWindow() { super.onDetachedFromWindow() - valueAnimator!!.end() - } - - public override fun onSaveInstanceState(): Parcelable { - val superState = super.onSaveInstanceState() - val ss = BaseCurveSavedState(superState) - ss.curveSettings = this.presenter.curveSettings - ss.animationSettings = this.presenter.animationSettings - return ss - } - - public override fun onRestoreInstanceState(state: Parcelable) { - if (state !is BaseCurveSavedState) { - super.onRestoreInstanceState(state) - return - } - - super.onRestoreInstanceState(state.superState) - - this.presenter.curveSettings = state.curveSettings - this.presenter.animationSettings = state.animationSettings + valueAnimator?.end() } var strokeWidth @@ -220,15 +200,33 @@ abstract class BaseCurveProgressView : View, IBaseCurveView { presenter.curveSettings.hasHole = hasHole } - protected class BaseCurveSavedState : View.BaseSavedState { + public override fun onSaveInstanceState(): Parcelable { + val superState = super.onSaveInstanceState() + val ss = BaseCurveSavedState(superState) + ss.curveSettings = this.presenter.curveSettings + ss.animationSettings = this.presenter.animationSettings + return ss + } + + public override fun onRestoreInstanceState(state: Parcelable) { + if (state is BaseCurveSavedState) { + super.onRestoreInstanceState(state.superState) + this.presenter.curveSettings = state.curveSettings + this.presenter.animationSettings = state.animationSettings + } else { + super.onRestoreInstanceState(state) + } + } + + protected open class BaseCurveSavedState : View.BaseSavedState { internal lateinit var curveSettings: CurveSettings internal lateinit var animationSettings: AnimationSettings constructor(superState: Parcelable) : super(superState) - constructor(`in`: Parcel) : super(`in`) { - this.curveSettings = `in`.readParcelable(CurveSettings::class.java.classLoader) - this.animationSettings = `in`.readParcelable(AnimationSettings::class.java.classLoader) + constructor(state: Parcel) : super(state) { + this.curveSettings = state.readParcelable(CurveSettings::class.java.classLoader) + this.animationSettings = state.readParcelable(AnimationSettings::class.java.classLoader) } override fun writeToParcel(out: Parcel, flags: Int) { @@ -237,13 +235,16 @@ abstract class BaseCurveProgressView : View, IBaseCurveView { out.writeParcelable(this.animationSettings, flags) } - val CREATOR: Parcelable.Creator = object : Parcelable.Creator { - override fun createFromParcel(`in`: Parcel): BaseCurveSavedState { - return BaseCurveSavedState(`in`) - } + companion object { + @JvmField + val CREATOR = object : Parcelable.Creator { + override fun createFromParcel(source: Parcel): BaseCurveSavedState { + return BaseCurveSavedState(source) + } - override fun newArray(size: Int): Array { - return arrayOfNulls(size) + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } } } } diff --git a/lemniscate/src/main/java/com/vlad1m1r/lemniscate/base/models/DrawState.kt b/lemniscate/src/main/java/com/vlad1m1r/lemniscate/base/models/DrawState.kt index 6107e2e..78a71e3 100644 --- a/lemniscate/src/main/java/com/vlad1m1r/lemniscate/base/models/DrawState.kt +++ b/lemniscate/src/main/java/com/vlad1m1r/lemniscate/base/models/DrawState.kt @@ -36,9 +36,12 @@ class DrawState(val path:Path) { path.lineTo(start.x, start.y) } else if (end != null) { path.moveTo(end.x, end.y) - } + } } + internal fun isInRightDirectionToBeInHole(start: Point?, end: Point?) + = start != null && end != null && start.x > end.x + fun addPointsToPath(listOfPoints: List, curveSettings: CurveSettings, viewSize: ViewSize) { resetPath() @@ -53,7 +56,7 @@ class DrawState(val path:Path) { end = listOfPoints[i + 1] if (curveSettings.hasHole) { - if (start != null && end != null && start.x > end.x) { + if (isInRightDirectionToBeInHole(start, end)) { start = CurveUtils.checkPointForHole(start, holeSize, viewSize.size) end = CurveUtils.checkPointForHole(end, holeSize, viewSize.size) } diff --git a/lemniscate/src/main/java/com/vlad1m1r/lemniscate/base/models/LineLength.kt b/lemniscate/src/main/java/com/vlad1m1r/lemniscate/base/models/LineLength.kt index 5b79742..346b8ee 100644 --- a/lemniscate/src/main/java/com/vlad1m1r/lemniscate/base/models/LineLength.kt +++ b/lemniscate/src/main/java/com/vlad1m1r/lemniscate/base/models/LineLength.kt @@ -18,7 +18,7 @@ package com.vlad1m1r.lemniscate.base.models import android.os.Parcel import android.os.Parcelable -class LineLength : Parcelable { +class LineLength() : Parcelable { var lineMinLength = 0.4f set(value) { @@ -38,9 +38,7 @@ class LineLength : Parcelable { } } - constructor() - - internal constructor(`in`: Parcel) { + internal constructor(`in`: Parcel) : this() { this.lineMinLength = `in`.readFloat() this.lineMaxLength = `in`.readFloat() } diff --git a/lemniscate/src/main/java/com/vlad1m1r/lemniscate/base/models/Point.kt b/lemniscate/src/main/java/com/vlad1m1r/lemniscate/base/models/Point.kt index 1b24ded..37a6a27 100644 --- a/lemniscate/src/main/java/com/vlad1m1r/lemniscate/base/models/Point.kt +++ b/lemniscate/src/main/java/com/vlad1m1r/lemniscate/base/models/Point.kt @@ -16,13 +16,8 @@ package com.vlad1m1r.lemniscate.base.models class Point(x: Float, y: Float, strokeWidth: Float, viewSize: Float) { - val x: Float - val y: Float - - init { - this.x = translateToPositiveCoordinates(x, strokeWidth, viewSize) - this.y = translateToPositiveCoordinates(y, strokeWidth, viewSize) - } + val x: Float = translateToPositiveCoordinates(x, strokeWidth, viewSize) + val y: Float = translateToPositiveCoordinates(y, strokeWidth, viewSize) private fun compensateForStrokeWidth(coordinate: Float, strokeWidth: Float, viewSize: Float): Float { val ratio = viewSize / (viewSize + 2 * strokeWidth) diff --git a/lemniscate/src/main/java/com/vlad1m1r/lemniscate/base/models/Points.kt b/lemniscate/src/main/java/com/vlad1m1r/lemniscate/base/models/Points.kt index 62d95d3..75b7e37 100644 --- a/lemniscate/src/main/java/com/vlad1m1r/lemniscate/base/models/Points.kt +++ b/lemniscate/src/main/java/com/vlad1m1r/lemniscate/base/models/Points.kt @@ -23,8 +23,8 @@ class Points { val isEmpty: Boolean get() = points.isEmpty() - fun getPoints(): ArrayList { - return points.clone() as ArrayList + fun getPoints(): List { + return points.toList() } fun addPoint(point: Point) { diff --git a/lemniscate/src/main/java/com/vlad1m1r/lemniscate/base/settings/AnimationSettings.kt b/lemniscate/src/main/java/com/vlad1m1r/lemniscate/base/settings/AnimationSettings.kt index 1e3957f..71d2dca 100644 --- a/lemniscate/src/main/java/com/vlad1m1r/lemniscate/base/settings/AnimationSettings.kt +++ b/lemniscate/src/main/java/com/vlad1m1r/lemniscate/base/settings/AnimationSettings.kt @@ -20,23 +20,22 @@ import android.os.Parcelable class AnimationSettings(var startingPointOnCurve:Int = 0, var duration: Int = 1000) : Parcelable { - internal constructor(`in`: Parcel) : this() { - this.startingPointOnCurve = `in`.readInt() - this.duration = `in`.readInt() + constructor(parcel: Parcel) : this( + parcel.readInt(), + parcel.readInt()) + + override fun writeToParcel(parcel: Parcel, flags: Int) { + parcel.writeInt(startingPointOnCurve) + parcel.writeInt(duration) } override fun describeContents(): Int { return 0 } - override fun writeToParcel(dest: Parcel, flags: Int) { - dest.writeInt(this.startingPointOnCurve) - dest.writeInt(this.duration) - } - companion object CREATOR : Parcelable.Creator { - override fun createFromParcel(source: Parcel): AnimationSettings { - return AnimationSettings(source) + override fun createFromParcel(parcel: Parcel): AnimationSettings { + return AnimationSettings(parcel) } override fun newArray(size: Int): Array { diff --git a/lemniscate/src/main/java/com/vlad1m1r/lemniscate/roulette/BaseRouletteProgressView.kt b/lemniscate/src/main/java/com/vlad1m1r/lemniscate/roulette/BaseRouletteProgressView.kt index cd26f6a..287ce36 100644 --- a/lemniscate/src/main/java/com/vlad1m1r/lemniscate/roulette/BaseRouletteProgressView.kt +++ b/lemniscate/src/main/java/com/vlad1m1r/lemniscate/roulette/BaseRouletteProgressView.kt @@ -20,8 +20,6 @@ import android.content.Context import android.os.Parcel import android.os.Parcelable import android.util.AttributeSet -import android.view.View - import com.vlad1m1r.lemniscate.base.BaseCurveProgressView import com.vlad1m1r.lemniscate.roulette.settings.RouletteCurveSettings import com.vlad1m1r.lemniscate.sample.lemniscate.R @@ -91,29 +89,28 @@ abstract class BaseRouletteProgressView : BaseCurveProgressView { } override fun onSaveInstanceState(): Parcelable { - val superState = super.onSaveInstanceState() - val ss = RouletteCurveSavedState(superState) + val ss = RouletteCurveSavedState(super.onSaveInstanceState()) ss.rouletteCurveSettings = rouletteCurveSettings return ss } override fun onRestoreInstanceState(state: Parcelable) { - if (state !is RouletteCurveSavedState) { + if (state is RouletteCurveSavedState) { + super.onRestoreInstanceState(state.superState) + this.rouletteCurveSettings = state.rouletteCurveSettings + } else { super.onRestoreInstanceState(state) - return } - super.onRestoreInstanceState(state.superState) - - this.rouletteCurveSettings = state.rouletteCurveSettings } - protected class RouletteCurveSavedState : View.BaseSavedState { + protected open class RouletteCurveSavedState : BaseCurveSavedState { + internal lateinit var rouletteCurveSettings: RouletteCurveSettings constructor(superState: Parcelable) : super(superState) - constructor(`in`: Parcel) : super(`in`) { - this.rouletteCurveSettings = `in`.readParcelable(RouletteCurveSettings::class.java.classLoader) + constructor(source: Parcel) : super(source) { + this.rouletteCurveSettings = source.readParcelable(RouletteCurveSettings::class.java.classLoader) } override fun writeToParcel(out: Parcel, flags: Int) { @@ -121,14 +118,16 @@ abstract class BaseRouletteProgressView : BaseCurveProgressView { out.writeParcelable(this.rouletteCurveSettings, flags) } + companion object { + @JvmField + val CREATOR = object : Parcelable.Creator { + override fun createFromParcel(source: Parcel): RouletteCurveSavedState { + return RouletteCurveSavedState(source) + } - val CREATOR: Parcelable.Creator = object : Parcelable.Creator { - override fun createFromParcel(`in`: Parcel): RouletteCurveSavedState { - return RouletteCurveSavedState(`in`) - } - - override fun newArray(size: Int): Array { - return arrayOfNulls(size) + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } } } } diff --git a/lemniscate/src/main/java/com/vlad1m1r/lemniscate/roulette/settings/RouletteCurveSettings.kt b/lemniscate/src/main/java/com/vlad1m1r/lemniscate/roulette/settings/RouletteCurveSettings.kt index 3736878..7bdd3b6 100644 --- a/lemniscate/src/main/java/com/vlad1m1r/lemniscate/roulette/settings/RouletteCurveSettings.kt +++ b/lemniscate/src/main/java/com/vlad1m1r/lemniscate/roulette/settings/RouletteCurveSettings.kt @@ -3,7 +3,7 @@ package com.vlad1m1r.lemniscate.roulette.settings import android.os.Parcel import android.os.Parcelable -class RouletteCurveSettings : Parcelable { +class RouletteCurveSettings() : Parcelable { /** * Radius of the non-moving circle @@ -22,36 +22,31 @@ class RouletteCurveSettings : Parcelable { */ var numberOfCycles = 1.0f - constructor() + constructor(parcel: Parcel) : this() { + radiusFixed = parcel.readFloat() + radiusMoving = parcel.readFloat() + distanceFromCenter = parcel.readFloat() + numberOfCycles = parcel.readFloat() + } - internal constructor(`in`: Parcel) { - this.radiusFixed = `in`.readFloat() - this.radiusMoving = `in`.readFloat() - this.distanceFromCenter = `in`.readFloat() - this.numberOfCycles = `in`.readFloat() + override fun writeToParcel(parcel: Parcel, flags: Int) { + parcel.writeFloat(radiusFixed) + parcel.writeFloat(radiusMoving) + parcel.writeFloat(distanceFromCenter) + parcel.writeFloat(numberOfCycles) } override fun describeContents(): Int { return 0 } - override fun writeToParcel(dest: Parcel, flags: Int) { - dest.writeFloat(this.radiusFixed) - dest.writeFloat(this.radiusMoving) - dest.writeFloat(this.distanceFromCenter) - dest.writeFloat(this.numberOfCycles) - } - - companion object { - - val CREATOR: Parcelable.Creator = object : Parcelable.Creator { - override fun createFromParcel(source: Parcel): RouletteCurveSettings { - return RouletteCurveSettings(source) - } + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): RouletteCurveSettings { + return RouletteCurveSettings(parcel) + } - override fun newArray(size: Int): Array { - return arrayOfNulls(size) - } + override fun newArray(size: Int): Array { + return arrayOfNulls(size) } } } diff --git a/lemniscate/src/test/java/com/vlad1m1r/lemniscate/base/models/PointsTest.kt b/lemniscate/src/test/java/com/vlad1m1r/lemniscate/base/models/PointsTest.kt index f10da00..fa8fc07 100644 --- a/lemniscate/src/test/java/com/vlad1m1r/lemniscate/base/models/PointsTest.kt +++ b/lemniscate/src/test/java/com/vlad1m1r/lemniscate/base/models/PointsTest.kt @@ -27,11 +27,4 @@ class PointsTest { points.clear() assertThat(points.isEmpty).isTrue() } - - @Test - fun getPointsReturnsCopy() { - val list = points.getPoints() - list.add(point) - assertThat(points.isEmpty).isTrue() - } } \ No newline at end of file diff --git a/lemniscate/src/test/java/com/vlad1m1r/lemniscate/base/settings/CurveSettingsParcelableTest.kt b/lemniscate/src/test/java/com/vlad1m1r/lemniscate/base/settings/CurveSettingsParcelableTest.kt index 1f6dc6e..4aa39a0 100644 --- a/lemniscate/src/test/java/com/vlad1m1r/lemniscate/base/settings/CurveSettingsParcelableTest.kt +++ b/lemniscate/src/test/java/com/vlad1m1r/lemniscate/base/settings/CurveSettingsParcelableTest.kt @@ -5,13 +5,11 @@ import android.os.Parcel import com.google.common.truth.Truth.assertThat import com.nhaarman.mockito_kotlin.mock import com.vlad1m1r.lemniscate.base.models.LineLength -import com.vlad1m1r.lemniscate.testutils.isEqualTo import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner - @RunWith(RobolectricTestRunner::class) class CurveSettingsParcelableTest { @@ -21,7 +19,7 @@ class CurveSettingsParcelableTest { @Before fun setUp() { - curveSettings = CurveSettings(paint) + curveSettings = CurveSettings() curveSettings.color = 123 curveSettings.hasHole = true curveSettings.lineLength = LineLength() @@ -40,6 +38,11 @@ class CurveSettingsParcelableTest { val copy = CurveSettings(parcel) parcel.recycle() - assertThat(curveSettings.isEqualTo(copy)).isTrue() + assertThat(curveSettings.color).isEqualTo(copy.color) + assertThat(curveSettings.hasHole).isEqualTo(copy.hasHole) + assertThat(curveSettings.lineLength.lineMaxLength).isEqualTo(copy.lineLength.lineMaxLength) + assertThat(curveSettings.lineLength.lineMinLength).isEqualTo(copy.lineLength.lineMinLength) + assertThat(curveSettings.strokeWidth).isEqualTo(copy.strokeWidth) + assertThat(curveSettings.precision).isEqualTo(copy.precision) } } diff --git a/lemniscate/src/test/java/com/vlad1m1r/lemniscate/base/settings/CurveSettingsTest.kt b/lemniscate/src/test/java/com/vlad1m1r/lemniscate/base/settings/CurveSettingsTest.kt index 4856783..a30aeae 100644 --- a/lemniscate/src/test/java/com/vlad1m1r/lemniscate/base/settings/CurveSettingsTest.kt +++ b/lemniscate/src/test/java/com/vlad1m1r/lemniscate/base/settings/CurveSettingsTest.kt @@ -21,7 +21,8 @@ class CurveSettingsTest { @Before fun setUp() { val lineLength = LineLength() - curveSettings = CurveSettings(paint, lineLength) + curveSettings = CurveSettings(paint) + curveSettings.lineLength = lineLength } @Test diff --git a/sample/build.gradle b/sample/build.gradle index 01c92bf..e0dc6bf 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -10,8 +10,8 @@ android { applicationId "com.vlad1m1r.lemniscate.sample" minSdkVersion 14 targetSdkVersion 27 - versionCode 121 - versionName "1.2.1" + versionCode 122 + versionName "1.2.2" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { @@ -30,7 +30,7 @@ dependencies { androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) - implementation 'com.android.support:appcompat-v7:27.0.2' + implementation 'com.android.support:appcompat-v7:27.1.0' implementation 'me.relex:circleindicator:1.2.2@aar' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" testImplementation 'junit:junit:4.12' diff --git a/sample/src/main/java/com/vlad1m1r/lemniscate/sample/CurveData.kt b/sample/src/main/java/com/vlad1m1r/lemniscate/sample/CurveData.kt index 6407f76..709e612 100644 --- a/sample/src/main/java/com/vlad1m1r/lemniscate/sample/CurveData.kt +++ b/sample/src/main/java/com/vlad1m1r/lemniscate/sample/CurveData.kt @@ -32,49 +32,46 @@ class CurveData(var precision: Int = 200, var distanceFromCenter: Float = 3.0f, var numberOfCycles: Int = 1) : Parcelable { - override fun describeContents(): Int { - return 0 - } + constructor(parcel: Parcel) : this( + parcel.readInt(), + parcel.readFloat(), + parcel.readFloat(), + parcel.readFloat(), + parcel.readFloat(), + parcel.readInt(), + parcel.readInt(), + parcel.readByte() != 0.toByte(), + parcel.readFloat(), + parcel.readFloat(), + parcel.readFloat(), + parcel.readInt()) - override fun writeToParcel(dest: Parcel, flags: Int) { - dest.writeInt(this.precision) - dest.writeFloat(this.strokeWidth) - dest.writeFloat(this.sizeMultiplier) - dest.writeFloat(this.lineMinLength) - dest.writeFloat(this.lineMaxLength) - dest.writeInt(this.color) - dest.writeInt(this.duration) - dest.writeByte(if (this.hasHole) 1.toByte() else 0.toByte()) - dest.writeFloat(this.radiusFixed) - dest.writeFloat(this.radiusMoving) - dest.writeFloat(this.distanceFromCenter) - dest.writeInt(this.numberOfCycles) + override fun writeToParcel(parcel: Parcel, flags: Int) { + parcel.writeInt(precision) + parcel.writeFloat(strokeWidth) + parcel.writeFloat(sizeMultiplier) + parcel.writeFloat(lineMinLength) + parcel.writeFloat(lineMaxLength) + parcel.writeInt(color) + parcel.writeInt(duration) + parcel.writeByte(if (hasHole) 1 else 0) + parcel.writeFloat(radiusFixed) + parcel.writeFloat(radiusMoving) + parcel.writeFloat(distanceFromCenter) + parcel.writeInt(numberOfCycles) } - protected constructor(`in`: Parcel) : this() { - this.precision = `in`.readInt() - this.strokeWidth = `in`.readFloat() - this.sizeMultiplier = `in`.readFloat() - this.lineMinLength = `in`.readFloat() - this.lineMaxLength = `in`.readFloat() - this.color = `in`.readInt() - this.duration = `in`.readInt() - this.hasHole = `in`.readByte().toInt() != 0 - this.radiusFixed = `in`.readFloat() - this.radiusMoving = `in`.readFloat() - this.distanceFromCenter = `in`.readFloat() - this.numberOfCycles = `in`.readInt() + override fun describeContents(): Int { + return 0 } - companion object { - val CREATOR: Parcelable.Creator = object : Parcelable.Creator { - override fun createFromParcel(source: Parcel): CurveData { - return CurveData(source) - } + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): CurveData { + return CurveData(parcel) + } - override fun newArray(size: Int): Array { - return arrayOfNulls(size) - } + override fun newArray(size: Int): Array { + return arrayOfNulls(size) } } } diff --git a/sample/src/main/java/com/vlad1m1r/lemniscate/sample/FragmentCurve.kt b/sample/src/main/java/com/vlad1m1r/lemniscate/sample/FragmentCurve.kt index b19b91f..ff48b98 100644 --- a/sample/src/main/java/com/vlad1m1r/lemniscate/sample/FragmentCurve.kt +++ b/sample/src/main/java/com/vlad1m1r/lemniscate/sample/FragmentCurve.kt @@ -61,11 +61,12 @@ class FragmentCurve : Fragment() { position = savedInstanceState.getInt(KEY_POSITION) if (baseCurveProgressView == null) { - baseCurveProgressView = getViewForPosition(position) - baseCurveProgressView!!.id = position - baseCurveProgressView!!.layoutParams = LinearLayout.LayoutParams( - LinearLayout.LayoutParams.WRAP_CONTENT, - LinearLayout.LayoutParams.WRAP_CONTENT) + baseCurveProgressView = getViewForPosition(position).apply { + id = position + layoutParams = LinearLayout.LayoutParams( + LinearLayout.LayoutParams.WRAP_CONTENT, + LinearLayout.LayoutParams.WRAP_CONTENT) + } } } @@ -75,12 +76,11 @@ class FragmentCurve : Fragment() { curveName = root.findViewById(R.id.textCurveName) layoutViewHolder = root.findViewById(R.id.layoutViewHolder) - if (baseCurveProgressView!!.parent != null) { - (baseCurveProgressView!!.parent as ViewGroup).removeView(baseCurveProgressView) - } + (baseCurveProgressView?.parent as ViewGroup?)?.removeView(baseCurveProgressView) + layoutViewHolder.addView(baseCurveProgressView) - curveName.text = baseCurveProgressView!!.javaClass.simpleName + curveName.text = baseCurveProgressView?.javaClass?.simpleName return root } @@ -113,7 +113,7 @@ class FragmentCurve : Fragment() { override fun onResume() { super.onResume() - if (listener != null) listener!!.onViewPrepared(position, baseCurveProgressView) + listener?.onViewPrepared(position, baseCurveProgressView) } override fun onDetach() { @@ -123,7 +123,7 @@ class FragmentCurve : Fragment() { override fun setUserVisibleHint(isVisibleToUser: Boolean) { super.setUserVisibleHint(isVisibleToUser) - if (listener != null) listener!!.onViewShown(position, baseCurveProgressView) + listener?.onViewShown(position, baseCurveProgressView) } @@ -134,13 +134,12 @@ class FragmentCurve : Fragment() { companion object { - private val KEY_POSITION = "position" + private const val KEY_POSITION = "position" - fun getInstance(position: Int): FragmentCurve { - val fragmentCurve = FragmentCurve() - fragmentCurve.position = position - fragmentCurve.retainInstance = true - return fragmentCurve - } + fun getInstance(fragmentsPosition: Int) = + FragmentCurve().apply { + position = fragmentsPosition + retainInstance = true + } } } diff --git a/sample/src/main/java/com/vlad1m1r/lemniscate/sample/FragmentSettings.kt b/sample/src/main/java/com/vlad1m1r/lemniscate/sample/FragmentSettings.kt index d6d1ccb..20c0a0f 100644 --- a/sample/src/main/java/com/vlad1m1r/lemniscate/sample/FragmentSettings.kt +++ b/sample/src/main/java/com/vlad1m1r/lemniscate/sample/FragmentSettings.kt @@ -56,78 +56,79 @@ class FragmentSettings : Fragment(), SeekBar.OnSeekBarChangeListener, CompoundBu } private fun setupViews() { + seekBarStrokeWidth.max = 50 seekBarStrokeWidth.progress = curveData.strokeWidth.toInt() seekBarStrokeWidth.setOnSeekBarChangeListener(this) - seekBarMaxLineLength!!.max = 99 - seekBarMaxLineLength!!.progress = round(100 * curveData.lineMaxLength).toInt() - 1 - seekBarMaxLineLength!!.setOnSeekBarChangeListener(this) + seekBarMaxLineLength.max = 99 + seekBarMaxLineLength.progress = round(100 * curveData.lineMaxLength).toInt() - 1 + seekBarMaxLineLength.setOnSeekBarChangeListener(this) - seekBarSizeMultiplier!!.max = 15 - seekBarSizeMultiplier!!.progress = 5 - seekBarSizeMultiplier!!.setOnSeekBarChangeListener(this) + seekBarSizeMultiplier.max = 15 + seekBarSizeMultiplier.progress = 5 + seekBarSizeMultiplier.setOnSeekBarChangeListener(this) - seekBarMinLineLength!!.max = 99 - seekBarMinLineLength!!.progress = round(100 * curveData.lineMinLength).toInt() - 1 - seekBarMinLineLength!!.setOnSeekBarChangeListener(this) + seekBarMinLineLength.max = 99 + seekBarMinLineLength.progress = round(100 * curveData.lineMinLength).toInt() - 1 + seekBarMinLineLength.setOnSeekBarChangeListener(this) - seekBarAnimationDuration!!.max = 199 - seekBarAnimationDuration!!.progress = curveData.duration / 10 - 1 - seekBarAnimationDuration!!.setOnSeekBarChangeListener(this) + seekBarAnimationDuration.max = 199 + seekBarAnimationDuration.progress = curveData.duration / 10 - 1 + seekBarAnimationDuration.setOnSeekBarChangeListener(this) - checkBoxHasHole!!.setOnCheckedChangeListener(this) + checkBoxHasHole.setOnCheckedChangeListener(this) - checkBoxHasHole!!.isChecked = curveData.hasHole + checkBoxHasHole.isChecked = curveData.hasHole - seekBarPrecision!!.max = 990 - seekBarPrecision!!.progress = curveData.precision - seekBarPrecision!!.setOnSeekBarChangeListener(this) + seekBarPrecision.max = 990 + seekBarPrecision.progress = curveData.precision + seekBarPrecision.setOnSeekBarChangeListener(this) - seekBarA!!.max = 10 - seekBarA!!.progress = (curveData.radiusFixed - 1).toInt() - seekBarA!!.setOnSeekBarChangeListener(this) + seekBarA.max = 10 + seekBarA.progress = (curveData.radiusFixed - 1).toInt() + seekBarA.setOnSeekBarChangeListener(this) - seekBarB!!.max = 10 - seekBarB!!.progress = (curveData.radiusMoving - 1).toInt() - seekBarB!!.setOnSeekBarChangeListener(this) + seekBarB.max = 10 + seekBarB.progress = (curveData.radiusMoving - 1).toInt() + seekBarB.setOnSeekBarChangeListener(this) - seekBarD!!.max = 10 - seekBarD!!.progress = (curveData.distanceFromCenter - 1).toInt() - seekBarD!!.setOnSeekBarChangeListener(this) + seekBarD.max = 10 + seekBarD.progress = (curveData.distanceFromCenter - 1).toInt() + seekBarD.setOnSeekBarChangeListener(this) - seekBarNumberOfCycles!!.max = 5 - seekBarNumberOfCycles!!.progress = curveData.numberOfCycles - 1 - seekBarNumberOfCycles!!.setOnSeekBarChangeListener(this) + seekBarNumberOfCycles.max = 5 + seekBarNumberOfCycles.progress = curveData.numberOfCycles - 1 + seekBarNumberOfCycles.setOnSeekBarChangeListener(this) - viewColor1!!.setOnClickListener(this) - viewColor2!!.setOnClickListener(this) - viewColor3!!.setOnClickListener(this) - viewColor4!!.setOnClickListener(this) - viewColor5!!.setOnClickListener(this) - viewColor6!!.setOnClickListener(this) + viewColor1.setOnClickListener(this) + viewColor2.setOnClickListener(this) + viewColor3.setOnClickListener(this) + viewColor4.setOnClickListener(this) + viewColor5.setOnClickListener(this) + viewColor6.setOnClickListener(this) } fun setBaseCurveProgressView(baseCurveProgressView: BaseCurveProgressView) { this.baseCurveProgressView = baseCurveProgressView //Checkbox - checkBoxHasHole!!.isEnabled = this.baseCurveProgressView is BernoullisProgressView || + checkBoxHasHole.isEnabled = this.baseCurveProgressView is BernoullisProgressView || this.baseCurveProgressView is GeronosProgressView || this.baseCurveProgressView is BernoullisBowProgressView || this.baseCurveProgressView is BernoullisSharpProgressView //Roulette params if (this.baseCurveProgressView is BaseRouletteProgressView) { - seekBarA!!.isEnabled = true - seekBarB!!.isEnabled = true - seekBarD!!.isEnabled = true + seekBarA.isEnabled = true + seekBarB.isEnabled = true + seekBarD.isEnabled = true seekBarNumberOfCycles!!.isEnabled = true } else { - seekBarA!!.isEnabled = false - seekBarB!!.isEnabled = false - seekBarD!!.isEnabled = false - seekBarNumberOfCycles!!.isEnabled = false + seekBarA.isEnabled = false + seekBarB.isEnabled = false + seekBarD.isEnabled = false + seekBarNumberOfCycles.isEnabled = false } invalidateView(this.baseCurveProgressView) @@ -137,12 +138,12 @@ class FragmentSettings : Fragment(), SeekBar.OnSeekBarChangeListener, CompoundBu override fun onProgressChanged(seekBar: SeekBar, i: Int, fromUser: Boolean) { when (seekBar.id) { R.id.seekBarStrokeWidth -> curveData.strokeWidth = resources.dpToPx(i / 3.0f) - R.id.seekBarMaxLineLength -> if (i < seekBarMinLineLength!!.progress) { - seekBarMaxLineLength!!.progress = seekBarMinLineLength!!.progress + R.id.seekBarMaxLineLength -> if (i < seekBarMinLineLength.progress) { + seekBarMaxLineLength.progress = seekBarMinLineLength.progress } else curveData.lineMaxLength = (i + 1) / 100.0f - R.id.seekBarMinLineLength -> if (i > seekBarMaxLineLength!!.progress) { - seekBarMinLineLength!!.progress = seekBarMaxLineLength!!.progress + R.id.seekBarMinLineLength -> if (i > seekBarMaxLineLength.progress) { + seekBarMinLineLength.progress = seekBarMaxLineLength.progress } else curveData.lineMinLength = (i + 1) / 100.0f R.id.seekBarSizeMultiplier -> curveData.sizeMultiplier = (i + 5) / 10.0f @@ -158,31 +159,31 @@ class FragmentSettings : Fragment(), SeekBar.OnSeekBarChangeListener, CompoundBu } private fun updateValues() { - textStrokeWidth!!.text = curveData.strokeWidth.toString() - textMaxLineLength!!.text = String.format(resources.getString(R.string.format_percentage), (curveData.lineMaxLength * 100).toInt()) - textMinLineLength!!.text = String.format(resources.getString(R.string.format_percentage), (curveData.lineMinLength * 100).toInt()) - textSizeMultiplier!!.text = curveData.sizeMultiplier.toString() - textAnimationDuration!!.text = String.format(resources.getString(R.string.format_ms), curveData.duration) - textPrecision!!.text = String.format(resources.getString(R.string.format_points), curveData.precision) + textStrokeWidth.text = curveData.strokeWidth.toString() + textMaxLineLength.text = String.format(resources.getString(R.string.format_percentage), (curveData.lineMaxLength * 100).toInt()) + textMinLineLength.text = String.format(resources.getString(R.string.format_percentage), (curveData.lineMinLength * 100).toInt()) + textSizeMultiplier.text = curveData.sizeMultiplier.toString() + textAnimationDuration.text = String.format(resources.getString(R.string.format_ms), curveData.duration) + textPrecision.text = String.format(resources.getString(R.string.format_points), curveData.precision) } private fun invalidateView(baseCurveProgressView: BaseCurveProgressView?) { - if (baseCurveProgressView != null) { - baseCurveProgressView.precision = curveData.precision - baseCurveProgressView.strokeWidth = curveData.strokeWidth - baseCurveProgressView.lineMaxLength = curveData.lineMaxLength - baseCurveProgressView.lineMinLength = curveData.lineMinLength - baseCurveProgressView.duration = curveData.duration - baseCurveProgressView.hasHole = curveData.hasHole - baseCurveProgressView.color = curveData.color - baseCurveProgressView.sizeMultiplier = curveData.sizeMultiplier - - if (baseCurveProgressView is BaseRouletteProgressView) { - baseCurveProgressView.radiusFixed = curveData.radiusFixed - baseCurveProgressView.radiusMoving = curveData.radiusMoving - baseCurveProgressView.distanceFromCenter = curveData.distanceFromCenter - - baseCurveProgressView.numberOfCycles = curveData.numberOfCycles.toFloat() + baseCurveProgressView?.let { + it.precision = curveData.precision + it.strokeWidth = curveData.strokeWidth + it.lineMaxLength = curveData.lineMaxLength + it.lineMinLength = curveData.lineMinLength + it.duration = curveData.duration + it.hasHole = curveData.hasHole + it.color = curveData.color + it.sizeMultiplier = curveData.sizeMultiplier + + if (it is BaseRouletteProgressView) { + it.radiusFixed = curveData.radiusFixed + it.radiusMoving = curveData.radiusMoving + it.distanceFromCenter = curveData.distanceFromCenter + + it.numberOfCycles = curveData.numberOfCycles.toFloat() } } } diff --git a/sample/src/main/java/com/vlad1m1r/lemniscate/sample/MainActivity.kt b/sample/src/main/java/com/vlad1m1r/lemniscate/sample/MainActivity.kt index fb5de33..006670d 100644 --- a/sample/src/main/java/com/vlad1m1r/lemniscate/sample/MainActivity.kt +++ b/sample/src/main/java/com/vlad1m1r/lemniscate/sample/MainActivity.kt @@ -31,10 +31,9 @@ import android.view.MenuItem import com.vlad1m1r.lemniscate.base.BaseCurveProgressView import me.relex.circleindicator.CircleIndicator - +private const val NUM_PAGES = 11 class MainActivity : AppCompatActivity(), FragmentCurve.OnViewCreated { - private val NUM_PAGES = 11 private lateinit var fragmentSettings: FragmentSettings private lateinit var pager: ViewPager