From 5b23a3f960a28cc2683ffc06a4a7da7bb720b116 Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Thu, 12 May 2022 17:39:15 -0500 Subject: [PATCH 01/19] Bump version to 2.1.0 --- uhabits-android/build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/uhabits-android/build.gradle.kts b/uhabits-android/build.gradle.kts index 2849d9df7..6bb541b0e 100644 --- a/uhabits-android/build.gradle.kts +++ b/uhabits-android/build.gradle.kts @@ -35,8 +35,8 @@ android { compileSdk = 31 defaultConfig { - versionCode = 20003 - versionName = "2.0.3" + versionCode = 20100 + versionName = "2.1.0" minSdk = 23 targetSdk = 31 applicationId = "org.isoron.uhabits" From 9609bee0f7ed1ef15c2ab92da11149be02bc5dc5 Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Thu, 12 May 2022 18:20:49 -0500 Subject: [PATCH 02/19] Update CHANGELOG and list of developers --- CHANGELOG.md | 34 +++++++++++++++++++ uhabits-android/src/main/res/layout/about.xml | 6 ++-- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f2e30097..19fd9106c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,39 @@ # Changelog +## [2.1.0] -- Unreleased +### Added +- Allow user to add notes to specific dates (@vbh, #1103) +- Allow user to track "at most" numerical habits (@KristianTashkov, #1101) +- Allow user to add skips to measurable habits (@kalina559, #1319) +- Bring back custom frequencies (x times in y days) (@hiqua, #1079) +- Improve number picker (@hiqua, @iSoron, #1082, #1370) +- Add new checkmark state picker (@iSoron, #1370) +- Allow user to import numerical habits from HabitBull (@hiqua, #1278) + +### Removed +- Hide snooze button Android 12 notifications (@hiqua, #1226) +- Remove preference to set LED lights (@iSoron) + +### Changed +- Hide failed habits along with completed ones (@hiqua, #1052) +- Cycle through all checkmark states when toggling (@iSoron) +- Add delay after toggling a habit (@hiqua, @kalina559, #1147) +- Small theme improvements (@KristianTashkov, #1113) +- Left-align habit notes (@iSoron) + +### Fixed +- Fix small dialog buttons (@kalina559, #1096) +- Fix invalid CSV files (@hiqua, #1177) +- Fix small issues in calendar chart (@kalina559, #1314) +- Resort habit list after edit (@hiqua, #1350) + +### Refactoring & Testing +- Replace raster icons by vector assets (@kalina559) +- Remove JVM dependencies from uhabits-core module (@sgallese) +- Add various missing tests (@sgallese) +- Upgrade project dependencies (@hiqua, @sgallese) +- Increase target SDK to 31 (@hiqua) + ## [2.0.3] - 2021-08-21 ### Fixed - Improve automatic checkmarks for monthly habits (@iSoron, #947) diff --git a/uhabits-android/src/main/res/layout/about.xml b/uhabits-android/src/main/res/layout/about.xml index b995d428c..3eb152757 100644 --- a/uhabits-android/src/main/res/layout/about.xml +++ b/uhabits-android/src/main/res/layout/about.xml @@ -123,11 +123,11 @@ - + - + - + From 53e7ef29189cda371a8d182a8c1b6d76ce945c68 Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Fri, 13 May 2022 08:11:54 -0500 Subject: [PATCH 03/19] LoopDBImporter: Improve performance; silence snackbar messages --- .../isoron/uhabits/core/io/LoopDBImporter.kt | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/LoopDBImporter.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/LoopDBImporter.kt index 918c2084d..69a7b956a 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/LoopDBImporter.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/io/LoopDBImporter.kt @@ -20,14 +20,13 @@ package org.isoron.uhabits.core.io import org.isoron.uhabits.core.AppScope import org.isoron.uhabits.core.DATABASE_VERSION -import org.isoron.uhabits.core.commands.Command import org.isoron.uhabits.core.commands.CommandRunner import org.isoron.uhabits.core.commands.CreateHabitCommand -import org.isoron.uhabits.core.commands.CreateRepetitionCommand import org.isoron.uhabits.core.commands.EditHabitCommand import org.isoron.uhabits.core.database.DatabaseOpener import org.isoron.uhabits.core.database.MigrationHelper import org.isoron.uhabits.core.database.Repository +import org.isoron.uhabits.core.models.Entry import org.isoron.uhabits.core.models.HabitList import org.isoron.uhabits.core.models.ModelFactory import org.isoron.uhabits.core.models.Timestamp @@ -81,34 +80,33 @@ class LoopDBImporter var habit = habitList.getByUUID(habitRecord.uuid) val entryRecords = entryRepository.findAll("where habit = ?", habitRecord.id.toString()) - var command: Command if (habit == null) { habit = modelFactory.buildHabit() habitRecord.id = null habitRecord.copyTo(habit) - command = CreateHabitCommand(modelFactory, habitList, habit) - command.run() + CreateHabitCommand(modelFactory, habitList, habit).run() } else { val modified = modelFactory.buildHabit() habitRecord.id = habit.id habitRecord.copyTo(modified) - command = EditHabitCommand(habitList, habit.id!!, modified) - command.run() + EditHabitCommand(habitList, habit.id!!, modified).run() } // Reload saved version of the habit - habit = habitList.getByUUID(habitRecord.uuid) + habit = habitList.getByUUID(habitRecord.uuid)!! + val entries = habit.originalEntries + // Import entries for (r in entryRecords) { val t = Timestamp(r.timestamp!!) - val (_, value, notes) = habit!!.originalEntries.get(t) - val oldNotes = r.notes ?: "" - if (value != r.value || notes != oldNotes) CreateRepetitionCommand(habitList, habit, t, r.value!!, oldNotes).run() + val (_, value, notes) = entries.get(t) + if (value != r.value || notes != r.notes) { + entries.add(Entry(t, r.value!!, r.notes ?: "")) + } } - - runner.notifyListeners(command) + habit.recompute() } - + habitList.resort() db.close() } } From cc03c4864890790eef346dde1d9883bf412094a3 Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Fri, 13 May 2022 09:53:27 -0500 Subject: [PATCH 04/19] TargetCard: Make target more accurate for non-daily habits --- .../screens/habits/show/views/TargetCard.kt | 40 ++++++++++++++++--- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/TargetCard.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/TargetCard.kt index 9b8add0dc..afc7c635c 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/TargetCard.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/show/views/TargetCard.kt @@ -27,6 +27,7 @@ import org.isoron.uhabits.core.ui.views.Theme import org.isoron.uhabits.core.utils.DateUtils import java.util.ArrayList import java.util.Calendar +import kotlin.math.max data class TargetCardState( val color: PaletteColor, @@ -96,15 +97,44 @@ class TargetCardPresenter { val cal = DateUtils.getStartOfTodayCalendarWithOffset() val daysInMonth = cal.getActualMaximum(Calendar.DAY_OF_MONTH) + val daysInWeek = 7 val daysInQuarter = 91 val daysInYear = cal.getActualMaximum(Calendar.DAY_OF_YEAR) + val weeksInMonth = daysInMonth / 7 + val weeksInQuarter = 13 + val weeksInYear = 52 + val monthsInQuarter = 3 + val monthsInYear = 12 + val denominator = habit.frequency.denominator val dailyTarget = habit.targetValue / habit.frequency.denominator - val targetToday = dailyTarget * (1 - skippedDayToday) - val targetThisWeek = dailyTarget * (7 - skippedDaysThisWeek) - val targetThisMonth = dailyTarget * (daysInMonth - skippedDaysThisMonth) - val targetThisQuarter = dailyTarget * (daysInQuarter - skippedDaysThisQuarter) - val targetThisYear = dailyTarget * (daysInYear - skippedDaysThisYear) + + var targetToday = dailyTarget + var targetThisWeek = when (denominator) { + 7 -> habit.targetValue + else -> dailyTarget * daysInWeek + } + var targetThisMonth = when (denominator) { + 30 -> habit.targetValue + 7 -> habit.targetValue * weeksInMonth + else -> dailyTarget * daysInMonth + } + var targetThisQuarter = when (denominator) { + 30 -> habit.targetValue * monthsInQuarter + 7 -> habit.targetValue * weeksInQuarter + else -> dailyTarget * daysInQuarter + } + var targetThisYear = when (denominator) { + 30 -> habit.targetValue * monthsInYear + 7 -> habit.targetValue * weeksInYear + else -> dailyTarget * daysInYear + } + + targetToday = max(0.0, targetToday - dailyTarget * skippedDayToday) + targetThisWeek = max(0.0, targetThisWeek - dailyTarget * skippedDaysThisWeek) + targetThisMonth = max(0.0, targetThisMonth - dailyTarget * skippedDaysThisMonth) + targetThisQuarter = max(0.0, targetThisQuarter - dailyTarget * skippedDaysThisQuarter) + targetThisYear = max(0.0, targetThisYear - dailyTarget * skippedDaysThisYear) val values = ArrayList() if (habit.frequency.denominator <= 1) values.add(valueToday / 1e3) From 0b256cb2c0bc951a427d9fe7c8addf7a5d820641 Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Fri, 13 May 2022 11:19:05 -0500 Subject: [PATCH 05/19] GitHub Actions: Enable API 30, 31; drop some older ones --- .github/workflows/main.yml | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index a428987f0..f3858d848 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -34,15 +34,11 @@ jobs: strategy: matrix: api: [ - 23, - 24, 25, - 26, 27, 28, - # 29, # Crashes constantly, see: https://issuetracker.google.com/issues/159732638 - # 30, # Not available yet - # 31, # Not available yet + 30, + 31, ] steps: From 0c292d1eaa4c82c9a13c3d1609c751fec6c93d86 Mon Sep 17 00:00:00 2001 From: Quentin Hibon Date: Sun, 12 Dec 2021 23:45:09 +0100 Subject: [PATCH 06/19] Make some rendering tests more tolerant --- .../uhabits/activities/habits/list/views/EmptyListViewTest.kt | 4 ++++ .../java/org/isoron/uhabits/widgets/TargetWidgetTest.kt | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/EmptyListViewTest.kt b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/EmptyListViewTest.kt index fec68b7e0..ac133ec7d 100644 --- a/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/EmptyListViewTest.kt +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/EmptyListViewTest.kt @@ -29,6 +29,10 @@ import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) @MediumTest class EmptyListViewTest : BaseViewTest() { + init { + // TODO: fix rendering differences across APIs + similarityCutoff = 0.00035 + } private val path = "habits/list/EmptyListView" private val view: EmptyListView = EmptyListView(targetContext) diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/TargetWidgetTest.kt b/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/TargetWidgetTest.kt index 41477c0ae..58950eb4e 100644 --- a/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/TargetWidgetTest.kt +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/TargetWidgetTest.kt @@ -32,6 +32,10 @@ import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) @MediumTest class TargetWidgetTest : BaseViewTest() { + init { + // TODO: fix rendering differences across APIs + similarityCutoff = 0.00025 + } private lateinit var habit: Habit private lateinit var view: FrameLayout override fun setUp() { From 3490cd183aa38b6b520f60822465cb49be923c36 Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Sat, 14 May 2022 07:43:25 -0500 Subject: [PATCH 07/19] GitHub Actions: Re-run only failed tests; warn about slow tests --- .github/workflows/main.yml | 5 +++- build.sh | 31 +++++++++++--------- tools/parseInstrument.py | 58 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 80 insertions(+), 14 deletions(-) create mode 100755 tools/parseInstrument.py diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index f3858d848..929a216ed 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -51,10 +51,13 @@ jobs: name: uhabits-android path: uhabits-android/build/outputs/ - - name: Install flock + - name: Install Linux utils run: | brew install util-linux + brew unlink parallel + brew install moreutils echo "/usr/local/opt/util-linux/bin" >> $GITHUB_PATH + echo "/usr/local/opt/moreutils/bin" >> $GITHUB_PATH - name: Run Android Tests run: ./build.sh android-tests ${{ matrix.api }} diff --git a/build.sh b/build.sh index b865429de..4f17ec653 100755 --- a/build.sh +++ b/build.sh @@ -122,14 +122,25 @@ android_test() { $ADB install -r ${ANDROID_OUTPUTS_DIR}/apk/androidTest/debug/uhabits-android-debug-androidTest.apk || return 1 for size in medium large; do - log_info "Running $size instrumented tests..." OUT_INSTRUMENT=${ANDROID_OUTPUTS_DIR}/instrument-${API}.txt OUT_LOGCAT=${ANDROID_OUTPUTS_DIR}/logcat-${API}.txt - $ADB shell am instrument \ - -r -e coverage true -e size $size \ - -w ${PACKAGE_NAME}.test/androidx.test.runner.AndroidJUnitRunner \ - | tee $OUT_INSTRUMENT - if grep "\(INSTRUMENTATION_STATUS_CODE.*-1\|FAILURES\|ABORTED\|onError\|Error type\|crashed\)" $OUT_INSTRUMENT; then + FAILED_TESTS="" + for i in {1..5}; do + log_info "Running $size instrumented tests (attempt $i)..." + $ADB shell am instrument \ + -r -e coverage true -e size "$size" $FAILED_TESTS \ + -w ${PACKAGE_NAME}.test/androidx.test.runner.AndroidJUnitRunner \ + | ts "%.s" | tee "$OUT_INSTRUMENT" + + FAILED_TESTS=$(tools/parseInstrument.py "$OUT_INSTRUMENT") + SUCCESS=$? + if [ $SUCCESS -eq 0 ]; then + log_info "$size tests passed." + break + fi + done + + if [ $SUCCESS -ne 0 ]; then log_error "Some $size instrumented tests failed." log_error "Saving logcat: $OUT_LOGCAT..." $ADB logcat -d > $OUT_LOGCAT @@ -138,7 +149,6 @@ android_test() { $ADB shell rm -r /sdcard/Android/data/${PACKAGE_NAME}/files/test-screenshots/ return 1 fi - log_info "$size tests passed." done return 0 @@ -276,12 +286,7 @@ main() { _print_usage exit 1 fi - for attempt in {1..5}; do - log_info "Running Android tests (attempt $attempt)..." - android_test $1 && return 0 - done - log_error "Maximum number of attempts reached. Failing." - return 1 + android_test $1 ;; android-tests-parallel) shift; _parse_opts "$@" diff --git a/tools/parseInstrument.py b/tools/parseInstrument.py new file mode 100755 index 000000000..da424d1e4 --- /dev/null +++ b/tools/parseInstrument.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python3 +""" +Android Instrumentation Test Parser + +Given a raw Android Instrumentation log (produced by "adb shell am instrument -r ...") this script +return zero if all tests pass and non-zero if some tests fail. In case of failure, this script +also prints arguments that, if passed to "am instrument", will cause it to re-run just the tests +that failed. This script additionally prints warning about the tests on the STDERR; e.g. slow tests. +""" +import sys +import re + +STATUS_START = 1 +STATUS_DISABLED = -3 +SLOW_TEST_THRESHOLD = 5.0 + +COLOR_YELLOW = '\033[93m' +COLOR_END = '\033[0m' + +def warn(msg): + sys.stderr.write("%s%s%s\n" % (COLOR_YELLOW, msg, COLOR_END)) + +log_filename = sys.argv[1] +current_class, current_method = None, None +failed_tests = "" +exit_code = 1 + +for line in open(log_filename).readlines(): + matches = re.findall('^([0-9.]*)', line) + current_time = float(matches[0]) + + matches = re.findall('INSTRUMENTATION_STATUS: class=(.*)', line) + if len(matches) > 0: + current_class = matches[0] + + matches = re.findall('INSTRUMENTATION_STATUS: test=(.*)', line) + if len(matches) > 0: + current_method = matches[0] + + matches = re.findall('OK \([0-9]* tests\)', line) + if len(matches) > 0: + exit_code = 0 + + matches = re.findall('INSTRUMENTATION_STATUS_CODE: ([-0-9]*)', line) + if len(matches) > 0: + status_code = int(matches[0]) + if (status_code < 0) and (status_code != STATUS_DISABLED): + failed_tests += f"-e class {current_class}#{current_method} " + if status_code == STATUS_START: + initial_time = current_time + else: + elapsed_time = current_time - initial_time + if(elapsed_time > SLOW_TEST_THRESHOLD): + warn("SLOW_TEST %s#%s (%.2f seconds)" % (current_class, current_method, elapsed_time)) + +if len(failed_tests) > 0: + print(failed_tests) +sys.exit(exit_code) \ No newline at end of file From 180cf25ad3be18cd294d673966a3dde36b106d9e Mon Sep 17 00:00:00 2001 From: Quentin Hibon Date: Mon, 13 Dec 2021 04:39:46 +0100 Subject: [PATCH 08/19] Fix tests in APIs 30, 31 --- tools/parseInstrument.py | 25 +++++++++++++------ .../uhabits/acceptance/steps/BackupSteps.kt | 4 ++- .../uhabits/widgets/CheckmarkWidgetTest.kt | 5 +++- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/tools/parseInstrument.py b/tools/parseInstrument.py index da424d1e4..c4a00c140 100755 --- a/tools/parseInstrument.py +++ b/tools/parseInstrument.py @@ -5,7 +5,7 @@ Android Instrumentation Test Parser Given a raw Android Instrumentation log (produced by "adb shell am instrument -r ...") this script return zero if all tests pass and non-zero if some tests fail. In case of failure, this script also prints arguments that, if passed to "am instrument", will cause it to re-run just the tests -that failed. This script additionally prints warning about the tests on the STDERR; e.g. slow tests. +that failed. This script additionally prints warnings about the tests on the STDERR; e.g. slow tests. """ import sys import re @@ -14,15 +14,20 @@ STATUS_START = 1 STATUS_DISABLED = -3 SLOW_TEST_THRESHOLD = 5.0 +COLOR_RED = '\033[91m' COLOR_YELLOW = '\033[93m' COLOR_END = '\033[0m' -def warn(msg): +def error(msg): + sys.stderr.write("%s%s%s\n" % (COLOR_RED, msg, COLOR_END)) + +def warning(msg): sys.stderr.write("%s%s%s\n" % (COLOR_YELLOW, msg, COLOR_END)) log_filename = sys.argv[1] current_class, current_method = None, None -failed_tests = "" +failed_tests = [] +am_args = "-e class " exit_code = 1 for line in open(log_filename).readlines(): @@ -37,7 +42,7 @@ for line in open(log_filename).readlines(): if len(matches) > 0: current_method = matches[0] - matches = re.findall('OK \([0-9]* tests\)', line) + matches = re.findall('OK \([0-9]* tests?\)', line) if len(matches) > 0: exit_code = 0 @@ -45,14 +50,18 @@ for line in open(log_filename).readlines(): if len(matches) > 0: status_code = int(matches[0]) if (status_code < 0) and (status_code != STATUS_DISABLED): - failed_tests += f"-e class {current_class}#{current_method} " + am_args += f"{current_class}#{current_method}," + failed_tests.append(f"{current_class}#{current_method}") if status_code == STATUS_START: initial_time = current_time else: elapsed_time = current_time - initial_time if(elapsed_time > SLOW_TEST_THRESHOLD): - warn("SLOW_TEST %s#%s (%.2f seconds)" % (current_class, current_method, elapsed_time)) + warning("SLOW %s#%s (%.2f seconds)" % (current_class, current_method, elapsed_time)) if len(failed_tests) > 0: - print(failed_tests) -sys.exit(exit_code) \ No newline at end of file + for test in failed_tests: + error("FAIL %s" % test) + print(am_args[:-1]) + +sys.exit(exit_code) diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/steps/BackupSteps.kt b/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/steps/BackupSteps.kt index c281932eb..f98164347 100644 --- a/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/steps/BackupSteps.kt +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/steps/BackupSteps.kt @@ -20,6 +20,7 @@ package org.isoron.uhabits.acceptance.steps import android.os.Build.VERSION.SDK_INT +import android.os.SystemClock.sleep import androidx.test.uiautomator.By import androidx.test.uiautomator.UiSelector import org.isoron.uhabits.BaseUserInterfaceTest.Companion.device @@ -39,7 +40,7 @@ fun exportFullBackup() { } fun clearDownloadFolder() { - device.executeShellCommand("rm -rf /sdcard/Download/") + device.executeShellCommand("rm -rf /sdcard/Download") } fun clearBackupFolder() { @@ -86,6 +87,7 @@ fun importBackupFromDownloadFolder() { device.findObject(UiSelector().textContains("Loop")).click() } else { device.click(50, 90) // Click menu button + Thread.sleep(1000) device.findObject(UiSelector().textContains("Download")).click() device.findObject(UiSelector().textContains("Loop")).click() } 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 05adfdbbe..f7dcea3c2 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 @@ -32,6 +32,7 @@ import org.isoron.uhabits.R import org.isoron.uhabits.core.models.Entry import org.isoron.uhabits.core.models.EntryList import org.isoron.uhabits.core.models.Habit +import org.isoron.uhabits.core.models.Timestamp import org.isoron.uhabits.core.utils.DateUtils.Companion.getTodayWithOffset import org.junit.Test import org.junit.runner.RunWith @@ -42,10 +43,12 @@ class CheckmarkWidgetTest : BaseViewTest() { private lateinit var habit: Habit private lateinit var entries: EntryList private lateinit var view: FrameLayout - private val today = getTodayWithOffset() + private lateinit var today: Timestamp + override fun setUp() { super.setUp() setTheme(R.style.WidgetTheme) + today = getTodayWithOffset() prefs.widgetOpacity = 255 prefs.isSkipEnabled = true habit = fixtures.createVeryLongHabit() From 366e9af167bbc125d4c6c753d8e51bb81f7a141a Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Sun, 15 May 2022 00:15:56 -0500 Subject: [PATCH 09/19] Update translations --- .../play/listings/ar-rSA/full-description.txt | 2 +- .../play/listings/cs-rCZ/full-description.txt | 22 ++--- .../src/main/play/listings/fa-rIR/title.txt | 2 +- .../play/listings/fr-rFR/full-description.txt | 2 +- .../play/listings/iw-rIL/full-description.txt | 8 +- .../src/main/play/listings/iw-rIL/title.txt | 2 +- .../play/listings/pl-rPL/full-description.txt | 2 +- .../listings/pl-rPL/short-description.txt | 2 +- .../src/main/play/listings/pl-rPL/title.txt | 2 +- .../play/listings/pt-rBR/full-description.txt | 2 +- .../play/listings/tr-rTR/full-description.txt | 2 +- .../play/listings/zh-rCN/full-description.txt | 4 +- .../src/main/res/values-ar-rSA/strings.xml | 2 +- .../src/main/res/values-bg-rBG/strings.xml | 97 +++++++++++++++++-- .../src/main/res/values-cs-rCZ/strings.xml | 1 + .../src/main/res/values-de-rDE/strings.xml | 12 ++- .../src/main/res/values-es-rES/strings.xml | 10 +- .../src/main/res/values-eu-rES/strings.xml | 17 ++++ .../src/main/res/values-in-rID/strings.xml | 7 +- .../src/main/res/values-it-rIT/strings.xml | 3 +- .../src/main/res/values-iw-rIL/strings.xml | 44 +++++---- .../src/main/res/values-ja-rJP/strings.xml | 4 + .../src/main/res/values-nl-rNL/strings.xml | 3 + .../src/main/res/values-pl-rPL/strings.xml | 10 +- .../src/main/res/values-pt-rBR/strings.xml | 6 ++ .../src/main/res/values-ro-rRO/strings.xml | 15 +++ .../src/main/res/values-tr-rTR/strings.xml | 6 ++ 27 files changed, 222 insertions(+), 67 deletions(-) diff --git a/uhabits-android/src/main/play/listings/ar-rSA/full-description.txt b/uhabits-android/src/main/play/listings/ar-rSA/full-description.txt index bf495505a..7b10b101c 100644 --- a/uhabits-android/src/main/play/listings/ar-rSA/full-description.txt +++ b/uhabits-android/src/main/play/listings/ar-rSA/full-description.txt @@ -1,4 +1,4 @@ -حلقة تعقب الحبوب تساعدك على إنشاء عادات إيجابية طويلة الأجل والحفاظ عليها في حياتك. تعطيكم الرسوم البيانية والإحصاءات التفصيلية صورة واضحة للكيفية التي تحسنت بها عاداتك مع مرور الوقت. التطبيق خالٍ تمامًا من الإعلانات ومفتوح المصدر ويحترم خصوصيتك. +يساعدك Loop Habit Tracker على إنشاء عادات إيجابية طويلة المدى والحفاظ عليها في حياتك. تعطيكم الرسوم البيانية والإحصاءات التفصيلية صورة واضحة للكيفية التي تحسنت بها عاداتك مع مرور الوقت. التطبيق خالٍ تمامًا من الإعلانات ومفتوح المصدر ويحترم خصوصيتك. واجهة جميلة وبسيطة يحتوي Loop على واجهة أنيقة وبسيطة وسهلة الاستخدام للغاية ، حتى للمستخدمين لأول مرة. تم تحسين التطبيق ليكون ذي سرعة عالية ، ويعمل التطبيق بشكل جيد حتى على الهواتف القديمة. diff --git a/uhabits-android/src/main/play/listings/cs-rCZ/full-description.txt b/uhabits-android/src/main/play/listings/cs-rCZ/full-description.txt index 6b92a2ce8..61723a185 100644 --- a/uhabits-android/src/main/play/listings/cs-rCZ/full-description.txt +++ b/uhabits-android/src/main/play/listings/cs-rCZ/full-description.txt @@ -1,29 +1,29 @@ -Loop Habit Tracker vám pomáhá vytvořit a udržet si dlouhodobé pozitivní zvyky. Podrobné grafy a statistiky vám ukáží jasný přehled, jak se vaše zvyky postupem času zlepšily. Aplikace je kompletně bez reklam, open source (otevřený zdrojový kód) a respektuje vaše soukromí. +Loop Habit Tracker Vám pomáhá vytvořit a udržet si dlouhodobé pozitivní návyky. Podrobné grafy a statistiky Vám ukáží jasný přehled, jak se Vaše návyky postupem času zlepšily. Aplikace je zcela bez reklam, open-source a respektuje Vaše soukromí. Krásné, minimalistické a přehledné rozhraní -Loop má elegantní a minimalostické rozhraní, které je velice jednoduché k použití. I pro nové uživatele. Skvěle optimalizováno pro rychlost, aplikace funguje i na starších telefonech. +Loop má elegantní a minimalistické rozhraní, které je jednoduché na ovládání i pro nové uživatele. Díky vysoké optimalizaci pro rychlost aplikace funguje skvěle i na starších telefonech. Skóre návyků -Loop má propracovaný vzorec pro výpočet síly vašich návyků. Každé opakování posílí váš zvyk a každé vynechání ho oslabí. Ale pár zmeškaných dní po dlouhém období vám kompletně nezničí váš pokrok, jako u mnoho jiných aplikací soustředěných na "nepřerušení řetězce". +Loop má propracovaný vzorec pro výpočet síly vašich návyků. Každé opakování posílí váš zvyk a každé vynechání ho oslabí. Pár zmeškaných dní po dlouhé výzvě Vám, na rozdíl od jiných aplikací, ve kterých nesmíte vynechat ani jeden den, nezničí Váš pokrok. Flexibilní plánování -Kromě každodenních návyků podporuje Loop návyky se složitějšími plány, například třikrát týdně nebo každý druhý den. +Kromě každodenních návyků podporuje Loop i návyky náročné na plánování, například třikrát týdně nebo každý druhý den. Připomenutí -Nastavte si oznámení, aby vám připomněly vaše návyky. Každý návyk může mít svou notifikaci ve zvoleném čase. Jednoduše potvrďte nebo zamítněte návyk přímo z notifikace. +Nastavte si upozornění, která Vám budou Vaše návyky připomínat. Pro každý návyk může být nastavena připomínka dle Vámi zvoleného času. Jednoduše potvrďte nebo propusťte návyk přímo z upozornění. Widgety -Nechte si při každém odemknutí telefonu připomenout vaše návyky. Barevné widgety vám dovolují sledovat vaše návyky přimo z vaší domovské obrazovky, aniž byste museli otevřít aplikaci. +Nechte si při každém odemknutí telefonu připomenout Vaše návyky. Barevné widgety Vám dovolí sledovat Vaše návyky přímo z Vaší domovské obrazovky, aniž byste museli otevřít aplikaci. Převezměte kontrolu nad svými daty -Pokud chcete dále analyzovat vaše údaje, nebo je přesunout do jiné služby, Loop umožňuje je exportovat do tabulek (CSV) nebo do databázového souboru (SQLite). Pokročilí uživatelé můžou propojit ovládání i skrze jiné aplikace, jako je Tasker. +Pokud chcete dále analyzovat Vaše data, nebo je přesunout do jiné služby, můžete je díky Loop exportovat do tabulek (CSV) nebo do databázového souboru (SQLite). Pokročilí uživatelé mohou propojit ovládání i skrze jiné aplikace, jako je Tasker. Bez omezení -Sledujte si tolik návyků, kolik chcete. Loop nenastavuje žádné umělé omezení počtu návyků, které můžete sledovat. Všechny funkce jsou k dispozici všem uživatelům. Neexistují žádné nákupy v aplikaci. +Sledujte tolik návyků, kolik chcete. Loop nenastavuje žádné umělé omezení počtu návyků, které můžete sledovat. Všechny funkce jsou k dispozici všem uživatelům. V aplikaci nic nenakupujete. Zcela bez reklam a open source -V této aplikaci nejsou žádné reklamy, nepříjemná oznámení nebo dotěrná oprávnění a nikdy zde nebudou. Aplikace je zcela open-source (GPLv3). +V této aplikaci nejsou žádné reklamy, nepříjemná oznámení nebo dotěrná oprávnění, a ani nikdy nebudou. Aplikace je zcela open-source (GPLv3). -Funguje offline a respektuje vaše soukromí -Loop nevyžaduje připojení k Internetu ani registraci online účtu. Vaše důvěrné údaje nejsou nikdy nikomu zaslány. Nemají k nim přístup ani vývojáři, nebo třetí strany. +Funguje off-line a respektuje vaše soukromí +Loop nevyžaduje připojení k internetu ani online registraci účtu. Vaše důvěrná data nikdy nikomu neodesíláme. Nemají k nim přístup ani vývojáři, nebo třetí strany. diff --git a/uhabits-android/src/main/play/listings/fa-rIR/title.txt b/uhabits-android/src/main/play/listings/fa-rIR/title.txt index 027232a12..c71fccae4 100644 --- a/uhabits-android/src/main/play/listings/fa-rIR/title.txt +++ b/uhabits-android/src/main/play/listings/fa-rIR/title.txt @@ -1 +1 @@ -Loop Habit Tracker +عادت‌سنج لوپ diff --git a/uhabits-android/src/main/play/listings/fr-rFR/full-description.txt b/uhabits-android/src/main/play/listings/fr-rFR/full-description.txt index 81aa942d3..d951abe8e 100644 --- a/uhabits-android/src/main/play/listings/fr-rFR/full-description.txt +++ b/uhabits-android/src/main/play/listings/fr-rFR/full-description.txt @@ -22,7 +22,7 @@ Si vous souhaitez analyser davantage vos données ou les déplacer vers un autre Suivez autant d'habitudes que vous le souhaitez. Loop n'impose aucune limite artificielle sur le nombre d'habitudes que vous pouvez avoir. Toutes les fonctionnalités sont disponibles pour tous les utilisateurs. Il n'y a aucun achat dans l'application. Entièrement sans publicité et open source -Il n'y a pas de publicités, de notifications agaçantes ou d'autorisations intrusives dans cette application. Il n'y en aura jamais. L'application est entièrement open-source (GPLv3). +Il n'y a pas de publicités, de notifications agaçantes ou d'autorisations intrusives dans cette application. L'application est entièrement open-source (GPLv3). Fonctionne hors ligne et respecte votre vie privée Loop ne nécessite pas de connexion Internet ni d'enregistrement d'un compte en ligne. Vos données confidentielles ne sont jamais envoyées à personne. Ni les développeurs ni aucun tiers n'y ont accès. diff --git a/uhabits-android/src/main/play/listings/iw-rIL/full-description.txt b/uhabits-android/src/main/play/listings/iw-rIL/full-description.txt index fde825d17..287aa81e9 100644 --- a/uhabits-android/src/main/play/listings/iw-rIL/full-description.txt +++ b/uhabits-android/src/main/play/listings/iw-rIL/full-description.txt @@ -1,13 +1,13 @@ -‏„Loop למעקב אחר ההרגלים” מסייע לך ביצירה ובשימור הרגלים טובים וארוכי טווח. תרשימים וסטטיסטיקה מפורטים נותנים לך תמונה ברורה כיצד ההרגלים שלך השתפרו לאורך זמן. היישום נטול פרסומות לחלוטין, קוד המקור שלו פתוח והוא מכבד את הפרטיות שלך. +יישום ”Loop לניהול הרגלים“ מסייע לך ביצירה ובשימור הרגלים טובים וארוכי טווח. תרשימים וסטטיסטיקה מפורטים נותנים לך תמונה ברורה כיצד ההרגלים שלך השתפרו לאורך זמן. היישום נטול פרסומות לחלוטין, קוד המקור שלו פתוח והוא מכבד את הפרטיות שלך. ממשק יפה, חסכוני וקליל -ל־Loop ממשק אלגנטי, חסכוני וקל לשימוש אפילו בפעם הראשונה. היישום מותאם במיוחד למהירות, ועובד היטב גם בטלפונים ישנים. +הממשק של Loop אלגנטי, חסכוני וקל לשימוש אפילו בפעם הראשונה. היישום מותאם במיוחד למהירות, ועובד היטב גם בטלפונים ישנים. ציון הרגל -ל־Loop יש נוסחה מתקדמת לחישוב חוזק ההרגלים שלך. כל חזרה על ההרגל מחזקת אותו, וכל יום שהוחמץ מחליש אותו. כמה ימים שהוחמצו לאחר רצף ארוך, לעומת זאת, לא יהרסו לחלוטין את ההתקדמות, בניגוד ליישומים רבים אחרים מסוג „לא לשבור את השרשרת”. +ל־Loop יש נוסחה מתקדמת לחישוב חוזק ההרגלים שלך. כל חזרה על ההרגל מחזקת אותו, וכל יום שהוחמץ מחליש אותו. כמה ימים שהוחמצו לאחר רצף ארוך, לעומת זאת, לא יהרסו לחלוטין את ההתקדמות, בניגוד ליישומים רבים אחרים מסוג ”לא לשבור את השרשרת“. לוחות זמנים גמישים -בנוסף להרגלים יומיומיים, Loop תומך בהרגלים עם לוחות זמנים מורכבים יותר, כמו 3 פעמים בשבוע או „יום כן יום לא”. +בנוסף להרגלים יומיומיים, Loop תומך בהרגלים עם לוחות זמנים מורכבים יותר, כמו 3 פעמים בשבוע או ”יום כן ויום לא“. תזכורות אפשר לתזמן התראות קבועות עם תזכורות לגבי ההרגלים שלך. לכל הרגל יכולה להיות תזכורת משלו, בשעה שנבחרה ביום. אפשר לסמן או לדחות את עשיית ההרגל ישירות מההתראה בקלות. diff --git a/uhabits-android/src/main/play/listings/iw-rIL/title.txt b/uhabits-android/src/main/play/listings/iw-rIL/title.txt index 027232a12..27ff3be99 100644 --- a/uhabits-android/src/main/play/listings/iw-rIL/title.txt +++ b/uhabits-android/src/main/play/listings/iw-rIL/title.txt @@ -1 +1 @@ -Loop Habit Tracker +‏Loop לניהול הרגלים diff --git a/uhabits-android/src/main/play/listings/pl-rPL/full-description.txt b/uhabits-android/src/main/play/listings/pl-rPL/full-description.txt index 6701c4bbf..1d08797ba 100644 --- a/uhabits-android/src/main/play/listings/pl-rPL/full-description.txt +++ b/uhabits-android/src/main/play/listings/pl-rPL/full-description.txt @@ -1,4 +1,4 @@ -Aplikacja "Śledzenie nawyków Loop" pomaga tworzyć i utrzymywać długotrwałe pozytywne nawyki w twoim życiu. Szczegółowe wykresy i statystyki dają jasny obraz tego, jak Twoje nawyki uległy poprawie z upływem czasu. Aplikacja jest całkowicie wolna od reklam, otwartoźródłowa i szanuje Twoją prywatność. +Loop Habit Tracker to aplikacja która pomaga tworzyć i podtrzymać długoterminowe pozytywne nawyki w Twoim życiu. Szczegółowe wykresy i statystyki dają jasny obraz tego, jak Twoje nawyki uległy poprawie z upływem czasu. Aplikacja jest całkowicie wolna od reklam, otwartoźródłowa i szanuje Twoją prywatność. Piękny, minimalistyczny i lekki interfejs Aplikacja "Śledzenie nawyków Loop" ma elegancki i minimalistyczny interfejs, który jest bardzo łatwy w obsłudze, nawet dla początkujących użytkowników. Jest ona wysoce zoptymalizowana pod kątem szybkości działania nawet na starszych telefonach. diff --git a/uhabits-android/src/main/play/listings/pl-rPL/short-description.txt b/uhabits-android/src/main/play/listings/pl-rPL/short-description.txt index 23f20dd0b..98bc53e65 100644 --- a/uhabits-android/src/main/play/listings/pl-rPL/short-description.txt +++ b/uhabits-android/src/main/play/listings/pl-rPL/short-description.txt @@ -1 +1 @@ -Twórz dobre nawyki i śledź ich postępy w czasie (bez reklam) +Twórz dobre nawyki i śledź postępy (bez reklam) diff --git a/uhabits-android/src/main/play/listings/pl-rPL/title.txt b/uhabits-android/src/main/play/listings/pl-rPL/title.txt index dc0f7be31..027232a12 100644 --- a/uhabits-android/src/main/play/listings/pl-rPL/title.txt +++ b/uhabits-android/src/main/play/listings/pl-rPL/title.txt @@ -1 +1 @@ -Śledzenie Nawyków Loop +Loop Habit Tracker diff --git a/uhabits-android/src/main/play/listings/pt-rBR/full-description.txt b/uhabits-android/src/main/play/listings/pt-rBR/full-description.txt index 8d997a24a..a232b6454 100644 --- a/uhabits-android/src/main/play/listings/pt-rBR/full-description.txt +++ b/uhabits-android/src/main/play/listings/pt-rBR/full-description.txt @@ -16,7 +16,7 @@ Agende notificações para lembrá-lo de seus hábitos. Cada hábito pode ter se Lembre-se de seus hábitos sempre que desbloquear o telefone. Widgets coloridos permitem que você acompanhe seus hábitos diretamente na tela inicial, sem abrir o aplicativo. Assuma o controle de seus dados -Se você deseja analisar melhor seus dados ou movê-los para outro serviço, o Loop permite exportá-los para planilhas (CSV) ou para um arquivo de banco de dados (SQLite). Para usuários avançados, marcas de seleção podem ser adicionadas através de outros aplicativos, como o Tasker. +Se você deseja analisar melhor seus dados ou movê-los para outro serviço, o Loop permite exportá-los para planilhas (CSV) ou para um arquivo de banco de dados (SQLite). Para usuários avançados, dados podem ser adicionadas através de outros aplicativos, como o Tasker. Sem limitações Acompanhe quantos hábitos desejar. O Loop não impõe limites artificiais sobre quantos hábitos você pode ter. Todos os recursos estão disponíveis para todos os usuários. Não há nenhum item à venda no aplicativo. diff --git a/uhabits-android/src/main/play/listings/tr-rTR/full-description.txt b/uhabits-android/src/main/play/listings/tr-rTR/full-description.txt index e47d1b765..63130e9ad 100644 --- a/uhabits-android/src/main/play/listings/tr-rTR/full-description.txt +++ b/uhabits-android/src/main/play/listings/tr-rTR/full-description.txt @@ -1,4 +1,4 @@ -Loop Alışkanlık Takibi, yaşamınızda uzun vadeli olumlu alışkanlıklar yaratmanıza ve sürdürmenize yardımcı olur. Ayrıntılı grafik ve istatistikler, alışkanlıklarınızın zaman içinde nasıl geliştiğine dair size net bir resim sunar. Uygulama tamamen reklamsız ve açık kaynaklıdır. Gizliliğinize saygı duyar. +Loop Alışkanlık Takibi, yaşamınızda uzun vadeli olumlu alışkanlıklar yaratmanıza ve sürdürmenize yardımcı olur. Ayrıntılı grafik ve istatistikler, alışkanlıklarınızın zaman içinde nasıl geliştiğine dair size net bir resim sunar. Uygulama tamamen reklamsız ve açık kaynaklıdır. Güzel, minimalist ve basit arayüz Loop, ilk kez kullananlar için bile kullanımı çok kolay olan zarif ve minimalist bir arayüze sahiptir. Hız için son derece optimize edilmiş olan bu uygulama, eski telefonlarda bile gayet iyi çalışır. diff --git a/uhabits-android/src/main/play/listings/zh-rCN/full-description.txt b/uhabits-android/src/main/play/listings/zh-rCN/full-description.txt index 91a211f5b..829db6db2 100644 --- a/uhabits-android/src/main/play/listings/zh-rCN/full-description.txt +++ b/uhabits-android/src/main/play/listings/zh-rCN/full-description.txt @@ -10,13 +10,13 @@ Loop 有高级的公式来计算您习惯的强度。 多多重复会使你的 除了每天习惯之外,Loop 还支持更加复杂的时间安排,例如每周三次或每天三次。 提醒 -设定通知以提醒您完成习惯。 每一种习惯都有属于自己的通知,您可以选定当天的某个时间提醒该习惯。 同时从通知中轻松地检查或取消您的习惯。 +设定通知以提醒您完成习惯。 您可以为每个习惯单独设置提醒,选定当天的某个时间提醒该习惯。 同时从通知中轻松地检查或取消您的习惯。 微件 当您解锁手机时, 多彩的小部件可让您直接从主屏幕记录自己的习惯,而无需打开应用程序。 掌控您的数据 -如果您想进一步分析数据或将数据备份,则可以使用 Loop 将其导出为电子表格(CSV)或数据库文件(SQLite)。 对于高级用户,可以通过其他应用程序(例如Tasker)使其自动化操作。 +如果您想进一步分析数据或将数据备份,则可以使用 Loop 将其导出为电子表格(CSV)或数据库文件(SQLite)。 对于高级用户,可以通过其他应用如 Tasker 实现自动化添加标记。 无限制 想记录多少习惯都没问题! Loop 对您的习惯没有任何限制, 所有用户均可使用所有功能, 并且没有应用内购买。 diff --git a/uhabits-android/src/main/res/values-ar-rSA/strings.xml b/uhabits-android/src/main/res/values-ar-rSA/strings.xml index ae82ed8f9..ca1c23f92 100644 --- a/uhabits-android/src/main/res/values-ar-rSA/strings.xml +++ b/uhabits-android/src/main/res/values-ar-rSA/strings.xml @@ -123,7 +123,7 @@ صامت تصنيف إخفاء المكتملة - إخفاء المُدخل + إخفاء المُدخل إخفاء المؤرشفة جعل الإشعارات ثابتة منع الإشعارات من تمريرها بعيداً. diff --git a/uhabits-android/src/main/res/values-bg-rBG/strings.xml b/uhabits-android/src/main/res/values-bg-rBG/strings.xml index e68ce594b..0ac1b3625 100644 --- a/uhabits-android/src/main/res/values-bg-rBG/strings.xml +++ b/uhabits-android/src/main/res/values-bg-rBG/strings.xml @@ -28,7 +28,23 @@ Добавяне на навик Промяна на цвят Навикът е създаден - Обзор + + Навикът е променен + Навиците са променени + + + Навикът е изтрит + Навиците са изтрити + + + Навикът е архивиран + Навиците са архивирани + + + Навикът е разархивиран + Навиците са разархивирани + + Обобщение Сила на навика История Изчистване @@ -36,6 +52,7 @@ Запазване Поредици Нямате активни навици + Всичко сте изпълнили за днес! Натиснете и задръжте за да добавите или премахнете отметка Изключено Създаване на навик @@ -55,16 +72,28 @@ 4 часа 8 часа 24 часа + Винаги да се пита + Персонализирано... Маркиране с кратко натискане + Поставяне на отметки с кратко натискане вместо с натискане и задържане Оценяване на това приложение в Google Play Изпращане на отзиви към разработчика Преглед на програмния код в GitHub Препратки Име Настройки + Избор на време за отлагане Знаете ли че? За да пренаредите записите, натиснете и задръжте върху името на навика и го придърпайте до правилното място. Може да виждате повече дни като обърнете телефона си в хоризонтално положение. + + Изтриване на навик? + Изтриване на навици? + + + Навикът ще бъде перманентно изтрит. Това действие не може да бъде отменено. + Навиците ще бъдат перманентно изтрити. Това действие не може да бъде отменено. + Навикът е изтрит / не е намерен Събота и неделя От понеделник до петък @@ -98,9 +127,9 @@ Генериране на доклад за грешки Отстраняване на проблеми Помагане за превода на това приложение - Нощен режим - Използване на чисто черно при нощен режим - Заменя сивите фонове с чисто черни при нощен режим. Намаля разхода на батерията при телефони с AMOLED дисплеи. + Тъмна тема + Използване на чисто черно при тъмна тема + Заменя сивите фонове с чисто черни при тъмна тема. Намаля разхода на батерията при телефони с AMOLED дисплеи. Интерфейс Обратен ред на дните Показва дните на основния екран в обратен ред @@ -110,6 +139,7 @@ Тримесечие Година Общо + Да или не На всеки %d дни На всеки %d седмици Сила @@ -117,9 +147,12 @@ Няма Филтър Скриване на завършените + Скриване на въведените Скриване на архивираните - Направи нотификациите постоянни - Предотвратява изчистването на нотификацията с плъзване настрани. + Направи известията постоянни + Предотвратява изчистването на известията с плъзване настрани. + Светлина за известяване + Показва мигаща светлина за напомняния. Налична само за телефони с LED светлини за известяване. Поправка на базата данни Базата данни е поправена. Премахване на отметка @@ -131,6 +164,58 @@ По име По цвят По сила + По състояние Експортиране + Натиснете и задръжте за да промените стойността + Стойност + Календар + Мерна единица + Тип на целта + Най-малко + Най-много + напр. Тренирахте ли днес? + Въпрос + Цел + Да + Не + Промяна на звук, вибрация, светлина и други настройки на известията + Персонализиране на известията + Преглед на политиката за поверителност + Преглед на всички сътрудници... + База данни + Прозрачност на приспособлението + Прави приспособленията по-прозрачни или по-непрозрачни на началния ви екран + Първи ден от седмицата + Изпълнихте ли навика днес? + Бележки + (Незадължително) + напр. Събудихте ли се рано днес? Тренирахте ли? Играхте ли шах? + Измерим + напр. Колко километра пробягахте днес? Колко страници прочетохте? + %d пъти седмично + %d пъти месечно %d пъти в период от %d дни + напр. Тренировка + Цвят + напр. 15 + напр. Бягане + напр. Колко километра пробягахте днес? + напр. км + Всеки месец + Не може да бъде празно + Днес + Въвеждане + Не са намерени навици + Не са намерени измерими навици + Не са намерени навици от тип \"да или не\" + Увеличаване + Намаляване + Включване на пропуснати дни + Маркирайте два пъти за да добавите пропускане вместо отметка. Пропусканията поддържат силата на навика ви непроменена и не прекъсват поредицата ви. + Показване на питанки при липсващи данни + Разграничаване на дните без данни от реални пропуски. За да добавите пропуск, маркирайте два пъти. + Вие вече сте разработчик + Не е намерено приложение, което да поддържа това действие + Удължаване на деня с няколко часа след полунощ + Изчакване до 3:00 часа сутринта за показване на нов ден. Полезно, ако обичайно си лягате да спите след полунощ. Изисква рестартиране на приложението. diff --git a/uhabits-android/src/main/res/values-cs-rCZ/strings.xml b/uhabits-android/src/main/res/values-cs-rCZ/strings.xml index 222fd3c2a..1680ac9d6 100644 --- a/uhabits-android/src/main/res/values-cs-rCZ/strings.xml +++ b/uhabits-android/src/main/res/values-cs-rCZ/strings.xml @@ -59,6 +59,7 @@ Vždy se ptát Vlastní... Označte opakování krátkým stisknutím + Zaškrtněte jediným klepnutím místo dlouhého podržení. Ohodnoťte nás v Google Play Zpětná vazba vývojáři Zobrazit zdroj. kód na GitHub diff --git a/uhabits-android/src/main/res/values-de-rDE/strings.xml b/uhabits-android/src/main/res/values-de-rDE/strings.xml index c4d852e5c..ca119039f 100644 --- a/uhabits-android/src/main/res/values-de-rDE/strings.xml +++ b/uhabits-android/src/main/res/values-de-rDE/strings.xml @@ -75,6 +75,7 @@ Immer fragen Benutzerdefiniert... Markierung durch kurzes Tippen ändern + Häkchen durch einfaches Antippen setzen, anstatt durch Drücken und Halten. Bewerte diese App auf Google Play Sende dem Entwickler Feedback Zeige den Quellcode auf GitHub @@ -98,7 +99,7 @@ Montag bis Freitag Jeden Tag Tage auswählen - Exportiere als CSV + Als CSV exportieren Fertig Löschen Stunden auswählen @@ -118,7 +119,7 @@ Datei nicht erkannt. Gewohnheiten erfolgreich importiert. Daten importieren - Exportiere vollständige Sicherung + Vollständige Sicherung exportieren Unterstützt vollständige Sicherungen dieser App, als auch von Tickmate, HabitBull und Rewire. Siehe FAQ für weitere Informationen. Erstellt Dateien, die von Tabellenkalkulationsprogrammen wie Microsoft Excel oder LibreOffice Calc geöffnet werden können. Diese Dateien können nicht wieder importiert werden. Erstellt eine Datei, die alle deine Daten enthält. Diese Datei kann wieder importiert werden. @@ -146,6 +147,7 @@ Keiner Filter Erledigte verbergen + Eingegebenes ausblenden Archivierte verbergen Fixiere Benachrichtigungen Verhindert das Wegwischen von Benachrichtigungen. @@ -165,8 +167,12 @@ Nach Zustand Exportieren Gedrückt halten, um den Wert zu ändern + Wert Kalender Einheit + Zieltyp + Mindestens + Höchtens z.B. Hast du heute trainiert? Frage Ziel @@ -202,7 +208,7 @@ Keine Gewohnheiten gefunden Keine messbaren Gewohnheiten gefunden Keine Ja-oder-Nein-Gewohnheiten gefunden - Vergrößern + Erhöhen Verringern Tage überspringen aktivieren Zwei mal markieren, um eine Lücke einzutragen statt abzuhaken. Lücken lassen deine Wertung unverändert und beenden deine Serie nicht. diff --git a/uhabits-android/src/main/res/values-es-rES/strings.xml b/uhabits-android/src/main/res/values-es-rES/strings.xml index 47bbd9fb4..44bcdec51 100644 --- a/uhabits-android/src/main/res/values-es-rES/strings.xml +++ b/uhabits-android/src/main/res/values-es-rES/strings.xml @@ -84,7 +84,7 @@ Configuración Seleccione el retardo de la interrupción ¿Sabías qué? - Para reordenar las entradas, mantén la pulsado sobre el nombre del hábito, después arrástralo a su posición correcta. + Para reordenar las entradas, mantén pulsado el nombre del hábito, después arrástralo a su posición correcta. Puedes ver más días al poner tu teléfono en modo horizontal. ¿Eliminar hábito? @@ -130,7 +130,7 @@ Modo nocturno Utilizar color negro en modo nocturno Reemplaza fondos grises por color negro en modo nocturno. Reduce el consumo de batería en teléfonos con pantalla AMOLED. - Interfície + Interfaz Orden inverso de días Mostrar días en orden inverso en la pantalla principal Día @@ -147,7 +147,7 @@ Ninguno Filtrar Ocultar completos - Ocultar ingresado + Ocultar ingresado Ocultar archivados Hacer notificaciones fijas Evita que las notificaciones sean descartadas. @@ -199,8 +199,8 @@ Color ej. 15 por ejemplo, correr - ej. ¿Cuántos quilómetros has corrido hoy? - ej. millas + ej. ¿Cuántos kilómetros has corrido hoy? + ej. kilómetros Cada mes No puede estar en blanco Hoy diff --git a/uhabits-android/src/main/res/values-eu-rES/strings.xml b/uhabits-android/src/main/res/values-eu-rES/strings.xml index 68a984267..e651b5ad5 100644 --- a/uhabits-android/src/main/res/values-eu-rES/strings.xml +++ b/uhabits-android/src/main/res/values-eu-rES/strings.xml @@ -28,6 +28,18 @@ Gehitu ohitura Kolorea aldatu Ohitura sortu da + + Ohitura aldatu da + Ohiturak aldatu dira + + + Ohitura ezabatu da + Ohiturak ezabatu dira + + + Ohitura artxibatu da + Ohiturak artxibatu dira + Ikuspegi orokorra Ohituraren indarra Historia @@ -148,6 +160,7 @@ Balioa Egutegia Unitatea + Gutxienez Gehienez adib. ariketa egin al duzu gaur? Galdera @@ -179,8 +192,12 @@ Hilabetero Ezin da hutsik egon Gaur + Sartu Ez da ohiturarik aurkitu + Ez da aurkitu ohitura neurgarririk + Ez da bai-ala-ez ohiturarik aurkitu Adierazi galdera ikurra falta diren datuetan Garatzailea zara! Ez da aurkitu akzio hau gauzatu dezakeen aplikaziorik + Itxaron goizeko 3:00ak arte egun berri bat erakusteko. Erabilgarria normalean gauerdia pasata lotara joaten bazara. Aplikazioa berrabiarazi behar da. diff --git a/uhabits-android/src/main/res/values-in-rID/strings.xml b/uhabits-android/src/main/res/values-in-rID/strings.xml index fc5d023b6..115daceb1 100644 --- a/uhabits-android/src/main/res/values-in-rID/strings.xml +++ b/uhabits-android/src/main/res/values-in-rID/strings.xml @@ -71,7 +71,7 @@ Selalu bertanya Kustom... Tandai dengan cepat - Beri tanda centang dengan satu ketukan alih-alih tekan dan tahan. + Beri tanda centang dengan satu ketukan alih-alih tekan-dan-tahan. Berikan rating aplikasi ini di Google Play Kirimkan umpan balik kepada Developer Lihat kode program di GitHub @@ -150,6 +150,7 @@ Tidak ada Filter Sembunyikan yang selesai + Sembunyikan yang dimasukkan Sembunyikan yang diarsipkan Jadikan notifikasi melekat Mencegah notifikasi untuk terhapus. @@ -169,8 +170,12 @@ Berdasarkan status Ekspor Tekan-dan-tahan untuk mengubah nilai + Nilai Kalender Unit + Jenis Target + Paling sedikit + Paling banyak mis. Apakah kamu sudah berolahraga hari ini? Pertanyaan Target diff --git a/uhabits-android/src/main/res/values-it-rIT/strings.xml b/uhabits-android/src/main/res/values-it-rIT/strings.xml index bc1dd2885..a9a3e5b13 100644 --- a/uhabits-android/src/main/res/values-it-rIT/strings.xml +++ b/uhabits-android/src/main/res/values-it-rIT/strings.xml @@ -147,7 +147,7 @@ Nessuno Filtra Nascondi completati - Nascondi inserito + Nascondi inserito Nascondi archiviati Notifiche non rimuovibili Impedisce di poter rimuovere le notifiche. @@ -213,6 +213,7 @@ Abilita salta giorni Attiva/disattiva due volte per aggiungere un salto invece di una spunta. Un salto mantiene il tuo punteggio invariato e non interrompe il tuo punteggio. Mostra punti interrogativi per i dati mancanti + Differenzia i giorni senza dati dagli intervalli effettivi. Per inserire un intervallo, attiva due volte. Ora sei uno sviluppatore Nessuna app disponibile per gestire questa azione Prolunga il giorno di alcune ore dopo la mezzanotte diff --git a/uhabits-android/src/main/res/values-iw-rIL/strings.xml b/uhabits-android/src/main/res/values-iw-rIL/strings.xml index ccc172e07..35bec1fff 100644 --- a/uhabits-android/src/main/res/values-iw-rIL/strings.xml +++ b/uhabits-android/src/main/res/values-iw-rIL/strings.xml @@ -18,7 +18,7 @@ ~ with this program. If not, see . --> - ‏Loop למעקב אחר ההרגלים + ‏Loop לניהול הרגלים הרגלים הגדרות עריכה @@ -68,13 +68,13 @@ סימון מאוחר יותר ברוך בואך - ‏„Loop למעקב אחר ההרגלים” מסייע לך ביצירה ובשימור הרגלים טובים. + יישום ”Loop לניהול הרגלים“ מסייע לך להתחיל ולשמר הרגלים טובים. יצירת הרגלים חדשים בכל יום, לאחר ביצוע ההרגל, יש לסמן זאת ביישום. מעקב אחר ההתקדמות - גרפים מפורטים מציגים כיצד ההרגלים שלך השתפרו לאורך זמן. - 15 דקות - 30 דקות + גרפים מפורטים מציגים כיצד שיפרת את ההרגלים לאורך זמן. + רבע שעה + חצי שעה שעה שעתיים 4 שעות @@ -83,8 +83,9 @@ תמיד לשאול התאמה אישית... סימון הרגלים בלחיצה קצרה + סימון הרגלים בעזרת הקשה יחידה במקום בעזרת הקשה והחזקה. דירוג היישום ב־Google Play - שליחת משוב למפתחים + שליחת משוב למפתח צפייה בקוד המקור ב־GitHub קישורים שם @@ -106,7 +107,7 @@ ההרגלים יימחקו לצמיתות. לא ניתן לבטל פעולה זו. ההרגל נמחק / לא נמצא - סופי שבוע + שבת וראשון שני עד שישי כל ימות השבוע בחירת ימים @@ -131,9 +132,9 @@ ההרגלים יובאו בהצלחה. ייבוא נתונים ייצוא גיבוי מלא - תומך בכל הגיבויים שיוצאו על ידי היישום, כמו־גם קבצים שנוצרו על ידי Tickmate, ‏HabitBull או Rewire. למידע נוסף נא לעיין בשאלות הנפוצות. - ליצירת קבצים שניתן לפתוח באמצעות תוכנת גיליון אלקטרוני כגון Microsoft Exel או OpenOffice Calc. לא ניתן לייבא את נתוני הקובץ בחזרה. - ליצירת קובץ שמכיל את כל הנתונים שלך. לא ניתן לייבא את נתוני הקובץ בחזרה. + תומך בכל הגיבויים שיוצאו מהיישום הזה, כמו־גם בקבצים שנוצרו על ידי Tickmate, ‏HabitBull או Rewire. למידע נוסף נא לעיין בשאלות הנפוצות. + ליצירת קבצים שנפתחים בתוכנת גיליון אלקטרוני כגון Microsoft Exel או OpenOffice Calc. לא ניתן לייבא את הקובץ בחזרה. + ליצירת קובץ שמכיל את כל הנתונים שלך. לא ניתן לייבא את הקובץ בחזרה. יצירת דו״ח התקלה נכשלה. יצירת דו״ח תקלה פתרון תקלות @@ -143,7 +144,7 @@ להחלפת הרקע האפור בערכת הנושא הכהה לשחור מוחלט. זה מפחית את צריכת הסוללה במכשירים עם תצוגת AMOLED. ממשק סדר ימים הפוך - הצגת ימים בסדר הפוך במסך הראשי. + הצגת הימים בסדר הפוך במסך הראשי. יום שבוע חודש @@ -158,6 +159,7 @@ ללא סינון הסתרת יעדים שהושגו + הסתרת ההרגלים שהושלמו הסתרת הארכיון יצירת תזכורות נעוצות למניעת התעלמות מתזכורות. @@ -177,14 +179,18 @@ לפי מצב ייצוא לחיצה והחזקה ישנו את הערך + ערך לוח שנה יחידה - למשל: האם התעמלת היום? + סוג יעד + לכל הפחות + לכל היותר + למשל: עשית כושר היום? שאלה יעד כן לא - שינוי הצליל, הרטט, התאורה ושאר הגדרות הקשורות להתראות + שינוי הצליל, הרטט, התאורה והגדרות התראה אחרות התאמת ההתראות הצגת מדיניות הפרטיות הצגת כל המתנדבים… @@ -192,15 +198,15 @@ אטימות היישומונים להפיכת היישומונים שקופים או אטומים יותר במסך הבית שלך. היום הראשון בשבוע - האם השלמת את ההרגל הזה היום? + השלמת את ההרגל הזה היום? הערות (רשות) - למשל: האם התעוררת מוקדם היום? האם התעמלת? האם שיחקת שחמט? + למשל: התעוררת מוקדם היום? עשית כושר? שיחקת שחמט? הרגלים נמדדים למשל: כמה קילומטרים רצת היום? כמה עמודים קראת? %d פעמים בשבוע %d פעמים בחודש - %d פעמים ב- %d ימים + %d פעמים ב־%d ימים למשל: התעמלות צבע למשל: 15 @@ -208,12 +214,12 @@ למשל: כמה קילומטרים רצת היום? למשל: קילומטרים כל חודש - חובה לתת שם + זהו שדה חובה היום מילוי לא נמצאו הרגלים לא נמצאו הרגלים נמדדים - לא נמצאו הרגלי „כן או לא” + לא נמצאו הרגלי ”כן או לא“ עלייה ירידה לאפשר דילוג על ימים @@ -223,5 +229,5 @@ מצב הפיתוח הופעל כעת לא נמצא יישום שתומך בפעולה זו הארכת היום בכמה שעות לאחר החצות - לחכות עד 3:00 כדי להציג יום חדש. שימושי אם לרוב הולכים לישון לאחר החצות. דורש הפעלה מחדש של היישום. + המתנה עד 3:00 לפני הצגת יום חדש. שימושי אם לרוב הולכים לישון אחרי חצות. דורש הפעלה מחדש של היישום. diff --git a/uhabits-android/src/main/res/values-ja-rJP/strings.xml b/uhabits-android/src/main/res/values-ja-rJP/strings.xml index c016c08d6..dc7d077f2 100644 --- a/uhabits-android/src/main/res/values-ja-rJP/strings.xml +++ b/uhabits-android/src/main/res/values-ja-rJP/strings.xml @@ -71,6 +71,7 @@ 毎回選択する カスタム... タップでチェックをON/OFF + 長押しの代わりにワンタップでチェックマークをつけます。 Google Play でこのアプリを評価 開発者にフィードバックを送信 GitHub でソースコードを参照 @@ -140,6 +141,7 @@ なし フィルター 達成した習慣を非表示 + 入力されたものを非表示にする アーカイブした習慣を非表示 通知を固定 通知をスワイプして消せないようにする @@ -159,8 +161,10 @@ ステータス順 エクスポート 長押しすると値を変更できます + カレンダー 単位 + 少なくとも 例:今日は運動しましたか? 質問 目標 diff --git a/uhabits-android/src/main/res/values-nl-rNL/strings.xml b/uhabits-android/src/main/res/values-nl-rNL/strings.xml index c7314dcf7..790dcbbc7 100644 --- a/uhabits-android/src/main/res/values-nl-rNL/strings.xml +++ b/uhabits-android/src/main/res/values-nl-rNL/strings.xml @@ -71,6 +71,7 @@ Altijd vragen Aangepast... Wijzig herhalingen door kort indrukken + Zet vinkjes met een enkele keer drukken in plaats van ingedrukt te houden. Beoordeel deze app in Google Play Stuur feedback aan de ontwikkelaar Bekijk de broncode op GitHub @@ -134,6 +135,7 @@ Stil Filteren Verberg voltooide + Verberg ingevoerde Verberg gearchiveerde Maak meldingen persistent Voorkom dat meldingen weggehaald kunnen worden. @@ -156,6 +158,7 @@ Waarde Kalender Eenheid + Doeltype Minimaal Maximaal bijv. Heb je vandaag gesport? diff --git a/uhabits-android/src/main/res/values-pl-rPL/strings.xml b/uhabits-android/src/main/res/values-pl-rPL/strings.xml index f658155cf..c9347762d 100644 --- a/uhabits-android/src/main/res/values-pl-rPL/strings.xml +++ b/uhabits-android/src/main/res/values-pl-rPL/strings.xml @@ -48,8 +48,8 @@ Nawyk przywrócony z archiwum - Nawyki przywrócone z archiwum - Nawyk przywrócony z archiwum + Nawyki zostały przywrócone z archiwum + Nawyki zostały przywrócone z archiwum Nawyki zostały przywrócone z archiwum Przegląd @@ -104,7 +104,7 @@ Nawyk zostanie trwale usunięty. Tej czynności nie można cofnąć. Nawyki zostaną trwale usunięte. Tej czynności nie można cofnąć. Nawyki zostaną trwale usunięte. Tej czynności nie można cofnąć. - Nawyki zostaną trwale usunięte. Tej operacji nie można cofnąć. + Nawyki zostaną trwale usunięte. Tej czynności nie można cofnąć. Nawyk usunięty/nie znaleziony Weekendy @@ -159,7 +159,7 @@ Brak Filtruj Ukryj zakończone - Ukryj wprowadzone + Ukryj wprowadzone Ukryj archiwizowane Przypinaj powiadomienia Zapobiega usunięciu powiadomień. @@ -196,7 +196,7 @@ Zobacz wszystkich współtwórców Baza danych Przezroczystość widżetu - Sprawia, że widżety są bardziej przezroczyste lub bardziej nieprzezroczyste na ekranie głównym. + Sprawia, że widżety są bardziej lub mniej przezroczyste na ekranie głównym. Pierwszy dzień tygodnia Czy wytrwałeś dziś w nawyku? Notatki diff --git a/uhabits-android/src/main/res/values-pt-rBR/strings.xml b/uhabits-android/src/main/res/values-pt-rBR/strings.xml index 6d3f95856..c5687a1f8 100644 --- a/uhabits-android/src/main/res/values-pt-rBR/strings.xml +++ b/uhabits-android/src/main/res/values-pt-rBR/strings.xml @@ -75,6 +75,7 @@ Perguntar sempre Personalizar... Marcar repetições com um toque curto + Adicione marcações com um simples toque, ao invés de pressionar e segurar. Avaliar esse app no Google Play Mandar sugestões para o desenvolvedor Ver código-fonte no GitHub @@ -146,6 +147,7 @@ Nenhum Filtro Ocultar concluído + Ocultar marcado Ocultar arquivado Tornar notificações persistentes Impede que as notificações sejam removidas. @@ -165,8 +167,12 @@ Por status Exportar Pressione e segure para alterar o valor + Valor Calendário Unidade + Tipo de meta + Pelo menos + No máximo ex.: Você se exercitou hoje? Questão Alvo diff --git a/uhabits-android/src/main/res/values-ro-rRO/strings.xml b/uhabits-android/src/main/res/values-ro-rRO/strings.xml index 0062c1147..019596b0b 100644 --- a/uhabits-android/src/main/res/values-ro-rRO/strings.xml +++ b/uhabits-android/src/main/res/values-ro-rRO/strings.xml @@ -151,5 +151,20 @@ Consultați politica de confidențialitate Vizualizați toți colaboratorii… Bază de date + Notițe + (Opţional) + ex. Te-ai trezit mai devreme astăzi? Ai făcut exerciții? Ai jucat șah? + Măsurabil %d ori în %d zile + Culoare + de exemplu mile + În fiecare lună + nu poate fi gol + Astăzi + Introducere + Nici un obicei găsit + Activați omiterea de zile + Arată semnele de întrebare pentru datele lipsă + Acum ești un dezvoltator + Extinde ziua câteva ore după miezul nopții diff --git a/uhabits-android/src/main/res/values-tr-rTR/strings.xml b/uhabits-android/src/main/res/values-tr-rTR/strings.xml index ac985b368..932d07bf4 100644 --- a/uhabits-android/src/main/res/values-tr-rTR/strings.xml +++ b/uhabits-android/src/main/res/values-tr-rTR/strings.xml @@ -75,6 +75,7 @@ Her zaman sor Özel... Tek dokunuşla işaretle + Basılı tutma yerine tek bir dokunuşla onay işaretleri koy. Google Play\'de uygulamayı oyla Geliştiriciye geri bildirim gönder Github\'da kaynak kodunu görüntüle @@ -146,6 +147,7 @@ Sessiz Filtre Tamamlananları gizle + Girileni gizle Arşivlenenleri gizle Bildirimleri kalıcı yap Bildirimlerin kaydırılmasını engeller. @@ -165,8 +167,12 @@ Duruma göre Dışarı aktar Değeri değiştirmek için basılı tut + Değer Takvim Birim + Hedef Türü + En az + En fazla örn: Bugün egzersiz yaptın mı? Soru Hedef From 7c1a91e35adf912717352afeb9ffa58c00c37edb Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Sun, 15 May 2022 00:23:27 -0500 Subject: [PATCH 10/19] Update list of translators --- translators-crowdin.csv | 424 ++++++++++-------- .../src/main/res/layout/about_translators.xml | 9 +- 2 files changed, 237 insertions(+), 196 deletions(-) diff --git a/translators-crowdin.csv b/translators-crowdin.csv index c313f06ef..2ce37da5f 100644 --- a/translators-crowdin.csv +++ b/translators-crowdin.csv @@ -1,377 +1,415 @@ Name,Languages,"Translated (Words)","Target Words","Approved (Words)",Voted,"""+"" votes received","""-"" votes received","Winning (Words)",Joined -"Alinson Xavier (iSoron)","Portuguese, Brazilian; Japanese; Spanish; Portuguese; Italian; Chinese Simplified; French; Hungarian; German; Arabic; Hindi; Slovenian; Catalan; Greek; Korean; Bulgarian; Chinese Traditional; Polish; Russian; Serbian (Cyrillic); Turkish; Ukrainian; Czech; Indonesian; Croatian; Danish; Dutch; Romanian; Swedish; Basque; Persian; Finnish; Vietnamese; Telugu; Tamil; Afrikaans; Esperanto; Hebrew",14808,17227,1282,0,1779,80,4274,"2016-03-05 18:35:27" +"Alinson Xavier (iSoron)","Portuguese, Brazilian; Japanese; Chinese Simplified; Italian; Spanish; Portuguese; French; Hungarian; Chinese Traditional; Turkish; Russian; Polish; Arabic; German; Korean; Greek; Catalan; Bulgarian; Hindi; Slovenian; Ukrainian; Serbian (Cyrillic); Czech; Indonesian; Croatian; Danish; Dutch; Romanian; Swedish; Basque; Persian; Finnish; Vietnamese; Tamil; Telugu; Hebrew; Esperanto; Norwegian; Afrikaans; Slovak; Armenian; Serbian (Latin); Uyghur",15497,18825,1308,0,1896,84,4315,"2016-03-05 18:35:27" "Slobodan Simić (Слободан Симић) (slsimic)","Serbian (Latin); Serbian (Cyrillic)",2054,1831,2114,12,33,0,1991,"2021-02-03 14:26:07" "Oglaigh Rystard (oglaignaheireann)","Ukrainian; Portuguese; Catalan; Greek; Basque; Romanian; Italian",1103,1037,1327,1,13,6,954,"2017-03-31 09:13:19" +dukelc,Slovak,1046,993,0,0,0,0,0,"2020-08-27 14:02:41" "David (Cliff122)",Swedish,1040,1019,725,6,0,0,700,"2020-01-21 13:56:55" -"Omer I.S. (omeritzics)",Hebrew,1000,900,1097,14,1,0,946,"2020-10-11 20:10:51" -dukelc,Slovak,919,880,0,0,0,0,0,"2020-08-27 14:02:41" -"Intan Ayunda (Intan_Ayunda)",Indonesian,800,793,962,0,0,0,711,"2020-10-14 07:51:58" +"Omer I.S. (omeritzics)",Hebrew,1040,927,1122,14,1,0,975,"2020-10-11 20:10:51" +"Intan Ayunda (Intan_Ayunda)",Indonesian,818,811,985,0,0,0,729,"2020-10-14 07:51:58" +"Mihail Stefanov (MStefanov)",Bulgarian,755,794,3,0,2,0,2,"2017-03-31 16:09:02" KMakoto,"Chinese Traditional",745,1146,949,0,0,0,745,"2019-10-22 04:19:52" -"Evren (evrenkiymaz)",Turkish,688,604,0,71,5,1,0,"2020-10-04 03:39:16" +"Evren (evrenkiymaz)",Turkish,688,604,0,71,28,22,0,"2020-10-04 03:39:16" +andaryon,Czech,681,606,0,108,0,0,0,"2021-11-25 10:20:45" +"Antti Kallio (antti.kallio)",Finnish,668,539,0,5,0,0,0,"2021-07-03 05:54:44" "David Nos (david.nos)","Catalan; Spanish",667,731,0,0,1,0,0,"2020-01-04 10:15:36" -"Antti Kallio (antti.kallio)",Finnish,650,525,0,0,0,0,0,"2021-07-03 05:54:44" -androide74,Italian,644,659,0,2,0,0,0,"2020-02-06 15:46:28" +androide74,Italian,662,681,0,2,0,0,0,"2020-02-06 15:46:28" +Osoitz,Basque,655,595,0,9,0,0,3,"2018-01-23 14:07:47" +"Dmitriy Bogdanov (di72nn)",Russian,643,589,1197,0,36,0,515,"2017-03-31 10:00:48" Tomairuka,Japanese,633,1636,909,43,0,0,564,"2020-12-12 12:14:22" -"Dmitriy Bogdanov (di72nn)",Russian,625,572,1197,0,36,0,515,"2017-03-31 10:00:48" reyhoon,Persian,624,759,0,1,3,1,0,"2020-10-01 18:17:23" -Osoitz,Basque,610,545,0,9,0,0,3,"2018-01-23 14:07:47" -"Saeed Esmaili (saaeed.es20)",Persian,568,774,0,5,4,0,0,"2020-11-26 15:41:15" +"Saeed Esmaili (saaeed.es20)",Persian,586,795,0,5,4,0,0,"2020-11-26 15:41:15" fabian.bouchal,German,548,527,0,6,0,3,72,"2020-01-07 06:43:37" -boban77,Czech,509,461,0,2,0,0,0,"2020-04-30 13:18:24" -"Yoav Argov (YoavArgov)",Hebrew,501,461,0,0,1,8,103,"2017-04-28 07:23:01" +"Isti (eisti)",Hungarian,528,476,0,0,0,0,0,"2020-12-03 12:02:51" +boban77,Czech,509,461,0,2,29,0,0,"2020-04-30 13:18:24" +"Martim Parente (martimparente)",Portuguese,505,542,0,38,0,0,0,"2020-08-26 10:22:11" +"Yoav Argov (YoavArgov)",Hebrew,501,461,0,0,1,8,91,"2017-04-28 07:23:01" REMOVED_USER,Norwegian,501,498,501,0,148,0,501,"2017-07-05 19:02:25" -"Martim Parente (Sharlimar)",Portuguese,497,534,0,38,0,0,0,"2020-08-26 10:22:11" "chrrris1987 (Chrrris1987)",Dutch,467,478,0,23,0,0,0,"2020-02-03 05:26:04" -"Huy Ngo (huyngo)",Vietnamese,461,695,0,1,0,0,0,"2020-01-26 11:58:36" "黄克 (hk13127)","Chinese Simplified",461,765,0,1,0,0,24,"2020-01-17 23:16:03" -"Arkadiusz Bubak (epitek)",Polish,458,416,29,24,0,3,0,"2020-11-05 05:11:58" +"Huy Ngo (huyngo)",Vietnamese,461,695,0,1,0,0,0,"2020-01-26 11:58:36" +"Arkadiusz Bubak (epitek)",Polish,458,416,52,24,9,4,0,"2020-11-05 05:11:58" marco.baturan,Esperanto,452,452,0,0,0,0,0,"2020-06-23 02:49:46" "Sief Tarek (sieftarek135)",Arabic,447,455,0,0,0,0,0,"2021-02-07 14:35:21" +"Alparslan Şakçi (sakci)",Turkish,436,372,0,118,1,0,0,"2022-01-14 12:03:11" +JY3,"Chinese Simplified",427,727,295,0,1,0,222,"2021-03-08 08:53:35" "Samuel Guay (SamGuay)",French,426,486,0,6,0,0,0,"2020-06-25 07:14:38" "Diana Karaseva (Sun_Dianka)",Russian,399,373,0,10,1,0,209,"2020-01-30 06:40:02" "Alexander Jansson (dalecarlian)",Swedish,396,406,507,0,0,3,399,"2017-06-21 01:37:32" luiandresgonzalez,Spanish,383,403,0,1,28,0,0,"2020-07-11 14:20:44" -"Thamara Andrade (tkcandrade)","Portuguese, Brazilian",380,387,0,0,1,0,252,"2020-01-09 19:35:48" +"Thamara Andrade (tkcandrade)","Portuguese, Brazilian",380,387,0,0,1,0,239,"2020-01-09 19:35:48" "Sølv Ræven (soelvraeven)",Danish,370,370,0,0,0,0,0,"2020-11-28 16:46:18" -"Isti (eisti)",Hungarian,367,329,0,0,0,0,0,"2020-12-03 12:02:51" "Anh Quân (dangquanuet)",Vietnamese,362,530,0,42,2,0,0,"2017-10-29 12:27:44" gapszi,Hungarian,348,301,0,86,0,0,0,"2019-04-08 01:35:54" -JY3,"Chinese Simplified",345,585,278,0,1,0,207,"2021-03-08 08:53:35" "Mahdi Nasiri (mahdi.nasiri)",Persian,343,465,0,39,3,1,0,"2017-07-14 09:17:25" Seoyul,Korean,339,825,0,0,27,0,0,"2017-06-21 08:11:39" "Magimai Prakasam (magimai)",Tamil,336,831,0,12,0,0,0,"2018-04-15 21:16:08" -"Michael Malak (MichaelKMalak)",Arabic,304,271,0,0,0,0,0,"2020-05-26 19:47:58" +"Michael Malak (MichaelKMalak)",Arabic,304,271,0,0,1,0,0,"2020-05-26 19:47:58" +Blinkin,Dutch,297,334,0,5,0,0,0,"2021-06-14 10:30:05" "Elina Salminen (salminen.elina.m)",Finnish,297,227,0,0,0,0,0,"2021-01-06 01:28:57" -ayane.m,Japanese,292,863,0,1,3,0,22,"2019-11-20 03:28:26" -Blinkin,Dutch,284,318,0,1,0,0,0,"2021-06-14 10:30:05" -"Marius Teufelweich (teufelweich)",German,249,256,606,4,2,0,146,"2021-03-12 04:11:38" +ayane.m,Japanese,292,863,0,1,5,0,22,"2019-11-20 03:28:26" +"Marius Teufelweich (teufelweich)",German,267,272,611,4,13,1,146,"2021-03-12 04:11:38" +hypnotichemionus,"Chinese Simplified",249,430,0,0,8,0,19,"2020-03-08 01:46:25" cobalt59,German,237,234,0,1,24,1,132,"2017-06-05 05:18:33" -"QWERT (lurenjia01)","Chinese Simplified",236,407,0,0,8,0,19,"2020-03-08 01:46:25" beriain,Basque,234,235,0,0,2,0,0,"2017-03-31 15:42:28" pnhpnh,Vietnamese,225,343,0,1,3,0,0,"2017-11-27 12:06:07" "Dika Fitrian Dwi Putra (OsamuDazai)",Indonesian,221,215,0,0,0,0,48,"2020-07-13 04:40:27" -easyrepro,Telugu,214,297,0,0,0,0,0,"2020-06-12 12:52:10" +easyrepro,Telugu,214,297,0,0,4,0,0,"2020-06-12 12:52:10" taras-ko,Ukrainian,211,183,0,1,4,0,19,"2017-10-26 16:52:22" sojusnik,German,207,200,1,0,30,0,66,"2017-04-03 17:11:56" -axmed99,Ukrainian,203,177,0,40,0,0,53,"2021-04-01 03:56:20" +"Andrij Mizyk (andmizyk)",Ukrainian,204,178,0,40,0,0,53,"2021-04-01 03:56:20" "Heru Yen (heruyen)",Indonesian,201,201,0,0,0,0,25,"2020-06-29 18:39:15" "Vijaykumar Borkar (vjkumar)",Hindi,200,364,0,11,0,0,0,"2021-08-06 16:12:15" -Ishmaeel,Turkish,193,174,0,129,6,0,0,"2017-10-04 03:54:00" +_translator,French,199,227,0,11,0,0,0,"2021-07-06 07:54:12" +Ishmaeel,Turkish,193,174,0,129,17,6,0,"2017-10-04 03:54:00" +oscfd,Spanish,192,201,0,2,4,0,0,"2021-05-21 17:58:22" +bruhwut,Vietnamese,189,292,0,1,0,0,0,"2021-05-21 07:16:30" "Aputsiak Niels Janussen (aputtu)",Danish,187,200,0,0,0,0,0,"2019-08-28 05:47:42" -_translator,French,181,206,0,11,0,0,0,"2021-07-06 07:54:12" fbruna17,Danish,181,179,0,1,0,0,0,"2021-01-28 15:48:47" +Bryanx,Dutch,179,168,0,5,2,0,0,"2019-11-21 17:08:12" "Omry Cohen (omrycohen)",Hebrew,175,156,0,1,0,0,33,"2021-01-18 07:33:23" -Bryanx,Dutch,174,165,0,5,0,0,0,"2019-11-21 17:08:12" "Pierre GALIEGUE (pierre.galiegue)",French,171,194,0,24,4,0,0,"2020-08-16 11:41:35" -bruhwut,Vietnamese,171,268,0,1,0,0,0,"2021-05-21 07:16:30" +plitwin,Polish,168,151,0,2,31,0,49,"2021-01-20 06:18:37" DionysosDV,Greek,165,153,0,0,0,0,0,"2021-02-27 19:05:25" "Gustavo Lima (GustavoLima)",Portuguese,158,177,0,1,4,10,0,"2020-08-26 10:35:05" -oscfd,Spanish,155,166,0,1,4,0,0,"2021-05-21 17:58:22" -plitwin,Polish,145,128,0,1,16,0,26,"2021-01-20 06:18:37" +"Ravi Rami (ramiravi)",Hindi,151,248,0,0,0,0,0,"2021-10-10 09:19:40" "Lương Vĩnh Khang (LuongVinhKhang)",Vietnamese,144,256,0,0,46,1,0,"2017-08-10 10:05:58" azzamsa,Indonesian,142,136,0,48,0,1,26,"2017-06-16 18:29:45" "yoding (yodingc)","Chinese Traditional; Chinese Simplified",141,271,0,10,0,0,0,"2021-07-07 01:45:45" "Neysa Nasywa (neysanasywa)",Indonesian,140,141,0,0,0,0,60,"2020-11-18 10:32:10" +mohmans,Arabic,139,141,0,12,1,0,0,"2020-11-23 02:48:00" +"Eilif Adelvice (adelvice)",Spanish,139,154,0,96,1,0,0,"2021-08-05 07:20:21" "Mohammed Imthath (mimthath4)",Tamil,136,274,0,0,11,0,0,"2018-02-15 22:41:15" +carllacan,Catalan,134,155,0,2,0,0,0,"2021-11-13 13:12:07" roptat,French,132,154,0,112,89,5,0,"2017-04-19 16:54:47" "Trần Thái (tranhoangthai2001)",Vietnamese,127,186,0,8,1,0,0,"2018-03-01 10:51:39" "OP Smosher (teenwolffan44)","Serbian (Cyrillic)",124,122,0,0,0,0,18,"2020-11-05 09:41:35" 4001982248998,Esperanto,122,119,0,0,0,0,0,"2017-10-08 04:13:02" "StoP4Me (Lcqp)",Romanian,121,119,0,0,3,0,0,"2018-05-06 18:51:59" -alalloush,Arabic,118,129,0,2,2,0,0,"2017-03-31 12:37:17" -"Eilif Adelvice (adelvice)",Spanish,116,126,0,96,0,0,0,"2021-08-05 07:20:21" -Sebastian05067,Spanish,114,133,0,55,28,0,0,"2017-05-14 00:48:16" +alalloush,Arabic,118,129,0,2,14,3,0,"2017-03-31 12:37:17" "Tanya (MagicUnderHood)",Russian,114,98,0,19,0,0,54,"2019-04-21 10:44:03" -REMOVED_USER,Arabic,111,106,0,22,21,2,0,"2018-01-05 07:01:45" -mohmans,Arabic,109,103,0,2,0,0,0,"2020-11-23 02:48:00" +Sebastian05067,Spanish,114,133,0,55,28,0,0,"2017-05-14 00:48:16" +REMOVED_USER,Arabic,111,106,0,22,22,2,0,"2018-01-05 07:01:45" "Iabin Arteaga (iabin)",Spanish,108,111,0,4,21,0,0,"2017-08-26 21:08:54" "Ivan Krušlin (krux3r)",Croatian,108,122,503,0,0,0,108,"2017-03-31 09:15:24" 2kaafone,Finnish,105,90,0,0,0,0,0,"2019-08-12 06:58:48" "Adam Jurkiewicz (hasztagg)",Polish,104,105,529,0,0,0,104,"2017-03-31 09:50:51" "just a name bro (justanamebr0)",Danish,98,109,0,0,1,0,0,"2019-06-19 11:57:55" "Nam Nguyen (namnl2706)",Vietnamese,95,137,0,0,0,0,0,"2020-08-18 23:02:33" -"손유정 (yuwon1213)",Korean,95,57,0,0,0,0,0,"2021-03-30 05:25:33" +"손유정 (yuwon1213)",Korean,95,57,0,0,1,0,0,"2021-03-30 05:25:33" ranmagen,Hebrew,91,78,0,0,0,0,0,"2021-02-16 05:44:31" LoneWanderer,"Chinese Traditional",90,137,0,4,0,0,0,"2020-09-29 05:24:48" -"Vo - (voyl)","Chinese Traditional",89,126,0,0,5,0,0,"2020-09-02 23:34:42" ikkaz,Indonesian,89,84,0,5,0,0,4,"2019-09-02 19:58:54" +"Vo - (voyl)","Chinese Traditional",89,126,0,0,5,0,0,"2020-09-02 23:34:42" "Irene K (Heaun)",Korean,88,75,0,25,0,0,0,"2020-03-16 11:31:12" Prosta4ok_ua,Ukrainian,87,84,0,1,0,0,17,"2020-01-23 19:43:41" "Kumar Anand (kumar0500)",Hindi,87,125,0,0,0,0,0,"2020-11-07 02:46:09" -"Ohad Edri (ohadalte)",Hebrew,85,79,0,0,1,3,18,"2020-07-04 03:42:09" +"Ohad Edri (ohadalte)",Hebrew,85,79,0,0,1,3,13,"2020-07-04 03:42:09" helectron,Persian,84,102,0,1,0,0,0,"2021-03-02 04:10:51" "Radu Cebotari (wildProgrammer)",Romanian,84,92,0,1,0,0,0,"2020-02-05 01:20:00" +"Bruces Lee (aplusbdesign)",Korean,82,66,0,0,0,0,0,"2021-08-23 11:27:18" +"Israa Z (sosozozo)",Arabic,79,87,0,43,14,0,3,"2017-11-27 14:10:50" "Sofia Neves (sofiasonev)","Portuguese, Brazilian",79,84,0,1,0,0,46,"2020-03-12 18:19:46" -"Jacob Roller (jdr28070)",Korean,79,61,0,0,0,0,0,"2020-01-03 11:36:40" +"Jacob Roller (jdr28070)",Korean,79,61,0,0,1,0,0,"2020-01-03 11:36:40" Tiralka,French,79,91,0,92,1,0,0,"2018-02-09 18:39:01" -"Israa Z (sosozozo)",Arabic,79,87,0,43,12,0,3,"2017-11-27 14:10:50" -"Toni Mustonen (toni.mustonen)",Finnish,78,72,0,0,0,0,0,"2017-09-02 05:34:12" -"Fauz Aladeem (topfauz)",Arabic,76,77,0,0,0,1,0,"2020-02-21 22:46:12" +"Toni Mustonen (toni.mustonen)",Finnish,78,72,0,0,5,0,0,"2017-09-02 05:34:12" "Michael (quelbs)",German,76,75,0,1,0,0,39,"2020-08-18 07:39:26" -"Oliver Gronowski (OliverGronowski)",German,70,69,0,5,0,0,0,"2021-05-14 16:37:10" +"Fauz Aladeem (topfauz)",Arabic,76,77,0,0,0,1,0,"2020-02-21 22:46:12" +"Radoslaw Biernacki (radoslaw.biernacki)",Polish,70,74,0,56,1,0,1,"2020-12-15 17:55:31" +"Oliver Gronowski (OliverGronowski)",German,70,69,0,5,2,0,0,"2021-05-14 16:37:10" RealDonald,Dutch,67,69,0,121,10,0,0,"2017-06-23 20:10:12" sirekanyan,"Armenian; Russian",66,65,0,0,0,0,0,"2020-04-18 11:32:52" "Константин К. (kocyak1991)",Russian,64,60,0,0,1,2,0,"2018-06-10 13:39:37" "Laura Sophie (laurasophie20)",German,62,67,0,4,0,0,0,"2018-01-06 14:21:24" -"Alparslan Sakci (sakci)",Turkish,61,55,0,11,0,0,0,"2021-06-10 11:59:22" raden20,Indonesian,61,62,177,0,1,0,64,"2017-04-09 22:04:23" +"Peter Williams (williamspete001)",Japanese,60,173,0,2,0,0,3,"2020-01-01 13:17:44" "Jan Wojtecki (j4nw)",Polish,58,46,0,0,0,0,26,"2017-11-02 05:42:14" "Deepak Bharathi (deepakbharathi1994)",Tamil,56,107,0,0,11,4,0,"2017-09-17 08:00:31" -"Peter Williams (williamspete001)",Japanese,55,147,0,2,0,0,3,"2020-01-01 13:17:44" "Андрій Козицький (andriikozytskyi1108)",Ukrainian,52,52,0,0,1,0,0,"2018-10-22 01:45:08" -"Nil riera (nilriera2000)",Catalan,52,61,0,1,0,0,0,"2021-06-22 16:37:44" +"Nil riera (nilriera2000)",Catalan,52,61,0,1,2,0,0,"2021-06-22 16:37:44" +"Neoone (Neooneqq)",Romanian,51,54,0,0,0,0,0,"2022-05-05 20:42:11" REMOVED_USER,Italian,51,52,0,2,0,0,0,"2017-08-21 05:15:31" govindap,"Japanese; Hindi",51,114,0,6,1,0,0,"2020-06-02 20:15:52" "Mare Geldenhuys (mare.geldenhuys)",Afrikaans,50,57,0,0,0,0,0,"2017-10-20 18:00:14" +"Mahmoud Magdy (M7moudManson)",Arabic,49,60,0,6,8,1,0,"2021-08-21 09:01:38" "Behnood HRazy (behnoodhr)",Persian,49,70,0,0,0,0,0,"2017-11-25 10:57:21" -"tat bz (Tat_i)",German,48,56,0,55,0,0,27,"2021-03-26 05:12:54" J3ll3nl,Dutch,48,48,0,0,17,1,3,"2017-03-31 11:56:09" -"Andrew Firnes (Anechan)",Russian,47,47,0,3,0,0,29,"2019-09-18 09:51:59" -andowero,Czech,47,38,0,0,0,0,0,"2020-01-20 02:29:01" +"tat bz (Tat_i)",German,48,56,0,55,0,1,27,"2021-03-26 05:12:54" vach,Armenian,47,36,0,0,0,0,0,"2020-04-18 16:53:12" +"Andrew Firnes (Anechan)",Russian,47,47,0,3,0,0,29,"2019-09-18 09:51:59" +andowero,Czech,47,38,0,0,3,0,0,"2020-01-20 02:29:01" "Rahul Shishodia (rahul.shishodia.10)",Hindi,46,85,0,6,5,1,0,"2018-12-24 22:18:19" "Coni Ragni (coni2ragnii)",Spanish,46,46,0,0,0,0,0,"2021-02-28 20:18:37" Cp0204,"Chinese Simplified",45,72,0,0,0,0,0,"2019-08-20 11:04:27" "cc (cavaz)",Italian,44,41,0,0,0,0,0,"2017-04-01 04:21:08" -"Boban Jagertraum (boban40)",Czech,43,38,0,2,1,1,0,"2017-03-31 09:39:16" -"Kamil Dziadek (prso94)",Polish,43,39,0,0,2,0,0,"2020-04-06 17:12:06" +"Boban Jagertraum (boban40)",Czech,43,38,0,2,18,1,0,"2017-03-31 09:39:16" +"Kamil Dziadek (prso94)",Polish,43,39,0,0,6,0,0,"2020-04-06 17:12:06" +andreea.muscalagiu,Romanian,42,52,0,1,0,0,0,"2017-10-22 07:19:49" "Me Me (gentelwom)",Arabic,42,40,0,0,0,0,0,"2020-11-08 20:44:01" -"Ali Elsheikh (aelsheikh1987)",Arabic,42,41,0,0,0,0,0,"2021-06-16 10:17:26" "Balázs Keresztury (belidzs)",Hungarian,42,41,501,0,7,0,38,"2017-04-06 02:40:24" -andreea.muscalagiu,Romanian,42,52,0,1,0,0,0,"2017-10-22 07:19:49" -"Mateusz Duda (MateuszDuda)",Polish,42,42,0,0,0,0,0,"2021-08-17 11:27:11" -MStefanov,Bulgarian,41,55,2,0,2,0,2,"2017-03-31 16:09:02" -"Sofia Veijonen (Suklaa) (sofia.veijonen)",Finnish,40,33,0,0,0,0,0,"2018-03-07 09:24:22" +"Mateusz Duda (MateuszDuda)",Polish,42,42,0,0,6,0,0,"2021-08-17 11:27:11" +"Ali Elsheikh (aelsheikh1987)",Arabic,42,41,0,0,0,0,0,"2021-06-16 10:17:26" "Ali Zali (stm19951995)",Persian,40,60,0,0,0,0,0,"2020-03-23 19:57:26" -"Limin Lu (liminlu)","Chinese Simplified",39,79,503,0,0,0,39,"2017-03-31 09:49:35" +"Sofia Veijonen (Suklaa) (sofia.veijonen)",Finnish,40,33,0,0,0,0,0,"2018-03-07 09:24:22" dusanstrgar,Slovenian,39,41,0,0,0,0,0,"2017-03-31 10:30:28" +"Limin Lu (liminlu)","Chinese Simplified",39,79,503,0,0,0,39,"2017-03-31 09:49:35" Anshoe,Tamil,38,65,0,14,0,0,0,"2018-01-02 11:06:52" anasshm,Arabic,37,36,0,9,0,0,0,"2019-01-27 04:07:22" hrexen,Armenian,37,37,0,0,0,0,0,"2020-12-09 02:30:34" "Abdulrahman (D7M)",Arabic,36,39,0,0,0,0,0,"2020-01-29 18:55:30" -"Maria Chushnyakova (maria.ch)",Russian,36,31,0,3,0,0,0,"2021-08-17 03:23:58" REMOVED_USER,Swedish,36,33,0,5,1,0,0,"2018-09-29 17:47:33" +xphsis,Basque,36,31,0,0,0,0,0,"2022-01-02 08:16:19" +"Maria Chushnyakova (maria.ch)",Russian,36,31,0,3,0,0,0,"2021-08-17 03:23:58" "長谷川知里 (chase0213)",Japanese,34,138,0,13,0,0,24,"2018-12-14 10:52:44" +"Piotr Łuczyński (peterluczynski)",Polish,33,30,0,6,10,0,2,"2020-01-29 07:27:40" "Luis E. Perichon (luisperichon)",Spanish,33,40,0,104,0,0,0,"2017-09-04 13:46:06" -"Piotr Łuczyński (peterluczynski)",Polish,33,30,0,6,5,0,2,"2020-01-29 07:27:40" "milad farahani (miladfarmahini90)",Persian,33,44,0,18,1,0,3,"2017-08-31 16:09:00" +JoeLi,"Chinese Traditional",31,70,0,12,0,0,24,"2017-06-25 05:32:48" andriikozytskyi2625,Ukrainian,31,23,0,0,0,0,0,"2019-07-08 00:16:41" +REMOVED_USER,Russian,31,30,0,2,4,0,3,"2018-12-03 23:55:47" Moastafa,Arabic,31,25,0,0,0,0,0,"2020-07-06 11:37:53" "hamza gamal (hamzagamal4444)",Arabic,31,28,0,0,0,0,0,"2020-08-03 15:23:34" -REMOVED_USER,Russian,31,30,0,2,4,0,3,"2018-12-03 23:55:47" -JoeLi,"Chinese Traditional",31,70,0,12,0,0,24,"2017-06-25 05:32:48" yancyn,"Chinese Simplified",30,40,0,0,0,0,1,"2020-05-18 20:06:03" -"비니몬youtube (khj01025276475)",Korean,29,25,0,0,0,0,0,"2020-02-09 20:44:35" "Ruud Schouten (ruudschouten)",Dutch,29,32,0,41,3,0,0,"2017-07-22 17:49:17" -"Aaron Dalton (Perlkonig)",French,26,25,0,141,1,0,0,"2018-01-14 12:58:19" +"비니몬youtube (khj01025276475)",Korean,29,25,0,0,0,0,0,"2020-02-09 20:44:35" +avelneve,Indonesian,29,28,0,0,0,0,0,"2022-04-13 13:26:10" "Niraj Yadav (neverforgetniraj)",Hindi,26,48,0,0,0,0,0,"2017-04-11 02:26:50" -"Guillaume Collic (gcollic)",French,26,28,0,126,11,0,0,"2017-05-05 16:13:00" -"Radoslaw Biernacki (radoslaw.biernacki)",Polish,26,24,0,8,0,0,1,"2020-12-15 17:55:31" +"Aaron Dalton (Perlkonig)",French,26,25,0,141,1,0,0,"2018-01-14 12:58:19" "Jonny I (jonny99dj)",Italian,26,26,0,5,0,0,0,"2017-10-07 07:35:34" +"Guillaume Collic (gcollic)",French,26,28,0,126,11,0,0,"2017-05-05 16:13:00" +Pan_Filuta,Czech,25,21,0,5,8,0,3,"2017-04-29 12:55:14" "Eddie (eddieattaboy)","Chinese Traditional",25,34,0,1,0,0,0,"2020-11-04 21:48:05" -Pan_Filuta,Czech,25,21,0,5,4,0,3,"2017-04-29 12:55:14" "eduard83 (barbany.eduard)",Catalan,24,25,0,2,0,0,0,"2019-06-26 14:59:47" +"A Aa (ylayzlmimashisafyoutub)",Arabic,23,33,0,34,1,1,0,"2021-09-27 15:34:26" +"Caner Başaran (basarancaner)",Turkish,23,21,0,0,26,1,0,"2017-04-09 06:34:59" "Ľuboš Čaky (lubos.caky)",Slovak,23,22,0,0,0,0,0,"2019-07-02 16:51:44" -"Caner Başaran (basarancaner)",Turkish,23,21,0,0,21,0,0,"2017-04-09 06:34:59" -hodanli,Turkish,22,26,0,0,1,0,0,"2017-11-03 14:33:41" -gnu-ewm,Polish,22,23,0,6,0,0,0,"2021-02-24 03:42:01" "Neeraj Verma (verma.neeraj.in)",Hindi,22,37,0,0,1,0,0,"2018-07-23 07:16:41" +gnu-ewm,Polish,22,23,0,6,2,0,0,"2021-02-24 03:42:01" +hodanli,Turkish,22,26,0,0,1,0,0,"2017-11-03 14:33:41" "Alcarkse (alexis.brusle)",French,21,25,0,7,11,0,0,"2017-08-06 09:32:29" -olbotta,Italian,20,25,0,2,0,0,0,"2021-06-06 04:22:55" "Shashwat (goforgold)",Hindi,20,33,0,0,0,0,0,"2020-05-17 10:34:42" -"Magdalena Urbańczyk (madziia139)",Polish,19,19,0,0,0,0,0,"2017-10-21 03:01:04" -sheeCesu,French,19,18,0,48,4,0,0,"2017-12-21 17:01:39" +olbotta,Italian,20,25,0,2,0,0,0,"2021-06-06 04:22:55" can13,Turkish,19,14,0,8,0,0,0,"2021-01-03 10:39:03" -"İsa Eş (IsaEs)",Turkish,19,17,0,0,6,1,0,"2017-06-20 07:30:22" "사자솥 (toke1597)",Korean,19,19,0,0,0,0,0,"2020-02-04 13:36:11" +KenKailer,Arabic,19,25,0,0,0,0,0,"2022-05-10 06:16:54" +"İsa Eş (IsaEs)",Turkish,19,17,0,0,6,2,0,"2017-06-20 07:30:22" +"Magdalena Urbańczyk (madziia139)",Polish,19,19,0,0,0,0,0,"2017-10-21 03:01:04" +sheeCesu,French,19,18,0,48,4,0,0,"2017-12-21 17:01:39" axikman11111,Uyghur,18,19,0,0,0,0,0,"2018-10-13 12:25:31" +Adeline31,French,17,20,0,3,0,0,0,"2019-12-06 00:00:11" "Hoon Jung (hooni100)",Korean,17,10,0,0,0,0,0,"2021-01-03 02:26:54" -"Ceara Lopez (cealopez)",Spanish,17,18,0,0,5,1,0,"2017-08-22 22:56:13" takoyakibento,Korean,17,13,0,3,0,0,0,"2020-08-01 08:44:15" -Adeline31,French,17,20,0,3,0,0,0,"2019-12-06 00:00:11" -engineeringforgood,Russian,16,15,0,0,0,0,16,"2021-01-22 03:32:35" +"Ceara Lopez (cealopez)",Spanish,17,18,0,0,5,1,0,"2017-08-22 22:56:13" bretzel15,German,16,20,0,0,0,0,0,"2020-04-06 02:49:14" -"Şamil Ateşoğlu (m.samilatesoglu)",Turkish,16,22,0,11,6,3,0,"2017-07-05 18:37:08" DebatablySane,Bulgarian,16,15,0,48,0,0,0,"2017-07-10 15:13:18" +"Şamil Ateşoğlu (m.samilatesoglu)",Turkish,16,22,0,11,6,3,0,"2017-07-05 18:37:08" +engineeringforgood,Russian,16,15,0,0,0,0,16,"2021-01-22 03:32:35" "Bhava Tharini (bhavidanush)",Tamil,15,37,0,0,0,0,0,"2019-10-09 05:43:11" +"Maro Chr (caprisunglasses)",Greek,14,17,0,0,0,0,0,"2021-08-17 06:53:33" "Zeynep Esen (nezihaesen50)",Turkish,14,13,0,0,0,0,0,"2020-01-28 07:05:15" -"Fikret Bilici (fikretbilici)",Turkish,14,13,0,0,0,0,0,"2020-06-21 17:16:11" -"EuiHo Hwang (euiho.hwang)",Korean,14,16,0,0,0,0,0,"2020-06-23 02:40:01" -"Zeeshan Rabbani (Zeera)",Hindi,14,25,0,0,0,0,0,"2020-09-15 11:32:01" -"Faiz Ahamed (faiznewton)",Tamil,14,31,0,0,0,0,0,"2021-05-06 23:06:46" -"Anastasia Borchuk (al2.borchuk)",Russian,14,14,0,0,0,0,0,"2020-04-14 13:22:49" iamsurajbobade,Hindi,14,30,0,0,0,0,0,"2018-05-21 11:23:27" +"Faiz Ahamed (faiznewton)",Tamil,14,31,0,0,0,0,0,"2021-05-06 23:06:46" "Sanji Vinsmock (mukanzhanbolat4)",Russian,14,14,0,0,0,0,0,"2020-02-18 12:38:54" -"Maro Chr (caprisunglasses)",Greek,14,17,0,0,0,0,0,"2021-08-17 06:53:33" -"Nenad Vukotic (vukotic.nenad)","Serbian (Cyrillic)",13,13,0,1,2,6,0,"2019-01-31 14:29:15" +"Zeeshan Rabbani (Zeera)",Hindi,14,25,0,0,0,0,0,"2020-09-15 11:32:01" +"pi hobbes (uwe_silv)",Japanese,14,46,0,0,0,0,0,"2022-01-15 02:57:14" +"Anastasia Borchuk (al2.borchuk)",Russian,14,14,0,0,0,0,0,"2020-04-14 13:22:49" +"Fikret Bilici (fikretbilici)",Turkish,14,13,0,0,0,0,0,"2020-06-21 17:16:11" +"EuiHo Hwang (euiho.hwang)",Korean,14,16,0,0,0,0,0,"2020-06-23 02:40:01" "Uwe Mönks (schirinowski)",German,13,12,0,0,0,0,0,"2021-02-18 04:00:41" "Dave (xdave)",Hungarian,13,11,0,0,0,0,0,"2020-03-02 20:56:50" +"Ana Kelly Vale (anakvale)","Portuguese, Brazilian",13,21,0,4,0,0,2,"2022-03-30 00:15:37" +GiorgioHerbie,Italian,13,15,0,0,0,0,0,"2022-01-17 17:35:40" +"Nenad Vukotic (vukotic.nenad)","Serbian (Cyrillic)",13,13,0,1,2,6,0,"2019-01-31 14:29:15" soura2,Arabic,12,13,0,0,0,0,0,"2020-01-13 19:23:47" "shreyas (techiespace)",Hindi,12,20,0,0,0,0,0,"2018-06-10 01:14:26" -"Sonu Sharma (riteetude)",Hindi,11,23,0,0,0,0,0,"2021-05-30 19:38:00" -Vmrc,French,11,12,0,2,0,0,0,"2020-11-02 05:35:06" "Jo Chuang (josephch405)","Chinese Traditional",11,24,0,0,0,0,11,"2017-06-16 20:21:06" -"sathvic k (sathvictripleseven)",Telugu,10,17,0,0,0,0,0,"2020-09-11 08:11:32" -"Brian Camacho (bmcamacho)",Polish,10,11,0,0,1,0,0,"2020-08-03 02:27:28" -"Anonymous edgy nerd (yamentaad)",Arabic,10,13,0,1,0,0,0,"2018-05-06 09:23:57" +Vmrc,French,11,12,0,2,0,0,0,"2020-11-02 05:35:06" +"Ammar Naif (Ammar_Naif)",Arabic,11,11,0,4,0,0,0,"2022-01-15 05:16:41" +"Sonu Sharma (riteetude)",Hindi,11,23,0,0,0,0,0,"2021-05-30 19:38:00" "Edwin van Rooij (edwinvrooij)",Dutch,10,13,0,17,0,0,0,"2018-11-05 03:59:10" +"Brian Camacho (bmcamacho)",Polish,10,11,0,0,1,1,0,"2020-08-03 02:27:28" "Mihael Wagner (miha.wagner)",Slovenian,10,9,0,7,0,0,0,"2017-10-18 18:26:29" +"Hrant Hakobian (hrastgh1)",Armenian,10,9,0,0,0,0,0,"2021-08-29 15:22:10" +"sathvic k (sathvictripleseven)",Telugu,10,17,0,0,0,0,0,"2020-09-11 08:11:32" "Ahmed Mosaad (ahmed.mosaad2018)",Arabic,10,12,0,6,0,0,0,"2021-02-03 18:45:43" +"Anonymous edgy nerd (yamentaad)",Arabic,10,13,0,1,0,0,0,"2018-05-06 09:23:57" +"Zesar Cebrián (Txorrota)",Spanish,10,44,0,0,0,0,0,"2022-02-09 01:34:32" +"Milan Siebenbürger (lennyd)",Czech,10,7,0,1,0,0,0,"2022-01-30 07:09:42" "Suhaili Hassan (kucingsyg96)",Indonesian,9,10,0,0,0,0,0,"2018-06-10 11:55:09" +"Sourire Lucide (sourire_lucide)",Russian,9,10,0,0,1,0,0,"2018-03-22 01:37:55" "Martin Vostatek (martinvostatek)",Czech,9,8,0,32,2,0,0,"2019-01-21 13:52:36" "Seweryn Piotrowski (Draxxsx)",Polish,9,10,0,0,19,0,0,"2020-01-02 09:55:48" -"Sourire Lucide (sourire_lucide)",Russian,9,10,0,0,1,0,0,"2018-03-22 01:37:55" +"Jakob Weickmann (jweickm)",Japanese,8,21,0,0,0,0,0,"2021-10-05 11:10:25" Rex123,Persian,8,8,0,0,0,0,0,"2017-07-01 00:47:42" "Andrey ZaXeLoN (waragaa)",Russian,7,7,0,8,1,0,0,"2017-09-18 21:37:42" "Konstantin (KZhidovinov)",Russian,7,7,0,0,0,0,0,"2020-01-29 13:35:12" -"Андрій Козицький (andriikozytskyi3807)",Ukrainian,7,12,0,2,0,0,0,"2020-09-26 20:31:56" ftfoi,Norwegian,7,6,0,0,0,0,0,"2020-04-11 20:42:35" -"Vladimir Pavlychev (KeyJoo)",Russian,7,9,0,0,0,0,0,"2017-12-18 02:46:56" +"Vladimir Pavlychev (vovs03)",Russian,7,9,0,0,0,0,0,"2017-12-18 02:46:56" +"Felipe Chagas (chagretes)","Portuguese, Brazilian",7,8,0,0,3,0,5,"2022-01-10 12:20:25" +"Андрій Козицький (andriikozytskyi3807)",Ukrainian,7,12,0,2,0,0,0,"2020-09-26 20:31:56" pkorove,Greek,7,7,0,0,0,0,0,"2020-03-07 11:36:12" -erfan2927,Persian,6,6,0,0,0,0,0,"2018-04-09 02:12:44" -"Burak Ceylan (7burakceylan)",Turkish,6,6,0,0,0,0,0,"2018-05-20 17:24:19" +ChloeLiang,Japanese,6,22,0,0,1,0,3,"2017-08-08 05:02:59" "Sam (SorodonSorodon)",German,6,6,0,13,0,0,0,"2017-04-14 11:09:27" "닉닉 (seohu9466)",Korean,6,14,0,13,0,0,0,"2017-10-09 23:08:15" "Sarita Cajas (sarayanacajas)",Spanish,6,4,0,0,1,0,0,"2021-05-14 14:27:59" -ChloeLiang,Japanese,6,22,0,0,1,0,3,"2017-08-08 05:02:59" -"Manuel Tassi (Mannivu)",Italian,5,6,0,0,0,0,0,"2021-01-03 11:00:33" -"Tomáš Hrabáček (Hrabyyy)",Czech,5,3,0,0,0,0,0,"2021-05-27 11:58:11" +erfan2927,Persian,6,6,0,0,0,0,0,"2018-04-09 02:12:44" +"Burak Ceylan (7burakceylan)",Turkish,6,6,0,0,0,0,0,"2018-05-20 17:24:19" +andriikozytskyi2018,Ukrainian,5,5,0,0,0,0,0,"2017-09-03 05:24:43" +"Vitor Henrique (vitorhcl)","Portuguese, Brazilian",5,8,0,1,0,0,0,"2022-03-08 20:00:59" +"Matthias Joly (joly.matt12)",French,5,8,0,27,1,0,0,"2017-08-28 09:53:59" +"Tomáš Hrabáček (Hrabyyy)",Czech,5,3,0,0,1,0,0,"2021-05-27 11:58:11" "Guerra Ivaneth (rossanaiva-04)",Spanish,5,7,0,0,0,0,0,"2019-02-03 16:48:59" "Дмитрий Хапенков (d.khapenkov)",Russian,5,5,0,6,4,0,2,"2018-01-06 23:00:43" -"Matthias Joly (joly.matt12)",French,5,8,0,27,1,0,0,"2017-08-28 09:53:59" "Micaela Pighin (micaelapiighin)",Spanish,5,6,0,1,0,0,0,"2019-10-09 23:32:42" -andriikozytskyi2018,Ukrainian,5,5,0,0,0,0,0,"2017-09-03 05:24:43" -marmo,German,4,4,0,0,0,0,0,"2021-01-13 01:16:35" -"Eli Besirov (elibesirov07)",Turkish,4,4,0,0,0,0,0,"2019-03-25 07:12:34" -"Lopo Isaac Fernández (rocapata)",Spanish,4,3,0,0,0,0,0,"2018-09-20 11:46:22" -bziuum,Polish,4,4,0,0,0,0,0,"2020-09-01 09:08:01" +"Manuel Tassi (Mannivu)",Italian,5,6,0,0,0,0,0,"2021-01-03 11:00:33" "Neko123 (emandic11)","Serbian (Cyrillic)",4,4,0,57,0,0,0,"2021-04-21 15:33:29" -Magidxz,Arabic,3,3,0,0,0,0,0,"2021-01-05 05:02:54" -"mohammadali barati (mabaraty)",Persian,3,3,0,0,0,0,0,"2021-07-10 05:54:44" +"Lopo Isaac Fernández (rocapata)",Spanish,4,3,0,0,0,0,0,"2018-09-20 11:46:22" +"Eli Besirov (elibesirov07)",Turkish,4,4,0,0,0,0,0,"2019-03-25 07:12:34" +marmo,German,4,4,0,0,0,0,0,"2021-01-13 01:16:35" +bziuum,Polish,4,4,0,0,3,0,0,"2020-09-01 09:08:01" +"Craig Foobar (craig.foobar)",German,3,3,0,25,0,0,0,"2022-02-20 16:55:47" +Katarin,Ukrainian,3,3,0,0,0,0,0,"2022-03-17 14:44:59" "Sarath S (CyberShark)",Tamil,3,7,0,0,0,0,0,"2020-08-27 22:43:16" +"Vagner Roberto (vagner.trompete)","Portuguese, Brazilian",3,3,0,0,0,0,0,"2017-12-30 17:54:26" +"Igor Piskun (i_piskun)",Ukrainian,3,3,0,0,0,0,0,"2018-01-19 15:20:27" +"Cláudio Bernardo (claudiobernardo.ti)","Portuguese, Brazilian",3,4,0,1,0,0,0,"2019-01-08 14:41:10" "Unnie Here (Carb)",Hindi,3,8,0,0,0,0,0,"2020-03-18 23:34:35" REMOVED_USER,"Portuguese, Brazilian",3,4,0,0,0,0,0,"2018-11-18 09:02:37" "Thoum Ptrgnt (thomas.petrignet)",French,3,3,0,2,0,3,0,"2017-09-23 19:25:52" "Oleg Kogut (kogut_oleg)",Ukrainian,3,3,0,0,0,0,0,"2018-12-28 14:31:02" carsten_kafke,German,3,3,0,43,0,0,3,"2017-10-27 13:27:47" -"Vagner Roberto (vagner.trompete)","Portuguese, Brazilian",3,3,0,0,0,0,0,"2017-12-30 17:54:26" -"Igor Piskun (i_piskun)",Ukrainian,3,3,0,0,0,0,0,"2018-01-19 15:20:27" -"Andrea Bianchi (andreawhite1597)",Italian,3,1,0,1,0,0,0,"2018-01-21 17:45:48" -"Cláudio Bernardo (claudiobernardo.ti)","Portuguese, Brazilian",3,4,0,1,0,0,0,"2019-01-08 14:41:10" -"Hiohana Rilary (hiohanarilary)","Portuguese, Brazilian",3,4,0,0,0,0,0,"2019-07-31 20:42:20" -"joabe gabriel (joabegabrielcma1)","Portuguese, Brazilian",3,4,0,0,0,0,0,"2018-08-21 09:08:59" +Magidxz,Arabic,3,3,0,0,0,0,0,"2021-01-05 05:02:54" "Péter Bernát (bernatp)",Hungarian,3,2,0,0,0,0,0,"2019-11-30 15:50:33" -"Martin Zimdahl (zimdahlmartin)",Swedish,3,2,0,0,1,0,3,"2018-09-15 04:39:22" +"joabe gabriel (joabegabrielcma1)","Portuguese, Brazilian",3,4,0,0,0,0,0,"2018-08-21 09:08:59" "Gabriel Cavalcante (gabrielc.alves14)","Portuguese, Brazilian",3,4,0,0,0,0,0,"2018-08-06 22:24:54" +"Martin Zimdahl (zimdahlmartin)",Swedish,3,2,0,0,1,0,3,"2018-09-15 04:39:22" atomjani,Hungarian,3,3,0,0,0,0,0,"2019-01-19 00:49:25" -"أم محمد تقي (souadboudia19)",Arabic,2,2,0,0,0,0,0,"2020-06-13 15:24:17" +"mohammadali barati (mabaraty)",Persian,3,3,0,0,0,0,0,"2021-07-10 05:54:44" +"Hiohana Rilary (hiohanarilary)","Portuguese, Brazilian",3,4,0,0,0,0,0,"2019-07-31 20:42:20" +"Tejaswini Boppana (Tejaswini)",Telugu,3,1,0,0,0,0,0,"2021-08-27 23:48:55" +"Andrea Bianchi (andreawhite1597)",Italian,3,1,0,1,0,0,0,"2018-01-21 17:45:48" +"Ño Bí Tã (pt614553)",Arabic,2,8,0,1,0,2,0,"2021-05-22 20:41:01" +"Judith Ayala (Azul1612)",Spanish,2,1,0,0,0,1,0,"2021-05-18 17:07:19" +"Valerij D (vala.dobler)",German,2,2,0,0,0,0,0,"2018-09-22 09:38:27" +"Balthazar Aubard (Balatzar)",French,2,5,0,0,1,0,0,"2017-09-23 01:42:57" +"Ahmed Bazazo (ahmedbazazo)",Arabic,2,2,0,0,0,0,0,"2022-02-19 20:11:09" +"Ali Zaida (alizaeda92)",Arabic,2,2,0,0,0,0,0,"2019-12-01 11:47:00" "FAy FAy (fayfayfay52)","Chinese Traditional",2,5,0,0,0,0,0,"2017-10-06 08:53:21" -chavs1997,Russian,2,2,0,9,0,0,0,"2018-05-18 16:58:19" Soroor_SI,Persian,2,2,0,0,0,0,0,"2018-06-10 06:28:27" -"Ilyas Fekhar (il47yas)",Arabic,2,2,0,0,0,0,0,"2018-04-17 22:00:41" -"hesamiranii (esam.matouri)",Persian,2,2,0,0,0,0,0,"2018-09-22 16:33:36" -"fatemeh s (fargolseifoori3)",Persian,2,2,0,0,0,0,0,"2019-01-31 12:06:57" -amei,"Portuguese, Brazilian",2,2,0,0,0,0,0,"2018-04-19 19:42:28" +chavs1997,Russian,2,2,0,9,0,0,0,"2018-05-18 16:58:19" "Naveen jai krishna (njsbpolymer1)",Tamil,2,5,0,0,0,0,0,"2020-01-10 14:19:41" -"Danial Agh (danialagh)",Persian,2,3,0,0,0,0,0,"2019-03-30 13:24:16" +omerfarukbas,Turkish,2,3,0,19,2,0,0,"2017-08-14 16:10:35" +"Ilyas Fekhar (il47yas)",Arabic,2,2,0,0,0,0,0,"2018-04-17 22:00:41" +"Héctor Mañas García (hectodium)",Catalan,2,3,0,0,0,0,0,"2021-10-02 20:32:09" "Walid Baazia (walidbaazia2005)",Arabic,2,1,0,0,0,0,0,"2021-01-27 12:47:34" -"Ali Zaida (alizaeda92)",Arabic,2,2,0,0,0,0,0,"2019-12-01 11:47:00" -LNDDYL,"Chinese Traditional",2,4,0,0,0,0,2,"2018-04-22 04:00:19" -"Ño Bí Tã (pt614553)",Arabic,2,8,0,1,0,0,0,"2021-05-22 20:41:01" -"Judith Ayala (Azul1612)",Spanish,2,1,0,0,0,1,0,"2021-05-18 17:07:19" +"fatemeh s (fargolseifoori3)",Persian,2,2,0,0,0,0,0,"2019-01-31 12:06:57" +"hesamiranii (esam.matouri)",Persian,2,2,0,0,0,0,0,"2018-09-22 16:33:36" REMOVED_USER,Ukrainian,2,2,0,0,0,0,0,"2017-06-15 12:24:44" -"Valerij D (vala.dobler)",German,2,2,0,0,0,0,0,"2018-09-22 09:38:27" "Alex Stein (diefaust1993)",Russian,2,2,0,4,4,0,2,"2017-07-13 06:56:17" +amei,"Portuguese, Brazilian",2,2,0,0,0,0,0,"2018-04-19 19:42:28" +"أم محمد تقي (souadboudia19)",Arabic,2,2,0,0,0,0,0,"2020-06-13 15:24:17" +LNDDYL,"Chinese Traditional",2,4,0,0,0,0,2,"2018-04-22 04:00:19" "조화정 (yunjoo337)",Korean,2,2,0,0,0,0,0,"2019-06-16 22:25:31" -omerfarukbas,Turkish,2,3,0,19,2,0,0,"2017-08-14 16:10:35" -"Balthazar Aubard (Balatzar)",French,2,5,0,0,1,0,0,"2017-09-23 01:42:57" +"Sidali Aymen (sidaliaymen950)",Arabic,2,2,0,0,0,0,0,"2022-01-31 18:50:59" +"Danial Agh (danialagh)",Persian,2,3,0,0,0,0,0,"2019-03-30 13:24:16" +iSoron2,"Portuguese, Brazilian",1,1,0,0,0,0,0,"2017-03-18 17:56:29" +"Anton (tT0NG)","Chinese Traditional",1,2,0,0,0,0,1,"2017-07-06 14:18:39" "Luca Gori (grolcu)",Italian,1,2,0,0,0,0,0,"2020-09-26 23:26:15" axd,Spanish,1,1,0,15,0,0,0,"2017-09-12 05:48:51" -iSoron2,"Portuguese, Brazilian",1,1,0,0,0,0,0,"2017-03-18 17:56:29" REMOVED_USER,Russian,1,2,0,6,1,0,1,"2019-12-26 05:37:01" -"Wibi Cahyo (wbcahyoh)",Indonesian,1,3,0,0,0,0,0,"2017-12-14 06:35:58" jonesses,German,1,1,0,1,0,0,1,"2021-01-01 08:03:18" -"Anton (tT0NG)","Chinese Traditional",1,2,0,0,0,0,1,"2017-07-06 14:18:39" -"박찌 (perpact20)",Korean,1,1,0,0,0,0,0,"2018-02-10 10:11:44" "Alan Jeon (skyisle)",Korean,1,2,0,8,0,0,0,"2018-01-09 10:46:00" "Maria Fefelova (mashafefel)",Russian,1,1,0,0,0,0,0,"2019-05-18 02:03:56" -"Anastasiia Bondarenko (nastasya.bondarenko.97)",Russian,1,1,0,0,0,0,0,"2019-06-07 17:43:08" -"Kan Black (kanblack.va)",Vietnamese,1,2,0,0,0,1,0,"2019-01-15 03:50:10" "Patrick Pimenta (trickap1)","Portuguese, Brazilian",1,1,0,0,0,0,0,"2018-12-01 14:31:21" -"Dagna Q (dagnaq)",,0,0,0,0,0,0,0,"2017-08-06 01:42:52" -Kamalakannan,,0,0,0,0,0,0,0,"2017-05-14 11:40:23" -"Éjbãss Übbeî (littlebittlebottle)",Norwegian,0,0,0,152,0,0,0,"2017-07-05 21:12:02" -"Равиль Мифтахов (ravilmif47)",Russian,0,0,0,1,0,0,0,"2019-08-12 21:58:30" +"박찌 (perpact20)",Korean,1,1,0,0,0,0,0,"2018-02-10 10:11:44" +"Kan Black (kanblack.va)",Vietnamese,1,2,0,0,0,1,0,"2019-01-15 03:50:10" +"Anastasiia Bondarenko (nastasya.bondarenko.97)",Russian,1,1,0,0,0,0,0,"2019-06-07 17:43:08" +"Wibi Cahyo (wbcahyoh)",Indonesian,1,3,0,0,0,0,0,"2017-12-14 06:35:58" sanyoniket,,0,0,0,0,0,0,0,"2019-07-23 12:58:40" -REMOVED_USER,,0,0,0,0,0,0,0,"2020-02-01 03:47:48" -"vi ve (VimalV)",,0,0,0,0,0,0,0,"2021-02-08 02:35:45" -"George Merkulov (george142.emarket)",Russian,0,0,0,11,0,0,0,"2019-06-09 19:47:02" -"Yasin Okumus (lacivert)",Turkish,0,0,0,1,0,0,0,"2018-02-07 04:13:51" -"Petros Bleyan (coolbleyan)",Russian,0,0,0,14,0,0,0,"2017-08-18 18:37:18" -"LeMeD (LeMeS)",French,0,0,0,2,0,0,0,"2021-02-06 15:35:00" +"Sri Harsha Bhogi (sriharshabhogi)",,0,0,0,0,0,0,0,"2018-09-02 05:31:53" +Irsgram,Russian,0,0,0,1,0,0,0,"2019-09-30 16:42:20" +"Baran Özavcı (n2141n)",Turkish,0,0,0,1,0,0,0,"2022-02-26 04:32:51" +"Masataka Yakura (myakura)",Japanese,0,0,0,1,0,0,0,"2021-09-03 22:10:36" ava_rfie,Persian,0,0,0,1,0,0,0,"2019-06-09 16:19:24" -"Mateusz Teteruk (mttet)",Polish,0,0,0,1,0,0,0,"2021-01-23 13:09:59" -EwanB,,0,0,0,0,0,0,0,"2019-11-19 10:04:38" -Fazy1380,,0,0,0,0,0,0,0,"2021-04-10 11:02:53" -"Lori Amico (lavodkaclyde2323)",Italian,0,0,0,1,0,0,0,"2017-04-09 10:08:13" -"Florian Stuhlmann (stuhlmann)",German,0,0,0,10,0,0,0,"2017-04-15 04:04:00" -"عبد الناصر سعيد الثبيتي (asaeed)",,0,0,0,0,0,0,0,"2018-03-13 02:09:35" -"Rivo Zängov (Eraser)",,0,0,0,0,0,0,0,"2020-10-13 04:38:26" -Hayder21,,0,0,0,0,0,0,0,"2019-12-31 10:56:24" T-v-Gerwen,Dutch,0,0,0,47,0,0,0,"2018-03-02 10:26:33" -"Eduard Boboc (edi.boboc33)",Romanian,0,0,0,4,0,0,0,"2019-12-16 09:08:39" -"Samuel Przeździęk (samek22)",Polish,0,0,0,1,0,0,0,"2021-08-01 00:49:01" -"Saiprasath B (Saiprasath)",,0,0,0,0,0,0,0,"2021-07-11 11:10:41" -shuvo786,,0,0,0,0,0,0,0,"2019-11-13 00:18:12" -"Edmunds Edmundam (edmundam)",,0,0,0,0,0,0,0,"2020-06-01 14:18:18" -Itch,,0,0,0,0,0,0,0,"2017-10-16 09:18:42" -"Manny Farsangy (manifarsangi)",Persian,0,0,0,12,0,0,0,"2021-08-10 05:32:28" -"Matus Zdansky (matuszdansky)",,0,0,0,0,0,0,0,"2019-10-20 13:52:24" +"George Merkulov (george142.emarket)",Russian,0,0,0,11,0,0,0,"2019-06-09 19:47:02" +philfr49,French,0,0,0,2,0,0,0,"2018-09-03 14:20:32" +"عبد الناصر سعيد الثبيتي (asaeed)",,0,0,0,0,0,0,0,"2018-03-13 02:09:35" "Thomas Orlita (Thomas995)",Czech,0,0,0,1,0,0,0,"2017-12-24 04:08:27" -Irsgram,Russian,0,0,0,1,0,0,0,"2019-09-30 16:42:20" -EmanAmini,,0,0,0,0,0,0,0,"2017-03-31 13:27:43" -mushin,,0,0,0,0,0,0,0,"2020-02-02 04:08:05" +"Edmunds Edmundam (edmundam)",,0,0,0,0,0,0,0,"2020-06-01 14:18:18" "Elmo (oberknecht)",,0,0,0,0,0,0,0,"2020-04-16 08:45:50" -AnggaRifandi,,0,0,0,0,0,0,0,"2017-03-31 19:28:35" -"darkkingredian (rediancool)",,0,0,0,0,0,0,0,"2021-07-27 16:04:32" -"Sri Harsha Bhogi (sriharshabhogi)",,0,0,0,0,0,0,0,"2018-09-02 05:31:53" -"Nat Fomicheva (natac)",Russian,0,0,0,3,0,0,0,"2019-01-25 14:35:02" -mdrobulis,,0,0,0,0,0,0,0,"2018-05-24 01:40:42" -"Sarah BCNN (fsarahboucenna)",French,0,0,0,16,0,0,0,"2018-02-11 11:07:36" +"Равиль Мифтахов (ravilmif47)",Russian,0,0,0,1,0,0,0,"2019-08-12 21:58:30" +"Manny Farsangy (manifarsangi)",Persian,0,0,0,12,0,0,0,"2021-08-10 05:32:28" +"Samuel Przeździęk (samek22)",Polish,0,0,0,1,0,0,0,"2021-08-01 00:49:01" +"Saiprasath B (Saiprasath)",,0,0,0,0,0,0,0,"2021-07-11 11:10:41" +REMOVED_USER,,0,0,0,0,0,0,0,"2018-08-24 00:17:43" +REMOVED_USER,,0,0,0,0,0,0,0,"2020-02-01 03:47:48" "Arjun K. (arjunkdot)",,0,0,0,0,0,0,0,"2020-09-20 11:16:18" -REMOVED_USER,Czech,0,0,0,18,0,0,0,"2018-03-27 06:19:52" -martyaberger,,0,0,0,0,0,0,0,"2019-01-01 18:48:08" -BongTran,Vietnamese,0,0,0,2,0,0,0,"2018-04-24 05:16:07" -"Arttu Ylhävuori (arttu.ylhavuori)",,0,0,0,0,0,0,0,"2019-07-24 15:03:42" -"Никита Карамов (nikita.karamoff)",Russian,0,0,0,10,0,0,0,"2018-10-29 03:57:21" -rooban23,,0,0,0,0,0,0,0,"2020-09-15 11:49:14" -"Eliška Roubalová (roubaeli)",Czech,0,0,0,6,0,0,0,"2019-12-31 12:47:29" -valney.faria,"Portuguese, Brazilian",0,0,0,1,0,0,0,"2020-02-02 14:45:02" -"Алтынбек Наурызғали (altinbeknaurizgali)",Russian,0,0,0,1,0,0,0,"2020-08-12 13:03:49" +EwanB,,0,0,0,0,0,0,0,"2019-11-19 10:04:38" +shuvo786,,0,0,0,0,0,0,0,"2019-11-13 00:18:12" +"Pro AAA (pro1010)",Arabic,0,0,0,1,0,0,0,"2022-02-14 03:32:44" +"manu (manuL96)",,0,0,0,0,0,0,0,"2022-05-06 23:34:55" +"Rivo Zängov (Eraser)",,0,0,0,0,0,0,0,"2020-10-13 04:38:26" +ashik8113,,0,0,0,0,0,0,0,"2022-04-13 11:58:26" +deepbird,,0,0,0,0,0,0,0,"2022-04-11 03:21:05" REMOVED_USER,,0,0,0,0,0,0,0,"2018-10-27 15:34:36" -REMOVED_USER,,0,0,0,0,0,0,0,"2018-08-24 00:17:43" Elham1361,,0,0,0,0,0,0,0,"2018-10-27 12:01:06" -dongchen.yue,German,0,0,0,4,0,0,0,"2020-09-12 15:05:59" "Ahnaf Tajwar (atn4404)",,0,0,0,0,0,0,0,"2018-10-16 11:13:30" +martyaberger,,0,0,0,0,0,0,0,"2019-01-01 18:48:08" AsadullahIlyas,,0,0,0,0,0,0,0,"2019-01-04 06:14:15" -droidahmed,Arabic,0,0,0,7,0,0,0,"2018-01-31 02:18:49" -philfr49,French,0,0,0,2,0,0,0,"2018-09-03 14:20:32" -"Ahmed Nazir (ahmednazir333)",,0,0,0,0,0,0,0,"2018-05-06 12:10:27" -"Balaji Jayaraman (jkbalaji1103)",,0,0,0,0,0,0,0,"2017-10-30 22:12:27" -"Wellington Ribeiro (wellington.rib)",,0,0,0,0,0,0,0,"2017-11-16 07:32:25" -"Javid IRAN (twitteriran98)",Persian,0,0,0,1,0,0,0,"2017-11-25 16:47:25" -"박인호 (wphestiraid)",Korean,0,0,0,2,0,0,0,"2018-01-05 00:33:14" +"akmal shafiq (mohdakmalshafiq)",,0,0,0,0,0,0,0,"2021-11-01 01:04:50" +"Sylwuskak (sylwuskak)",Polish,0,0,0,1,0,0,0,"2022-01-25 04:19:53" +"Yunsu Kim (yunsukim86)",Korean,0,0,0,2,0,0,0,"2022-01-14 06:33:43" "Pumpith Ungsupanit (pumpithu)",,0,0,0,0,0,0,0,"2019-01-19 23:47:57" -Sandhu564.,,0,0,0,0,0,0,0,"2020-12-14 01:27:45" -"Quentin Hibon (hiq)",,0,0,0,0,0,0,0,"2021-02-07 16:39:31" -AhmedDz,Arabic,0,0,0,1,0,0,0,"2017-12-31 10:12:31" +"Nat Fomicheva (natac)",Russian,0,0,0,3,0,0,0,"2019-01-25 14:35:02" +HemanthMeda,Telugu,0,0,0,4,0,0,0,"2021-12-01 14:02:14" +"darkkingredian (rediancool)",,0,0,0,0,0,0,0,"2021-07-27 16:04:32" +catemlitten,Japanese,0,0,0,1,0,0,0,"2021-11-17 15:06:02" +"Said Tahsin Dane (tasomaniac)",,0,0,0,0,0,0,0,"2021-09-25 05:31:01" +"Matus Zdansky (matuszdansky)",,0,0,0,0,0,0,0,"2019-10-20 13:52:24" +mdrobulis,,0,0,0,0,0,0,0,"2018-05-24 01:40:42" +valney.faria,"Portuguese, Brazilian",0,0,0,1,0,0,0,"2020-02-02 14:45:02" +"Petros Bleyan (coolbleyan)",Russian,0,0,0,14,0,0,0,"2017-08-18 18:37:18" +"Карлен Шаухаев (KarlenShaukhaev)",,0,0,0,0,0,0,0,"2020-04-27 08:53:49" "Shuvashish Sahoo (shuvashish76)",,0,0,0,0,0,0,0,"2020-09-17 09:10:09" REMOVED_USER,,0,0,0,0,0,0,0,"2018-01-05 16:56:12" -NairaDNV,Spanish,0,0,0,9,0,0,0,"2018-01-05 19:10:33" +"Dagna Q (dagnaq)",,0,0,0,0,0,0,0,"2017-08-06 01:42:52" +Sandhu564.,,0,0,0,0,0,0,0,"2020-12-14 01:27:45" +AhmedDz,Arabic,0,0,0,1,0,0,0,"2017-12-31 10:12:31" +"Quentin Hibon (hiq)",,0,0,0,0,0,0,0,"2021-02-07 16:39:31" +"Ahmed Nazir (ahmednazir333)",,0,0,0,0,0,0,0,"2018-05-06 12:10:27" +"박인호 (wphestiraid)",Korean,0,0,0,2,0,0,0,"2018-01-05 00:33:14" Raulbertassi,,0,0,0,0,0,0,0,"2018-01-07 17:23:18" -"Карлен Шаухаев (KarlenShaukhaev)",,0,0,0,0,0,0,0,"2020-04-27 08:53:49" +"Javid IRAN (twitteriran98)",Persian,0,0,0,1,0,0,0,"2017-11-25 16:47:25" +"Wellington Ribeiro (wellington.rib)",,0,0,0,0,0,0,0,"2017-11-16 07:32:25" dimateos,,0,0,0,0,0,0,0,"2021-01-10 06:29:52" -"Katherine Alexandra Flórez Ramírez (katherine.florez12)",Spanish,0,0,0,46,0,0,0,"2018-01-20 02:18:32" +"Balaji Jayaraman (jkbalaji1103)",,0,0,0,0,0,0,0,"2017-10-30 22:12:27" "reza golestanzadeh (reza.golestanzadeh)",Persian,0,0,0,1,0,0,0,"2020-10-21 12:07:20" -farbod66,Persian,0,0,0,1,0,0,0,"2018-01-20 11:04:23" "Muhammet Furkan ALMACI (furkan.almaci)",Turkish,0,0,0,1,0,0,0,"2017-10-29 13:44:56" +dongchen.yue,German,0,0,0,4,0,0,0,"2020-09-12 15:05:59" +"Алтынбек Наурызғали (altinbeknaurizgali)",Russian,0,0,0,1,0,0,0,"2020-08-12 13:03:49" +rooban23,,0,0,0,0,0,0,0,"2020-09-15 11:49:14" +NairaDNV,Spanish,0,0,0,9,0,0,0,"2018-01-05 19:10:33" +"Katherine Alexandra Flórez Ramírez (katherine.florez12)",Spanish,0,0,0,46,0,0,0,"2018-01-20 02:18:32" +Itch,,0,0,0,0,0,0,0,"2017-10-16 09:18:42" +"Yasin Okumus (lacivert)",Turkish,0,0,0,1,0,0,0,"2018-02-07 04:13:51" +"Eduard Boboc (edi.boboc33)",Romanian,0,0,0,4,0,0,0,"2019-12-16 09:08:39" +Hayder21,,0,0,0,0,0,0,0,"2019-12-31 10:56:24" +"Eliška Roubalová (roubaeli)",Czech,0,0,0,6,0,0,0,"2019-12-31 12:47:29" +Fazy1380,,0,0,0,0,0,0,0,"2021-04-10 11:02:53" +"Arttu Ylhävuori (arttu.ylhavuori)",,0,0,0,0,0,0,0,"2019-07-24 15:03:42" +EmanAmini,,0,0,0,0,0,0,0,"2017-03-31 13:27:43" +AnggaRifandi,,0,0,0,0,0,0,0,"2017-03-31 19:28:35" +"Lori Amico (lavodkaclyde2323)",Italian,0,0,0,1,0,0,0,"2017-04-09 10:08:13" +"Florian Stuhlmann (stuhlmann)",German,0,0,0,10,0,0,0,"2017-04-15 04:04:00" +Kamalakannan,,0,0,0,0,0,0,0,"2017-05-14 11:40:23" +farbod66,Persian,0,0,0,1,0,0,0,"2018-01-20 11:04:23" +"vi ve (VimalV)",,0,0,0,0,0,0,0,"2021-02-08 02:35:45" +"Éjbãss Übbeî (littlebittlebottle)",Norwegian,0,0,0,152,0,0,0,"2017-07-05 21:12:02" +"LeMeD (LeMeS)",French,0,0,0,2,0,0,0,"2021-02-06 15:35:00" +BongTran,Vietnamese,0,0,0,2,0,0,0,"2018-04-24 05:16:07" +REMOVED_USER,Czech,0,0,0,18,0,0,0,"2018-03-27 06:19:52" +mushin,,0,0,0,0,0,0,0,"2020-02-02 04:08:05" +"Mateusz Teteruk (mttet)",Polish,0,0,0,1,0,0,0,"2021-01-23 13:09:59" +"Sarah BCNN (fsarahboucenna)",French,0,0,0,16,0,0,0,"2018-02-11 11:07:36" +droidahmed,Arabic,0,0,0,7,0,0,0,"2018-01-31 02:18:49" +"Никита Карамов (nikita.karamoff)",Russian,0,0,0,10,0,0,0,"2018-10-29 03:57:21" diff --git a/uhabits-android/src/main/res/layout/about_translators.xml b/uhabits-android/src/main/res/layout/about_translators.xml index 90c726ee2..52c80303c 100644 --- a/uhabits-android/src/main/res/layout/about_translators.xml +++ b/uhabits-android/src/main/res/layout/about_translators.xml @@ -11,6 +11,7 @@ + @@ -57,6 +58,7 @@ + @@ -114,18 +116,19 @@ + + - @@ -134,11 +137,11 @@ + - @@ -179,9 +182,9 @@ - + From b66a6ff71704fd0dbc1a4812a7104c98e168c9a3 Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Sun, 15 May 2022 00:33:36 -0500 Subject: [PATCH 11/19] Write release notes --- .../main/play/release-notes/en-US/default.txt | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/uhabits-android/src/main/play/release-notes/en-US/default.txt b/uhabits-android/src/main/play/release-notes/en-US/default.txt index 279010497..65854caea 100644 --- a/uhabits-android/src/main/play/release-notes/en-US/default.txt +++ b/uhabits-android/src/main/play/release-notes/en-US/default.txt @@ -1,12 +1,6 @@ -2.0.3: -* Bug fixes -2.0: -* Track numeric habits (e.g. how many pages did you read?) -* Skip days without breaking your streak -* Show question marks for days with missing data -* Extend day a few hours past midnight -* Show multiple habits in a single widget -* Export daily backups automatically -* Sort habits by status and in reverse -* Add notes to habits -* Improve theme and accessibility +2.1: +* Add notes to specific dates +* Track at-most measurable habits +* Add skips to measurable habits +* Bring back custom frequencies +* Other minor improvements and bug fixes \ No newline at end of file From 68740b4043a37cb472be477004229eee09037da7 Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Sun, 15 May 2022 09:23:47 -0500 Subject: [PATCH 12/19] SettingsFragment: Minor changes to theme --- .../uhabits/activities/settings/SettingsFragment.kt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsFragment.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsFragment.kt index 9f22409c5..30c01896d 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsFragment.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsFragment.kt @@ -27,6 +27,7 @@ import android.os.Build.VERSION.SDK_INT import android.os.Bundle import android.provider.Settings import android.util.Log +import android.view.View import androidx.preference.ListPreference import androidx.preference.Preference import androidx.preference.PreferenceCategory @@ -43,6 +44,7 @@ import org.isoron.uhabits.core.ui.NotificationTray import org.isoron.uhabits.core.utils.DateUtils.Companion.getLongWeekdayNames import org.isoron.uhabits.notifications.AndroidNotificationTray.Companion.createAndroidNotificationChannel import org.isoron.uhabits.notifications.RingtoneManager +import org.isoron.uhabits.utils.StyledResources import org.isoron.uhabits.widgets.WidgetUpdater import java.util.Calendar @@ -84,6 +86,12 @@ class SettingsFragment : PreferenceFragmentCompat(), OnSharedPreferenceChangeLis super.onPause() } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + val sr = StyledResources(context!!) + view.setBackgroundColor(sr.getColor(R.attr.contrast0)) + super.onViewCreated(view, savedInstanceState) + } + override fun onPreferenceTreeClick(preference: Preference): Boolean { val key = preference.key ?: return false if (key == "reminderSound") { From 90de1f372363ea5478163852662e3eb3bf731650 Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Sun, 15 May 2022 10:21:46 -0500 Subject: [PATCH 13/19] GitHub Actions: Implement emulator boot timeout --- .github/workflows/main.yml | 4 ++-- build.sh | 31 ++++++++++++++++++++++++++----- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 929a216ed..12784ef18 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -53,11 +53,11 @@ jobs: - name: Install Linux utils run: | - brew install util-linux brew unlink parallel - brew install moreutils + brew install util-linux moreutils coreutils echo "/usr/local/opt/util-linux/bin" >> $GITHUB_PATH echo "/usr/local/opt/moreutils/bin" >> $GITHUB_PATH + echo "/usr/local/opt/coreutils/libexec/gnubin" >> $GITHUB_PATH - name: Run Android Tests run: ./build.sh android-tests ${{ matrix.api }} diff --git a/build.sh b/build.sh index 4f17ec653..f72b38adb 100755 --- a/build.sh +++ b/build.sh @@ -26,6 +26,7 @@ GRADLE="./gradlew --stacktrace --quiet" PACKAGE_NAME=org.isoron.uhabits SDKMANAGER="${ANDROID_HOME}/cmdline-tools/latest/bin/sdkmanager" VERSION=$(grep versionName uhabits-android/build.gradle.kts | sed -e 's/.*"\([^"]*\)".*/\1/g') +BOOT_TIMEOUT=360 if [ -z $VERSION ]; then echo "Could not parse app version from: uhabits-android/build.gradle.kts" @@ -69,8 +70,7 @@ core_build() { # Android # ----------------------------------------------------------------------------- -# shellcheck disable=SC2016 -android_test() { +android_boot_attempt() { API=$1 AVDNAME=${AVD_PREFIX}${API} @@ -99,17 +99,38 @@ android_test() { log_info "Waiting for emulator to boot..." export ADB="$ADB -s emulator-6${API}0" - $ADB wait-for-device shell 'while [[ -z "$(getprop sys.boot_completed)" ]]; do echo Waiting...; sleep 1; done; input keyevent 82' || return 1 - $ADB root || return 1 - sleep 5 + timeout $BOOT_TIMEOUT $ADB wait-for-device shell 'while [[ -z "$(getprop sys.boot_completed)" ]]; do echo Waiting...; sleep 1; done; input keyevent 82' + if [ $? -ne 0 ]; then + log_error "Emulator failed to boot after $BOOT_TIMEOUT seconds." + return 1 + fi log_info "Disabling animations..." + $ADB root || return 1 + sleep 5 $ADB shell settings put global window_animation_scale 0 || return 1 $ADB shell settings put global transition_animation_scale 0 || return 1 $ADB shell settings put global animator_duration_scale 0 || return 1 log_info "Acquiring wake lock..." $ADB shell 'echo android-test > /sys/power/wake_lock' || return 1 +} + +android_boot() { + for attempt in {1..5}; do + android_boot_attempt $1 && return 0 + sleep 5 + done + log_error "Too many failed attempts. Aborting." + return 1 +} + +# shellcheck disable=SC2016 +android_test() { + API=$1 + AVDNAME=${AVD_PREFIX}${API} + + android_boot $API || return 1 if [ -n "$RELEASE" ]; then log_info "Installing release APK..." From e6bcbb39ffc573e0db10282e3fd390f5616e34a5 Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Mon, 16 May 2022 15:24:20 -0500 Subject: [PATCH 14/19] GitHub Actions: Enable AVD cache --- .github/workflows/main.yml | 13 +++++++++++ build.sh | 48 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 59 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 12784ef18..b1c40ecc3 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -59,6 +59,19 @@ jobs: echo "/usr/local/opt/moreutils/bin" >> $GITHUB_PATH echo "/usr/local/opt/coreutils/libexec/gnubin" >> $GITHUB_PATH + - name: AVD cache + uses: actions/cache@v3 + id: avd-cache + with: + path: | + ~/.android/avd/* + ~/.android/adb* + key: avd-${{ matrix.api }} + + - name: Setup AVD + if: steps.avd-cache.outputs.cache-hit != 'true' + run: ./build.sh android-setup ${{ matrix.api }} + - name: Run Android Tests run: ./build.sh android-tests ${{ matrix.api }} diff --git a/build.sh b/build.sh index f72b38adb..7fd30d33e 100755 --- a/build.sh +++ b/build.sh @@ -15,6 +15,7 @@ # You should have received a copy of the GNU General Public License along # with this program. If not, see . +set -o xtrace cd "$(dirname "$0")" || exit ADB="${ANDROID_HOME}/platform-tools/adb" @@ -70,7 +71,7 @@ core_build() { # Android # ----------------------------------------------------------------------------- -android_boot_attempt() { +android_setup() { API=$1 AVDNAME=${AVD_PREFIX}${API} @@ -95,7 +96,15 @@ android_boot_attempt() { ) 10>/tmp/uhabitsTest.lock log_info "Launching emulator..." - $EMULATOR -avd $AVDNAME -port 6${API}0 1>/dev/null 2>&1 & + $EMULATOR \ + -avd $AVDNAME \ + -port 6${API}0 \ + -no-window \ + -gpu swiftshader_indirect \ + -noaudio \ + -no-boot-anim \ + -camera-back none \ + 1>/dev/null 2>&1 & log_info "Waiting for emulator to boot..." export ADB="$ADB -s emulator-6${API}0" @@ -114,6 +123,37 @@ android_boot_attempt() { log_info "Acquiring wake lock..." $ADB shell 'echo android-test > /sys/power/wake_lock' || return 1 + + log_info "Saving snapshot..." + $ADB emu avd snapshot save fresh-install +} + +android_boot_attempt() { + API=$1 + AVDNAME=${AVD_PREFIX}${API} + + log_info "Stopping Android emulator..." + while [[ -n $(pgrep -f ${AVDNAME}) ]]; do + pkill -9 -f ${AVDNAME} + done + + log_info "Launching emulator..." + $EMULATOR \ + -avd $AVDNAME \ + -port 6${API}0 \ + -snapshot fresh-install \ + -no-snapshot-save \ + -wipe-data \ + 1>/dev/null 2>&1 & + + log_info "Waiting for emulator to boot..." + export ADB="$ADB -s emulator-6${API}0" + sleep 5 + timeout $BOOT_TIMEOUT $ADB wait-for-device shell 'while [[ -z "$(getprop sys.boot_completed)" ]]; do echo Waiting...; sleep 1; done; input keyevent 82' + if [ $? -ne 0 ]; then + log_error "Emulator failed to boot after $BOOT_TIMEOUT seconds." + return 1 + fi } android_boot() { @@ -301,6 +341,10 @@ main() { core_build android_build ;; + android-setup) + shift; _parse_opts "$@" + android_setup $1 + ;; android-tests) shift; _parse_opts "$@" if [ -z $1 ]; then From 0a95b6d2a0118aabc8b78b221617257f3225c1f1 Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Mon, 16 May 2022 20:36:43 -0500 Subject: [PATCH 15/19] GitHub Actions: Use self-hosted runner --- .github/workflows/main.yml | 69 ++++++-------------------------------- build.sh | 50 +++++++++++++++++---------- 2 files changed, 43 insertions(+), 76 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index b1c40ecc3..46bed95e5 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -7,71 +7,24 @@ on: paths-ignore: - '**.md' jobs: - Build: - runs-on: ubuntu-latest + Test: + runs-on: self-hosted steps: - name: Check out source code uses: actions/checkout@v1 - - name: Install Java Development Kit 11 - uses: actions/setup-java@v1 - with: - java-version: 11 - - - name: Build Project + - name: Build project run: ./build.sh build - - name: Upload Build Artifacts - uses: actions/upload-artifact@v2 - with: - name: uhabits-android - path: uhabits-android/build/outputs/ - - AndroidTest: - needs: Build - runs-on: macOS-10.15 - timeout-minutes: 60 - strategy: - matrix: - api: [ - 25, - 27, - 28, - 30, - 31, - ] + - name: Run Android tests + run: ./build.sh android-tests-parallel 23 24 25 26 27 28 30 31 - steps: - - name: Check out source code - uses: actions/checkout@v1 - - - name: Download Previously Built APK - uses: actions/download-artifact@v2 - with: - name: uhabits-android - path: uhabits-android/build/outputs/ - - - name: Install Linux utils - run: | - brew unlink parallel - brew install util-linux moreutils coreutils - echo "/usr/local/opt/util-linux/bin" >> $GITHUB_PATH - echo "/usr/local/opt/moreutils/bin" >> $GITHUB_PATH - echo "/usr/local/opt/coreutils/libexec/gnubin" >> $GITHUB_PATH - - - name: AVD cache - uses: actions/cache@v3 - id: avd-cache + - name: Upload artifacts + if: always() + uses: actions/upload-artifact@v2 with: + name: build path: | - ~/.android/avd/* - ~/.android/adb* - key: avd-${{ matrix.api }} - - - name: Setup AVD - if: steps.avd-cache.outputs.cache-hit != 'true' - run: ./build.sh android-setup ${{ matrix.api }} - - - name: Run Android Tests - run: ./build.sh android-tests ${{ matrix.api }} + build/*log + uhabits-android/build/outputs diff --git a/build.sh b/build.sh index 7fd30d33e..5c27503fa 100755 --- a/build.sh +++ b/build.sh @@ -15,7 +15,6 @@ # You should have received a copy of the GNU General Public License along # with this program. If not, see . -set -o xtrace cd "$(dirname "$0")" || exit ADB="${ANDROID_HOME}/platform-tools/adb" @@ -99,11 +98,6 @@ android_setup() { $EMULATOR \ -avd $AVDNAME \ -port 6${API}0 \ - -no-window \ - -gpu swiftshader_indirect \ - -noaudio \ - -no-boot-anim \ - -camera-back none \ 1>/dev/null 2>&1 & log_info "Waiting for emulator to boot..." @@ -114,16 +108,6 @@ android_setup() { return 1 fi - log_info "Disabling animations..." - $ADB root || return 1 - sleep 5 - $ADB shell settings put global window_animation_scale 0 || return 1 - $ADB shell settings put global transition_animation_scale 0 || return 1 - $ADB shell settings put global animator_duration_scale 0 || return 1 - - log_info "Acquiring wake lock..." - $ADB shell 'echo android-test > /sys/power/wake_lock' || return 1 - log_info "Saving snapshot..." $ADB emu avd snapshot save fresh-install } @@ -154,6 +138,17 @@ android_boot_attempt() { log_error "Emulator failed to boot after $BOOT_TIMEOUT seconds." return 1 fi + + log_info "Disabling animations..." + $ADB root || return 1 + sleep 5 + $ADB shell settings put global window_animation_scale 0 || return 1 + $ADB shell settings put global transition_animation_scale 0 || return 1 + $ADB shell settings put global animator_duration_scale 0 || return 1 + + log_info "Acquiring wake lock..." + $ADB shell 'echo android-test > /sys/power/wake_lock' || return 1 + } android_boot() { @@ -216,6 +211,8 @@ android_test() { } android_test_parallel() { + # Launch background processes + PIDS="" for API in $*; do ( LOG=build/android-test-$API.log @@ -223,12 +220,27 @@ android_test_parallel() { if android_test $API 1>$LOG 2>&1; then log_info "API $API: Passed" else - log_error "API $API: Failed. See $LOG for more details." + log_error "API $API: Failed" fi pkill -9 -f ${AVD_PREFIX}${API} )& + PIDS+=" $!" done - wait + + # Check exit codes + RET_CODE=0 + for pid in $PIDS; do + wait $pid || RET_CODE=1 + done + + # Print all logs + for API in $*; do + echo "::group::Android Tests (API $API)" + cat build/android-test-$API.log + echo "::endgroup::" + done + + return $RET_CODE } android_build() { @@ -300,12 +312,14 @@ CI/CD script for Loop Habit Tracker. Usage: build.sh build [options] + build.sh android-setup build.sh android-tests [options] build.sh android-tests-parallel ... [options] build.sh android-accept-images [options] Commands: build Build the app and run small tests + android-setup Create Android virtual machine android-tests Run medium and large Android tests on an emulator android-tests-parallel Tests multiple API levels simultaneously android-accept-images Copy fetched images to corresponding assets folder From 79e2402c9d852c80b26f1577e8fee637ca2f6fe6 Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Sat, 30 Jul 2022 18:30:53 -0500 Subject: [PATCH 16/19] Merge pull request #1425 from eduebernal/freq-display-normal fix marker scaling in frequency display --- .../views/common/FrequencyChart/render.png | Bin 9182 -> 8847 bytes .../FrequencyChart/renderDifferentSize.png | Bin 16536 -> 15586 bytes .../FrequencyChart/renderTransparent.png | Bin 9182 -> 8847 bytes .../habits/show/FrequencyCard/render.png | Bin 24958 -> 24300 bytes .../views/widgets/FrequencyWidget/render.png | Bin 20839 -> 23011 bytes .../activities/common/views/FrequencyChart.kt | 21 +++++---------- .../isoron/uhabits/core/utils/DateUtils.kt | 21 +++++++++++++++ .../uhabits/core/utils/DateUtilsTest.kt | 25 ++++++++++++++++++ 8 files changed, 52 insertions(+), 15 deletions(-) diff --git a/uhabits-android/src/androidTest/assets/views/common/FrequencyChart/render.png b/uhabits-android/src/androidTest/assets/views/common/FrequencyChart/render.png index 3d7861df0b2b7d9302ea7460ed6252d93571692c..5bdcbc1e17f2fe809a3b1ff90500aab3094778bb 100644 GIT binary patch literal 8847 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 OKv%R4kOf*c_x~SDG=&}j literal 9182 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 W-TT|?=^SrM2`?Z}SZ|Z5DIL>|?f}j)H zT55(6L>5o_M@tPpK{j8;f&VDIu4><+1zQlUT?7R2K-y|oZuw;{js^x<+|H6Y>~YBH z7f?N3L_bzjDQs%B^C_`Ub0RaD&!!sN8eVOpe*i8k`YY2_@gF0ur8B=wdWZo`9fhWeG~+ z3!@K5sV{xkxWBpUf9{x@|M|7cH40p28xzm2PFo!N`Y7TI_SrJ?34|_RU}4XyshDGA z%#Cw_QKwBe(!oVu{8d0_8s>%e)w8>iUth1_Gu@uxkJvPWBvAU~-_csISPd3?n^zP} zLXYi-?-bCEr1VHr=U=v{54rK;-fN!|=h)|+-nbIf1{6JQT3*;Ls)Q=~Iy|-6M!@N` zyIH;GQ(-DeTCgTogEXoa>JJmh&*{&SL6n9vp*G+0v$)W&%#2fsE_J7`JZ~EKHZ!Vs z<>X!ZiDIZ5wqt<8WO}(tVVcP&aBnWsKEBAuD0_7k44z?E*vpbNf?}Be$1vv6ivdzu z$to0g&Nw~$6fpxC?%ciR$&WNcacjX&E%E6o4fXY{D$R~;X^k;V9MWEkNs>QVbiqQQ zo;{|a%lZB)T1~8LK*aKGP2tBEF<7~>C#Qp$&zZ@*=TD$KQ|{>!_k#1MY@W#s)2p0! zKFhg^gI5vc5H?&R=e~{&7Cjr4rM)Hq4bpSNF&DMRrZa~%D*ADj z_J}e;e=mW=ohuFwv;O{{%@e49Apayz{t_vZ4_ z6+iW(;2CoPY%|S@In?=t$B&1;bt}JrZYZKPohj;*WvZ@#n6mpsOD&>`t!4fF`}cNd z(8Ux9&#dKeVza21HE+rliRm>JZj2bTy4b0d!6Z}O1V8eY9P*mf=^3c$S7x99eXAHa zAeF&KwY6&{B_%3U$XmiQiao>h5W>gi%nmqOM@!;T7DOLyU3WoVaV{h-XzkfOVUepd zV_afQm#S9OWAhq=$3wqt9r!{uv@K?+W^(rubg&@pV;81qtq}Mc4SY`;idVFMyhGm0 zTX&18B7IBx#zUc|?br26xifo*q2$}*NJg3~Z{w%UP&W`hlt?QiFQ4PN7}b2qw5Nl;SkByu4gw!)n=!$M1aUn?+%#V@*VS3eX#9{05Z? zOJp>7_-Ju9%1WtHpFU-;;hcVSG%2+Qe-cB<5!6%y)_--9?LV}(p6ImAa&vUtkwzZC zoPMlsuUHsU;0gBqFJ6IheCzlA2Nzsn*;eTd{U%rR&qoQ36mgPe7m@-4S?~6RTJ0p^ zM@IIO&E9D@*>UQoN8WNNIg&YH{VnBay=YF=hr z?Bh>GrCAnA)cM&~AEg)gc?{PuTnIW#v!JvNcWC;ylmZJI&Y8*QaAGdK68xv~-h9YGVPVKxXA zq9OqS-*Z;Gjg4AHofLYzs;tWdW!lU*l$tk7%%=%Fky{Yec{CNuU}{P4wE1Q%nVm4R zw6tUdMw}{pHtQaOMpOBWis3B!WsYMR&C_h4Wt|S}b7yU5x6)`PsEV(fp zCt31Tv`wU6o=t&KmG5LiZf8io3x#z|Ykg|?rvKYEia;4l^ANh9$-3N*=CYut{Ie%i z)(%+&-dS>ux!lun>Y_Kq%lmY5J(#8{C-|FO|FP~!*tOPlrD9+Gp@cSZ&`a#Tui3eodkfg%xX45w=j(gs6E z`HGvZ?&wop;QxJ)bWs0z1Ds(E)bL`#aIPzEh`0nrJNL$)Z#4NB{-(X6AJ&8(9sUTq zml_dqE4ju?FAn}Ud;jlWMTRNUsj1~t4h;_gvi$4xEe+C_DF@NAby$o-{~}QyZ{(GAZ_2+lB7ZTam4u=y?On>lTbC#tghZ zB;x4irsBQ6V#DZi+4rbsr;CmsU;Om6342dS(>smzq~xGX=Wy26WbN zEc~TjR={ZcY5XVRS%@Y(V7@4nLfm_LN1XnMqooZ}loc0u&nE1p3MOKWDNGn9avwc< z%D_1aAmew>>?@M?H8EGp^-+2k!LLBX^ zaZI(>XM@|8Ol$nbIZ*Q@DIH8^M;;d?a$sO!6tT$-DI2VsCA}kTkfEBy%M#S8Dg&i3w|X*x8=YbS>C2 z_eB>_idB#lkm%y_a_KofY(~X+s7bu_3kEgekECZ9=iIg0ZT@so>84VLPVG0_`L9J; zP;450iPcPT{OT9IljAH}0~;F~m(KYI5r1~gLMG%BshY7IwPiO~UxUt6ZukDjnXa=R z7RjJ+GLA4jg_L;>_~;+cXh#v3%!qp{2CCE2gJW!;Jb7ZSmlWdezT!rvsJ-U)m}lGh zB;}2{hXJ*-{`Fef_Yg8-=2eR(FMfQ}dsuV<@B1W%pTYJ6Y0?lI+nSIL*+~Duz-IAj zerG2qg`hzTUyE$4-C=^=IV58`8?;E%o1`nye5+lx_=o5*rUa~LmfoPkEFyl97<_~^ zY~$nozu44U4)(Uj@67Xn0Hw>xlw>(gR) zpcZO4p$|}vIit&T`KX~hn`_q^`z~&qQ8k*>fuAiGgu#=;{jhtfW9DKaHfc!;Eq_wT zytAt0I#c`Jr*PHzpJH#)EBlW>HFR7uSeW;0y5Y-9`*pCcu3=u&^CEIVBbZYf)0!9O zAc+o*l$~zBe_W^IORrSq)-Sa+o>Bhv?q?eORc(vjshqqX8WJ6n6TR1peQxAvaa}pd zaUM_DJM7GTR^0oefI-zxq}!h}b7DB-g@3@^Q`)Lb3q$yC_orPD*P?o00ghFO)yJQd z_!(SulLxr2Dd3{|{h@1l@up6*qQYMfFDvh zY#!R53{`>&}cHE(X-6 z=HkjJuekGL^~ttlXZ_)c*y#p9g|b`_TZzsmT31R8l0hTwh?h=rusrRcD*R09)9pt~ zHkUCMW}-z--KiA9oIbx}13m1%bOUxO9C{9#xg31&0+eRzb<5uIgjxrKSDm`lU_)+N zK;%h%OBsqz;h)c(89g-&I@nC@{%9_Y6vt4(LXTO0PPt^BeWc`n0*41n(>4%&tr;2<<4Pg=%CmBjx6)3+V|it2C4`~%fLm;5Vwr%Uz~ zIlEWk<(iBx0rTbz-=jiOb=UF-tyX*~fdFkTYZVXTN0w2@o=}A&W!mnQ+d|6`yrO_C zrYQEj(_8Oj%bqpk1DG9epkW)?+HP9#uC28?$ajzQ5{VAw>C%VO?Fc;uOs*c#MHOTy zv=X^^Z@Wjaryh?}R*)?}ePaeYcM9YR7;d_ZSV- z{dNsLSTfG)t(!ILJWTH|^eq-Z7 zw4b7KzueX$n?vU6Ezki4I{X0XFg@23l_DSap(uazK1t7+n%`s&ICC$owXNY0-FPvO zt~SCl1t55Pm;QGPM)~z0=>;3rztG1eET8h`dTOM-M3Q^rO<%t2ok_Dd6SSQryHCl> z4BKOReF7=XK-lFRGH&5wTpaat*}0TvjJfW}7@Y4i31pOn*D?+V`wYlSeLo-gE}6co zmmX5QsPl#dSkDagZ*hJP*}OfgD<~_7qCY_*B}$H(T&+^%ObObyzn;9j$2nzTBGYPv z(RDiShA)A!KZAM^jA`Gg+cYC~SlP24RDwAFji40qWajQ)I#Z%xOPWg7v zc?kT?-r%b>nxUtn%r^h2^$8kY+BiuDri9JuZ-q6S`n#{!?4(Ff-Oo1}gAdj(Pwzff z_!n_4CGJ5{c)JNnVUrwM+#p_lY#GoXR`;(0+f1I>{CQ7B@Ya~3F(Dx|Eh$=X>4oo@ z0AJoOiu$>vFL}#JM{xeFr#MB8`VZw+- zrL{hf(MT$<2?&F@xp9Ap$te2F&bltFlvaWPX{9%#UipSWPdlg z1?PjhD-P&_9MXkP&%z#|^0}9G#wD+`)_HrVZ-?rNIEyN3nww&q8CeE96kWDmqen3 z?VXu_JX+l93}gJm#*Yj;7{4!oo{ z%M7jJ9B9$x>;A#P!CR>PW<(XFs-&%QHcIKLB!TQHz#u{&oL+@V78h{U&I25vwN^Ei zCFpNH*j@UWH|&uuFpfHY=?v6@I~3XL2~_IYV~6BtOSwEkO3?=|-@V%iZ*69?YG_TZM$yRUq+6$#IHyX*!=MuI3?@(?~Afbuy)@xdOUoBPC`qi!4;?n~x( zw&gbT7I4(m1jU@`CwzqkS|P00IJ>?~4hLkUr)R@4apXv}blio@Xr(G%wC*OEs=4`a z%g$`h(Ruok+G%xw70$}#{ZdEdAkVqHylohlNvGnEr?$KseN%Wu6txQEzgqC9y_UcL z*7@_pQ#u+J(Yvzu5#s_oXW@CX{;ft9VkSrJdg=$KTB0wRS2fsgcM==mUCt+4&LLmC zV}u7%ASv>;Qtdhe-kWKQf`ZITb>%_c8rCm+&=ygQTdb(7t7AnPbuErf5@F3`)&{I$ zsi;gwsJk|MlIT0?J%~o@zNBu^0fRm8YhU{VZk}uc?~tR^N^B5<7&Mrhe~;V2r;sgI zgxJvNxhpTf8N`jy5vcq>Y4^7uQ`#Ew8joz7ik;?wHV{9-B(A-iBmxDuxZH#uR(2U< z3hnBv9IR`G^|bvJBowCQ;TvKDvT30H+-Fv#QL1HBHL&v2);QW>|7I9>x0BkCdQsLi zo%g9x`Owf10}!q#;Pvs-rcl#3kncJti85n;Q~dxm(6-FL#3gF>(<{$|jm z2N6Eq<+g2HE>2E+qsKaSEm*^7pu4@JqZWf-zkXHe+kQvQ%Wvn`S)AK2Q88V-raaUaQ55%E!$sr#^DkV4)_*yU<;%hEbkNiAim#DLRF!*wumF@ zi6kJOR2j^T>3Y6tdzl%p!DDFn^G&#=hwtqSO!n1j(-Rx*Z78ZJBOnn3&}%6*zj7VW z;qh*ikIVGW-a?{BDO)<5TH-dPp^KQK5bJ1SHMySxvYDZEB^hdBn2>_HpfQf9PqAb* z6cA7pcCoYBfy?qx4#Q*Xuvz~`#HKuaj|bVn()X^NpI;_$)IR*#yQpFMaBj24VxFGj z*C_#79#3uj&LXYS@I3&A;`4f{tE=_Fv^Ae+18iA=Z;v&J<$HraQ4Z)tUQp?K?oBTa zDa4Ox6`-$3Uu(2 zWMR^bqiYjcRM@~jK%>(Vm3qo=Z{NMU!wH$^c70nO!aVSGs`Sq`0gZB64OGI4HIgo< zxyvy27SS_5s(!TIL~4+c0IJwK{-Q`Hp^5m*ztKdIihB{bFUhl{w#M0TG}qP>u&1*e zJ^a;{`tH@-%c%=E_q3KJfQ}ZpOb-rFDpCL3ofl`O;LD_R`IO}o^tZ%oamQsaZCYHC zHI`ljM$3e+q}%+P&2Z*VeeiMm|4)4|L8VvpArrb1QIb_3v0lo9w|*P&_ylDA*79*U z?hQ+2cK98o?PS9?vshq#wda3%`{G5@S?|uSw~tkWMF&~kBR+o4`_-K1YfpG_warB6 z_fEfwYF_pE!B|@<3I=p1jH_v;emF0-!w7vcm$!9|WQ;Qv!rm?A)GljAIa_U^h<;}B#74y>nflXVphWS#| zkhK&v5svo!?!}}JsH#1)##h}I0)#rzm+QZnb^let=l_vbo07E7TlK$9zv)r7lUk$u zPj82-c#ZDHJdG$G`c_xRJh9D!^HL`{cO_7K#}2z^F) zwB9_tR8mqd$)U3nIKInoep&YA&Ar)Ydz)+GwXPwe$;GL~o3KrWB(TY+oo2B&CSdh7;+f@YSXp-i%oah^4u5ph+ENrfeqLCPseC1f3L$_y!~Uv(vIZ3 zY28&^&HVnBB$u4-5j2|_;adN0^2t6V%&rjK*nzXuU;C*mKz!2O-A&ZUuML~NQEuYA z+fHX&{v8c-BX_@X<`GG5>3xSOPMG#6e5^G#0DdfwIG>gDWah24<^F%!Y|O>Fa0U3; zs76t=u4T|f%OkHYXE<^W=pWd7Nh&CknUvDH?F4Pdb{w?cFTs{!{DD*@2iXSoQvZ#m4jaFnhSsLg*Rev=y{3O$0 zotMvN+b5KKeanQ|}h4GHgEdvm^YR!OtDb z6w$yp#hLclT_F0Ad?~UP+yFpVt30%>^pBtS%T+6Pcvhaa5Wc=?;X@OMii_XN`I_9un~eRlXVWt>a(EmKewHz) z<K=N zH_AV+DDV>0xATA{zUY+btknD5P0>rMmjA1Q+i@5&nOa$%c@fODxY{!2c~`v5ZdYsg zg8>aM?`^mL(M#^6m=sZ*WD=?@Bq+Q+SS;>F>$&T}*w_a^C?W7mtYVlWB`f>+GwOepA+|i35F=kbz+;E z{i9n>sr%pW{QH|j)%srbXZQaTG36D^12fR_+uh4`t!2A&@>S0aI|W0+cfT_SzU!rn zO1FNos(-!)Vi{yzfCzs3<Q*s+Vb+DRaotaW z5#qT?@GlQUlw~xZ@A$5k`>7ybkgJn*xd0oU98sNPZ6>3u6XGM#N9&Tx%xr_wy7bN*+b1<^O9VXssE%ov-+D zYPA@+WP0mV&v)#0=;`T$GN)4jDsweu`VjKSubl2o(Vcgtu2iyzRK&YXugbi=FGBgp zEmF>WY9{+GKX9yv$fbb)1i)4)cu^lHauH$`D-v(g@Sb8K1vT`(N6g%$F}!rxxpm+& z)mQ_V4-=%r7cJ-jY))SB%2p1CGsTMJ8ziOT*8IEp|D7}L2yX>|l)#qUEFv(wdH|O~ zo<=vp9Xx(yc#_hXd^^fSB&FL&Ks`?yj8d=dl-&id{C}zIzW=D}9pBdsj%|qlnT*(D z2WciiRsuPp_)PV+m*Dzs%BO&$c#7{c2+eJZP3a_E`|FCZ+2pg^1= z^BRD&b#OQWRZ%GY(jRyVRyj)(Ycz>fiv|rJ^s-{ra--egi$Sua+CNyInqCziflJ13(dnv5k}+E z*%-Jtc4f}iaU>*?E+c{DpVL<7{+8YXjW<&k8AK9ncD2kCXqAGG9*vR28u|BfR6;Fp zf4(s1YQXULM@?&kLP;h5KcqMH&-&msBKO;Eq8R4mjASJhw)%;FTizW~!9<2B-xnT` z7#j}!ZJnDjR4+b@eo1;^|06^WR*KT@Kxu&LEakK`qQ3rJ%kKo@jy{8u@Cc5J&%b>l zpvyE)gX3?IF|VQFNONeYhw_yhYHF{qkH{6ap(FlwYv;btQuhyu@BiH(o4_5CPj%e! z-&D4Xe}GXld`A-bjt9(LO_{v=GwZbJ>AB_QSWY=lyKHphS=H$2M94?rRAgSCx+yCu z93f1S&C1H_8c&-N+n)1C-Sk5ZDvlwbdxaHeB{)OkfHK$pou47_JwQaE@Oc68>D0o1i_s+7l8GU2@+in z48B}hSy_c3*vAQ9fXT5yT9zQFpmgQr!u8J=J7PQV9ys!TFISF*G4>Y zrKHSF=6$0R)!$WW)(+Zs?{)@2cMYcRaev1=Ft#m??4MgN?piz#^>-~Qz*MfSjZKXP zgBcTqf;d_PgU6ehS?6z2Q&R_M9SR|LfKMjNd+;26U@VCaI{4#(H#z>XLN?mX}kd zPQ^TMjH@UM$K!HYjw$fvtVgQ-00E)n6Jv`PCZoD*9e|*5RX)pdC3nB8>BRGIxa^!~ z4_sZ9uX>tqwnYh^Jgm9T)HvkvYc5yto^{{Ria-fCo@ZHGlv~uLpaj_+f}Pa(Ru1J# ztT??DBhQsJC8$&yv^+0i1>g$gEi_0{a11DmPH|jH>FbJwGfwJB$z~iwMkjCsx99fO3Z1cP^JUXf*P2Wl8WnN~JXAv>z@lK9J(s*#A*zD)#6We}l>G zJkrdRX!1M5Mk?$(MS6(K6yhgZn#sRAA`W0;>Gy(8hE0x>ZI2^1uk{cQ zv2rrW(;JXw)QiEj=GEY%s>%H)Jb-i#Qfw=rR5pW;a(IiKQ$RN@x=u=*MW|U;55%Uj zF{o4q7?1Ug9&cSChjO5mR7mff$Gj$DQwD2S5xA`y7`O-AxR)bj69?O^njS%&xMcx< z7Gx;M7>H?1AIu^Kk{gW{j*V|w!DC-%#s5CO*MLO|xyLZpNTcP?mbYp-Ha4cr&lP6{ zvLiwWpWdwl2fg^suOK>j1z2LYLDkARJp-oNVrvo8)BUETBzQjToU5Nt!zyRo??e91 z4cr}Vx*B&C_giA}QjGH|duXP{lJNTLe>bXr@wuqyKl`(RHO*(vQO=&>4SiBSHTi9P z)Fh(e;v>=_AJ7mKR${zL<+p;OrwsT65xz=5qhM6aaIpVP6$o>C49;;6VfRch4jao2 zDo@`Ifwr$E5JM9Cd2Rp8rc&NhdW{AJUDA=`KdMS=p?6FZfH=jQI6xxteYSj)(rKnj za_h7K@WANl^G_C}9hBHT{-y`E=eL4{2FvW}dXUg~4H6mwnUViycdebMhm2YzV4USu z26DNoAlqlOW62#h*+v%h0p|+r8uPqp7ZH#M3cUQG>TnMG*)LSK$Zb7V0q@SN`=7Wy=$ncB%%qK!!wzC z_s`#p_~5P-)~uzhwYKV~c$gth|D>MKw8vZ!>yazGB>j3sedy6G6sc@MrJaY{-J6@6 z@at^)%D}*2Z80Xx)LzSjImpe9-A9B{wV+Ln0Vq$A#WjH2_l35Np$*8D-(L=U5pZOL z&oLwcI5F@2h(M@G+z+_58vAsbn{39!Wgtn9l&iavr`w*~>8D!halYOgQm)A`5G`mTgEQNp=JZ zXBCr5D55jvQj}uPo}oY@z6nGfj^2@i*8EX=9UAWy{wB|nBl?iTRtu7y&vXLMnIL2) zp+SRk+aDbrEe99hEQu-B&L*E2hof;reu`tqpI=VUdK1aBi3a-1i#|aRYvn%n*qRY( z>^f9ggqRLp|DV~A6NTD;=F6#9Bv8lT^^)dsZ6qn5kq|h(7s7RAU#xd<(3b*>fkq?- z0yKFOY82>O8Oi;ePEwYENmpU>R|X+&$d3gHn9~VtAaHue6RsEBWep>t2nng75Yv;C zN2$MIMDW)QXypdniE;)1P`;5bL5rhfCKm*a$?pru_2aTP6bZx7Q21cQm$~)8EH7hd z8~3ZOuzzkL%ZsR0x&^XV5evkI0-aP>V2XOd+?1Cp`%gj39Jj+04_!_u7z8p4A0|q` zeI7m>naB*hi1orPI>PH6=DrjRYrZ^pcr@uh)&@rE8}LwBTILX&Q+|pefjT;!?@!%+ z0edF#)cXWB1E@Od2{iu{+?ek9J?hGk$+1PaNnpwlEIrMX6F1sGXn`YCIC*V%cXyd; zg$+uzy)Q2Sj^3Pse=vJjNA0%XzozQtUK6)3U`L@bTZA;8rH&Mq(X`B15_ctk+mBN| zF_Db$VL~PY)AuM_uh2o`R(Qf$a-`RCr=XUX8043|m6AZyD&BCeg@x?yG3#gOE(y%U zh*wXe@9#{im$oGX5~kmExEDk9iUQiFL3+ciCNqcQJE?3~L!M1nYd6uU(zh&hIp?8+ zn?a1K0B@(MJ*M`BJGjwnIT1R`NKelZ@#btBQ(RlM-O&yUU)=0&HP!T2OZ7oK-rtNh zY+M4Phw>srPJ@vfJxzIKu)VVNNF~#2Sj#6J4~(=8m>a;vD!)M5uQixT zi7+LUFNLa403})%F{iesL}(zo!u+L?T#&deb#pp#cXBzRJKj!`7_XDA3s<(=? zk7+)L2kFaal`2{8^3ayTc7&kuRYf-hfRZvULzNgzzi){RYm;}hB*V9Xf$T(GfpI?| zZW^cKXFO=upz$0PSy|au&}?@$ z8w0mOK*xOAL}(^c{fyh(Z91YJ-zrnkV>^8roNX9V%syze^vZ zx5V@X63eLHa5`9#hpUUChi+bETc%FO-7O-`LwldZD+Wn zpz*jxcsV@-LrBuJJ)}Ihcjy!}9;yQta1Sg+@X;nBn{{@Q{;Q8DXu72_ zUC>KL1_psBju7n|9Sk3F>0OJ)vpJ!M#$?vu$p&-N2rJ8Jujhd~VMDAEbOrW)=b=bT zOD<8k!%!1s0Q?I=`$EV-4B=JtU)D(E^(XF&0~a}kLBCi^T3X2g!QJ(FSaFwqc0@Bp z#B|LZ(kd`?1wEvdb-wZtgbf@GzVSP;LqOBv*z#4YP}%G0*W@@niNpaMGX|{3AW8`M zk<^Mk=F~hC6JmU^#Qb#N1QQkAiqLX!Cjy9$DqLBMgCJ}M$+u+WUJnjUL@Vj8^?*fN zqGmPjlh4uK6x&n4%)Kj_DXI`mjyk&aYBxIRdI1Mk8MOfhaer92ezW8AwhL5(*xau~ zfX2&&YF$ueiE9d*4i9r{(y>s?u-Nsjn{v5vd^MYWK+x?avERkNt7Li{DxHwR3a35g){ebn03h;-Rfm z>TzPrz9#ek#m3srO_h3VH#uj{Y0MJ*$0piyhKGhiKt7{dtBIv02l5mDFfR+q&LkPd z){9}~G*RMk8i=$$0Jmre>Bm^6YJ=PwklT8q+ot%@Ms9yfzz*7DBcRqQATu-y@#VIf zK_It`=~`?C%TfC37_p&b;+=BUCtKn`_^A`;x~51lgW?d0ji+0hK*|pjzrn^&J+afL zR~l+QGhzu605p*EXr1>iFf+!kuH8j>x9fSQn|86L9w4R}5t~j>dnt<^dtxcY``#aN z5C^N=C)G6v1odoYoX0~RaIuBtuc&T*RR{Ft=yXdsS&%I4?Bp2ssOUsL&^lgMOQnUyaW=fK>+6>l5 zCUcrid16li_ziLfj~6GT{1)(0m%JXrXuYpIvIy2Tg46IULzA_1lJO*H1&Pr<&auAF zzL1BPVPGNOe)wWu+zgZmX^bOclM z4}DwPv<~4|csQ?bhW`4j{Fzr0`>9#eJ(Ls^QbswE$FMIvz1Q zk`s3*iHU(tAyQa9O!Zb}q^0d~&fG{kJxPMndCfSkU^!$C13i7T-1P^4SwytHDF3;v zYcbQdEmjGS>^IhAb7%@0KT1JAg;`Nelxb!=J$Nur;|{evZQBX-H`?4|3}*zg zK|NWT*Rt8{hys}+N(;s%c5_?o>RQU8N80}cql)B--@dDHb1Hh6VcukPRgP&%zR57gI; z5SPUpShE`iX1BFNm|KJZk#^yW3%BumidO$pBqbxG0s=)aIl=mDA~`1~Crd(53<%tS zg(Ru?Rx4gp8T*c;xEMWv{54~V5pgUd^XZK}M>n8Dc!Jhq)N|n;kYE|wT-00LdI@lh zW)5LtVGo8hrr4gflia~fP9ZkMAiW$3+s~+kIUx4@q}YD!wH(G2p2H_6-BIHuAuC(M z-tvBN_d8u0{@*0%-L|)5WX5U+aXyLb+Lq3Uqq{4|Cw2@78ju?tb2PqnP!=tlMI67A zy(I0r)1*Ph%4160=?Oi=O;UjAGSX(~xug5qu_$P|k=hfq(!Fj4LW3rR(<|(+|1$Tm z8Vy!-Dx;3*T7vmlHvZSOSVD+;0L|&ToJ-M5b%5k-#U_6SG!&ruoar2@EAFO1T1eL4 zM{GKxbf6%4+Q$GsZKUHDpnYa-F@-`U8^nLD0An4(^y#nVE?OoQ0jx3f^{Z5ad+0@E zHO2M<&`*v{EI@h`z4Q}Z;MHSADrh9H)`A5iu)W9LTou0bWHpyi*Q0yCeod-fD6KE; zw38gaj41)48{GsMWJIJW}cWJ z>mgcBW}0iSoq_8_kF91kPR;AV&pqsBo_>^vr~<1T-$8)wIfBU9RaBW2W)v|XCG6iF zYQ9rBs5ZUFp4@0N847G>PCzAcGQErd0V|^s-?zrz9i$b^YS82X8M{yS%8Q}>(?}I* zObj%T*wBkpW{GRF63-a}FXS+8Ebc|UjPjK=A~g2Hf2_;k7LPIFa!}|d_Gh#L84`cP zeCH$Z2tqYL$V4C2fX9(T1Q|>mgRc;$Jg;LD{m5JNit9gsqH zEH;362Hc>Zw)f$dbYYi0y&=C6G%0uO8!bxFawLHPozi}v23}0{c4X^7Ox+;7&&2z+dMJPJfWG8N(cn$nM_<4!mG%}fa6msM91F8H z?MS&v!TOgZ&<^@aa(As&Z01k)i{qdO7Xl|P%%SbNk?`EZx-mJKCw5lnxwQ?o1owv7 zg;F=4T~#hKAT{yN_sZ$OYg-1=nMY@YUp~mKZKMU*w&>^4JFm72OcVxC7+j>B&CtZ3 zwS4uYrM02U0<-g*MQ0icxhFI$;y%Y;X7JjUpN)EE&2+glWc=7mHZH|&tLW9Lg}S|i zo_`AOLs7MzNMX53e4_1_INIi{zc{BV1Gt6Ad~)Yg97>HL&zcB-N1b)mBG z(%hq?_>1qs-wBW*{apZC*0379bN5iy!M0O4SjqmMwzmv9(if$K&dwYQBkiiKuBTRd I)%x-O0RpW)ivR!s diff --git a/uhabits-android/src/androidTest/assets/views/common/FrequencyChart/renderTransparent.png b/uhabits-android/src/androidTest/assets/views/common/FrequencyChart/renderTransparent.png index 3d7861df0b2b7d9302ea7460ed6252d93571692c..5bdcbc1e17f2fe809a3b1ff90500aab3094778bb 100644 GIT binary patch literal 8847 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 OKv%R4kOf*c_x~SDG=&}j literal 9182 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 iN1M3KqqxoMTl^0buafKN#dNL!0000> - private var maxFreq = 0 private var firstWeekday = Calendar.SUNDAY constructor(context: Context?) : super(context) { @@ -82,7 +82,6 @@ class FrequencyChart : ScrollableChart { fun setFrequency(frequency: java.util.HashMap>) { this.frequency = frequency - maxFreq = getMaxFreq(frequency) postInvalidate() } @@ -91,15 +90,6 @@ class FrequencyChart : ScrollableChart { postInvalidate() } - private fun getMaxFreq(frequency: HashMap>): Int { - var maxValue = 1 - for (values in frequency.values) for (value in values) maxValue = max( - value, - maxValue - ) - return maxValue - } - fun setIsBackgroundTransparent(isBackgroundTransparent: Boolean) { this.isBackgroundTransparent = isBackgroundTransparent initColors() @@ -166,6 +156,7 @@ class FrequencyChart : ScrollableChart { private fun drawColumn(canvas: Canvas, rect: RectF?, date: GregorianCalendar) { val values = frequency[Timestamp(date)] + val weekDaysInMonth = getWeekdaysInMonth(Timestamp(date)) val rowHeight = rect!!.height() / 8.0f prevRect!!.set(rect) val localeWeekdayList: Array = getWeekdaySequence(firstWeekday) @@ -174,7 +165,7 @@ class FrequencyChart : ScrollableChart { rect.offset(prevRect!!.left, prevRect!!.top + baseSize * j) val i = localeWeekdayList[j] % 7 if (values != null) - drawMarker(canvas, rect, values[i]) + drawMarker(canvas, rect, values[i], weekDaysInMonth[i]) rect.offset(0f, rowHeight) } drawFooter(canvas, rect, date) @@ -222,7 +213,7 @@ class FrequencyChart : ScrollableChart { canvas.drawLine(rGrid.left, rGrid.top, rGrid.right, rGrid.top, pGrid!!) } - private fun drawMarker(canvas: Canvas, rect: RectF?, value: Int?) { + private fun drawMarker(canvas: Canvas, rect: RectF?, value: Int?, frequency: Int) { // value can be negative when the entry is skipped val valueCopy = value?.let { max(0, it) } @@ -230,7 +221,8 @@ class FrequencyChart : ScrollableChart { // maximal allowed mark radius val maxRadius = (rect.height() - 2 * padding) / 2.0f // the real mark radius is scaled down by a factor depending on the maximal frequency - val scale = 1.0f / maxFreq * valueCopy!! + + val scale = 1.0f / frequency * valueCopy!! val radius = maxRadius * scale val colorIndex = min((colors.size - 1), ((colors.size - 1) * scale).roundToInt()) pGraph!!.color = colors[colorIndex] @@ -293,6 +285,5 @@ class FrequencyChart : ScrollableChart { frequency[Timestamp(date)] = values date.add(Calendar.MONTH, -1) } - maxFreq = getMaxFreq(frequency) } } diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/DateUtils.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/DateUtils.kt index 7c2c0a4fd..b06513140 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/DateUtils.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/utils/DateUtils.kt @@ -19,6 +19,7 @@ package org.isoron.uhabits.core.utils import org.isoron.uhabits.core.models.Timestamp +import java.time.YearMonth import java.util.Calendar import java.util.Calendar.DAY_OF_MONTH import java.util.Calendar.DAY_OF_WEEK @@ -178,6 +179,26 @@ abstract class DateUtils { return getWeekdayNames(GregorianCalendar.SHORT, firstWeekday) } + /** + * Returns a vector of Int representing the frequency of each weekday in a given month. + * + * @param startOfMonth a Timestamp representing the beginning of the month. + */ + @JvmStatic + fun getWeekdaysInMonth(startOfMonth: Timestamp): Array { + val month = startOfMonth.toCalendar()[Calendar.MONTH] + 1 + val year = startOfMonth.toCalendar()[Calendar.YEAR] + val weekday = startOfMonth.weekday + val monthLength = YearMonth.of(year, month).lengthOfMonth() + + val freq = Array(7) { 0 } + for (day in weekday until weekday + monthLength) { + freq[day % 7] += 1 + } + + return freq + } + @JvmStatic fun getToday(): Timestamp = Timestamp(getStartOfToday()) diff --git a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/utils/DateUtilsTest.kt b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/utils/DateUtilsTest.kt index 75280ab9b..22b6e0057 100644 --- a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/utils/DateUtilsTest.kt +++ b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/utils/DateUtilsTest.kt @@ -118,6 +118,31 @@ class DateUtilsTest : BaseUnitTest() { assertThat(arrayOf("Sat", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri"), equalTo(longWeekdayNames)) } + @Test + fun getWeekdaysInMonth() { + val february = GregorianCalendar(2018, Calendar.FEBRUARY, 1) + val leapFebruary = GregorianCalendar(2020, Calendar.FEBRUARY, 1) + val month = GregorianCalendar(2020, Calendar.APRIL, 1) + val longMonth = GregorianCalendar(2020, Calendar.AUGUST, 1) + + assertThat( + arrayOf(4, 4, 4, 4, 4, 4, 4), + equalTo(DateUtils.getWeekdaysInMonth(Timestamp(february))) + ) + assertThat( + arrayOf(5, 4, 4, 4, 4, 4, 4), + equalTo(DateUtils.getWeekdaysInMonth(Timestamp(leapFebruary))) + ) + assertThat( + arrayOf(4, 4, 4, 4, 5, 5, 4), + equalTo(DateUtils.getWeekdaysInMonth(Timestamp(month))) + ) + assertThat( + arrayOf(5, 5, 5, 4, 4, 4, 4), + equalTo(DateUtils.getWeekdaysInMonth(Timestamp(longMonth))) + ) + } + @Test fun testGetToday() { setFixedLocalTime(FIXED_LOCAL_TIME) From c0fcd4e763c9c16bc97a9cdd460bea42f07f4c20 Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Thu, 11 Aug 2022 04:08:22 -0500 Subject: [PATCH 17/19] Update CHANGELOG --- CHANGELOG.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 19fd9106c..845d81ec3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ - Allow user to add skips to measurable habits (@kalina559, #1319) - Bring back custom frequencies (x times in y days) (@hiqua, #1079) - Improve number picker (@hiqua, @iSoron, #1082, #1370) -- Add new checkmark state picker (@iSoron, #1370) +- Add new checkmark and number picker (@iSoron, #1370) - Allow user to import numerical habits from HabitBull (@hiqua, #1278) ### Removed @@ -20,19 +20,20 @@ - Add delay after toggling a habit (@hiqua, @kalina559, #1147) - Small theme improvements (@KristianTashkov, #1113) - Left-align habit notes (@iSoron) +- Increase target SDK to 31 (@hiqua) ### Fixed - Fix small dialog buttons (@kalina559, #1096) - Fix invalid CSV files (@hiqua, #1177) - Fix small issues in calendar chart (@kalina559, #1314) - Resort habit list after edit (@hiqua, #1350) +- Fix marker scaling in frequency display (@eduebernal, #1425) ### Refactoring & Testing - Replace raster icons by vector assets (@kalina559) - Remove JVM dependencies from uhabits-core module (@sgallese) - Add various missing tests (@sgallese) - Upgrade project dependencies (@hiqua, @sgallese) -- Increase target SDK to 31 (@hiqua) ## [2.0.3] - 2021-08-21 ### Fixed From 0eae43fe55e4ffb71365b2ebe606fee2c5e88cf7 Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Thu, 11 Aug 2022 05:17:41 -0500 Subject: [PATCH 18/19] Fix "enter" notification action on API 31 --- uhabits-android/src/main/AndroidManifest.xml | 12 --- .../activities/common/dialogs/NumberPopup.kt | 4 + .../habits/list/ListHabitsActivity.kt | 25 ++++- .../uhabits/intents/PendingIntentFactory.kt | 32 +++--- .../notifications/AndroidNotificationTray.kt | 2 +- .../uhabits/receivers/WidgetReceiver.kt | 11 -- .../isoron/uhabits/widgets/CheckmarkWidget.kt | 2 +- .../NumericalCheckmarkWidgetActivity.kt | 101 ------------------ 8 files changed, 43 insertions(+), 146 deletions(-) delete mode 100644 uhabits-android/src/main/java/org/isoron/uhabits/widgets/activities/NumericalCheckmarkWidgetActivity.kt diff --git a/uhabits-android/src/main/AndroidManifest.xml b/uhabits-android/src/main/AndroidManifest.xml index 721a10ae5..9c114d733 100644 --- a/uhabits-android/src/main/AndroidManifest.xml +++ b/uhabits-android/src/main/AndroidManifest.xml @@ -119,18 +119,6 @@ android:value=".activities.habits.list.ListHabitsActivity" /> - - - - - - Unit = { _, _ -> } + var onDismiss: () -> Unit = {} private val originalValue = value private lateinit var dialog: Dialog @@ -81,6 +82,9 @@ class NumberPopup( ) setBackgroundDrawableResource(android.R.color.transparent) } + dialog.setOnDismissListener { + onDismiss() + } view.value.setOnKeyListener { _, keyCode, event -> if (event.action == ACTION_DOWN && keyCode == KEYCODE_ENTER) { diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.kt index 22fd1b42e..a29d5d1a3 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.kt @@ -29,6 +29,7 @@ import kotlinx.coroutines.Dispatchers import org.isoron.uhabits.BaseExceptionHandler import org.isoron.uhabits.HabitsApplication import org.isoron.uhabits.activities.habits.list.views.HabitCardListAdapter +import org.isoron.uhabits.core.models.Timestamp import org.isoron.uhabits.core.preferences.Preferences import org.isoron.uhabits.core.tasks.TaskRunner import org.isoron.uhabits.core.ui.ThemeSwitcher.Companion.THEME_DARK @@ -36,11 +37,15 @@ import org.isoron.uhabits.core.utils.MidnightTimer import org.isoron.uhabits.database.AutoBackup import org.isoron.uhabits.inject.ActivityContextModule import org.isoron.uhabits.inject.DaggerHabitsActivityComponent +import org.isoron.uhabits.inject.HabitsActivityComponent +import org.isoron.uhabits.inject.HabitsApplicationComponent import org.isoron.uhabits.utils.restartWithFade class ListHabitsActivity : AppCompatActivity(), Preferences.Listener { var pureBlack: Boolean = false + lateinit var appComponent: HabitsApplicationComponent + lateinit var component: HabitsActivityComponent lateinit var taskRunner: TaskRunner lateinit var adapter: HabitCardListAdapter lateinit var rootView: ListHabitsRootView @@ -59,8 +64,8 @@ class ListHabitsActivity : AppCompatActivity(), Preferences.Listener { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - val appComponent = (applicationContext as HabitsApplication).component - val component = DaggerHabitsActivityComponent + appComponent = (applicationContext as HabitsApplication).component + component = DaggerHabitsActivityComponent .builder() .activityContextModule(ActivityContextModule(this)) .habitsApplicationComponent(appComponent) @@ -79,6 +84,7 @@ class ListHabitsActivity : AppCompatActivity(), Preferences.Listener { Thread.setDefaultUncaughtExceptionHandler(BaseExceptionHandler(this)) component.listHabitsBehavior.onStartup() setContentView(rootView) + parseIntents() } override fun onPause() { @@ -116,4 +122,19 @@ class ListHabitsActivity : AppCompatActivity(), Preferences.Listener { super.onActivityResult(request, result, data) screen.onResult(request, result, data) } + + private fun parseIntents() { + if (intent.action == ACTION_EDIT) { + val habitId = intent.extras?.getLong("habit") + val timestamp = intent.extras?.getLong("timestamp") + if (habitId != null && timestamp != null) { + val habit = appComponent.habitList.getById(habitId)!! + component.listHabitsBehavior.onEdit(habit, Timestamp(timestamp)) + } + } + } + + companion object { + const val ACTION_EDIT = "org.isoron.uhabits.ACTION_EDIT" + } } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/intents/PendingIntentFactory.kt b/uhabits-android/src/main/java/org/isoron/uhabits/intents/PendingIntentFactory.kt index 841fa55e6..3a1ee29c5 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/intents/PendingIntentFactory.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/intents/PendingIntentFactory.kt @@ -22,10 +22,12 @@ package org.isoron.uhabits.intents import android.app.PendingIntent import android.app.PendingIntent.FLAG_IMMUTABLE import android.app.PendingIntent.FLAG_UPDATE_CURRENT +import android.app.PendingIntent.getActivity import android.app.PendingIntent.getBroadcast import android.content.Context import android.content.Intent import android.net.Uri +import org.isoron.uhabits.activities.habits.list.ListHabitsActivity import org.isoron.uhabits.core.AppScope import org.isoron.uhabits.core.models.Habit import org.isoron.uhabits.core.models.Timestamp @@ -127,32 +129,26 @@ class PendingIntentFactory FLAG_IMMUTABLE or FLAG_UPDATE_CURRENT ) - fun setNumericalValue( - widgetContext: Context, - habit: Habit, - numericalValue: Int, - timestamp: Long? - ): - PendingIntent = + fun updateWidgets(): PendingIntent = getBroadcast( - widgetContext, - 2, - Intent(widgetContext, WidgetReceiver::class.java).apply { - data = Uri.parse(habit.uriString) - action = WidgetReceiver.ACTION_SET_NUMERICAL_VALUE - putExtra("numericalValue", numericalValue) - if (timestamp != null) putExtra("timestamp", timestamp) + context, + 0, + Intent(context, WidgetReceiver::class.java).apply { + action = WidgetReceiver.ACTION_UPDATE_WIDGETS_VALUE }, FLAG_IMMUTABLE or FLAG_UPDATE_CURRENT ) - fun updateWidgets(): PendingIntent = - getBroadcast( + fun showNumberPicker(habit: Habit, timestamp: Timestamp): PendingIntent? { + return getActivity( context, 0, - Intent(context, WidgetReceiver::class.java).apply { - action = WidgetReceiver.ACTION_UPDATE_WIDGETS_VALUE + Intent(context, ListHabitsActivity::class.java).apply { + action = ListHabitsActivity.ACTION_EDIT + putExtra("habit", habit.id) + putExtra("timestamp", timestamp.unixTime) }, FLAG_IMMUTABLE or FLAG_UPDATE_CURRENT ) + } } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/notifications/AndroidNotificationTray.kt b/uhabits-android/src/main/java/org/isoron/uhabits/notifications/AndroidNotificationTray.kt index 07b215440..47279f3d8 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/notifications/AndroidNotificationTray.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/notifications/AndroidNotificationTray.kt @@ -112,7 +112,7 @@ class AndroidNotificationTray val enterAction = Action( R.drawable.ic_action_check, context.getString(R.string.enter), - pendingIntents.setNumericalValue(context, habit, 0, null) + pendingIntents.showNumberPicker(habit, timestamp) ) val wearableBg = decodeResource(context.resources, R.drawable.stripe) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.kt b/uhabits-android/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.kt index 2f5702796..fc44eefbc 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.kt @@ -27,7 +27,6 @@ import org.isoron.uhabits.HabitsApplication import org.isoron.uhabits.core.ui.widgets.WidgetBehavior import org.isoron.uhabits.inject.HabitsApplicationComponent import org.isoron.uhabits.intents.IntentParser.CheckmarkIntentData -import org.isoron.uhabits.widgets.activities.NumericalCheckmarkWidgetActivity /** * The Android BroadcastReceiver for Loop Habit Tracker. @@ -96,15 +95,6 @@ class WidgetReceiver : BroadcastReceiver() { data.timestamp ) } - ACTION_SET_NUMERICAL_VALUE -> { - context.sendBroadcast(Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) - val numberSelectorIntent = Intent(context, NumericalCheckmarkWidgetActivity::class.java) - numberSelectorIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - numberSelectorIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK) - numberSelectorIntent.action = NumericalCheckmarkWidgetActivity.ACTION_SHOW_NUMERICAL_VALUE_ACTIVITY - parser.copyIntentData(intent, numberSelectorIntent) - context.startActivity(numberSelectorIntent) - } ACTION_UPDATE_WIDGETS_VALUE -> { widgetUpdater.updateWidgets() widgetUpdater.scheduleStartDayWidgetUpdate() @@ -126,7 +116,6 @@ class WidgetReceiver : BroadcastReceiver() { const val ACTION_DISMISS_REMINDER = "org.isoron.uhabits.ACTION_DISMISS_REMINDER" const val ACTION_REMOVE_REPETITION = "org.isoron.uhabits.ACTION_REMOVE_REPETITION" const val ACTION_TOGGLE_REPETITION = "org.isoron.uhabits.ACTION_TOGGLE_REPETITION" - const val ACTION_SET_NUMERICAL_VALUE = "org.isoron.uhabits.ACTION_SET_NUMERICAL_VALUE" const val ACTION_UPDATE_WIDGETS_VALUE = "org.isoron.uhabits.ACTION_UPDATE_WIDGETS_VALUE" private const val TAG = "WidgetReceiver" var lastReceivedIntent: Intent? = null diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidget.kt b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidget.kt index f2814ff4d..fbbb7ffd1 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidget.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidget.kt @@ -43,7 +43,7 @@ open class CheckmarkWidget( override fun getOnClickPendingIntent(context: Context): PendingIntent? { return if (habit.isNumerical) { - pendingIntentFactory.setNumericalValue(context, habit, 10, null) + pendingIntentFactory.showNumberPicker(habit, DateUtils.getToday()) } else { pendingIntentFactory.toggleCheckmark(habit, null) } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/widgets/activities/NumericalCheckmarkWidgetActivity.kt b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/activities/NumericalCheckmarkWidgetActivity.kt deleted file mode 100644 index a7305521e..000000000 --- a/uhabits-android/src/main/java/org/isoron/uhabits/widgets/activities/NumericalCheckmarkWidgetActivity.kt +++ /dev/null @@ -1,101 +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 . - */ - -package org.isoron.uhabits.widgets.activities - -import android.app.Activity -import android.content.Context -import android.os.Bundle -import android.view.View -import android.view.ViewGroup.LayoutParams.MATCH_PARENT -import android.widget.FrameLayout -import org.isoron.uhabits.HabitsApplication -import org.isoron.uhabits.activities.AndroidThemeSwitcher -import org.isoron.uhabits.activities.common.dialogs.NumberPopup -import org.isoron.uhabits.core.ui.screens.habits.list.ListHabitsBehavior -import org.isoron.uhabits.core.ui.widgets.WidgetBehavior -import org.isoron.uhabits.core.utils.DateUtils -import org.isoron.uhabits.intents.IntentParser -import org.isoron.uhabits.utils.SystemUtils -import org.isoron.uhabits.widgets.WidgetUpdater - -class NumericalCheckmarkWidgetActivity : Activity(), ListHabitsBehavior.NumberPickerCallback { - - private lateinit var behavior: WidgetBehavior - private lateinit var data: IntentParser.CheckmarkIntentData - private lateinit var widgetUpdater: WidgetUpdater - private lateinit var rootView: View - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - rootView = FrameLayout(this) - rootView.layoutParams = FrameLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT) - setContentView(rootView) - val app = this.applicationContext as HabitsApplication - val component = app.component - val parser = app.component.intentParser - data = parser.parseCheckmarkIntent(intent) - behavior = WidgetBehavior( - component.habitList, - component.commandRunner, - component.notificationTray, - component.preferences - ) - widgetUpdater = component.widgetUpdater - rootView.post { - showNumberSelector(this) - } - SystemUtils.unlockScreen(this) - } - - override fun onNumberPicked(newValue: Double, notes: String) { - behavior.setValue(data.habit, data.timestamp, (newValue * 1000).toInt(), notes) - widgetUpdater.updateWidgets() - finish() - } - - override fun onNumberPickerDismissed() { - finish() - } - - private fun showNumberSelector(context: Context) { - val app = this.applicationContext as HabitsApplication - AndroidThemeSwitcher(this, app.component.preferences).apply() - val today = DateUtils.getTodayWithOffset() - val entry = data.habit.computedEntries.get(today) - NumberPopup( - context = context, - prefs = app.component.preferences, - anchor = rootView, - notes = entry.notes, - value = entry.value / 1000.0, - ).apply { - onToggle = { value, notes -> - onNumberPicked(value, notes) - finish() - overridePendingTransition(0, 0) - } - show() - } - } - - companion object { - const val ACTION_SHOW_NUMERICAL_VALUE_ACTIVITY = "org.isoron.uhabits.ACTION_SHOW_NUMERICAL_VALUE_ACTIVITY" - } -} From 838e13f30cdbb54c0af6ff79e848010526b055be Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Sat, 13 Aug 2022 07:24:20 -0500 Subject: [PATCH 19/19] Prevent crashes in AutoBackup from blocking app launch --- .../uhabits/activities/habits/list/ListHabitsActivity.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.kt index a29d5d1a3..64c7a02c9 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.kt @@ -21,6 +21,7 @@ package org.isoron.uhabits.activities.habits.list import android.content.Intent import android.os.Bundle +import android.util.Log import android.view.Menu import android.view.MenuItem import androidx.appcompat.app.AppCompatActivity @@ -100,7 +101,11 @@ class ListHabitsActivity : AppCompatActivity(), Preferences.Listener { rootView.postInvalidate() midnightTimer.onResume() taskRunner.run { - AutoBackup(this@ListHabitsActivity).run() + try { + AutoBackup(this@ListHabitsActivity).run() + } catch (e: Exception) { + Log.e("ListHabitActivity", "AutoBackup task failed", e) + } } if (prefs.theme == THEME_DARK && prefs.isPureBlackEnabled != pureBlack) { restartWithFade(ListHabitsActivity::class.java)