From f1c88797a3709f25580a3eed0a49009c62b21da6 Mon Sep 17 00:00:00 2001 From: Quentin Hibon Date: Thu, 21 Jan 2021 23:42:04 +0100 Subject: [PATCH] Clean up code after conversions --- .../org/isoron/uhabits/BaseAndroidTest.kt | 9 ++- .../isoron/uhabits/BaseUserInterfaceTest.kt | 4 +- .../java/org/isoron/uhabits/BaseViewTest.kt | 12 ++-- .../isoron/uhabits/HabitsApplicationTest.kt | 6 +- .../activities/common/views/ScoreChartTest.kt | 27 ++++----- .../habits/list/views/HintViewTest.kt | 9 +-- .../habits/show/views/ScoreCardViewTest.kt | 10 +--- .../uhabits/database/AndroidDatabaseTest.kt | 13 ++--- .../uhabits/widgets/CheckmarkWidgetTest.kt | 14 +++-- .../activities/AndroidThemeSwitcher.kt | 4 -- .../activities/common/views/ScoreChart.kt | 4 +- .../common/views/ScrollableChart.kt | 58 +++++++++---------- .../habits/list/views/HabitCardView.kt | 16 +---- .../habits/list/views/HeaderView.kt | 4 +- .../habits/list/views/NumberButtonView.kt | 22 ++++--- .../habits/show/views/ScoreCardView.kt | 2 +- .../isoron/uhabits/tasks/AndroidTaskRunner.kt | 1 - .../org/isoron/uhabits/widgets/ScoreWidget.kt | 2 +- .../isoron/uhabits/core/models/HabitList.kt | 16 +++-- .../core/models/memory/MemoryHabitList.kt | 22 +++---- .../core/models/memory/package-info.java | 23 -------- .../core/models/sqlite/package-info.java | 23 -------- .../isoron/uhabits/core/test/HabitFixtures.kt | 2 +- .../screens/habits/list/ListHabitsBehavior.kt | 9 ++- .../list/ListHabitsSelectionMenuBehavior.kt | 16 +++-- .../uhabits/core/database/RepositoryTest.kt | 41 +++++++------ 26 files changed, 152 insertions(+), 217 deletions(-) delete mode 100644 uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/memory/package-info.java delete mode 100644 uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/sqlite/package-info.java diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.kt b/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.kt index 76722b92e..ee7a1a332 100644 --- a/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.kt +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.kt @@ -27,8 +27,8 @@ import androidx.test.filters.MediumTest import androidx.test.platform.app.InstrumentationRegistry import androidx.test.uiautomator.UiDevice import junit.framework.TestCase -import org.hamcrest.CoreMatchers -import org.hamcrest.MatcherAssert +import org.hamcrest.CoreMatchers.hasItems +import org.hamcrest.MatcherAssert.assertThat import org.isoron.uhabits.core.models.HabitList import org.isoron.uhabits.core.models.ModelFactory import org.isoron.uhabits.core.models.Timestamp @@ -109,9 +109,9 @@ abstract class BaseAndroidTest : TestCase() { val manager = AppWidgetManager.getInstance(targetContext) val installedProviders: MutableList = LinkedList() for (info in manager.installedProviders) installedProviders.add(info.provider) - MatcherAssert.assertThat>( + assertThat>( installedProviders, - CoreMatchers.hasItems(provider) + hasItems(provider) ) } @@ -208,7 +208,6 @@ abstract class BaseAndroidTest : TestCase() { @Throws(Exception::class) fun restoreSystemTime() { - if (savedCalendar == null) throw NullPointerException() setSystemTime(savedCalendar) } diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseUserInterfaceTest.kt b/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseUserInterfaceTest.kt index 720d998a0..af7f503e3 100644 --- a/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseUserInterfaceTest.kt +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseUserInterfaceTest.kt @@ -99,8 +99,8 @@ open class BaseUserInterfaceTest { @Throws(Exception::class) protected fun rotateDevice() { - device!!.setOrientationLeft() - device!!.setOrientationNatural() + device.setOrientationLeft() + device.setOrientationNatural() } companion object { diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseViewTest.kt b/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseViewTest.kt index c5cd6c94c..bcec69dfa 100644 --- a/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseViewTest.kt +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseViewTest.kt @@ -34,12 +34,10 @@ import java.io.File import java.io.FileOutputStream import java.io.IOException import java.util.Random +import kotlin.math.abs open class BaseViewTest : BaseAndroidTest() { var similarityCutoff = 0.00018 - override fun setUp() { - super.setUp() - } @Throws(IOException::class) protected fun assertRenders(view: View, expectedImagePath: String) { @@ -134,10 +132,10 @@ open class BaseViewTest : BaseAndroidTest() { if (random.nextInt(4) != 0) continue val argb1 = colorToArgb(b1.getPixel(x, y)) val argb2 = colorToArgb(b2.getPixel(x, y)) - distance += Math.abs(argb1[0] - argb2[0]).toDouble() - distance += Math.abs(argb1[1] - argb2[1]).toDouble() - distance += Math.abs(argb1[2] - argb2[2]).toDouble() - distance += Math.abs(argb1[3] - argb2[3]).toDouble() + distance += abs(argb1[0] - argb2[0]).toDouble() + distance += abs(argb1[1] - argb2[1]).toDouble() + distance += abs(argb1[2] - argb2[2]).toDouble() + distance += abs(argb1[3] - argb2[3]).toDouble() } } distance /= 255.0 * 16 * b1.width * b1.height diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitsApplicationTest.kt b/uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitsApplicationTest.kt index f6996903f..4dfd13277 100644 --- a/uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitsApplicationTest.kt +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitsApplicationTest.kt @@ -20,8 +20,8 @@ package org.isoron.uhabits import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.MediumTest -import org.hamcrest.CoreMatchers -import org.hamcrest.MatcherAssert +import org.hamcrest.CoreMatchers.containsString +import org.hamcrest.MatcherAssert.assertThat import org.junit.Test import org.junit.runner.RunWith import java.io.IOException @@ -35,6 +35,6 @@ class HabitsApplicationTest : BaseAndroidTest() { val msg = "LOGCAT TEST" RuntimeException(msg).printStackTrace() val log = AndroidBugReporter(targetContext).getLogcat() - MatcherAssert.assertThat(log, CoreMatchers.containsString(msg)) + assertThat(log, containsString(msg)) } } diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/ScoreChartTest.kt b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/ScoreChartTest.kt index c4d1cbc87..bcd4a18dd 100644 --- a/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/ScoreChartTest.kt +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/ScoreChartTest.kt @@ -33,16 +33,17 @@ import org.junit.runner.RunWith class ScoreChartTest : BaseViewTest() { private lateinit var habit: Habit private lateinit var view: ScoreChart + @Before override fun setUp() { super.setUp() fixtures.purgeHabits(habitList) habit = fixtures.createLongHabit() - val (scores, bucketSize, _, color) = buildState(habit, prefs.firstWeekdayInt, 0) + val state = buildState(habit, prefs.firstWeekdayInt, 0) view = ScoreChart(targetContext).apply { - setScores(scores.toMutableList()) - setColor(color.toFixedAndroidColor()) - setBucketSize(bucketSize) + setScores(state.scores) + setColor(state.color.toFixedAndroidColor()) + setBucketSize(state.bucketSize) } measureView(view, dpToPixels(300), dpToPixels(200)) } @@ -71,12 +72,8 @@ class ScoreChartTest : BaseViewTest() { @Test @Throws(Throwable::class) fun testRender_withMonthlyBucket() { - val (scores, bucketSize) = buildState( - habit, - prefs.firstWeekdayInt, - 2 - ) - view.setScores(scores.toMutableList()) + val (scores, bucketSize) = buildState(habit, prefs.firstWeekdayInt, 2) + view.setScores(scores) view.setBucketSize(bucketSize) view.invalidate() assertRenders(view, BASE_PATH + "renderMonthly.png") @@ -92,13 +89,9 @@ class ScoreChartTest : BaseViewTest() { @Test @Throws(Throwable::class) fun testRender_withYearlyBucket() { - val (scores, bucketSize) = buildState( - habit, - prefs.firstWeekdayInt, - 4 - ) - view.setScores(scores.toMutableList()) - view.setBucketSize(bucketSize) + val state = buildState(habit, prefs.firstWeekdayInt, 4) + view.setScores(state.scores) + view.setBucketSize(state.bucketSize) view.invalidate() assertRenders(view, BASE_PATH + "renderYearly.png") } diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/HintViewTest.kt b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/HintViewTest.kt index 1ff4104bd..af1f30df8 100644 --- a/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/HintViewTest.kt +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/HintViewTest.kt @@ -23,8 +23,8 @@ import androidx.test.filters.MediumTest import com.nhaarman.mockitokotlin2.doReturn import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import org.hamcrest.CoreMatchers -import org.hamcrest.MatcherAssert +import org.hamcrest.CoreMatchers.equalTo +import org.hamcrest.MatcherAssert.assertThat import org.isoron.uhabits.BaseViewTest import org.isoron.uhabits.core.ui.screens.habits.list.HintList import org.junit.Before @@ -36,6 +36,7 @@ import org.junit.runner.RunWith class HintViewTest : BaseViewTest() { private lateinit var view: HintView private lateinit var list: HintList + @Before override fun setUp() { super.setUp() @@ -58,10 +59,10 @@ class HintViewTest : BaseViewTest() { @Test @Throws(Exception::class) fun testClick() { - MatcherAssert.assertThat(view.alpha, CoreMatchers.equalTo(1f)) + assertThat(view.alpha, equalTo(1f)) view.performClick() skipAnimation(view) - MatcherAssert.assertThat(view.alpha, CoreMatchers.equalTo(0f)) + assertThat(view.alpha, equalTo(0f)) } companion object { diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/ScoreCardViewTest.kt b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/ScoreCardViewTest.kt index 481748ffd..b695c3a7b 100644 --- a/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/ScoreCardViewTest.kt +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/ScoreCardViewTest.kt @@ -24,7 +24,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.MediumTest import org.isoron.uhabits.BaseViewTest import org.isoron.uhabits.R -import org.isoron.uhabits.core.ui.screens.habits.show.views.ScoreCardPresenter +import org.isoron.uhabits.core.ui.screens.habits.show.views.ScoreCardPresenter.Companion.buildState import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -43,13 +43,7 @@ class ScoreCardViewTest : BaseViewTest() { .from(targetContext) .inflate(R.layout.show_habit, null) .findViewById(R.id.scoreCard) as ScoreCardView - view.setState( - ScoreCardPresenter.buildState( - habit = habit, - firstWeekday = 0, - spinnerPosition = 0, - ) - ) + view.setState(buildState(habit = habit, firstWeekday = 0, spinnerPosition = 0)) measureView(view, 800f, 600f) } diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/database/AndroidDatabaseTest.kt b/uhabits-android/src/androidTest/java/org/isoron/uhabits/database/AndroidDatabaseTest.kt index 6fe668e3f..b58603789 100644 --- a/uhabits-android/src/androidTest/java/org/isoron/uhabits/database/AndroidDatabaseTest.kt +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/database/AndroidDatabaseTest.kt @@ -19,12 +19,11 @@ package org.isoron.uhabits.database import android.database.sqlite.SQLiteDatabase -import org.hamcrest.MatcherAssert -import org.hamcrest.core.IsEqual +import org.hamcrest.MatcherAssert.assertThat +import org.hamcrest.core.IsEqual.equalTo import org.isoron.uhabits.BaseAndroidTest import org.isoron.uhabits.core.database.Cursor import org.junit.Test -import java.util.HashMap class AndroidDatabaseTest : BaseAndroidTest() { private lateinit var db: AndroidDatabase @@ -37,13 +36,11 @@ class AndroidDatabaseTest : BaseAndroidTest() { @Test @Throws(Exception::class) fun testInsert() { - val map = HashMap() - map["name"] = "asd" - map["color"] = null + val map = mapOf(Pair("name", "asd"), Pair("color", null)) db.insert("test", map) val c: Cursor = db.query("select * from test") c.moveToNext() - assertNull(c.getInt(0)) - MatcherAssert.assertThat(c.getString(1), IsEqual.equalTo("asd")) + c.getInt(0)!! + assertThat(c.getString(1), equalTo("asd")) } } diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/CheckmarkWidgetTest.kt b/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/CheckmarkWidgetTest.kt index 0a5823bbf..b73c49c1b 100644 --- a/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/CheckmarkWidgetTest.kt +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/CheckmarkWidgetTest.kt @@ -24,7 +24,9 @@ import android.widget.FrameLayout import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.MediumTest import org.hamcrest.CoreMatchers -import org.hamcrest.MatcherAssert +import org.hamcrest.CoreMatchers.`is` +import org.hamcrest.CoreMatchers.equalTo +import org.hamcrest.MatcherAssert.assertThat import org.isoron.uhabits.BaseViewTest import org.isoron.uhabits.R import org.isoron.uhabits.core.models.Entry @@ -50,26 +52,26 @@ class CheckmarkWidgetTest : BaseViewTest() { entries = habit.computedEntries val widget = CheckmarkWidget(targetContext, 0, habit) view = convertToView(widget, 150, 200) - MatcherAssert.assertThat(entries.get(today).value, CoreMatchers.equalTo(Entry.YES_MANUAL)) + assertThat(entries.get(today).value, equalTo(Entry.YES_MANUAL)) } @Test @Throws(Exception::class) fun testClick() { val button = view.findViewById(R.id.button) as Button - MatcherAssert.assertThat( + assertThat( button, - CoreMatchers.`is`(CoreMatchers.not(CoreMatchers.nullValue())) + `is`(CoreMatchers.not(CoreMatchers.nullValue())) ) // A better test would be to capture the intent, but it doesn't seem // possible to capture intents sent to BroadcastReceivers. button.performClick() sleep(1000) - MatcherAssert.assertThat(entries.get(today).value, CoreMatchers.equalTo(Entry.SKIP)) + assertThat(entries.get(today).value, equalTo(Entry.SKIP)) button.performClick() sleep(1000) - MatcherAssert.assertThat(entries.get(today).value, CoreMatchers.equalTo(Entry.NO)) + assertThat(entries.get(today).value, equalTo(Entry.NO)) } @Test diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/AndroidThemeSwitcher.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/AndroidThemeSwitcher.kt index 262db7fda..855adaa84 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/AndroidThemeSwitcher.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/AndroidThemeSwitcher.kt @@ -53,10 +53,6 @@ constructor( } } - // override fun getCurrentTheme(): Theme { - // return currentTheme - // } - override fun applyDarkTheme() { currentTheme = DarkTheme() context.setTheme(R.style.AppBaseThemeDark) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/ScoreChart.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/ScoreChart.kt index 286f20216..3a53f0f8a 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/ScoreChart.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/ScoreChart.kt @@ -62,7 +62,7 @@ class ScoreChart : ScrollableChart { private var nColumns = 0 private var textColor = 0 private var gridColor = 0 - private var scores: MutableList? = null + private var scores: List? = null private var primaryColor = 0 @Deprecated("") @@ -113,7 +113,7 @@ class ScoreChart : ScrollableChart { postInvalidate() } - fun setScores(scores: MutableList) { + fun setScores(scores: List) { this.scores = scores postInvalidate() } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/ScrollableChart.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/ScrollableChart.kt index 113b37076..509acc067 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/ScrollableChart.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/ScrollableChart.kt @@ -37,10 +37,10 @@ abstract class ScrollableChart : View, GestureDetector.OnGestureListener, Animat private set private var scrollerBucketSize = 1 private var direction = 1 - private var detector: GestureDetector? = null - private var scroller: Scroller? = null - private var scrollAnimator: ValueAnimator? = null - private var scrollController: ScrollController? = null + private lateinit var detector: GestureDetector + private lateinit var scroller: Scroller + private lateinit var scrollAnimator: ValueAnimator + private lateinit var scrollController: ScrollController private var maxDataOffset = 10000 constructor(context: Context?) : super(context) { @@ -52,11 +52,11 @@ abstract class ScrollableChart : View, GestureDetector.OnGestureListener, Animat } override fun onAnimationUpdate(animation: ValueAnimator) { - if (!scroller!!.isFinished) { - scroller!!.computeScrollOffset() + if (!scroller.isFinished) { + scroller.computeScrollOffset() updateDataOffset() } else { - scrollAnimator!!.cancel() + scrollAnimator.cancel() } } @@ -70,9 +70,9 @@ abstract class ScrollableChart : View, GestureDetector.OnGestureListener, Animat velocityX: Float, velocityY: Float ): Boolean { - scroller!!.fling( - scroller!!.currX, - scroller!!.currY, + scroller.fling( + scroller.currX, + scroller.currY, direction * velocityX.toInt() / 2, 0, 0, @@ -81,13 +81,13 @@ abstract class ScrollableChart : View, GestureDetector.OnGestureListener, Animat 0 ) invalidate() - scrollAnimator!!.duration = scroller!!.duration.toLong() - scrollAnimator!!.start() + scrollAnimator.duration = scroller.duration.toLong() + scrollAnimator.start() return false } private val maxX: Int - private get() = maxDataOffset * scrollerBucketSize + get() = maxDataOffset * scrollerBucketSize public override fun onRestoreInstanceState(state: Parcelable) { if (state !is BundleSavedState) { @@ -99,16 +99,16 @@ abstract class ScrollableChart : View, GestureDetector.OnGestureListener, Animat direction = state.bundle.getInt("direction") dataOffset = state.bundle.getInt("dataOffset") maxDataOffset = state.bundle.getInt("maxDataOffset") - scroller!!.startScroll(0, 0, x, y, 0) - scroller!!.computeScrollOffset() + scroller.startScroll(0, 0, x, y, 0) + scroller.computeScrollOffset() super.onRestoreInstanceState(state.superState) } public override fun onSaveInstanceState(): Parcelable? { val superState = super.onSaveInstanceState() val bundle = Bundle().apply { - putInt("x", scroller!!.currX) - putInt("y", scroller!!.currY) + putInt("x", scroller.currX) + putInt("y", scroller.currY) putInt("dataOffset", dataOffset) putInt("direction", direction) putInt("maxDataOffset", maxDataOffset) @@ -124,15 +124,15 @@ abstract class ScrollableChart : View, GestureDetector.OnGestureListener, Animat parent?.requestDisallowInterceptTouchEvent(true) } dx *= -direction - dx = min(dx, (maxX - scroller!!.currX).toFloat()) - scroller!!.startScroll( - scroller!!.currX, - scroller!!.currY, + dx = min(dx, (maxX - scroller.currX).toFloat()) + scroller.startScroll( + scroller.currX, + scroller.currY, dx.toInt(), dy.toInt(), 0 ) - scroller!!.computeScrollOffset() + scroller.computeScrollOffset() updateDataOffset() return true } @@ -143,7 +143,7 @@ abstract class ScrollableChart : View, GestureDetector.OnGestureListener, Animat } override fun onTouchEvent(event: MotionEvent): Boolean { - return detector!!.onTouchEvent(event) + return detector.onTouchEvent(event) } fun setScrollDirection(direction: Int) { @@ -155,11 +155,11 @@ abstract class ScrollableChart : View, GestureDetector.OnGestureListener, Animat fun setMaxDataOffset(maxDataOffset: Int) { this.maxDataOffset = maxDataOffset dataOffset = min(dataOffset, maxDataOffset) - scrollController!!.onDataOffsetChanged(dataOffset) + scrollController.onDataOffsetChanged(dataOffset) postInvalidate() } - fun setScrollController(scrollController: ScrollController?) { + fun setScrollController(scrollController: ScrollController) { this.scrollController = scrollController } @@ -177,18 +177,18 @@ abstract class ScrollableChart : View, GestureDetector.OnGestureListener, Animat } fun reset() { - scroller!!.finalX = 0 - scroller!!.computeScrollOffset() + scroller.finalX = 0 + scroller.computeScrollOffset() updateDataOffset() } private fun updateDataOffset() { - var newDataOffset = scroller!!.currX / scrollerBucketSize + var newDataOffset = scroller.currX / scrollerBucketSize newDataOffset = max(0, newDataOffset) newDataOffset = min(maxDataOffset, newDataOffset) if (newDataOffset != dataOffset) { dataOffset = newDataOffset - scrollController!!.onDataOffsetChanged(dataOffset) + scrollController.onDataOffsetChanged(dataOffset) postInvalidate() } } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.kt index 26af7f3e9..21d81faaf 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.kt @@ -22,7 +22,6 @@ package org.isoron.uhabits.activities.habits.list.views import android.content.Context import android.graphics.text.LineBreaker.BREAK_STRATEGY_BALANCED import android.os.Build.VERSION.SDK_INT -import android.os.Build.VERSION_CODES.LOLLIPOP import android.os.Build.VERSION_CODES.M import android.os.Handler import android.os.Looper @@ -159,7 +158,7 @@ class HabitCardView( gravity = Gravity.CENTER_VERTICAL orientation = LinearLayout.HORIZONTAL layoutParams = LinearLayout.LayoutParams(MATCH_PARENT, WRAP_CONTENT) - if (SDK_INT >= LOLLIPOP) elevation = dp(1f) + elevation = dp(1f) addView(scoreRing) addView(label) @@ -167,8 +166,7 @@ class HabitCardView( addView(numberPanel) setOnTouchListener { v, event -> - if (SDK_INT >= LOLLIPOP) - v.background.setHotspot(event.x, event.y) + v.background.setHotspot(event.x, event.y) false } } @@ -247,7 +245,7 @@ class HabitCardView( private fun triggerRipple(x: Float, y: Float) { val background = innerFrame.background - if (SDK_INT >= LOLLIPOP) background.setHotspot(x, y) + background.setHotspot(x, y) background.state = intArrayOf( android.R.attr.state_pressed, android.R.attr.state_enabled @@ -256,14 +254,6 @@ class HabitCardView( } private fun updateBackground(isSelected: Boolean) { - if (SDK_INT < LOLLIPOP) { - val background = when (isSelected) { - true -> sres.getDrawable(R.attr.selectedBackground) - false -> sres.getDrawable(R.attr.cardBackground) - } - innerFrame.setBackgroundDrawable(background) - return - } val background = when (isSelected) { true -> R.drawable.selected_box diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HeaderView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HeaderView.kt index 2c46bb2b3..fc7edbba8 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HeaderView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HeaderView.kt @@ -25,8 +25,6 @@ import android.graphics.Color import android.graphics.Paint import android.graphics.RectF import android.graphics.Typeface -import android.os.Build.VERSION.SDK_INT -import android.os.Build.VERSION_CODES.LOLLIPOP import android.text.TextPaint import android.view.View.MeasureSpec.EXACTLY import org.isoron.uhabits.R @@ -60,7 +58,7 @@ class HeaderView( init { setScrollerBucketSize(dim(R.dimen.checkmarkWidth).toInt()) setBackgroundColor(sres.getColor(R.attr.headerBackgroundColor)) - if (SDK_INT >= LOLLIPOP) elevation = dp(2.0f) + elevation = dp(2.0f) } override fun atMidnight() { diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.kt index 2b38bf9e9..41f72c2b4 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.kt @@ -161,15 +161,19 @@ class NumberButtonView( val label: String val typeface: Typeface - if (value >= 0) { - label = value.toShortString() - typeface = BOLD_TYPEFACE - } else if (preferences.areQuestionMarksEnabled()) { - label = resources.getString(R.string.fa_question) - typeface = getFontAwesome() - } else { - label = "0" - typeface = BOLD_TYPEFACE + when { + value >= 0 -> { + label = value.toShortString() + typeface = BOLD_TYPEFACE + } + preferences.areQuestionMarksEnabled() -> { + label = resources.getString(R.string.fa_question) + typeface = getFontAwesome() + } + else -> { + label = "0" + typeface = BOLD_TYPEFACE + } } pBold.color = activeColor diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/ScoreCardView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/ScoreCardView.kt index fb28bc055..e5c740574 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/ScoreCardView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/ScoreCardView.kt @@ -36,7 +36,7 @@ class ScoreCardView(context: Context, attrs: AttributeSet) : LinearLayout(contex val androidColor = state.color.toThemedAndroidColor(context) binding.title.setTextColor(androidColor) binding.spinner.setSelection(state.spinnerPosition) - binding.scoreView.setScores(state.scores.toMutableList()) + binding.scoreView.setScores(state.scores) binding.scoreView.reset() binding.scoreView.setBucketSize(state.bucketSize) binding.scoreView.setColor(androidColor) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/tasks/AndroidTaskRunner.kt b/uhabits-android/src/main/java/org/isoron/uhabits/tasks/AndroidTaskRunner.kt index f2f519ca0..aa96604c2 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/tasks/AndroidTaskRunner.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/tasks/AndroidTaskRunner.kt @@ -75,7 +75,6 @@ class AndroidTaskRunner : TaskRunner { } override fun onPreExecute() { - // isCancelled = task.isCanceled if (isCancelled) return for (l in listeners) l.onTaskStarted(task) activeTasks.add(this) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/widgets/ScoreWidget.kt b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/ScoreWidget.kt index 45d78e9f2..4beeed281 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/widgets/ScoreWidget.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/ScoreWidget.kt @@ -52,7 +52,7 @@ class ScoreWidget( setIsTransparencyEnabled(true) setBucketSize(viewModel.bucketSize) setColor(habit.color.toThemedAndroidColor(context)) - setScores(viewModel.scores.toMutableList()) + setScores(viewModel.scores) } } diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitList.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitList.kt index 571360e19..69b738dda 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitList.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/HabitList.kt @@ -30,13 +30,13 @@ import javax.annotation.concurrent.ThreadSafe @ThreadSafe abstract class HabitList : Iterable { val observable: ModelObservable + @JvmField protected val filter: HabitMatcher /** * Creates a new HabitList. * - * * Depending on the implementation, this list can either be empty or be * populated by some pre-existing habits, for example, from a certain * database. @@ -54,7 +54,6 @@ abstract class HabitList : Iterable { /** * Inserts a new habit in the list. * - * * If the id of the habit is null, the list will assign it a new id, which * is guaranteed to be unique in the scope of the list. If id is not null, * the caller should make sure that the list does not already contain @@ -115,7 +114,6 @@ abstract class HabitList : Iterable { /** * Removes the given habit from the list. * - * * If the given habit is not in the list, does nothing. * * @param h the habit to be removed. @@ -151,7 +149,6 @@ abstract class HabitList : Iterable { /** * Notifies the list that a certain list of habits has been modified. * - * * Depending on the implementation, this operation might trigger a write to * disk, or do nothing at all. To make sure that the habits get persisted, * this operation must be called. @@ -163,7 +160,6 @@ abstract class HabitList : Iterable { /** * Notifies the list that a certain habit has been modified. * - * * See [.update] for more details. * * @param habit the habit that has been modified. @@ -212,6 +208,14 @@ abstract class HabitList : Iterable { abstract fun resort() enum class Order { - BY_NAME_ASC, BY_NAME_DESC, BY_COLOR_ASC, BY_COLOR_DESC, BY_SCORE_ASC, BY_SCORE_DESC, BY_STATUS_ASC, BY_STATUS_DESC, BY_POSITION + BY_NAME_ASC, + BY_NAME_DESC, + BY_COLOR_ASC, + BY_COLOR_DESC, + BY_SCORE_ASC, + BY_SCORE_DESC, + BY_STATUS_ASC, + BY_STATUS_DESC, + BY_POSITION } } diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/memory/MemoryHabitList.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/memory/MemoryHabitList.kt index 129d4971a..6e6bace1a 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/memory/MemoryHabitList.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/memory/MemoryHabitList.kt @@ -151,16 +151,18 @@ class MemoryHabitList : HabitList { } val statusComparatorAsc = Comparator { h1: Habit, h2: Habit -> statusComparatorDesc.compare(h2, h1) } - if (order === Order.BY_POSITION) return positionComparator - if (order === Order.BY_NAME_ASC) return nameComparatorAsc - if (order === Order.BY_NAME_DESC) return nameComparatorDesc - if (order === Order.BY_COLOR_ASC) return colorComparatorAsc - if (order === Order.BY_COLOR_DESC) return colorComparatorDesc - if (order === Order.BY_SCORE_DESC) return scoreComparatorDesc - if (order === Order.BY_SCORE_ASC) return scoreComparatorAsc - if (order === Order.BY_STATUS_DESC) return statusComparatorDesc - if (order === Order.BY_STATUS_ASC) return statusComparatorAsc - throw IllegalStateException() + return when { + order === Order.BY_POSITION -> positionComparator + order === Order.BY_NAME_ASC -> nameComparatorAsc + order === Order.BY_NAME_DESC -> nameComparatorDesc + order === Order.BY_COLOR_ASC -> colorComparatorAsc + order === Order.BY_COLOR_DESC -> colorComparatorDesc + order === Order.BY_SCORE_DESC -> scoreComparatorDesc + order === Order.BY_SCORE_ASC -> scoreComparatorAsc + order === Order.BY_STATUS_DESC -> statusComparatorDesc + order === Order.BY_STATUS_ASC -> statusComparatorAsc + else -> throw IllegalStateException() + } } @Synchronized diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/memory/package-info.java b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/memory/package-info.java deleted file mode 100644 index 53f4766ab..000000000 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/memory/package-info.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (C) 2016-2021 Álinson Santos Xavier - * - * This file is part of Loop Habit Tracker. - * - * Loop Habit Tracker is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by the - * Free Software Foundation, either version 3 of the License, or (at your - * option) any later version. - * - * Loop Habit Tracker is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -/** - * Provides in-memory implementation of core models. - */ -package org.isoron.uhabits.core.models.memory; \ No newline at end of file diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/sqlite/package-info.java b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/sqlite/package-info.java deleted file mode 100644 index bc872132d..000000000 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/models/sqlite/package-info.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (C) 2016-2021 Álinson Santos Xavier - * - * This file is part of Loop Habit Tracker. - * - * Loop Habit Tracker is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by the - * Free Software Foundation, either version 3 of the License, or (at your - * option) any later version. - * - * Loop Habit Tracker is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see . - */ - -/** - * Provides SQLite implementations of the core models. - */ -package org.isoron.uhabits.core.models.sqlite; \ No newline at end of file diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/test/HabitFixtures.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/test/HabitFixtures.kt index 86eaa122e..fca65af71 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/test/HabitFixtures.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/test/HabitFixtures.kt @@ -29,7 +29,7 @@ import org.isoron.uhabits.core.models.sqlite.SQLiteEntryList import org.isoron.uhabits.core.utils.DateUtils.Companion.getToday class HabitFixtures(private val modelFactory: ModelFactory, private val habitList: HabitList) { - var NON_DAILY_HABIT_CHECKS = booleanArrayOf( + private var NON_DAILY_HABIT_CHECKS = booleanArrayOf( true, false, false, true, true, true, false, false, true, true ) diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehavior.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehavior.kt index 515ec6343..9877e8ad4 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehavior.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehavior.kt @@ -123,7 +123,14 @@ open class ListHabitsBehavior @Inject constructor( } enum class Message { - COULD_NOT_EXPORT, IMPORT_SUCCESSFUL, IMPORT_FAILED, DATABASE_REPAIRED, COULD_NOT_GENERATE_BUG_REPORT, FILE_NOT_RECOGNIZED, SYNC_ENABLED, SYNC_KEY_ALREADY_INSTALLED + COULD_NOT_EXPORT, + IMPORT_SUCCESSFUL, + IMPORT_FAILED, + DATABASE_REPAIRED, + COULD_NOT_GENERATE_BUG_REPORT, + FILE_NOT_RECOGNIZED, + SYNC_ENABLED, + SYNC_KEY_ALREADY_INSTALLED } interface BugReporter { diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsSelectionMenuBehavior.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsSelectionMenuBehavior.kt index ebd033480..cc43ecba4 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsSelectionMenuBehavior.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsSelectionMenuBehavior.kt @@ -37,7 +37,7 @@ class ListHabitsSelectionMenuBehavior @Inject constructor( var commandRunner: CommandRunner ) { fun canArchive(): Boolean { - for ((_, _, _, _, isArchived) in adapter.selected) if (isArchived) return false + for (habit in adapter.selected) if (habit.isArchived) return false return true } @@ -46,7 +46,7 @@ class ListHabitsSelectionMenuBehavior @Inject constructor( } fun canUnarchive(): Boolean { - for ((_, _, _, _, isArchived) in adapter.selected) if (!isArchived) return false + for (habit in adapter.selected) if (!habit.isArchived) return false return true } @@ -56,23 +56,21 @@ class ListHabitsSelectionMenuBehavior @Inject constructor( } fun onChangeColor() { - val selected = adapter.selected - val (color) = selected[0] + val (color) = adapter.selected[0] screen.showColorPicker(color) { selectedColor: PaletteColor -> - commandRunner.run(ChangeHabitColorCommand(habitList, selected, selectedColor)) + commandRunner.run(ChangeHabitColorCommand(habitList, adapter.selected, selectedColor)) adapter.clearSelection() } } fun onDeleteHabits() { - val selected = adapter.selected screen.showDeleteConfirmationScreen( { - adapter.performRemove(selected) - commandRunner.run(DeleteHabitsCommand(habitList, selected)) + adapter.performRemove(adapter.selected) + commandRunner.run(DeleteHabitsCommand(habitList, adapter.selected)) adapter.clearSelection() }, - selected.size + adapter.selected.size ) } diff --git a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/database/RepositoryTest.kt b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/database/RepositoryTest.kt index c07e0bf9a..30c79d700 100644 --- a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/database/RepositoryTest.kt +++ b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/database/RepositoryTest.kt @@ -18,19 +18,20 @@ */ package org.isoron.uhabits.core.database +import junit.framework.Assert.assertNull import org.apache.commons.lang3.builder.EqualsBuilder import org.apache.commons.lang3.builder.HashCodeBuilder import org.apache.commons.lang3.builder.ToStringBuilder -import org.hamcrest.MatcherAssert -import org.hamcrest.core.IsEqual +import org.hamcrest.MatcherAssert.assertThat +import org.hamcrest.core.IsEqual.equalTo import org.isoron.uhabits.core.BaseUnitTest -import org.junit.Assert import org.junit.Before import org.junit.Test class RepositoryTest : BaseUnitTest() { private lateinit var repository: Repository private lateinit var db: Database + @Before @Throws(Exception::class) override fun setUp() { @@ -54,11 +55,10 @@ class RepositoryTest : BaseUnitTest() { "values (10, 20, 'hello', 8.0)" ) val record = repository.find(10L) - Assert.assertNotNull(record) - MatcherAssert.assertThat(record!!.id, IsEqual.equalTo(10L)) - MatcherAssert.assertThat(record.color, IsEqual.equalTo(20)) - MatcherAssert.assertThat(record.name, IsEqual.equalTo("hello")) - MatcherAssert.assertThat(record.score, IsEqual.equalTo(8.0)) + assertThat(record!!.id, equalTo(10L)) + assertThat(record.color, equalTo(20)) + assertThat(record.name, equalTo("hello")) + assertThat(record.score, equalTo(8.0)) } @Test @@ -71,11 +71,11 @@ class RepositoryTest : BaseUnitTest() { score = 5.0 } repository.save(record) - MatcherAssert.assertThat(record, IsEqual.equalTo(repository.find(50L))) + assertThat(record, equalTo(repository.find(50L))) record.name = "world" record.score = 128.0 repository.save(record) - MatcherAssert.assertThat(record, IsEqual.equalTo(repository.find(50L))) + assertThat(record, equalTo(repository.find(50L))) } @Test @@ -88,9 +88,8 @@ class RepositoryTest : BaseUnitTest() { } repository.save(record) val retrieved = repository.find(record.id!!) - Assert.assertNotNull(retrieved) - Assert.assertNull(retrieved!!.name) - MatcherAssert.assertThat(record, IsEqual.equalTo(retrieved)) + assertNull(retrieved!!.name) + assertThat(record, equalTo(retrieved)) } @Test @@ -108,8 +107,8 @@ class RepositoryTest : BaseUnitTest() { score = 2.0 } repository.save(r2) - MatcherAssert.assertThat(r1.id, IsEqual.equalTo(1L)) - MatcherAssert.assertThat(r2.id, IsEqual.equalTo(2L)) + assertThat(r1.id, equalTo(1L)) + assertThat(r2.id, equalTo(2L)) } @Test @@ -128,14 +127,14 @@ class RepositoryTest : BaseUnitTest() { } repository.save(rec2) val id = rec1.id!! - MatcherAssert.assertThat(rec1, IsEqual.equalTo(repository.find(id))) - MatcherAssert.assertThat(rec2, IsEqual.equalTo(repository.find(rec2.id!!))) + assertThat(rec1, equalTo(repository.find(id))) + assertThat(rec2, equalTo(repository.find(rec2.id!!))) repository.remove(rec1) - MatcherAssert.assertThat(rec1.id, IsEqual.equalTo(null)) - Assert.assertNull(repository.find(id)) - MatcherAssert.assertThat(rec2, IsEqual.equalTo(repository.find(rec2.id!!))) + assertThat(rec1.id, equalTo(null)) + assertNull(repository.find(id)) + assertThat(rec2, equalTo(repository.find(rec2.id!!))) repository.remove(rec1) // should have no effect - Assert.assertNull(repository.find(id)) + assertNull(repository.find(id)) } @Table(name = "tests")