mirror of
https://github.com/iSoron/uhabits.git
synced 2025-12-08 10:08:51 -06:00
Compare commits
15 Commits
404671546c
...
hiqua-patc
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a96b7f0fba | ||
|
|
f1a003fabf | ||
|
|
856a0726f7 | ||
|
|
df97b1fd4f | ||
| dc678e59df | |||
|
|
d95084500f | ||
|
6f7215b46f
|
|||
|
|
c423d2b3ca | ||
|
|
758fc56277 | ||
|
|
c7d1e92cae | ||
|
|
d24dcbf2ca | ||
|
|
579b33cc78 | ||
|
|
1a3e6315a1 | ||
|
|
7f4d06d15d | ||
|
|
b8033a6012 |
1
.github/workflows/main.yml
vendored
1
.github/workflows/main.yml
vendored
@@ -9,6 +9,7 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
Test:
|
Test:
|
||||||
runs-on: self-hosted
|
runs-on: self-hosted
|
||||||
|
timeout-minutes: 30
|
||||||
steps:
|
steps:
|
||||||
- name: Check out source code
|
- name: Check out source code
|
||||||
uses: actions/checkout@v1
|
uses: actions/checkout@v1
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
plugins {
|
plugins {
|
||||||
val kotlinVersion = "1.7.10"
|
val kotlinVersion = "1.7.21"
|
||||||
id("com.android.application") version ("7.3.0-rc01") apply (false)
|
id("com.android.application") version ("7.3.1") apply (false)
|
||||||
id("org.jetbrains.kotlin.android") version kotlinVersion apply (false)
|
id("org.jetbrains.kotlin.android") version kotlinVersion apply (false)
|
||||||
id("org.jetbrains.kotlin.kapt") version kotlinVersion apply (false)
|
id("org.jetbrains.kotlin.kapt") version kotlinVersion apply (false)
|
||||||
id("org.jetbrains.kotlin.android.extensions") version kotlinVersion apply (false)
|
id("org.jetbrains.kotlin.android.extensions") version kotlinVersion apply (false)
|
||||||
|
|||||||
@@ -80,11 +80,11 @@ android {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
val daggerVersion = "2.43.2"
|
val daggerVersion = "2.44.2"
|
||||||
val kotlinVersion = "1.7.10"
|
val kotlinVersion = "1.7.21"
|
||||||
val kxCoroutinesVersion = "1.6.4"
|
val kxCoroutinesVersion = "1.6.4"
|
||||||
val ktorVersion = "1.6.8"
|
val ktorVersion = "1.6.8"
|
||||||
val espressoVersion = "3.4.0"
|
val espressoVersion = "3.5.0"
|
||||||
|
|
||||||
androidTestImplementation("androidx.test.espresso:espresso-contrib:$espressoVersion")
|
androidTestImplementation("androidx.test.espresso:espresso-contrib:$espressoVersion")
|
||||||
androidTestImplementation("androidx.test.espresso:espresso-core:$espressoVersion")
|
androidTestImplementation("androidx.test.espresso:espresso-core:$espressoVersion")
|
||||||
@@ -92,10 +92,10 @@ dependencies {
|
|||||||
androidTestImplementation("com.linkedin.dexmaker:dexmaker-mockito:2.28.3")
|
androidTestImplementation("com.linkedin.dexmaker:dexmaker-mockito:2.28.3")
|
||||||
androidTestImplementation("io.ktor:ktor-client-mock:$ktorVersion")
|
androidTestImplementation("io.ktor:ktor-client-mock:$ktorVersion")
|
||||||
androidTestImplementation("io.ktor:ktor-jackson:$ktorVersion")
|
androidTestImplementation("io.ktor:ktor-jackson:$ktorVersion")
|
||||||
androidTestImplementation("androidx.annotation:annotation:1.4.0")
|
androidTestImplementation("androidx.annotation:annotation:1.5.0")
|
||||||
androidTestImplementation("androidx.test.ext:junit:1.1.3")
|
androidTestImplementation("androidx.test.ext:junit:1.1.4")
|
||||||
androidTestImplementation("androidx.test.uiautomator:uiautomator:2.2.0")
|
androidTestImplementation("androidx.test.uiautomator:uiautomator:2.2.0")
|
||||||
androidTestImplementation("androidx.test:rules:1.4.0")
|
androidTestImplementation("androidx.test:rules:1.5.0")
|
||||||
androidTestImplementation("com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0")
|
androidTestImplementation("com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0")
|
||||||
compileOnly("javax.annotation:jsr250-api:1.0")
|
compileOnly("javax.annotation:jsr250-api:1.0")
|
||||||
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.2.2")
|
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.2.2")
|
||||||
@@ -110,11 +110,11 @@ dependencies {
|
|||||||
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlinVersion")
|
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlinVersion")
|
||||||
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:$kxCoroutinesVersion")
|
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:$kxCoroutinesVersion")
|
||||||
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:$kxCoroutinesVersion")
|
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:$kxCoroutinesVersion")
|
||||||
implementation("androidx.appcompat:appcompat:1.5.0")
|
implementation("androidx.appcompat:appcompat:1.5.1")
|
||||||
implementation("androidx.legacy:legacy-preference-v14:1.0.0")
|
implementation("androidx.legacy:legacy-preference-v14:1.0.0")
|
||||||
implementation("androidx.legacy:legacy-support-v4:1.0.0")
|
implementation("androidx.legacy:legacy-support-v4:1.0.0")
|
||||||
implementation("com.google.android.material:material:1.6.1")
|
implementation("com.google.android.material:material:1.8.0")
|
||||||
implementation("com.opencsv:opencsv:5.6")
|
implementation("com.opencsv:opencsv:5.7.1")
|
||||||
implementation(project(":uhabits-core"))
|
implementation(project(":uhabits-core"))
|
||||||
kapt("com.google.dagger:dagger-compiler:$daggerVersion")
|
kapt("com.google.dagger:dagger-compiler:$daggerVersion")
|
||||||
kaptAndroidTest("com.google.dagger:dagger-compiler:$daggerVersion")
|
kaptAndroidTest("com.google.dagger:dagger-compiler:$daggerVersion")
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import android.app.backup.BackupManager
|
|||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.SharedPreferences
|
import android.content.SharedPreferences
|
||||||
import android.content.SharedPreferences.OnSharedPreferenceChangeListener
|
import android.content.SharedPreferences.OnSharedPreferenceChangeListener
|
||||||
|
import android.net.Uri
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.provider.Settings
|
import android.provider.Settings
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
@@ -43,6 +44,7 @@ import org.isoron.uhabits.core.utils.DateUtils.Companion.getLongWeekdayNames
|
|||||||
import org.isoron.uhabits.notifications.AndroidNotificationTray.Companion.createAndroidNotificationChannel
|
import org.isoron.uhabits.notifications.AndroidNotificationTray.Companion.createAndroidNotificationChannel
|
||||||
import org.isoron.uhabits.notifications.RingtoneManager
|
import org.isoron.uhabits.notifications.RingtoneManager
|
||||||
import org.isoron.uhabits.utils.StyledResources
|
import org.isoron.uhabits.utils.StyledResources
|
||||||
|
import org.isoron.uhabits.utils.startActivitySafely
|
||||||
import org.isoron.uhabits.widgets.WidgetUpdater
|
import org.isoron.uhabits.widgets.WidgetUpdater
|
||||||
import java.util.Calendar
|
import java.util.Calendar
|
||||||
|
|
||||||
@@ -92,16 +94,24 @@ class SettingsFragment : PreferenceFragmentCompat(), OnSharedPreferenceChangeLis
|
|||||||
|
|
||||||
override fun onPreferenceTreeClick(preference: Preference): Boolean {
|
override fun onPreferenceTreeClick(preference: Preference): Boolean {
|
||||||
val key = preference.key ?: return false
|
val key = preference.key ?: return false
|
||||||
if (key == "reminderSound") {
|
when (key) {
|
||||||
showRingtonePicker()
|
"reminderSound" -> {
|
||||||
return true
|
showRingtonePicker()
|
||||||
} else if (key == "reminderCustomize") {
|
return true
|
||||||
createAndroidNotificationChannel(requireContext())
|
}
|
||||||
val intent = Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS)
|
"reminderCustomize" -> {
|
||||||
intent.putExtra(Settings.EXTRA_APP_PACKAGE, requireContext().packageName)
|
createAndroidNotificationChannel(requireContext())
|
||||||
intent.putExtra(Settings.EXTRA_CHANNEL_ID, NotificationTray.REMINDERS_CHANNEL_ID)
|
val intent = Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS)
|
||||||
startActivity(intent)
|
intent.putExtra(Settings.EXTRA_APP_PACKAGE, requireContext().packageName)
|
||||||
return true
|
intent.putExtra(Settings.EXTRA_CHANNEL_ID, NotificationTray.REMINDERS_CHANNEL_ID)
|
||||||
|
startActivity(intent)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
"rateApp" -> {
|
||||||
|
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.playStoreURL)))
|
||||||
|
activity?.startActivitySafely(intent)
|
||||||
|
return true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return super.onPreferenceTreeClick(preference)
|
return super.onPreferenceTreeClick(preference)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,7 +33,8 @@ import org.isoron.uhabits.HabitsApplication
|
|||||||
import org.isoron.uhabits.R
|
import org.isoron.uhabits.R
|
||||||
import org.isoron.uhabits.activities.AndroidThemeSwitcher
|
import org.isoron.uhabits.activities.AndroidThemeSwitcher
|
||||||
import org.isoron.uhabits.core.models.Habit
|
import org.isoron.uhabits.core.models.Habit
|
||||||
import org.isoron.uhabits.core.ui.ThemeSwitcher.Companion.THEME_LIGHT
|
import org.isoron.uhabits.core.ui.views.DarkTheme
|
||||||
|
import org.isoron.uhabits.core.ui.views.LightTheme
|
||||||
import org.isoron.uhabits.receivers.ReminderController
|
import org.isoron.uhabits.receivers.ReminderController
|
||||||
import org.isoron.uhabits.utils.SystemUtils
|
import org.isoron.uhabits.utils.SystemUtils
|
||||||
import java.util.Calendar
|
import java.util.Calendar
|
||||||
@@ -51,11 +52,8 @@ class SnoozeDelayPickerActivity : FragmentActivity(), OnItemClickListener {
|
|||||||
val app = applicationContext as HabitsApplication
|
val app = applicationContext as HabitsApplication
|
||||||
val appComponent = app.component
|
val appComponent = app.component
|
||||||
val themeSwitcher = AndroidThemeSwitcher(this, appComponent.preferences)
|
val themeSwitcher = AndroidThemeSwitcher(this, appComponent.preferences)
|
||||||
if (themeSwitcher.getSystemTheme() == THEME_LIGHT) {
|
themeSwitcher.setTheme()
|
||||||
setTheme(R.style.BaseDialog)
|
|
||||||
} else {
|
|
||||||
setTheme(R.style.BaseDialogDark)
|
|
||||||
}
|
|
||||||
val data = intent.data
|
val data = intent.data
|
||||||
if (data == null) {
|
if (data == null) {
|
||||||
finish()
|
finish()
|
||||||
@@ -75,6 +73,16 @@ class SnoozeDelayPickerActivity : FragmentActivity(), OnItemClickListener {
|
|||||||
SystemUtils.unlockScreen(this)
|
SystemUtils.unlockScreen(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun AndroidThemeSwitcher.setTheme() {
|
||||||
|
if (this.isNightMode) {
|
||||||
|
setTheme(R.style.BaseDialogDark)
|
||||||
|
this.currentTheme = DarkTheme()
|
||||||
|
} else {
|
||||||
|
setTheme(R.style.BaseDialog)
|
||||||
|
this.currentTheme = LightTheme()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun showTimePicker() {
|
private fun showTimePicker() {
|
||||||
val calendar = Calendar.getInstance()
|
val calendar = Calendar.getInstance()
|
||||||
val dialog = TimePickerDialog.newInstance(
|
val dialog = TimePickerDialog.newInstance(
|
||||||
|
|||||||
@@ -160,11 +160,9 @@
|
|||||||
</Preference>
|
</Preference>
|
||||||
|
|
||||||
<Preference
|
<Preference
|
||||||
|
android:key="rateApp"
|
||||||
android:title="@string/pref_rate_this_app"
|
android:title="@string/pref_rate_this_app"
|
||||||
app:iconSpaceReserved="false">
|
app:iconSpaceReserved="false">
|
||||||
<intent
|
|
||||||
android:action="android.intent.action.VIEW"
|
|
||||||
android:data="@string/playStoreURL" />
|
|
||||||
</Preference>
|
</Preference>
|
||||||
|
|
||||||
<Preference
|
<Preference
|
||||||
|
|||||||
3
uhabits-core/assets/test/habitbull4.csv
Normal file
3
uhabits-core/assets/test/habitbull4.csv
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
HabitName,HabitDescription,HabitCategory,CalendarDate,Value,CommentText
|
||||||
|
Caffeine,,Coffee Consumption,2022-11-21,80,
|
||||||
|
Caffeine,,Coffee Consumption,2022-11-22,80,
|
||||||
|
@@ -43,13 +43,12 @@ kotlin {
|
|||||||
val jvmMain by getting {
|
val jvmMain by getting {
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation(kotlin("stdlib-jdk8"))
|
implementation(kotlin("stdlib-jdk8"))
|
||||||
compileOnly("com.google.dagger:dagger:2.43.2")
|
compileOnly("com.google.dagger:dagger:2.44.2")
|
||||||
implementation("com.google.guava:guava:31.1-android")
|
implementation("com.google.guava:guava:31.1-android")
|
||||||
implementation("org.jetbrains.kotlin:kotlin-stdlib:1.7.10")
|
|
||||||
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4")
|
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4")
|
||||||
implementation("androidx.annotation:annotation:1.4.0")
|
implementation("androidx.annotation:annotation:1.5.0")
|
||||||
implementation("com.google.code.findbugs:jsr305:3.0.2")
|
implementation("com.google.code.findbugs:jsr305:3.0.2")
|
||||||
implementation("com.opencsv:opencsv:5.6")
|
implementation("com.opencsv:opencsv:5.7.1")
|
||||||
implementation("commons-codec:commons-codec:1.15")
|
implementation("commons-codec:commons-codec:1.15")
|
||||||
implementation("org.apache.commons:commons-lang3:3.12.0")
|
implementation("org.apache.commons:commons-lang3:3.12.0")
|
||||||
}
|
}
|
||||||
@@ -59,7 +58,7 @@ kotlin {
|
|||||||
dependencies {
|
dependencies {
|
||||||
implementation(kotlin("test"))
|
implementation(kotlin("test"))
|
||||||
implementation(kotlin("test-junit"))
|
implementation(kotlin("test-junit"))
|
||||||
implementation("org.xerial:sqlite-jdbc:3.39.2.1")
|
implementation("org.xerial:sqlite-jdbc:3.40.0.0")
|
||||||
implementation("org.hamcrest:hamcrest:2.2")
|
implementation("org.hamcrest:hamcrest:2.2")
|
||||||
implementation("org.apache.commons:commons-io:1.3.2")
|
implementation("org.apache.commons:commons-io:1.3.2")
|
||||||
implementation("com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0")
|
implementation("com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0")
|
||||||
|
|||||||
@@ -86,10 +86,12 @@ class HabitBullCSVImporter
|
|||||||
logger.info("Found a value of $value, considering this habit as numerical.")
|
logger.info("Found a value of $value, considering this habit as numerical.")
|
||||||
h.type = HabitType.NUMERICAL
|
h.type = HabitType.NUMERICAL
|
||||||
}
|
}
|
||||||
h.originalEntries.add(Entry(timestamp, value, notes))
|
h.originalEntries.add(Entry(timestamp, value * 1000, notes))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
map.forEach { (_, habit) -> habit.recompute() }
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun parseTimestamp(rawValue: String): Timestamp {
|
private fun parseTimestamp(rawValue: String): Timestamp {
|
||||||
|
|||||||
@@ -85,8 +85,8 @@ class ImportTest : BaseUnitTest() {
|
|||||||
assertThat(habit.type, equalTo(HabitType.NUMERICAL))
|
assertThat(habit.type, equalTo(HabitType.NUMERICAL))
|
||||||
assertThat(habit.description, equalTo(""))
|
assertThat(habit.description, equalTo(""))
|
||||||
assertThat(habit.frequency, equalTo(Frequency.DAILY))
|
assertThat(habit.frequency, equalTo(Frequency.DAILY))
|
||||||
assertThat(getValue(habit, 2021, 9, 1), equalTo(30))
|
assertThat(getValue(habit, 2021, 9, 1), equalTo(30000))
|
||||||
assertThat(getValue(habit, 2022, 1, 8), equalTo(100))
|
assertThat(getValue(habit, 2022, 1, 8), equalTo(100000))
|
||||||
|
|
||||||
val habit2 = habitList.getByPosition(1)
|
val habit2 = habitList.getByPosition(1)
|
||||||
assertThat(habit2.name, equalTo("run"))
|
assertThat(habit2.name, equalTo("run"))
|
||||||
@@ -98,6 +98,21 @@ class ImportTest : BaseUnitTest() {
|
|||||||
assertTrue(isChecked(habit2, 2022, 1, 19))
|
assertTrue(isChecked(habit2, 2022, 1, 19))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Throws(IOException::class)
|
||||||
|
fun testHabitBullCSV4() {
|
||||||
|
importFromFile("habitbull4.csv")
|
||||||
|
assertThat(habitList.size(), equalTo(1))
|
||||||
|
|
||||||
|
val habit = habitList.getByPosition(0)
|
||||||
|
assertThat(habit.name, equalTo("Caffeine"))
|
||||||
|
assertThat(habit.type, equalTo(HabitType.NUMERICAL))
|
||||||
|
assertThat(habit.description, equalTo(""))
|
||||||
|
assertThat(habit.frequency, equalTo(Frequency.DAILY))
|
||||||
|
assertThat(getValue(habit, 2022, 11, 21), equalTo(80000))
|
||||||
|
assertThat(getValue(habit, 2022, 11, 22), equalTo(80000))
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@Throws(IOException::class)
|
@Throws(IOException::class)
|
||||||
fun testLoopDB() {
|
fun testLoopDB() {
|
||||||
|
|||||||
@@ -34,8 +34,8 @@ application {
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
val ktorVersion = "1.6.8"
|
val ktorVersion = "1.6.8"
|
||||||
val kotlinVersion = "1.7.10"
|
val kotlinVersion = "1.7.21"
|
||||||
val logbackVersion = "1.4.0"
|
val logbackVersion = "1.4.5"
|
||||||
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlinVersion")
|
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlinVersion")
|
||||||
implementation("io.ktor:ktor-server-netty:$ktorVersion")
|
implementation("io.ktor:ktor-server-netty:$ktorVersion")
|
||||||
implementation("ch.qos.logback:logback-classic:$logbackVersion")
|
implementation("ch.qos.logback:logback-classic:$logbackVersion")
|
||||||
|
|||||||
Reference in New Issue
Block a user