mirror of
https://github.com/iSoron/uhabits.git
synced 2025-12-06 09:08:52 -06:00
Compare commits
34 Commits
d3c90481be
...
hotfix/2.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
177d01edd9
|
|||
|
ec1f0c5356
|
|||
|
961fb7618f
|
|||
|
11f726064a
|
|||
| abced92a07 | |||
|
|
eeacc5eef8 | ||
|
|
16c65f19fd | ||
| fc402fd81b | |||
| f7c6bc716c | |||
| 2535347d5a | |||
| 13af054214 | |||
| fcbb586e80 | |||
|
|
428bf42e79 | ||
| 838e13f30c | |||
| 0eae43fe55 | |||
| c0fcd4e763 | |||
| 79e2402c9d | |||
| 53c270ee12 | |||
| 0a95b6d2a0 | |||
| e6bcbb39ff | |||
| 90de1f3723 | |||
| 68740b4043 | |||
| b66a6ff717 | |||
| 7c1a91e35a | |||
| 366e9af167 | |||
| 03b02aaa06 | |||
|
|
180cf25ad3 | ||
| 3490cd183a | |||
|
|
0c292d1eaa | ||
| 0b256cb2c0 | |||
| cc03c48648 | |||
| 53e7ef2918 | |||
| 9609bee0f7 | |||
| 5b23a3f960 |
59
.github/workflows/main.yml
vendored
59
.github/workflows/main.yml
vendored
@@ -7,59 +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
|
||||
- name: Run Android tests
|
||||
run: ./build.sh android-tests-parallel 23 24 25 26 27 28 30 31
|
||||
|
||||
- name: Upload artifacts
|
||||
if: always()
|
||||
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: [
|
||||
23,
|
||||
24,
|
||||
25,
|
||||
26,
|
||||
27,
|
||||
28,
|
||||
# 29, # Crashes constantly, see: https://issuetracker.google.com/issues/159732638
|
||||
# 30, # Not available yet
|
||||
# 31, # Not available yet
|
||||
]
|
||||
|
||||
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 flock
|
||||
run: |
|
||||
brew install util-linux
|
||||
echo "/usr/local/opt/util-linux/bin" >> $GITHUB_PATH
|
||||
|
||||
- name: Run Android Tests
|
||||
run: ./build.sh android-tests ${{ matrix.api }}
|
||||
name: build
|
||||
path: |
|
||||
build/*log
|
||||
uhabits-android/build/outputs
|
||||
|
||||
|
||||
41
CHANGELOG.md
41
CHANGELOG.md
@@ -1,5 +1,46 @@
|
||||
# Changelog
|
||||
|
||||
## [2.1.1] -- 2022-09-24
|
||||
### Fixed
|
||||
- Fix Tasker plugin (@iSoron, #1503)
|
||||
|
||||
## [2.1.0] -- 2022-09-10
|
||||
### 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 and number picker (@iSoron, #1370)
|
||||
- Allow user to import numerical habits from HabitBull (@hiqua, #1278)
|
||||
- Add support for Android 13 themed icons (@cheeeeer, #1497)
|
||||
|
||||
### 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)
|
||||
- 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)
|
||||
- Fix widgets not working correctly on API 33 (@iSoron, #1488)
|
||||
|
||||
### 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)
|
||||
|
||||
## [2.0.3] - 2021-08-21
|
||||
### Fixed
|
||||
- Improve automatic checkmarks for monthly habits (@iSoron, #947)
|
||||
|
||||
@@ -5,7 +5,7 @@ plugins {
|
||||
id("org.jetbrains.kotlin.kapt") version kotlinVersion apply (false)
|
||||
id("org.jetbrains.kotlin.android.extensions") version kotlinVersion apply (false)
|
||||
id("org.jetbrains.kotlin.multiplatform") version kotlinVersion apply (false)
|
||||
id("org.jlleitschuh.gradle.ktlint") version "10.3.0"
|
||||
id("org.jlleitschuh.gradle.ktlint") version "10.2.1"
|
||||
}
|
||||
|
||||
apply {
|
||||
|
||||
124
build.sh
124
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_setup() {
|
||||
API=$1
|
||||
AVDNAME=${AVD_PREFIX}${API}
|
||||
|
||||
@@ -95,15 +95,53 @@ android_test() {
|
||||
) 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 \
|
||||
1>/dev/null 2>&1 &
|
||||
|
||||
log_info "Waiting for emulator to boot..."
|
||||
export ADB="$ADB -s emulator-6${API}0"
|
||||
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 "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"
|
||||
$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
|
||||
@@ -111,6 +149,24 @@ android_test() {
|
||||
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..."
|
||||
$ADB install -r ${ANDROID_OUTPUTS_DIR}/apk/release/uhabits-android-release.apk || return 1
|
||||
@@ -122,14 +178,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,13 +205,14 @@ 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
|
||||
}
|
||||
|
||||
android_test_parallel() {
|
||||
# Launch background processes
|
||||
PIDS=""
|
||||
for API in $*; do
|
||||
(
|
||||
LOG=build/android-test-$API.log
|
||||
@@ -152,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() {
|
||||
@@ -229,12 +312,14 @@ CI/CD script for Loop Habit Tracker.
|
||||
|
||||
Usage:
|
||||
build.sh build [options]
|
||||
build.sh android-setup <API>
|
||||
build.sh android-tests <API> [options]
|
||||
build.sh android-tests-parallel <API> <API>... [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
|
||||
@@ -270,18 +355,17 @@ main() {
|
||||
core_build
|
||||
android_build
|
||||
;;
|
||||
android-setup)
|
||||
shift; _parse_opts "$@"
|
||||
android_setup $1
|
||||
;;
|
||||
android-tests)
|
||||
shift; _parse_opts "$@"
|
||||
if [ -z $1 ]; then
|
||||
_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 "$@"
|
||||
|
||||
@@ -33,7 +33,7 @@ The repository will be downloaded to the directory `uhabits`.
|
||||
2. When the IDE asks you for the project location, select `uhabits` and click "Ok".
|
||||
3. Android Studio will spend some time indexing the project. When this is complete, click the toolbar icon "Sync Project with Gradle File", located near the right corner of the top toolbar.
|
||||
4. The operation will likely fail several times due to missing Android SDK components. Each time it fails, click the link "Install missing platforms", "Install build tools", etc, and try again.
|
||||
5. To test the application, create a virtual Android device using the menu "Tools" and "AVD Manager". The default options should work fine, but feel free to customize the device.
|
||||
5. To test the application, create a virtual Android device using the menu "Tools" and "AVD Manager". The default options should work fine, but free to customize the device.
|
||||
6. Click the menu "Run" and "uhabits-android". The application should launch.
|
||||
|
||||
|
||||
|
||||
67
tools/parseInstrument.py
Executable file
67
tools/parseInstrument.py
Executable file
@@ -0,0 +1,67 @@
|
||||
#!/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 warnings 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_RED = '\033[91m'
|
||||
COLOR_YELLOW = '\033[93m'
|
||||
COLOR_END = '\033[0m'
|
||||
|
||||
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 = []
|
||||
am_args = "-e class "
|
||||
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):
|
||||
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):
|
||||
warning("SLOW %s#%s (%.2f seconds)" % (current_class, current_method, elapsed_time))
|
||||
|
||||
if len(failed_tests) > 0:
|
||||
for test in failed_tests:
|
||||
error("FAIL %s" % test)
|
||||
print(am_args[:-1])
|
||||
|
||||
sys.exit(exit_code)
|
||||
@@ -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"
|
||||
"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"
|
||||
"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"
|
||||
"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"
|
||||
"Me Me (gentelwom)",Arabic,42,40,0,0,0,0,0,"2020-11-08 20:44:01"
|
||||
"Balázs Keresztury (belidzs)",Hungarian,42,41,501,0,7,0,38,"2017-04-06 02:40:24"
|
||||
"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"
|
||||
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"
|
||||
"사자솥 (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"
|
||||
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"
|
||||
axikman11111,Uyghur,18,19,0,0,0,0,0,"2018-10-13 12:25:31"
|
||||
"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"
|
||||
"Hoon Jung (hooni100)",Korean,17,10,0,0,0,0,0,"2021-01-03 02:26:54"
|
||||
takoyakibento,Korean,17,13,0,3,0,0,0,"2020-08-01 08:44:15"
|
||||
"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"
|
||||
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"
|
||||
"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"
|
||||
"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"
|
||||
"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"
|
||||
"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"
|
||||
"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"
|
||||
"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"
|
||||
"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"
|
||||
"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"
|
||||
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"
|
||||
"조화정 (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"
|
||||
"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"
|
||||
Soroor_SI,Persian,2,2,0,0,0,0,0,"2018-06-10 06:28:27"
|
||||
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"
|
||||
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"
|
||||
"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"
|
||||
"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"
|
||||
"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"
|
||||
"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"
|
||||
"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"
|
||||
"Равиль Мифтахов (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"
|
||||
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"
|
||||
"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"
|
||||
"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"
|
||||
"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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
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"
|
||||
|
||||
|
@@ -35,8 +35,8 @@ android {
|
||||
compileSdk = 31
|
||||
|
||||
defaultConfig {
|
||||
versionCode = 20003
|
||||
versionName = "2.0.3"
|
||||
versionCode = 20101
|
||||
versionName = "2.1.1"
|
||||
minSdk = 23
|
||||
targetSdk = 31
|
||||
applicationId = "org.isoron.uhabits"
|
||||
@@ -86,19 +86,19 @@ android {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
val daggerVersion = "2.43.1"
|
||||
val kotlinVersion = "1.7.0"
|
||||
val kxCoroutinesVersion = "1.6.4"
|
||||
val daggerVersion = "2.41"
|
||||
val kotlinVersion = "1.6.21"
|
||||
val kxCoroutinesVersion = "1.6.1"
|
||||
val ktorVersion = "1.6.8"
|
||||
val espressoVersion = "3.4.0"
|
||||
|
||||
androidTestImplementation("androidx.test.espresso:espresso-contrib:$espressoVersion")
|
||||
androidTestImplementation("androidx.test.espresso:espresso-core:$espressoVersion")
|
||||
androidTestImplementation("com.google.dagger:dagger:$daggerVersion")
|
||||
androidTestImplementation("com.linkedin.dexmaker:dexmaker-mockito:2.28.3")
|
||||
androidTestImplementation("com.linkedin.dexmaker:dexmaker-mockito:2.28.1")
|
||||
androidTestImplementation("io.ktor:ktor-client-mock:$ktorVersion")
|
||||
androidTestImplementation("io.ktor:ktor-jackson:$ktorVersion")
|
||||
androidTestImplementation("androidx.annotation:annotation:1.4.0")
|
||||
androidTestImplementation("androidx.annotation:annotation:1.3.0")
|
||||
androidTestImplementation("androidx.test.ext:junit:1.1.3")
|
||||
androidTestImplementation("androidx.test.uiautomator:uiautomator:2.2.0")
|
||||
androidTestImplementation("androidx.test:rules:1.4.0")
|
||||
@@ -116,10 +116,10 @@ dependencies {
|
||||
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlinVersion")
|
||||
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:$kxCoroutinesVersion")
|
||||
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:$kxCoroutinesVersion")
|
||||
implementation("androidx.appcompat:appcompat:1.4.2")
|
||||
implementation("androidx.appcompat:appcompat:1.4.1")
|
||||
implementation("androidx.legacy:legacy-preference-v14:1.0.0")
|
||||
implementation("androidx.legacy:legacy-support-v4:1.0.0")
|
||||
implementation("com.google.android.material:material:1.6.1")
|
||||
implementation("com.google.android.material:material:1.5.0")
|
||||
implementation("com.opencsv:opencsv:5.6")
|
||||
implementation(project(":uhabits-core"))
|
||||
kapt("com.google.dagger:dagger-compiler:$daggerVersion")
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -119,18 +119,6 @@
|
||||
android:value=".activities.habits.list.ListHabitsActivity" />
|
||||
</activity>
|
||||
|
||||
<activity
|
||||
android:name=".widgets.activities.NumericalCheckmarkWidgetActivity"
|
||||
android:excludeFromRecents="true"
|
||||
android:exported="true"
|
||||
android:label="NumericalCheckmarkWidget"
|
||||
android:noHistory="true"
|
||||
android:theme="@style/Theme.Transparent">
|
||||
<intent-filter>
|
||||
<action android:name="org.isoron.uhabits.ACTION_SHOW_NUMERICAL_VALUE_ACTIVITY" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
<activity
|
||||
android:name=".notifications.SnoozeDelayPickerActivity"
|
||||
android:excludeFromRecents="true"
|
||||
@@ -282,7 +270,7 @@
|
||||
<!-- Locale/Tasker -->
|
||||
<receiver
|
||||
android:name=".automation.FireSettingReceiver"
|
||||
android:exported="false">
|
||||
android:exported="true">
|
||||
<intent-filter>
|
||||
<action android:name="com.twofortyfouram.locale.intent.action.FIRE_SETTING" />
|
||||
</intent-filter>
|
||||
|
||||
@@ -35,6 +35,7 @@ import org.isoron.uhabits.core.preferences.Preferences
|
||||
import org.isoron.uhabits.databinding.CheckmarkPopupBinding
|
||||
import org.isoron.uhabits.utils.InterfaceUtils.getFontAwesome
|
||||
import org.isoron.uhabits.utils.dimBehind
|
||||
import org.isoron.uhabits.utils.dismissCurrentAndShow
|
||||
import org.isoron.uhabits.utils.dp
|
||||
import org.isoron.uhabits.utils.sres
|
||||
|
||||
@@ -117,7 +118,7 @@ class CheckmarkPopup(
|
||||
view.unknownBtn.setOnClickListener { onClick(UNKNOWN) }
|
||||
dialog.setCanceledOnTouchOutside(true)
|
||||
dialog.dimBehind()
|
||||
dialog.show()
|
||||
dialog.dismissCurrentAndShow()
|
||||
}
|
||||
|
||||
fun save() {
|
||||
|
||||
@@ -149,8 +149,10 @@ class FrequencyPickerDialog(
|
||||
}
|
||||
contentView.xTimesPerYDaysRadioButton.isChecked -> {
|
||||
if (contentView.xTimesPerYDaysXTextView.text.isNotEmpty() && contentView.xTimesPerYDaysYTextView.text.isNotEmpty()) {
|
||||
numerator = Integer.parseInt(contentView.xTimesPerYDaysXTextView.text.toString())
|
||||
denominator = Integer.parseInt(contentView.xTimesPerYDaysYTextView.text.toString())
|
||||
numerator =
|
||||
Integer.parseInt(contentView.xTimesPerYDaysXTextView.text.toString())
|
||||
denominator =
|
||||
Integer.parseInt(contentView.xTimesPerYDaysYTextView.text.toString())
|
||||
}
|
||||
}
|
||||
else -> {
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
package org.isoron.uhabits.activities.common.dialogs
|
||||
|
||||
import android.app.Dialog
|
||||
import android.content.DialogInterface
|
||||
import android.os.Bundle
|
||||
import androidx.appcompat.app.AppCompatDialogFragment
|
||||
import org.isoron.platform.gui.AndroidDataView
|
||||
@@ -49,6 +50,7 @@ class HistoryEditorDialog : AppCompatDialogFragment(), CommandRunner.Listener {
|
||||
private var onDateClickedListener: OnDateClickedListener? = null
|
||||
|
||||
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
|
||||
clearCurrentDialog()
|
||||
val component = (activity!!.application as HabitsApplication).component
|
||||
commandRunner = component.commandRunner
|
||||
habit = component.habitList.getById(arguments!!.getLong("habit"))!!
|
||||
@@ -72,12 +74,20 @@ class HistoryEditorDialog : AppCompatDialogFragment(), CommandRunner.Listener {
|
||||
dataView = AndroidDataView(context!!, null)
|
||||
dataView.view = chart!!
|
||||
|
||||
return Dialog(context!!).apply {
|
||||
val dialog = Dialog(context!!).apply {
|
||||
val metrics = resources.displayMetrics
|
||||
val maxHeight = resources.getDimensionPixelSize(R.dimen.history_editor_max_height)
|
||||
setContentView(dataView)
|
||||
window!!.setLayout(metrics.widthPixels, min(metrics.heightPixels, maxHeight))
|
||||
}
|
||||
|
||||
currentDialog = dialog
|
||||
return dialog
|
||||
}
|
||||
|
||||
override fun onDismiss(dialog: DialogInterface) {
|
||||
super.onDismiss(dialog)
|
||||
currentDialog = null
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
@@ -111,4 +121,14 @@ class HistoryEditorDialog : AppCompatDialogFragment(), CommandRunner.Listener {
|
||||
override fun onCommandFinished(command: Command) {
|
||||
refreshData()
|
||||
}
|
||||
|
||||
companion object {
|
||||
// HistoryEditorDialog handles multiple dialogs on its own,
|
||||
// because sometimes we want it to be shown under another dialog (e.g. NumberPopup)
|
||||
var currentDialog: Dialog? = null
|
||||
fun clearCurrentDialog() {
|
||||
currentDialog?.dismiss()
|
||||
currentDialog = null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,6 +31,7 @@ import org.isoron.uhabits.core.models.Entry
|
||||
import org.isoron.uhabits.core.preferences.Preferences
|
||||
import org.isoron.uhabits.databinding.CheckmarkPopupBinding
|
||||
import org.isoron.uhabits.utils.dimBehind
|
||||
import org.isoron.uhabits.utils.dismissCurrentAndShow
|
||||
import org.isoron.uhabits.utils.dp
|
||||
import org.isoron.uhabits.utils.requestFocusWithKeyboard
|
||||
import java.text.DecimalFormat
|
||||
@@ -43,6 +44,7 @@ class NumberPopup(
|
||||
private val anchor: View,
|
||||
) {
|
||||
var onToggle: (Double, String) -> Unit = { _, _ -> }
|
||||
var onDismiss: () -> Unit = {}
|
||||
private val originalValue = value
|
||||
private lateinit var dialog: Dialog
|
||||
|
||||
@@ -81,6 +83,9 @@ class NumberPopup(
|
||||
)
|
||||
setBackgroundDrawableResource(android.R.color.transparent)
|
||||
}
|
||||
dialog.setOnDismissListener {
|
||||
onDismiss()
|
||||
}
|
||||
|
||||
view.value.setOnKeyListener { _, keyCode, event ->
|
||||
if (event.action == ACTION_DOWN && keyCode == KEYCODE_ENTER) {
|
||||
@@ -99,7 +104,7 @@ class NumberPopup(
|
||||
view.value.requestFocusWithKeyboard()
|
||||
dialog.setCanceledOnTouchOutside(true)
|
||||
dialog.dimBehind()
|
||||
dialog.show()
|
||||
dialog.dismissCurrentAndShow()
|
||||
}
|
||||
|
||||
fun save() {
|
||||
|
||||
@@ -73,6 +73,7 @@ class WeekdayPickerDialog :
|
||||
.setNegativeButton(
|
||||
android.R.string.cancel
|
||||
) { _: DialogInterface?, _: Int -> dismiss() }
|
||||
|
||||
return builder.create()
|
||||
}
|
||||
|
||||
|
||||
@@ -63,7 +63,9 @@ class FrequencyChart : ScrollableChart {
|
||||
private var primaryColor = 0
|
||||
private var isBackgroundTransparent = false
|
||||
private lateinit var frequency: HashMap<Timestamp, Array<Int>>
|
||||
private var maxFreq = 0
|
||||
private var firstWeekday = Calendar.SUNDAY
|
||||
private var isNumerical: Boolean = false
|
||||
|
||||
constructor(context: Context?) : super(context) {
|
||||
init()
|
||||
@@ -80,8 +82,14 @@ class FrequencyChart : ScrollableChart {
|
||||
postInvalidate()
|
||||
}
|
||||
|
||||
fun setIsNumerical(type: Boolean) {
|
||||
isNumerical = type
|
||||
postInvalidate()
|
||||
}
|
||||
|
||||
fun setFrequency(frequency: java.util.HashMap<Timestamp, Array<Int>>) {
|
||||
this.frequency = frequency
|
||||
maxFreq = getMaxFreq(frequency)
|
||||
postInvalidate()
|
||||
}
|
||||
|
||||
@@ -90,6 +98,15 @@ class FrequencyChart : ScrollableChart {
|
||||
postInvalidate()
|
||||
}
|
||||
|
||||
private fun getMaxFreq(frequency: HashMap<Timestamp, Array<Int>>): 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()
|
||||
@@ -213,7 +230,7 @@ class FrequencyChart : ScrollableChart {
|
||||
canvas.drawLine(rGrid.left, rGrid.top, rGrid.right, rGrid.top, pGrid!!)
|
||||
}
|
||||
|
||||
private fun drawMarker(canvas: Canvas, rect: RectF?, value: Int?, frequency: Int) {
|
||||
private fun drawMarker(canvas: Canvas, rect: RectF?, value: Int?, weekdayFrequency: Int) {
|
||||
// value can be negative when the entry is skipped
|
||||
val valueCopy = value?.let { max(0, it) }
|
||||
|
||||
@@ -221,8 +238,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 / frequency * valueCopy!!
|
||||
val scalingFactor = if (isNumerical) maxFreq else weekdayFrequency
|
||||
val scale = 1.0f / scalingFactor * valueCopy!!
|
||||
val radius = maxRadius * scale
|
||||
val colorIndex = min((colors.size - 1), ((colors.size - 1) * scale).roundToInt())
|
||||
pGraph!!.color = colors[colorIndex]
|
||||
@@ -285,5 +302,6 @@ class FrequencyChart : ScrollableChart {
|
||||
frequency[Timestamp(date)] = values
|
||||
date.add(Calendar.MONTH, -1)
|
||||
}
|
||||
maxFreq = getMaxFreq(frequency)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -59,6 +59,7 @@ import org.isoron.uhabits.core.models.Reminder
|
||||
import org.isoron.uhabits.core.models.WeekdayList
|
||||
import org.isoron.uhabits.databinding.ActivityEditHabitBinding
|
||||
import org.isoron.uhabits.utils.ColorUtils
|
||||
import org.isoron.uhabits.utils.dismissCurrentAndShow
|
||||
import org.isoron.uhabits.utils.formatTime
|
||||
import org.isoron.uhabits.utils.toFormattedString
|
||||
|
||||
@@ -156,23 +157,23 @@ class EditHabitActivity : AppCompatActivity() {
|
||||
|
||||
val colorPickerDialogFactory = ColorPickerDialogFactory(this)
|
||||
binding.colorButton.setOnClickListener {
|
||||
val dialog = colorPickerDialogFactory.create(color, themeSwitcher.currentTheme)
|
||||
dialog.setListener { paletteColor ->
|
||||
val picker = colorPickerDialogFactory.create(color, themeSwitcher.currentTheme)
|
||||
picker.setListener { paletteColor ->
|
||||
this.color = paletteColor
|
||||
updateColors()
|
||||
}
|
||||
dialog.show(supportFragmentManager, "colorPicker")
|
||||
picker.dismissCurrentAndShow(supportFragmentManager, "colorPicker")
|
||||
}
|
||||
|
||||
populateFrequency()
|
||||
binding.booleanFrequencyPicker.setOnClickListener {
|
||||
val dialog = FrequencyPickerDialog(freqNum, freqDen)
|
||||
dialog.onFrequencyPicked = { num, den ->
|
||||
val picker = FrequencyPickerDialog(freqNum, freqDen)
|
||||
picker.onFrequencyPicked = { num, den ->
|
||||
freqNum = num
|
||||
freqDen = den
|
||||
populateFrequency()
|
||||
}
|
||||
dialog.show(supportFragmentManager, "frequencyPicker")
|
||||
picker.dismissCurrentAndShow(supportFragmentManager, "frequencyPicker")
|
||||
}
|
||||
|
||||
populateTargetType()
|
||||
@@ -189,7 +190,8 @@ class EditHabitActivity : AppCompatActivity() {
|
||||
populateTargetType()
|
||||
dialog.dismiss()
|
||||
}
|
||||
builder.show()
|
||||
val dialog = builder.create()
|
||||
dialog.dismissCurrentAndShow()
|
||||
}
|
||||
|
||||
binding.numericalFrequencyPicker.setOnClickListener {
|
||||
@@ -235,7 +237,7 @@ class EditHabitActivity : AppCompatActivity() {
|
||||
is24HourMode,
|
||||
androidColor
|
||||
)
|
||||
dialog.show(supportFragmentManager, "timePicker")
|
||||
dialog.dismissCurrentAndShow(supportFragmentManager, "timePicker")
|
||||
}
|
||||
|
||||
binding.reminderDatePicker.setOnClickListener {
|
||||
@@ -247,7 +249,7 @@ class EditHabitActivity : AppCompatActivity() {
|
||||
populateReminder()
|
||||
}
|
||||
dialog.setSelectedDays(reminderDays)
|
||||
dialog.show(supportFragmentManager, "dayPicker")
|
||||
dialog.dismissCurrentAndShow(supportFragmentManager, "dayPicker")
|
||||
}
|
||||
|
||||
binding.buttonSave.setOnClickListener {
|
||||
|
||||
@@ -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
|
||||
@@ -29,6 +30,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 +38,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 +65,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)
|
||||
@@ -94,11 +100,17 @@ class ListHabitsActivity : AppCompatActivity(), Preferences.Listener {
|
||||
rootView.postInvalidate()
|
||||
midnightTimer.onResume()
|
||||
taskRunner.run {
|
||||
AutoBackup(this@ListHabitsActivity).run()
|
||||
try {
|
||||
AutoBackup(this@ListHabitsActivity).run()
|
||||
appComponent.widgetUpdater.updateWidgets()
|
||||
} catch (e: Exception) {
|
||||
Log.e("ListHabitActivity", "TaskRunner failed", e)
|
||||
}
|
||||
}
|
||||
if (prefs.theme == THEME_DARK && prefs.isPureBlackEnabled != pureBlack) {
|
||||
restartWithFade(ListHabitsActivity::class.java)
|
||||
}
|
||||
parseIntents()
|
||||
super.onResume()
|
||||
}
|
||||
|
||||
@@ -116,4 +128,26 @@ class ListHabitsActivity : AppCompatActivity(), Preferences.Listener {
|
||||
super.onActivityResult(request, result, data)
|
||||
screen.onResult(request, result, data)
|
||||
}
|
||||
|
||||
private fun parseIntents() {
|
||||
if (intent == null) return
|
||||
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))
|
||||
}
|
||||
}
|
||||
intent = null
|
||||
}
|
||||
|
||||
override fun onNewIntent(intent: Intent?) {
|
||||
super.onNewIntent(intent)
|
||||
setIntent(intent)
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val ACTION_EDIT = "org.isoron.uhabits.ACTION_EDIT"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -64,6 +64,7 @@ import org.isoron.uhabits.tasks.ImportDataTask
|
||||
import org.isoron.uhabits.tasks.ImportDataTaskFactory
|
||||
import org.isoron.uhabits.utils.copyTo
|
||||
import org.isoron.uhabits.utils.currentTheme
|
||||
import org.isoron.uhabits.utils.dismissCurrentAndShow
|
||||
import org.isoron.uhabits.utils.restartWithFade
|
||||
import org.isoron.uhabits.utils.showMessage
|
||||
import org.isoron.uhabits.utils.showSendEmailScreen
|
||||
@@ -163,7 +164,7 @@ class ListHabitsScreen
|
||||
}
|
||||
|
||||
override fun showDeleteConfirmationScreen(callback: OnConfirmedCallback, quantity: Int) {
|
||||
ConfirmDeleteDialog(activity, callback, quantity).show()
|
||||
ConfirmDeleteDialog(activity, callback, quantity).dismissCurrentAndShow()
|
||||
}
|
||||
|
||||
override fun showEditHabitsScreen(selected: List<Habit>) {
|
||||
@@ -224,7 +225,7 @@ class ListHabitsScreen
|
||||
override fun showColorPicker(defaultColor: PaletteColor, callback: OnColorPickedCallback) {
|
||||
val picker = colorPickerFactory.create(defaultColor, themeSwitcher.currentTheme!!)
|
||||
picker.setListener(callback)
|
||||
picker.show(activity.supportFragmentManager, "picker")
|
||||
picker.dismissCurrentAndShow(activity.supportFragmentManager, "picker")
|
||||
}
|
||||
|
||||
override fun showNumberPopup(
|
||||
|
||||
@@ -50,6 +50,7 @@ import org.isoron.uhabits.core.ui.screens.habits.show.ShowHabitPresenter
|
||||
import org.isoron.uhabits.core.ui.views.OnDateClickedListener
|
||||
import org.isoron.uhabits.intents.IntentFactory
|
||||
import org.isoron.uhabits.utils.currentTheme
|
||||
import org.isoron.uhabits.utils.dismissCurrentAndShow
|
||||
import org.isoron.uhabits.utils.showMessage
|
||||
import org.isoron.uhabits.utils.showSendFileScreen
|
||||
import org.isoron.uhabits.widgets.WidgetUpdater
|
||||
@@ -228,7 +229,7 @@ class ShowHabitActivity : AppCompatActivity(), CommandRunner.Listener {
|
||||
}
|
||||
|
||||
override fun showDeleteConfirmationScreen(callback: OnConfirmedCallback) {
|
||||
ConfirmDeleteDialog(this@ShowHabitActivity, callback, 1).show()
|
||||
ConfirmDeleteDialog(this@ShowHabitActivity, callback, 1).dismissCurrentAndShow()
|
||||
}
|
||||
|
||||
override fun close() {
|
||||
|
||||
@@ -33,6 +33,7 @@ class FrequencyCardView(context: Context, attrs: AttributeSet) : LinearLayout(co
|
||||
fun setState(state: FrequencyCardState) {
|
||||
val androidColor = state.theme.color(state.color).toInt()
|
||||
binding.frequencyChart.setFrequency(state.frequency)
|
||||
binding.frequencyChart.setIsNumerical(state.isNumerical)
|
||||
binding.frequencyChart.setFirstWeekday(state.firstWeekday)
|
||||
binding.title.setTextColor(androidColor)
|
||||
binding.frequencyChart.setColor(androidColor)
|
||||
|
||||
@@ -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") {
|
||||
|
||||
@@ -21,11 +21,16 @@ package org.isoron.uhabits.intents
|
||||
|
||||
import android.app.PendingIntent
|
||||
import android.app.PendingIntent.FLAG_IMMUTABLE
|
||||
import android.app.PendingIntent.FLAG_MUTABLE
|
||||
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 android.os.Build
|
||||
import org.isoron.uhabits.activities.habits.list.ListHabitsActivity
|
||||
import org.isoron.uhabits.activities.habits.show.ShowHabitActivity
|
||||
import org.isoron.uhabits.core.AppScope
|
||||
import org.isoron.uhabits.core.models.Habit
|
||||
import org.isoron.uhabits.core.models.Timestamp
|
||||
@@ -87,6 +92,20 @@ class PendingIntentFactory
|
||||
)
|
||||
.getPendingIntent(0, FLAG_IMMUTABLE or FLAG_UPDATE_CURRENT)!!
|
||||
|
||||
fun showHabitTemplate(): PendingIntent {
|
||||
return getActivity(
|
||||
context,
|
||||
0,
|
||||
Intent(context, ShowHabitActivity::class.java),
|
||||
getIntentTemplateFlags()
|
||||
)
|
||||
}
|
||||
|
||||
fun showHabitFillIn(habit: Habit) =
|
||||
Intent().apply {
|
||||
data = Uri.parse(habit.uriString)
|
||||
}
|
||||
|
||||
fun showReminder(
|
||||
habit: Habit,
|
||||
reminderTime: Long?,
|
||||
@@ -127,25 +146,6 @@ class PendingIntentFactory
|
||||
FLAG_IMMUTABLE or FLAG_UPDATE_CURRENT
|
||||
)
|
||||
|
||||
fun setNumericalValue(
|
||||
widgetContext: Context,
|
||||
habit: Habit,
|
||||
numericalValue: Int,
|
||||
timestamp: Long?
|
||||
):
|
||||
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)
|
||||
},
|
||||
FLAG_IMMUTABLE or FLAG_UPDATE_CURRENT
|
||||
)
|
||||
|
||||
fun updateWidgets(): PendingIntent =
|
||||
getBroadcast(
|
||||
context,
|
||||
@@ -155,4 +155,56 @@ class PendingIntentFactory
|
||||
},
|
||||
FLAG_IMMUTABLE or FLAG_UPDATE_CURRENT
|
||||
)
|
||||
|
||||
fun showNumberPicker(habit: Habit, timestamp: Timestamp): PendingIntent? {
|
||||
return getActivity(
|
||||
context,
|
||||
(habit.id!! % Integer.MAX_VALUE).toInt() + 1,
|
||||
Intent(context, ListHabitsActivity::class.java).apply {
|
||||
action = ListHabitsActivity.ACTION_EDIT
|
||||
putExtra("habit", habit.id)
|
||||
putExtra("timestamp", timestamp.unixTime)
|
||||
},
|
||||
FLAG_IMMUTABLE or FLAG_UPDATE_CURRENT
|
||||
)
|
||||
}
|
||||
|
||||
fun showNumberPickerTemplate(): PendingIntent {
|
||||
return getActivity(
|
||||
context,
|
||||
1,
|
||||
Intent(context, ListHabitsActivity::class.java).apply {
|
||||
action = ListHabitsActivity.ACTION_EDIT
|
||||
},
|
||||
getIntentTemplateFlags()
|
||||
)
|
||||
}
|
||||
|
||||
fun showNumberPickerFillIn(habit: Habit, timestamp: Timestamp) = Intent().apply {
|
||||
putExtra("habit", habit.id)
|
||||
putExtra("timestamp", timestamp.unixTime)
|
||||
}
|
||||
|
||||
private fun getIntentTemplateFlags(): Int {
|
||||
var flags = 0
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
||||
flags = flags or FLAG_MUTABLE
|
||||
}
|
||||
return flags
|
||||
}
|
||||
|
||||
fun toggleCheckmarkTemplate(): PendingIntent =
|
||||
getBroadcast(
|
||||
context,
|
||||
2,
|
||||
Intent(context, WidgetReceiver::class.java).apply {
|
||||
action = WidgetReceiver.ACTION_TOGGLE_REPETITION
|
||||
},
|
||||
getIntentTemplateFlags()
|
||||
)
|
||||
|
||||
fun toggleCheckmarkFillIn(habit: Habit, timestamp: Timestamp) = Intent().apply {
|
||||
data = Uri.parse(habit.uriString)
|
||||
putExtra("timestamp", timestamp.unixTime)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
package org.isoron.uhabits.utils
|
||||
|
||||
import android.app.Dialog
|
||||
import androidx.fragment.app.DialogFragment
|
||||
import androidx.fragment.app.FragmentManager
|
||||
import java.lang.ref.WeakReference
|
||||
|
||||
var currentDialog: WeakReference<Dialog> = WeakReference(null)
|
||||
|
||||
fun Dialog.dismissCurrentAndShow() {
|
||||
currentDialog.get()?.dismiss()
|
||||
currentDialog = WeakReference(this)
|
||||
show()
|
||||
}
|
||||
|
||||
fun DialogFragment.dismissCurrentAndShow(fragmentManager: FragmentManager, tag: String) {
|
||||
currentDialog.get()?.dismiss()
|
||||
show(fragmentManager, tag)
|
||||
fragmentManager.executePendingTransactions()
|
||||
currentDialog = WeakReference(this.dialog)
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -49,6 +49,7 @@ class FrequencyWidget(
|
||||
(widgetView.dataView as FrequencyChart).apply {
|
||||
setFirstWeekday(firstWeekday)
|
||||
setColor(WidgetTheme().color(habit.color).toInt())
|
||||
setIsNumerical(habit.isNumerical)
|
||||
setFrequency(habit.originalEntries.computeWeekdayFrequency(habit.isNumerical))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -73,6 +73,10 @@ class StackWidget(
|
||||
StackWidgetType.getStackWidgetAdapterViewId(widgetType),
|
||||
StackWidgetType.getStackWidgetEmptyViewId(widgetType)
|
||||
)
|
||||
remoteViews.setPendingIntentTemplate(
|
||||
StackWidgetType.getStackWidgetAdapterViewId(widgetType),
|
||||
StackWidgetType.getPendingIntentTemplate(pendingIntentFactory, widgetType, habits)
|
||||
)
|
||||
return remoteViews
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,11 +29,14 @@ import android.widget.RemoteViewsService
|
||||
import android.widget.RemoteViewsService.RemoteViewsFactory
|
||||
import org.isoron.platform.utils.StringUtils.Companion.splitLongs
|
||||
import org.isoron.uhabits.HabitsApplication
|
||||
import org.isoron.uhabits.R
|
||||
import org.isoron.uhabits.core.models.Habit
|
||||
import org.isoron.uhabits.core.models.HabitNotFoundException
|
||||
import org.isoron.uhabits.core.preferences.Preferences
|
||||
import org.isoron.uhabits.core.utils.DateUtils.Companion.getToday
|
||||
import org.isoron.uhabits.intents.IntentFactory
|
||||
import org.isoron.uhabits.intents.PendingIntentFactory
|
||||
import org.isoron.uhabits.utils.InterfaceUtils.dpToPixels
|
||||
import java.util.ArrayList
|
||||
|
||||
class StackWidgetService : RemoteViewsService() {
|
||||
override fun onGetViewFactory(intent: Intent): RemoteViewsFactory {
|
||||
@@ -54,7 +57,6 @@ internal class StackRemoteViewsFactory(private val context: Context, intent: Int
|
||||
)
|
||||
private val habitIds: LongArray
|
||||
private val widgetType: StackWidgetType
|
||||
private var remoteViews = ArrayList<RemoteViews>()
|
||||
override fun onCreate() {}
|
||||
override fun onDestroy() {}
|
||||
override fun getCount(): Int {
|
||||
@@ -85,8 +87,26 @@ internal class StackRemoteViewsFactory(private val context: Context, intent: Int
|
||||
}
|
||||
|
||||
override fun getViewAt(position: Int): RemoteViews? {
|
||||
Log.i("StackRemoteViewsFactory", "getViewAt $position")
|
||||
return if (0 <= position && position < remoteViews.size) remoteViews[position] else null
|
||||
Log.i("StackRemoteViewsFactory", "getViewAt $position started")
|
||||
if (position < 0 || position >= habitIds.size) return null
|
||||
val app = context.applicationContext as HabitsApplication
|
||||
val prefs = app.component.preferences
|
||||
val habitList = app.component.habitList
|
||||
val options = AppWidgetManager.getInstance(context).getAppWidgetOptions(widgetId)
|
||||
if (Looper.myLooper() == null) Looper.prepare()
|
||||
val habits = habitIds.map { habitList.getById(it) ?: throw HabitNotFoundException() }
|
||||
val h = habits[position]
|
||||
val widget = constructWidget(h, prefs)
|
||||
widget.setDimensions(getDimensionsFromOptions(context, options))
|
||||
val landscapeViews = widget.landscapeRemoteViews
|
||||
val portraitViews = widget.portraitRemoteViews
|
||||
val factory = PendingIntentFactory(context, IntentFactory())
|
||||
val intent = StackWidgetType.getIntentFillIn(factory, widgetType, h, habits, getToday())
|
||||
landscapeViews.setOnClickFillInIntent(R.id.button, intent)
|
||||
portraitViews.setOnClickFillInIntent(R.id.button, intent)
|
||||
val remoteViews = RemoteViews(landscapeViews, portraitViews)
|
||||
Log.i("StackRemoteViewsFactory", "getViewAt $position ended")
|
||||
return remoteViews
|
||||
}
|
||||
|
||||
private fun constructWidget(
|
||||
@@ -131,24 +151,6 @@ internal class StackRemoteViewsFactory(private val context: Context, intent: Int
|
||||
}
|
||||
|
||||
override fun onDataSetChanged() {
|
||||
Log.i("StackRemoteViewsFactory", "onDataSetChanged started")
|
||||
val app = context.applicationContext as HabitsApplication
|
||||
val prefs = app.component.preferences
|
||||
val habitList = app.component.habitList
|
||||
val options = AppWidgetManager.getInstance(context).getAppWidgetOptions(widgetId)
|
||||
val newRemoteViews = ArrayList<RemoteViews>()
|
||||
if (Looper.myLooper() == null) Looper.prepare()
|
||||
for (id in habitIds) {
|
||||
val h = habitList.getById(id) ?: throw HabitNotFoundException()
|
||||
val widget = constructWidget(h, prefs)
|
||||
widget.setDimensions(getDimensionsFromOptions(context, options))
|
||||
val landscapeViews = widget.landscapeRemoteViews
|
||||
val portraitViews = widget.portraitRemoteViews
|
||||
newRemoteViews.add(RemoteViews(landscapeViews, portraitViews))
|
||||
Log.i("StackRemoteViewsFactory", "onDataSetChanged constructed widget $id")
|
||||
}
|
||||
remoteViews = newRemoteViews
|
||||
Log.i("StackRemoteViewsFactory", "onDataSetChanged ended")
|
||||
}
|
||||
|
||||
init {
|
||||
|
||||
@@ -18,7 +18,12 @@
|
||||
*/
|
||||
package org.isoron.uhabits.widgets
|
||||
|
||||
import android.app.PendingIntent
|
||||
import android.content.Intent
|
||||
import org.isoron.uhabits.R
|
||||
import org.isoron.uhabits.core.models.Habit
|
||||
import org.isoron.uhabits.core.models.Timestamp
|
||||
import org.isoron.uhabits.intents.PendingIntentFactory
|
||||
import java.lang.IllegalStateException
|
||||
|
||||
enum class StackWidgetType(val value: Int) {
|
||||
@@ -73,5 +78,39 @@ enum class StackWidgetType(val value: Int) {
|
||||
else -> throw IllegalStateException()
|
||||
}
|
||||
}
|
||||
|
||||
fun getPendingIntentTemplate(
|
||||
factory: PendingIntentFactory,
|
||||
widgetType: StackWidgetType,
|
||||
habits: List<Habit>
|
||||
): PendingIntent {
|
||||
val containsNumerical = habits.any { it.isNumerical }
|
||||
return when (widgetType) {
|
||||
CHECKMARK -> if (containsNumerical) {
|
||||
factory.showNumberPickerTemplate()
|
||||
} else {
|
||||
factory.toggleCheckmarkTemplate()
|
||||
}
|
||||
FREQUENCY, SCORE, HISTORY, STREAKS, TARGET -> factory.showHabitTemplate()
|
||||
}
|
||||
}
|
||||
|
||||
fun getIntentFillIn(
|
||||
factory: PendingIntentFactory,
|
||||
widgetType: StackWidgetType,
|
||||
habit: Habit,
|
||||
allHabitsInStackWidget: List<Habit>,
|
||||
timestamp: Timestamp
|
||||
): Intent {
|
||||
val containsNumerical = allHabitsInStackWidget.any { it.isNumerical }
|
||||
return when (widgetType) {
|
||||
CHECKMARK -> if (containsNumerical) {
|
||||
factory.showNumberPickerFillIn(habit, timestamp)
|
||||
} else {
|
||||
factory.toggleCheckmarkFillIn(habit, timestamp)
|
||||
}
|
||||
FREQUENCY, SCORE, HISTORY, STREAKS, TARGET -> factory.showHabitFillIn(habit)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,101 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2016-2021 Álinson Santos Xavier <git@axavier.org>
|
||||
*
|
||||
* 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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
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"
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
حلقة تعقب الحبوب تساعدك على إنشاء عادات إيجابية طويلة الأجل والحفاظ عليها في حياتك. تعطيكم الرسوم البيانية والإحصاءات التفصيلية صورة واضحة للكيفية التي تحسنت بها عاداتك مع مرور الوقت. التطبيق خالٍ تمامًا من الإعلانات ومفتوح المصدر ويحترم خصوصيتك.
|
||||
يساعدك Loop Habit Tracker على إنشاء عادات إيجابية طويلة المدى والحفاظ عليها في حياتك. تعطيكم الرسوم البيانية والإحصاءات التفصيلية صورة واضحة للكيفية التي تحسنت بها عاداتك مع مرور الوقت. التطبيق خالٍ تمامًا من الإعلانات ومفتوح المصدر ويحترم خصوصيتك.
|
||||
|
||||
<b>واجهة جميلة وبسيطة</b>
|
||||
يحتوي Loop على واجهة أنيقة وبسيطة وسهلة الاستخدام للغاية ، حتى للمستخدمين لأول مرة. تم تحسين التطبيق ليكون ذي سرعة عالية ، ويعمل التطبيق بشكل جيد حتى على الهواتف القديمة.
|
||||
|
||||
@@ -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í.
|
||||
|
||||
<b>Krásné, minimalistické a přehledné rozhraní</b>
|
||||
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.
|
||||
|
||||
<b>Skóre návyků</b>
|
||||
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.
|
||||
|
||||
<b>Flexibilní plánování</b>
|
||||
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.
|
||||
|
||||
<b>Připomenutí</b>
|
||||
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í.
|
||||
|
||||
<b>Widgety</b>
|
||||
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.
|
||||
|
||||
<b>Převezměte kontrolu nad svými daty</b>
|
||||
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.
|
||||
|
||||
<b>Bez omezení</b>
|
||||
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.
|
||||
|
||||
<b>Zcela bez reklam a open source</b>
|
||||
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).
|
||||
|
||||
<b>Funguje offline a respektuje vaše soukromí</b>
|
||||
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.
|
||||
<b>Funguje off-line a respektuje vaše soukromí</b>
|
||||
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.
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
Loop Habit Tracker
|
||||
عادتسنج لوپ
|
||||
|
||||
@@ -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.
|
||||
|
||||
<b>Entièrement sans publicité et open source</b>
|
||||
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).
|
||||
|
||||
<b>Fonctionne hors ligne et respecte votre vie privée</b>
|
||||
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.
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
„Loop למעקב אחר ההרגלים” מסייע לך ביצירה ובשימור הרגלים טובים וארוכי טווח. תרשימים וסטטיסטיקה מפורטים נותנים לך תמונה ברורה כיצד ההרגלים שלך השתפרו לאורך זמן. היישום נטול פרסומות לחלוטין, קוד המקור שלו פתוח והוא מכבד את הפרטיות שלך.
|
||||
יישום ”Loop לניהול הרגלים“ מסייע לך ביצירה ובשימור הרגלים טובים וארוכי טווח. תרשימים וסטטיסטיקה מפורטים נותנים לך תמונה ברורה כיצד ההרגלים שלך השתפרו לאורך זמן. היישום נטול פרסומות לחלוטין, קוד המקור שלו פתוח והוא מכבד את הפרטיות שלך.
|
||||
|
||||
<b>ממשק יפה, חסכוני וקליל</b>
|
||||
ל־Loop ממשק אלגנטי, חסכוני וקל לשימוש אפילו בפעם הראשונה. היישום מותאם במיוחד למהירות, ועובד היטב גם בטלפונים ישנים.
|
||||
הממשק של Loop אלגנטי, חסכוני וקל לשימוש אפילו בפעם הראשונה. היישום מותאם במיוחד למהירות, ועובד היטב גם בטלפונים ישנים.
|
||||
|
||||
<b>ציון הרגל</b>
|
||||
ל־Loop יש נוסחה מתקדמת לחישוב חוזק ההרגלים שלך. כל חזרה על ההרגל מחזקת אותו, וכל יום שהוחמץ מחליש אותו. כמה ימים שהוחמצו לאחר רצף ארוך, לעומת זאת, לא יהרסו לחלוטין את ההתקדמות, בניגוד ליישומים רבים אחרים מסוג „לא לשבור את השרשרת”.
|
||||
ל־Loop יש נוסחה מתקדמת לחישוב חוזק ההרגלים שלך. כל חזרה על ההרגל מחזקת אותו, וכל יום שהוחמץ מחליש אותו. כמה ימים שהוחמצו לאחר רצף ארוך, לעומת זאת, לא יהרסו לחלוטין את ההתקדמות, בניגוד ליישומים רבים אחרים מסוג ”לא לשבור את השרשרת“.
|
||||
|
||||
<b>לוחות זמנים גמישים</b>
|
||||
בנוסף להרגלים יומיומיים, Loop תומך בהרגלים עם לוחות זמנים מורכבים יותר, כמו 3 פעמים בשבוע או „יום כן יום לא”.
|
||||
בנוסף להרגלים יומיומיים, Loop תומך בהרגלים עם לוחות זמנים מורכבים יותר, כמו 3 פעמים בשבוע או ”יום כן ויום לא“.
|
||||
|
||||
<b>תזכורות</b>
|
||||
אפשר לתזמן התראות קבועות עם תזכורות לגבי ההרגלים שלך. לכל הרגל יכולה להיות תזכורת משלו, בשעה שנבחרה ביום. אפשר לסמן או לדחות את עשיית ההרגל ישירות מההתראה בקלות.
|
||||
|
||||
@@ -1 +1 @@
|
||||
Loop Habit Tracker
|
||||
Loop לניהול הרגלים
|
||||
|
||||
@@ -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ść.
|
||||
|
||||
<b>Piękny, minimalistyczny i lekki interfejs</b>
|
||||
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.
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -1 +1 @@
|
||||
Śledzenie Nawyków Loop
|
||||
Loop Habit Tracker
|
||||
|
||||
@@ -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.
|
||||
|
||||
<b>Assuma o controle de seus dados</b>
|
||||
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.
|
||||
|
||||
<b>Sem limitações</b>
|
||||
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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
<b>Güzel, minimalist ve basit arayüz</b>
|
||||
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.
|
||||
|
||||
@@ -10,13 +10,13 @@ Loop 有高级的公式来计算您习惯的强度。 多多重复会使你的
|
||||
除了每天习惯之外,Loop 还支持更加复杂的时间安排,例如每周三次或每天三次。
|
||||
|
||||
<b>提醒</b>
|
||||
设定通知以提醒您完成习惯。 每一种习惯都有属于自己的通知,您可以选定当天的某个时间提醒该习惯。 同时从通知中轻松地检查或取消您的习惯。
|
||||
设定通知以提醒您完成习惯。 您可以为每个习惯单独设置提醒,选定当天的某个时间提醒该习惯。 同时从通知中轻松地检查或取消您的习惯。
|
||||
|
||||
<b>微件</b>
|
||||
当您解锁手机时, 多彩的小部件可让您直接从主屏幕记录自己的习惯,而无需打开应用程序。
|
||||
|
||||
<b>掌控您的数据</b>
|
||||
如果您想进一步分析数据或将数据备份,则可以使用 Loop 将其导出为电子表格(CSV)或数据库文件(SQLite)。 对于高级用户,可以通过其他应用程序(例如Tasker)使其自动化操作。
|
||||
如果您想进一步分析数据或将数据备份,则可以使用 Loop 将其导出为电子表格(CSV)或数据库文件(SQLite)。 对于高级用户,可以通过其他应用如 Tasker 实现自动化添加标记。
|
||||
|
||||
<b>无限制</b>
|
||||
想记录多少习惯都没问题! Loop 对您的习惯没有任何限制, 所有用户均可使用所有功能, 并且没有应用内购买。
|
||||
|
||||
@@ -1,12 +1,9 @@
|
||||
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.1:
|
||||
* Fix Tasker plugin
|
||||
|
||||
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
|
||||
|
||||
@@ -123,11 +123,11 @@
|
||||
<TextView style="@style/About.Item" android:text="Álinson S. Xavier (@iSoron)"/>
|
||||
<TextView style="@style/About.Item" android:text="Quentin Hibon (@hiqua)"/>
|
||||
<TextView style="@style/About.Item" android:text="Oleg Ivashchenko (@olegivo)"/>
|
||||
<TextView style="@style/About.Item" android:text="Rechee Jozil (@recheej)"/>
|
||||
<TextView style="@style/About.Item" android:text="Jakub Kalinowski (@kalina559)"/>
|
||||
<TextView style="@style/About.Item" android:text="Luboš Luňák (@llunak)"/>
|
||||
<TextView style="@style/About.Item" android:text="Sebastian Gallese (@sgallese)"/>
|
||||
<TextView style="@style/About.Item" android:text="Kristian Tashkov (@KristianTashkov)"/>
|
||||
<TextView style="@style/About.Item" android:text="Jakub Kalinowski (@kalina559)"/>
|
||||
<TextView style="@style/About.Item" android:text="Rechee Jozil (@recheej)"/>
|
||||
<TextView style="@style/About.Item" android:text="Sebastian Gallese (@sgallese)"/>
|
||||
<TextView style="@style/About.Item" android:text="Luboš Luňák (@llunak)"/>
|
||||
<TextView style="@style/About.Item" android:text="Bindu (@vbh)"/>
|
||||
<TextView style="@style/About.Item" android:text="Victor Yu (@vyu1)"/>
|
||||
<TextView style="@style/About.Item" android:text="Christoph Hennemann (@chennemann)"/>
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
<TextView style="@style/About.Item" android:text="raden20" />
|
||||
<TextView style="@style/About.Item.Language" android:text="Català" />
|
||||
<TextView style="@style/About.Item" android:text="David Nos" />
|
||||
<TextView style="@style/About.Item" android:text="carllacan" />
|
||||
<TextView style="@style/About.Item.Language" android:text="Cрпски" />
|
||||
<TextView style="@style/About.Item" android:text="Rancher" />
|
||||
<TextView style="@style/About.Item.Language" android:text="Dansk" />
|
||||
@@ -57,6 +58,7 @@
|
||||
<TextView style="@style/About.Item" android:text="Eman" />
|
||||
<TextView style="@style/About.Item" android:text="Saeed Esmaili" />
|
||||
<TextView style="@style/About.Item.Language" android:text="Hindi" />
|
||||
<TextView style="@style/About.Item" android:text="Ravi Rami" />
|
||||
<TextView style="@style/About.Item" android:text="Vijaykumar Borkar" />
|
||||
<TextView style="@style/About.Item.Language" android:text="Hrvatski" />
|
||||
<TextView style="@style/About.Item" android:text="Ivan Krušlin" />
|
||||
@@ -114,18 +116,19 @@
|
||||
<TextView style="@style/About.Item" android:text="bruhwut" />
|
||||
<TextView style="@style/About.Item" android:text="pnhpnh" />
|
||||
<TextView style="@style/About.Item.Language" android:text="Türkçe" />
|
||||
<TextView style="@style/About.Item" android:text="Alparslan Şakçi" />
|
||||
<TextView style="@style/About.Item" android:text="Caner Başaran" />
|
||||
<TextView style="@style/About.Item" android:text="Evren" />
|
||||
<TextView style="@style/About.Item" android:text="Ishmaeel" />
|
||||
<TextView style="@style/About.Item" android:text="hodanli" />
|
||||
<TextView style="@style/About.Item.Language" android:text="Čeština" />
|
||||
<TextView style="@style/About.Item" android:text="Tomáš Borovec" />
|
||||
<TextView style="@style/About.Item" android:text="andaryon" />
|
||||
<TextView style="@style/About.Item" android:text="boban77" />
|
||||
<TextView style="@style/About.Item.Language" android:text="Ελληνικά" />
|
||||
<TextView style="@style/About.Item" android:text="Andreas Michelakis" />
|
||||
<TextView style="@style/About.Item" android:text="DionysosDV" />
|
||||
<TextView style="@style/About.Item.Language" android:text="Български" />
|
||||
<TextView style="@style/About.Item" android:text="MStefanov" />
|
||||
<TextView style="@style/About.Item" android:text="Mihail Stefanov" />
|
||||
<TextView style="@style/About.Item.Language" android:text="Русский" />
|
||||
<TextView style="@style/About.Item" android:text="Andrew Firnes" />
|
||||
@@ -134,11 +137,11 @@
|
||||
<TextView style="@style/About.Item" android:text="Tanya" />
|
||||
<TextView style="@style/About.Item" android:text="engineeringforgood" />
|
||||
<TextView style="@style/About.Item.Language" android:text="Українська" />
|
||||
<TextView style="@style/About.Item" android:text="Andrij Mizyk" />
|
||||
<TextView style="@style/About.Item" android:text="Oglaigh Rystard" />
|
||||
<TextView style="@style/About.Item" android:text="Prosta4ok_ua" />
|
||||
<TextView style="@style/About.Item" android:text="Rystard" />
|
||||
<TextView style="@style/About.Item" android:text="Yurii Stavytskyi" />
|
||||
<TextView style="@style/About.Item" android:text="axmed99" />
|
||||
<TextView style="@style/About.Item" android:text="taras-ko" />
|
||||
<TextView style="@style/About.Item.Language" android:text="српски" />
|
||||
<TextView style="@style/About.Item" android:text="OP Smosher" />
|
||||
@@ -179,9 +182,9 @@
|
||||
<TextView style="@style/About.Item" android:text="Lee" />
|
||||
<TextView style="@style/About.Item" android:text="Limin Lu" />
|
||||
<TextView style="@style/About.Item" android:text="Liveeasy" />
|
||||
<TextView style="@style/About.Item" android:text="QWERT" />
|
||||
<TextView style="@style/About.Item" android:text="Ting-Hua" />
|
||||
<TextView style="@style/About.Item" android:text="XuToTo" />
|
||||
<TextView style="@style/About.Item" android:text="hypnotichemionus" />
|
||||
<TextView style="@style/About.Item" android:text="yoding" />
|
||||
<TextView style="@style/About.Item" android:text="黄克" />
|
||||
<TextView style="@style/About.Item.Language" android:text="日本語" />
|
||||
|
||||
@@ -21,4 +21,5 @@
|
||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<background android:drawable="@color/ic_launcher_background"/>
|
||||
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
||||
<monochrome android:drawable="@mipmap/ic_launcher_monochrome"/>
|
||||
</adaptive-icon>
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 1.8 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.8 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 2.4 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 3.7 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 7.4 KiB |
@@ -123,7 +123,7 @@
|
||||
<string name="none">صامت </string>
|
||||
<string name="filter">تصنيف </string>
|
||||
<string name="hide_completed">إخفاء المكتملة </string>
|
||||
<string name="hide_entered">إخفاء المُدخل</string>
|
||||
<string name="hide_entered" comment=""Hide entered" appears in place of "hide completed" if the user has enabled the question marks option. This option hides all habits that have any data entered, not just the ones that have been completed. This allows the user to hide habits that have already failed early in the day.">إخفاء المُدخل</string>
|
||||
<string name="hide_archived">إخفاء المؤرشفة </string>
|
||||
<string name="sticky_notifications">جعل الإشعارات ثابتة </string>
|
||||
<string name="sticky_notifications_description">منع الإشعارات من تمريرها بعيداً. </string>
|
||||
|
||||
@@ -28,7 +28,23 @@
|
||||
<string name="add_habit">Добавяне на навик</string>
|
||||
<string name="color_picker_default_title">Промяна на цвят</string>
|
||||
<string name="toast_habit_created">Навикът е създаден</string>
|
||||
<string name="overview">Обзор</string>
|
||||
<plurals name="toast_habits_changed">
|
||||
<item quantity="one">Навикът е променен</item>
|
||||
<item quantity="other">Навиците са променени</item>
|
||||
</plurals>
|
||||
<plurals name="toast_habits_deleted">
|
||||
<item quantity="one">Навикът е изтрит</item>
|
||||
<item quantity="other">Навиците са изтрити</item>
|
||||
</plurals>
|
||||
<plurals name="toast_habits_archived">
|
||||
<item quantity="one">Навикът е архивиран</item>
|
||||
<item quantity="other">Навиците са архивирани</item>
|
||||
</plurals>
|
||||
<plurals name="toast_habits_unarchived">
|
||||
<item quantity="one">Навикът е разархивиран</item>
|
||||
<item quantity="other">Навиците са разархивирани</item>
|
||||
</plurals>
|
||||
<string name="overview">Обобщение</string>
|
||||
<string name="habit_strength">Сила на навика</string>
|
||||
<string name="history">История</string>
|
||||
<string name="clear">Изчистване</string>
|
||||
@@ -36,6 +52,7 @@
|
||||
<string name="save">Запазване</string>
|
||||
<string name="streaks">Поредици</string>
|
||||
<string name="no_habits_found">Нямате активни навици</string>
|
||||
<string name="no_habits_left_to_do">Всичко сте изпълнили за днес!</string>
|
||||
<string name="long_press_to_toggle">Натиснете и задръжте за да добавите или премахнете отметка</string>
|
||||
<string name="reminder_off">Изключено</string>
|
||||
<string name="create_habit">Създаване на навик</string>
|
||||
@@ -55,16 +72,28 @@
|
||||
<string name="interval_4_hour">4 часа</string>
|
||||
<string name="interval_8_hour">8 часа</string>
|
||||
<string name="interval_24_hour">24 часа</string>
|
||||
<string name="interval_always_ask">Винаги да се пита</string>
|
||||
<string name="interval_custom">Персонализирано...</string>
|
||||
<string name="pref_toggle_title">Маркиране с кратко натискане</string>
|
||||
<string name="pref_toggle_description_2">Поставяне на отметки с кратко натискане вместо с натискане и задържане</string>
|
||||
<string name="pref_rate_this_app">Оценяване на това приложение в Google Play</string>
|
||||
<string name="pref_send_feedback">Изпращане на отзиви към разработчика</string>
|
||||
<string name="pref_view_source_code">Преглед на програмния код в GitHub</string>
|
||||
<string name="links">Препратки</string>
|
||||
<string name="name">Име</string>
|
||||
<string name="settings">Настройки</string>
|
||||
<string name="select_snooze_delay">Избор на време за отлагане</string>
|
||||
<string name="hint_title">Знаете ли че?</string>
|
||||
<string name="hint_drag">За да пренаредите записите, натиснете и задръжте върху името на навика и го придърпайте до правилното място.</string>
|
||||
<string name="hint_landscape">Може да виждате повече дни като обърнете телефона си в хоризонтално положение.</string>
|
||||
<plurals name="delete_habits_title">
|
||||
<item quantity="one">Изтриване на навик?</item>
|
||||
<item quantity="other">Изтриване на навици?</item>
|
||||
</plurals>
|
||||
<plurals name="delete_habits_message">
|
||||
<item quantity="one">Навикът ще бъде перманентно изтрит. Това действие не може да бъде отменено.</item>
|
||||
<item quantity="other">Навиците ще бъдат перманентно изтрити. Това действие не може да бъде отменено.</item>
|
||||
</plurals>
|
||||
<string name="habit_not_found">Навикът е изтрит / не е намерен</string>
|
||||
<string name="weekends">Събота и неделя</string>
|
||||
<string name="any_weekday">От понеделник до петък</string>
|
||||
@@ -98,9 +127,9 @@
|
||||
<string name="generate_bug_report">Генериране на доклад за грешки</string>
|
||||
<string name="troubleshooting">Отстраняване на проблеми</string>
|
||||
<string name="help_translate">Помагане за превода на това приложение</string>
|
||||
<string name="night_mode">Нощен режим</string>
|
||||
<string name="use_pure_black">Използване на чисто черно при нощен режим</string>
|
||||
<string name="pure_black_description">Заменя сивите фонове с чисто черни при нощен режим. Намаля разхода на батерията при телефони с AMOLED дисплеи.</string>
|
||||
<string name="night_mode">Тъмна тема</string>
|
||||
<string name="use_pure_black">Използване на чисто черно при тъмна тема</string>
|
||||
<string name="pure_black_description">Заменя сивите фонове с чисто черни при тъмна тема. Намаля разхода на батерията при телефони с AMOLED дисплеи.</string>
|
||||
<string name="interface_preferences">Интерфейс</string>
|
||||
<string name="reverse_days">Обратен ред на дните</string>
|
||||
<string name="reverse_days_description">Показва дните на основния екран в обратен ред</string>
|
||||
@@ -110,6 +139,7 @@
|
||||
<string name="quarter">Тримесечие</string>
|
||||
<string name="year">Година</string>
|
||||
<string name="total">Общо</string>
|
||||
<string name="yes_or_no">Да или не</string>
|
||||
<string name="every_x_days">На всеки %d дни</string>
|
||||
<string name="every_x_weeks">На всеки %d седмици</string>
|
||||
<string name="score">Сила</string>
|
||||
@@ -117,9 +147,12 @@
|
||||
<string name="none">Няма</string>
|
||||
<string name="filter">Филтър</string>
|
||||
<string name="hide_completed">Скриване на завършените</string>
|
||||
<string name="hide_entered" comment=""Hide entered" appears in place of "hide completed" if the user has enabled the question marks option. This option hides all habits that have any data entered, not just the ones that have been completed. This allows the user to hide habits that have already failed early in the day.">Скриване на въведените</string>
|
||||
<string name="hide_archived">Скриване на архивираните</string>
|
||||
<string name="sticky_notifications">Направи нотификациите постоянни</string>
|
||||
<string name="sticky_notifications_description">Предотвратява изчистването на нотификацията с плъзване настрани.</string>
|
||||
<string name="sticky_notifications">Направи известията постоянни</string>
|
||||
<string name="sticky_notifications_description">Предотвратява изчистването на известията с плъзване настрани.</string>
|
||||
<string name="led_notifications">Светлина за известяване</string>
|
||||
<string name="led_notifications_description">Показва мигаща светлина за напомняния. Налична само за телефони с LED светлини за известяване.</string>
|
||||
<string name="repair_database">Поправка на базата данни</string>
|
||||
<string name="database_repaired">Базата данни е поправена.</string>
|
||||
<string name="uncheck">Премахване на отметка</string>
|
||||
@@ -131,6 +164,58 @@
|
||||
<string name="by_name">По име</string>
|
||||
<string name="by_color">По цвят</string>
|
||||
<string name="by_score">По сила</string>
|
||||
<string name="by_status">По състояние</string>
|
||||
<string name="export">Експортиране</string>
|
||||
<string name="long_press_to_edit">Натиснете и задръжте за да промените стойността</string>
|
||||
<string name="value">Стойност</string>
|
||||
<string name="calendar">Календар</string>
|
||||
<string name="unit">Мерна единица</string>
|
||||
<string name="target_type">Тип на целта</string>
|
||||
<string name="target_type_at_least">Най-малко</string>
|
||||
<string name="target_type_at_most">Най-много</string>
|
||||
<string name="example_question_boolean">напр. Тренирахте ли днес?</string>
|
||||
<string name="question">Въпрос</string>
|
||||
<string name="target">Цел</string>
|
||||
<string name="yes">Да</string>
|
||||
<string name="no">Не</string>
|
||||
<string name="customize_notification_summary">Промяна на звук, вибрация, светлина и други настройки на известията</string>
|
||||
<string name="customize_notification">Персонализиране на известията</string>
|
||||
<string name="pref_view_privacy">Преглед на политиката за поверителност</string>
|
||||
<string name="view_all_contributors">Преглед на всички сътрудници...</string>
|
||||
<string name="database">База данни</string>
|
||||
<string name="widget_opacity_title">Прозрачност на приспособлението</string>
|
||||
<string name="widget_opacity_description">Прави приспособленията по-прозрачни или по-непрозрачни на началния ви екран</string>
|
||||
<string name="first_day_of_the_week">Първи ден от седмицата</string>
|
||||
<string name="default_reminder_question">Изпълнихте ли навика днес?</string>
|
||||
<string name="notes">Бележки</string>
|
||||
<string name="example_notes">(Незадължително)</string>
|
||||
<string name="yes_or_no_example">напр. Събудихте ли се рано днес? Тренирахте ли? Играхте ли шах?</string>
|
||||
<string name="measurable">Измерим</string>
|
||||
<string name="measurable_example">напр. Колко километра пробягахте днес? Колко страници прочетохте?</string>
|
||||
<string name="x_times_per_week">%d пъти седмично</string>
|
||||
<string name="x_times_per_month">%d пъти месечно</string>
|
||||
<string name="x_times_per_y_days">%d пъти в период от %d дни</string>
|
||||
<string name="yes_or_no_short_example">напр. Тренировка</string>
|
||||
<string name="color">Цвят</string>
|
||||
<string name="example_target">напр. 15</string>
|
||||
<string name="measurable_short_example">напр. Бягане</string>
|
||||
<string name="measurable_question_example">напр. Колко километра пробягахте днес?</string>
|
||||
<string name="measurable_units_example">напр. км</string>
|
||||
<string name="every_month">Всеки месец</string>
|
||||
<string name="validation_cannot_be_blank">Не може да бъде празно</string>
|
||||
<string name="today">Днес</string>
|
||||
<string name="enter">Въвеждане</string>
|
||||
<string name="no_habits">Не са намерени навици</string>
|
||||
<string name="no_numerical_habits">Не са намерени измерими навици</string>
|
||||
<string name="no_boolean_habits">Не са намерени навици от тип \"да или не\"</string>
|
||||
<string name="increment">Увеличаване</string>
|
||||
<string name="decrement">Намаляване</string>
|
||||
<string name="pref_skip_title">Включване на пропуснати дни</string>
|
||||
<string name="pref_skip_description">Маркирайте два пъти за да добавите пропускане вместо отметка. Пропусканията поддържат силата на навика ви непроменена и не прекъсват поредицата ви.</string>
|
||||
<string name="pref_unknown_title">Показване на питанки при липсващи данни</string>
|
||||
<string name="pref_unknown_description">Разграничаване на дните без данни от реални пропуски. За да добавите пропуск, маркирайте два пъти.</string>
|
||||
<string name="you_are_now_a_developer">Вие вече сте разработчик</string>
|
||||
<string name="activity_not_found">Не е намерено приложение, което да поддържа това действие</string>
|
||||
<string name="pref_midnight_delay_title">Удължаване на деня с няколко часа след полунощ</string>
|
||||
<string name="pref_midnight_delay_description">Изчакване до 3:00 часа сутринта за показване на нов ден. Полезно, ако обичайно си лягате да спите след полунощ. Изисква рестартиране на приложението.</string>
|
||||
</resources>
|
||||
|
||||
@@ -59,6 +59,7 @@
|
||||
<string name="interval_always_ask">Vždy se ptát</string>
|
||||
<string name="interval_custom">Vlastní...</string>
|
||||
<string name="pref_toggle_title">Označte opakování krátkým stisknutím</string>
|
||||
<string name="pref_toggle_description_2">Zaškrtněte jediným klepnutím místo dlouhého podržení.</string>
|
||||
<string name="pref_rate_this_app">Ohodnoťte nás v Google Play</string>
|
||||
<string name="pref_send_feedback">Zpětná vazba vývojáři</string>
|
||||
<string name="pref_view_source_code">Zobrazit zdroj. kód na GitHub</string>
|
||||
|
||||
@@ -75,6 +75,7 @@
|
||||
<string name="interval_always_ask">Immer fragen</string>
|
||||
<string name="interval_custom">Benutzerdefiniert...</string>
|
||||
<string name="pref_toggle_title">Markierung durch kurzes Tippen ändern</string>
|
||||
<string name="pref_toggle_description_2">Häkchen durch einfaches Antippen setzen, anstatt durch Drücken und Halten.</string>
|
||||
<string name="pref_rate_this_app">Bewerte diese App auf Google Play</string>
|
||||
<string name="pref_send_feedback">Sende dem Entwickler Feedback</string>
|
||||
<string name="pref_view_source_code">Zeige den Quellcode auf GitHub</string>
|
||||
@@ -98,7 +99,7 @@
|
||||
<string name="any_weekday">Montag bis Freitag</string>
|
||||
<string name="any_day">Jeden Tag</string>
|
||||
<string name="select_weekdays">Tage auswählen</string>
|
||||
<string name="export_to_csv">Exportiere als CSV</string>
|
||||
<string name="export_to_csv">Als CSV exportieren</string>
|
||||
<string name="done_label">Fertig</string>
|
||||
<string name="clear_label">Löschen</string>
|
||||
<string name="select_hours">Stunden auswählen</string>
|
||||
@@ -118,7 +119,7 @@
|
||||
<string name="file_not_recognized">Datei nicht erkannt.</string>
|
||||
<string name="habits_imported">Gewohnheiten erfolgreich importiert.</string>
|
||||
<string name="import_data">Daten importieren</string>
|
||||
<string name="export_full_backup">Exportiere vollständige Sicherung</string>
|
||||
<string name="export_full_backup">Vollständige Sicherung exportieren</string>
|
||||
<string name="import_data_summary">Unterstützt vollständige Sicherungen dieser App, als auch von Tickmate, HabitBull und Rewire. Siehe FAQ für weitere Informationen.</string>
|
||||
<string name="export_as_csv_summary">Erstellt Dateien, die von Tabellenkalkulationsprogrammen wie Microsoft Excel oder LibreOffice Calc geöffnet werden können. Diese Dateien können nicht wieder importiert werden.</string>
|
||||
<string name="export_full_backup_summary">Erstellt eine Datei, die alle deine Daten enthält. Diese Datei kann wieder importiert werden.</string>
|
||||
@@ -146,6 +147,7 @@
|
||||
<string name="none">Keiner</string>
|
||||
<string name="filter">Filter</string>
|
||||
<string name="hide_completed">Erledigte verbergen</string>
|
||||
<string name="hide_entered" comment=""Hide entered" appears in place of "hide completed" if the user has enabled the question marks option. This option hides all habits that have any data entered, not just the ones that have been completed. This allows the user to hide habits that have already failed early in the day.">Eingegebenes ausblenden</string>
|
||||
<string name="hide_archived">Archivierte verbergen</string>
|
||||
<string name="sticky_notifications">Fixiere Benachrichtigungen</string>
|
||||
<string name="sticky_notifications_description">Verhindert das Wegwischen von Benachrichtigungen.</string>
|
||||
@@ -165,8 +167,12 @@
|
||||
<string name="by_status">Nach Zustand</string>
|
||||
<string name="export">Exportieren</string>
|
||||
<string name="long_press_to_edit">Gedrückt halten, um den Wert zu ändern</string>
|
||||
<string name="value">Wert</string>
|
||||
<string name="calendar">Kalender</string>
|
||||
<string name="unit">Einheit</string>
|
||||
<string name="target_type">Zieltyp</string>
|
||||
<string name="target_type_at_least">Mindestens</string>
|
||||
<string name="target_type_at_most">Höchtens</string>
|
||||
<string name="example_question_boolean">z.B. Hast du heute trainiert?</string>
|
||||
<string name="question">Frage</string>
|
||||
<string name="target">Ziel</string>
|
||||
@@ -202,7 +208,7 @@
|
||||
<string name="no_habits">Keine Gewohnheiten gefunden</string>
|
||||
<string name="no_numerical_habits">Keine messbaren Gewohnheiten gefunden</string>
|
||||
<string name="no_boolean_habits">Keine Ja-oder-Nein-Gewohnheiten gefunden</string>
|
||||
<string name="increment">Vergrößern</string>
|
||||
<string name="increment">Erhöhen</string>
|
||||
<string name="decrement">Verringern</string>
|
||||
<string name="pref_skip_title">Tage überspringen aktivieren</string>
|
||||
<string name="pref_skip_description">Zwei mal markieren, um eine Lücke einzutragen statt abzuhaken. Lücken lassen deine Wertung unverändert und beenden deine Serie nicht.</string>
|
||||
|
||||
@@ -84,7 +84,7 @@
|
||||
<string name="settings">Configuración</string>
|
||||
<string name="select_snooze_delay">Seleccione el retardo de la interrupción</string>
|
||||
<string name="hint_title">¿Sabías qué?</string>
|
||||
<string name="hint_drag">Para reordenar las entradas, mantén la pulsado sobre el nombre del hábito, después arrástralo a su posición correcta.</string>
|
||||
<string name="hint_drag">Para reordenar las entradas, mantén pulsado el nombre del hábito, después arrástralo a su posición correcta.</string>
|
||||
<string name="hint_landscape">Puedes ver más días al poner tu teléfono en modo horizontal.</string>
|
||||
<plurals name="delete_habits_title">
|
||||
<item quantity="one">¿Eliminar hábito?</item>
|
||||
@@ -130,7 +130,7 @@
|
||||
<string name="night_mode">Modo nocturno</string>
|
||||
<string name="use_pure_black">Utilizar color negro en modo nocturno</string>
|
||||
<string name="pure_black_description">Reemplaza fondos grises por color negro en modo nocturno. Reduce el consumo de batería en teléfonos con pantalla AMOLED.</string>
|
||||
<string name="interface_preferences">Interfície</string>
|
||||
<string name="interface_preferences">Interfaz</string>
|
||||
<string name="reverse_days">Orden inverso de días</string>
|
||||
<string name="reverse_days_description">Mostrar días en orden inverso en la pantalla principal</string>
|
||||
<string name="day">Día</string>
|
||||
@@ -147,7 +147,7 @@
|
||||
<string name="none">Ninguno</string>
|
||||
<string name="filter">Filtrar</string>
|
||||
<string name="hide_completed">Ocultar completos</string>
|
||||
<string name="hide_entered">Ocultar ingresado</string>
|
||||
<string name="hide_entered" comment=""Hide entered" appears in place of "hide completed" if the user has enabled the question marks option. This option hides all habits that have any data entered, not just the ones that have been completed. This allows the user to hide habits that have already failed early in the day.">Ocultar ingresado</string>
|
||||
<string name="hide_archived">Ocultar archivados</string>
|
||||
<string name="sticky_notifications">Hacer notificaciones fijas</string>
|
||||
<string name="sticky_notifications_description">Evita que las notificaciones sean descartadas.</string>
|
||||
@@ -199,8 +199,8 @@
|
||||
<string name="color">Color</string>
|
||||
<string name="example_target">ej. 15</string>
|
||||
<string name="measurable_short_example">por ejemplo, correr</string>
|
||||
<string name="measurable_question_example">ej. ¿Cuántos quilómetros has corrido hoy?</string>
|
||||
<string name="measurable_units_example">ej. millas</string>
|
||||
<string name="measurable_question_example">ej. ¿Cuántos kilómetros has corrido hoy?</string>
|
||||
<string name="measurable_units_example">ej. kilómetros</string>
|
||||
<string name="every_month">Cada mes</string>
|
||||
<string name="validation_cannot_be_blank">No puede estar en blanco</string>
|
||||
<string name="today">Hoy</string>
|
||||
|
||||
@@ -28,6 +28,18 @@
|
||||
<string name="add_habit">Gehitu ohitura</string>
|
||||
<string name="color_picker_default_title">Kolorea aldatu</string>
|
||||
<string name="toast_habit_created">Ohitura sortu da</string>
|
||||
<plurals name="toast_habits_changed">
|
||||
<item quantity="one">Ohitura aldatu da</item>
|
||||
<item quantity="other">Ohiturak aldatu dira</item>
|
||||
</plurals>
|
||||
<plurals name="toast_habits_deleted">
|
||||
<item quantity="one">Ohitura ezabatu da</item>
|
||||
<item quantity="other">Ohiturak ezabatu dira</item>
|
||||
</plurals>
|
||||
<plurals name="toast_habits_archived">
|
||||
<item quantity="one">Ohitura artxibatu da</item>
|
||||
<item quantity="other">Ohiturak artxibatu dira</item>
|
||||
</plurals>
|
||||
<string name="overview">Ikuspegi orokorra</string>
|
||||
<string name="habit_strength">Ohituraren indarra</string>
|
||||
<string name="history">Historia</string>
|
||||
@@ -148,6 +160,7 @@
|
||||
<string name="value">Balioa</string>
|
||||
<string name="calendar">Egutegia</string>
|
||||
<string name="unit">Unitatea</string>
|
||||
<string name="target_type_at_least">Gutxienez</string>
|
||||
<string name="target_type_at_most">Gehienez</string>
|
||||
<string name="example_question_boolean">adib. ariketa egin al duzu gaur?</string>
|
||||
<string name="question">Galdera</string>
|
||||
@@ -179,8 +192,12 @@
|
||||
<string name="every_month">Hilabetero</string>
|
||||
<string name="validation_cannot_be_blank">Ezin da hutsik egon</string>
|
||||
<string name="today">Gaur</string>
|
||||
<string name="enter">Sartu</string>
|
||||
<string name="no_habits">Ez da ohiturarik aurkitu</string>
|
||||
<string name="no_numerical_habits">Ez da aurkitu ohitura neurgarririk</string>
|
||||
<string name="no_boolean_habits">Ez da bai-ala-ez ohiturarik aurkitu</string>
|
||||
<string name="pref_unknown_title">Adierazi galdera ikurra falta diren datuetan</string>
|
||||
<string name="you_are_now_a_developer">Garatzailea zara!</string>
|
||||
<string name="activity_not_found">Ez da aurkitu akzio hau gauzatu dezakeen aplikaziorik</string>
|
||||
<string name="pref_midnight_delay_description">Itxaron goizeko 3:00ak arte egun berri bat erakusteko. Erabilgarria normalean gauerdia pasata lotara joaten bazara. Aplikazioa berrabiarazi behar da.</string>
|
||||
</resources>
|
||||
|
||||
@@ -71,7 +71,7 @@
|
||||
<string name="interval_always_ask">Selalu bertanya</string>
|
||||
<string name="interval_custom">Kustom...</string>
|
||||
<string name="pref_toggle_title">Tandai dengan cepat</string>
|
||||
<string name="pref_toggle_description_2">Beri tanda centang dengan satu ketukan alih-alih tekan dan tahan.</string>
|
||||
<string name="pref_toggle_description_2">Beri tanda centang dengan satu ketukan alih-alih tekan-dan-tahan.</string>
|
||||
<string name="pref_rate_this_app">Berikan rating aplikasi ini di Google Play</string>
|
||||
<string name="pref_send_feedback">Kirimkan umpan balik kepada Developer</string>
|
||||
<string name="pref_view_source_code">Lihat kode program di GitHub</string>
|
||||
@@ -150,6 +150,7 @@
|
||||
<string name="none">Tidak ada</string>
|
||||
<string name="filter">Filter</string>
|
||||
<string name="hide_completed">Sembunyikan yang selesai</string>
|
||||
<string name="hide_entered" comment=""Hide entered" appears in place of "hide completed" if the user has enabled the question marks option. This option hides all habits that have any data entered, not just the ones that have been completed. This allows the user to hide habits that have already failed early in the day.">Sembunyikan yang dimasukkan</string>
|
||||
<string name="hide_archived">Sembunyikan yang diarsipkan</string>
|
||||
<string name="sticky_notifications">Jadikan notifikasi melekat</string>
|
||||
<string name="sticky_notifications_description">Mencegah notifikasi untuk terhapus.</string>
|
||||
@@ -169,8 +170,12 @@
|
||||
<string name="by_status">Berdasarkan status</string>
|
||||
<string name="export">Ekspor</string>
|
||||
<string name="long_press_to_edit">Tekan-dan-tahan untuk mengubah nilai</string>
|
||||
<string name="value">Nilai</string>
|
||||
<string name="calendar">Kalender</string>
|
||||
<string name="unit">Unit</string>
|
||||
<string name="target_type">Jenis Target</string>
|
||||
<string name="target_type_at_least">Paling sedikit</string>
|
||||
<string name="target_type_at_most">Paling banyak</string>
|
||||
<string name="example_question_boolean">mis. Apakah kamu sudah berolahraga hari ini?</string>
|
||||
<string name="question">Pertanyaan</string>
|
||||
<string name="target">Target</string>
|
||||
|
||||
@@ -147,7 +147,7 @@
|
||||
<string name="none">Nessuno</string>
|
||||
<string name="filter">Filtra</string>
|
||||
<string name="hide_completed">Nascondi completati</string>
|
||||
<string name="hide_entered">Nascondi inserito</string>
|
||||
<string name="hide_entered" comment=""Hide entered" appears in place of "hide completed" if the user has enabled the question marks option. This option hides all habits that have any data entered, not just the ones that have been completed. This allows the user to hide habits that have already failed early in the day.">Nascondi inserito</string>
|
||||
<string name="hide_archived">Nascondi archiviati</string>
|
||||
<string name="sticky_notifications">Notifiche non rimuovibili</string>
|
||||
<string name="sticky_notifications_description">Impedisce di poter rimuovere le notifiche.</string>
|
||||
@@ -213,6 +213,7 @@
|
||||
<string name="pref_skip_title">Abilita salta giorni</string>
|
||||
<string name="pref_skip_description">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.</string>
|
||||
<string name="pref_unknown_title">Mostra punti interrogativi per i dati mancanti</string>
|
||||
<string name="pref_unknown_description">Differenzia i giorni senza dati dagli intervalli effettivi. Per inserire un intervallo, attiva due volte.</string>
|
||||
<string name="you_are_now_a_developer">Ora sei uno sviluppatore</string>
|
||||
<string name="activity_not_found">Nessuna app disponibile per gestire questa azione</string>
|
||||
<string name="pref_midnight_delay_title">Prolunga il giorno di alcune ore dopo la mezzanotte</string>
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
~ with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
-->
|
||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||
<string name="app_name">Loop למעקב אחר ההרגלים</string>
|
||||
<string name="app_name">Loop לניהול הרגלים</string>
|
||||
<string name="main_activity_title">הרגלים</string>
|
||||
<string name="action_settings">הגדרות</string>
|
||||
<string name="edit">עריכה</string>
|
||||
@@ -68,13 +68,13 @@
|
||||
<string name="check">סימון</string>
|
||||
<string name="snooze">מאוחר יותר</string>
|
||||
<string name="intro_title_1">ברוך בואך</string>
|
||||
<string name="intro_description_1">„Loop למעקב אחר ההרגלים” מסייע לך ביצירה ובשימור הרגלים טובים.</string>
|
||||
<string name="intro_description_1">יישום ”Loop לניהול הרגלים“ מסייע לך להתחיל ולשמר הרגלים טובים.</string>
|
||||
<string name="intro_title_2">יצירת הרגלים חדשים</string>
|
||||
<string name="intro_description_2">בכל יום, לאחר ביצוע ההרגל, יש לסמן זאת ביישום.</string>
|
||||
<string name="intro_title_4">מעקב אחר ההתקדמות</string>
|
||||
<string name="intro_description_4">גרפים מפורטים מציגים כיצד ההרגלים שלך השתפרו לאורך זמן.</string>
|
||||
<string name="interval_15_minutes">15 דקות</string>
|
||||
<string name="interval_30_minutes">30 דקות</string>
|
||||
<string name="intro_description_4">גרפים מפורטים מציגים כיצד שיפרת את ההרגלים לאורך זמן.</string>
|
||||
<string name="interval_15_minutes">רבע שעה</string>
|
||||
<string name="interval_30_minutes">חצי שעה</string>
|
||||
<string name="interval_1_hour">שעה</string>
|
||||
<string name="interval_2_hour">שעתיים</string>
|
||||
<string name="interval_4_hour">4 שעות</string>
|
||||
@@ -83,8 +83,9 @@
|
||||
<string name="interval_always_ask">תמיד לשאול</string>
|
||||
<string name="interval_custom">התאמה אישית...</string>
|
||||
<string name="pref_toggle_title">סימון הרגלים בלחיצה קצרה</string>
|
||||
<string name="pref_toggle_description_2">סימון הרגלים בעזרת הקשה יחידה במקום בעזרת הקשה והחזקה.</string>
|
||||
<string name="pref_rate_this_app">דירוג היישום ב־Google Play</string>
|
||||
<string name="pref_send_feedback">שליחת משוב למפתחים</string>
|
||||
<string name="pref_send_feedback">שליחת משוב למפתח</string>
|
||||
<string name="pref_view_source_code">צפייה בקוד המקור ב־GitHub</string>
|
||||
<string name="links">קישורים</string>
|
||||
<string name="name">שם</string>
|
||||
@@ -106,7 +107,7 @@
|
||||
<item quantity="other">ההרגלים יימחקו לצמיתות. לא ניתן לבטל פעולה זו.</item>
|
||||
</plurals>
|
||||
<string name="habit_not_found">ההרגל נמחק / לא נמצא</string>
|
||||
<string name="weekends">סופי שבוע</string>
|
||||
<string name="weekends">שבת וראשון</string>
|
||||
<string name="any_weekday">שני עד שישי</string>
|
||||
<string name="any_day">כל ימות השבוע</string>
|
||||
<string name="select_weekdays">בחירת ימים</string>
|
||||
@@ -131,9 +132,9 @@
|
||||
<string name="habits_imported">ההרגלים יובאו בהצלחה.</string>
|
||||
<string name="import_data">ייבוא נתונים</string>
|
||||
<string name="export_full_backup">ייצוא גיבוי מלא</string>
|
||||
<string name="import_data_summary">תומך בכל הגיבויים שיוצאו על ידי היישום, כמו־גם קבצים שנוצרו על ידי Tickmate, HabitBull או Rewire. למידע נוסף נא לעיין בשאלות הנפוצות.</string>
|
||||
<string name="export_as_csv_summary">ליצירת קבצים שניתן לפתוח באמצעות תוכנת גיליון אלקטרוני כגון Microsoft Exel או OpenOffice Calc. לא ניתן לייבא את נתוני הקובץ בחזרה.</string>
|
||||
<string name="export_full_backup_summary">ליצירת קובץ שמכיל את כל הנתונים שלך. לא ניתן לייבא את נתוני הקובץ בחזרה.</string>
|
||||
<string name="import_data_summary">תומך בכל הגיבויים שיוצאו מהיישום הזה, כמו־גם בקבצים שנוצרו על ידי Tickmate, HabitBull או Rewire. למידע נוסף נא לעיין בשאלות הנפוצות.</string>
|
||||
<string name="export_as_csv_summary">ליצירת קבצים שנפתחים בתוכנת גיליון אלקטרוני כגון Microsoft Exel או OpenOffice Calc. לא ניתן לייבא את הקובץ בחזרה.</string>
|
||||
<string name="export_full_backup_summary">ליצירת קובץ שמכיל את כל הנתונים שלך. לא ניתן לייבא את הקובץ בחזרה.</string>
|
||||
<string name="bug_report_failed">יצירת דו״ח התקלה נכשלה.</string>
|
||||
<string name="generate_bug_report">יצירת דו״ח תקלה</string>
|
||||
<string name="troubleshooting">פתרון תקלות</string>
|
||||
@@ -143,7 +144,7 @@
|
||||
<string name="pure_black_description">להחלפת הרקע האפור בערכת הנושא הכהה לשחור מוחלט. זה מפחית את צריכת הסוללה במכשירים עם תצוגת AMOLED.</string>
|
||||
<string name="interface_preferences">ממשק</string>
|
||||
<string name="reverse_days">סדר ימים הפוך</string>
|
||||
<string name="reverse_days_description">הצגת ימים בסדר הפוך במסך הראשי.</string>
|
||||
<string name="reverse_days_description">הצגת הימים בסדר הפוך במסך הראשי.</string>
|
||||
<string name="day">יום</string>
|
||||
<string name="week">שבוע</string>
|
||||
<string name="month">חודש</string>
|
||||
@@ -158,6 +159,7 @@
|
||||
<string name="none">ללא</string>
|
||||
<string name="filter">סינון</string>
|
||||
<string name="hide_completed">הסתרת יעדים שהושגו</string>
|
||||
<string name="hide_entered" comment=""Hide entered" appears in place of "hide completed" if the user has enabled the question marks option. This option hides all habits that have any data entered, not just the ones that have been completed. This allows the user to hide habits that have already failed early in the day.">הסתרת ההרגלים שהושלמו</string>
|
||||
<string name="hide_archived">הסתרת הארכיון</string>
|
||||
<string name="sticky_notifications">יצירת תזכורות נעוצות</string>
|
||||
<string name="sticky_notifications_description">למניעת התעלמות מתזכורות.</string>
|
||||
@@ -177,14 +179,18 @@
|
||||
<string name="by_status">לפי מצב</string>
|
||||
<string name="export">ייצוא</string>
|
||||
<string name="long_press_to_edit">לחיצה והחזקה ישנו את הערך</string>
|
||||
<string name="value">ערך</string>
|
||||
<string name="calendar">לוח שנה</string>
|
||||
<string name="unit">יחידה</string>
|
||||
<string name="example_question_boolean">למשל: האם התעמלת היום?</string>
|
||||
<string name="target_type">סוג יעד</string>
|
||||
<string name="target_type_at_least">לכל הפחות</string>
|
||||
<string name="target_type_at_most">לכל היותר</string>
|
||||
<string name="example_question_boolean">למשל: עשית כושר היום?</string>
|
||||
<string name="question">שאלה</string>
|
||||
<string name="target">יעד</string>
|
||||
<string name="yes">כן</string>
|
||||
<string name="no">לא</string>
|
||||
<string name="customize_notification_summary">שינוי הצליל, הרטט, התאורה ושאר הגדרות הקשורות להתראות</string>
|
||||
<string name="customize_notification_summary">שינוי הצליל, הרטט, התאורה והגדרות התראה אחרות</string>
|
||||
<string name="customize_notification">התאמת ההתראות</string>
|
||||
<string name="pref_view_privacy">הצגת מדיניות הפרטיות</string>
|
||||
<string name="view_all_contributors">הצגת כל המתנדבים…</string>
|
||||
@@ -192,15 +198,15 @@
|
||||
<string name="widget_opacity_title">אטימות היישומונים</string>
|
||||
<string name="widget_opacity_description">להפיכת היישומונים שקופים או אטומים יותר במסך הבית שלך.</string>
|
||||
<string name="first_day_of_the_week">היום הראשון בשבוע</string>
|
||||
<string name="default_reminder_question">האם השלמת את ההרגל הזה היום?</string>
|
||||
<string name="default_reminder_question">השלמת את ההרגל הזה היום?</string>
|
||||
<string name="notes">הערות</string>
|
||||
<string name="example_notes">(רשות)</string>
|
||||
<string name="yes_or_no_example">למשל: האם התעוררת מוקדם היום? האם התעמלת? האם שיחקת שחמט?</string>
|
||||
<string name="yes_or_no_example">למשל: התעוררת מוקדם היום? עשית כושר? שיחקת שחמט?</string>
|
||||
<string name="measurable">הרגלים נמדדים</string>
|
||||
<string name="measurable_example">למשל: כמה קילומטרים רצת היום? כמה עמודים קראת?</string>
|
||||
<string name="x_times_per_week">%d פעמים בשבוע</string>
|
||||
<string name="x_times_per_month">%d פעמים בחודש</string>
|
||||
<string name="x_times_per_y_days">%d פעמים ב- %d ימים</string>
|
||||
<string name="x_times_per_y_days">%d פעמים ב־%d ימים</string>
|
||||
<string name="yes_or_no_short_example">למשל: התעמלות</string>
|
||||
<string name="color">צבע</string>
|
||||
<string name="example_target">למשל: 15</string>
|
||||
@@ -208,12 +214,12 @@
|
||||
<string name="measurable_question_example">למשל: כמה קילומטרים רצת היום?</string>
|
||||
<string name="measurable_units_example">למשל: קילומטרים</string>
|
||||
<string name="every_month">כל חודש</string>
|
||||
<string name="validation_cannot_be_blank">חובה לתת שם</string>
|
||||
<string name="validation_cannot_be_blank">זהו שדה חובה</string>
|
||||
<string name="today">היום</string>
|
||||
<string name="enter">מילוי</string>
|
||||
<string name="no_habits">לא נמצאו הרגלים</string>
|
||||
<string name="no_numerical_habits">לא נמצאו הרגלים נמדדים</string>
|
||||
<string name="no_boolean_habits">לא נמצאו הרגלי „כן או לא”</string>
|
||||
<string name="no_boolean_habits">לא נמצאו הרגלי ”כן או לא“</string>
|
||||
<string name="increment">עלייה</string>
|
||||
<string name="decrement">ירידה</string>
|
||||
<string name="pref_skip_title">לאפשר דילוג על ימים</string>
|
||||
@@ -223,5 +229,5 @@
|
||||
<string name="you_are_now_a_developer">מצב הפיתוח הופעל כעת</string>
|
||||
<string name="activity_not_found">לא נמצא יישום שתומך בפעולה זו</string>
|
||||
<string name="pref_midnight_delay_title">הארכת היום בכמה שעות לאחר החצות</string>
|
||||
<string name="pref_midnight_delay_description">לחכות עד 3:00 כדי להציג יום חדש. שימושי אם לרוב הולכים לישון לאחר החצות. דורש הפעלה מחדש של היישום.</string>
|
||||
<string name="pref_midnight_delay_description">המתנה עד 3:00 לפני הצגת יום חדש. שימושי אם לרוב הולכים לישון אחרי חצות. דורש הפעלה מחדש של היישום.</string>
|
||||
</resources>
|
||||
|
||||
@@ -71,6 +71,7 @@
|
||||
<string name="interval_always_ask">毎回選択する</string>
|
||||
<string name="interval_custom">カスタム...</string>
|
||||
<string name="pref_toggle_title">タップでチェックをON/OFF</string>
|
||||
<string name="pref_toggle_description_2">長押しの代わりにワンタップでチェックマークをつけます。</string>
|
||||
<string name="pref_rate_this_app">Google Play でこのアプリを評価</string>
|
||||
<string name="pref_send_feedback">開発者にフィードバックを送信</string>
|
||||
<string name="pref_view_source_code">GitHub でソースコードを参照</string>
|
||||
@@ -140,6 +141,7 @@
|
||||
<string name="none">なし</string>
|
||||
<string name="filter">フィルター</string>
|
||||
<string name="hide_completed">達成した習慣を非表示</string>
|
||||
<string name="hide_entered" comment=""Hide entered" appears in place of "hide completed" if the user has enabled the question marks option. This option hides all habits that have any data entered, not just the ones that have been completed. This allows the user to hide habits that have already failed early in the day.">入力されたものを非表示にする</string>
|
||||
<string name="hide_archived">アーカイブした習慣を非表示</string>
|
||||
<string name="sticky_notifications">通知を固定</string>
|
||||
<string name="sticky_notifications_description">通知をスワイプして消せないようにする</string>
|
||||
@@ -159,8 +161,10 @@
|
||||
<string name="by_status">ステータス順</string>
|
||||
<string name="export">エクスポート</string>
|
||||
<string name="long_press_to_edit">長押しすると値を変更できます</string>
|
||||
<string name="value">値</string>
|
||||
<string name="calendar">カレンダー</string>
|
||||
<string name="unit">単位</string>
|
||||
<string name="target_type_at_least">少なくとも</string>
|
||||
<string name="example_question_boolean">例:今日は運動しましたか?</string>
|
||||
<string name="question">質問</string>
|
||||
<string name="target">目標</string>
|
||||
|
||||
@@ -71,6 +71,7 @@
|
||||
<string name="interval_always_ask">Altijd vragen</string>
|
||||
<string name="interval_custom">Aangepast...</string>
|
||||
<string name="pref_toggle_title">Wijzig herhalingen door kort indrukken</string>
|
||||
<string name="pref_toggle_description_2">Zet vinkjes met een enkele keer drukken in plaats van ingedrukt te houden.</string>
|
||||
<string name="pref_rate_this_app">Beoordeel deze app in Google Play</string>
|
||||
<string name="pref_send_feedback">Stuur feedback aan de ontwikkelaar</string>
|
||||
<string name="pref_view_source_code">Bekijk de broncode op GitHub</string>
|
||||
@@ -134,6 +135,7 @@
|
||||
<string name="none">Stil</string>
|
||||
<string name="filter">Filteren</string>
|
||||
<string name="hide_completed">Verberg voltooide</string>
|
||||
<string name="hide_entered" comment=""Hide entered" appears in place of "hide completed" if the user has enabled the question marks option. This option hides all habits that have any data entered, not just the ones that have been completed. This allows the user to hide habits that have already failed early in the day.">Verberg ingevoerde</string>
|
||||
<string name="hide_archived">Verberg gearchiveerde</string>
|
||||
<string name="sticky_notifications">Maak meldingen persistent</string>
|
||||
<string name="sticky_notifications_description">Voorkom dat meldingen weggehaald kunnen worden.</string>
|
||||
@@ -156,6 +158,7 @@
|
||||
<string name="value">Waarde</string>
|
||||
<string name="calendar">Kalender</string>
|
||||
<string name="unit">Eenheid</string>
|
||||
<string name="target_type">Doeltype</string>
|
||||
<string name="target_type_at_least">Minimaal</string>
|
||||
<string name="target_type_at_most">Maximaal</string>
|
||||
<string name="example_question_boolean">bijv. Heb je vandaag gesport?</string>
|
||||
|
||||
@@ -48,8 +48,8 @@
|
||||
</plurals>
|
||||
<plurals name="toast_habits_unarchived">
|
||||
<item quantity="one">Nawyk przywrócony z archiwum</item>
|
||||
<item quantity="few">Nawyki przywrócone z archiwum</item>
|
||||
<item quantity="many">Nawyk przywrócony z archiwum</item>
|
||||
<item quantity="few">Nawyki zostały przywrócone z archiwum</item>
|
||||
<item quantity="many">Nawyki zostały przywrócone z archiwum</item>
|
||||
<item quantity="other">Nawyki zostały przywrócone z archiwum</item>
|
||||
</plurals>
|
||||
<string name="overview">Przegląd</string>
|
||||
@@ -104,7 +104,7 @@
|
||||
<item quantity="one">Nawyk zostanie trwale usunięty. Tej czynności nie można cofnąć.</item>
|
||||
<item quantity="few">Nawyki zostaną trwale usunięte. Tej czynności nie można cofnąć.</item>
|
||||
<item quantity="many">Nawyki zostaną trwale usunięte. Tej czynności nie można cofnąć.</item>
|
||||
<item quantity="other">Nawyki zostaną trwale usunięte. Tej operacji nie można cofnąć.</item>
|
||||
<item quantity="other">Nawyki zostaną trwale usunięte. Tej czynności nie można cofnąć.</item>
|
||||
</plurals>
|
||||
<string name="habit_not_found">Nawyk usunięty/nie znaleziony</string>
|
||||
<string name="weekends">Weekendy</string>
|
||||
@@ -159,7 +159,7 @@
|
||||
<string name="none">Brak</string>
|
||||
<string name="filter">Filtruj</string>
|
||||
<string name="hide_completed">Ukryj zakończone</string>
|
||||
<string name="hide_entered">Ukryj wprowadzone</string>
|
||||
<string name="hide_entered" comment=""Hide entered" appears in place of "hide completed" if the user has enabled the question marks option. This option hides all habits that have any data entered, not just the ones that have been completed. This allows the user to hide habits that have already failed early in the day.">Ukryj wprowadzone</string>
|
||||
<string name="hide_archived">Ukryj archiwizowane</string>
|
||||
<string name="sticky_notifications">Przypinaj powiadomienia</string>
|
||||
<string name="sticky_notifications_description">Zapobiega usunięciu powiadomień.</string>
|
||||
@@ -196,7 +196,7 @@
|
||||
<string name="view_all_contributors">Zobacz wszystkich współtwórców</string>
|
||||
<string name="database">Baza danych</string>
|
||||
<string name="widget_opacity_title">Przezroczystość widżetu</string>
|
||||
<string name="widget_opacity_description">Sprawia, że widżety są bardziej przezroczyste lub bardziej nieprzezroczyste na ekranie głównym.</string>
|
||||
<string name="widget_opacity_description">Sprawia, że widżety są bardziej lub mniej przezroczyste na ekranie głównym.</string>
|
||||
<string name="first_day_of_the_week">Pierwszy dzień tygodnia</string>
|
||||
<string name="default_reminder_question">Czy wytrwałeś dziś w nawyku?</string>
|
||||
<string name="notes">Notatki</string>
|
||||
|
||||
@@ -75,6 +75,7 @@
|
||||
<string name="interval_always_ask">Perguntar sempre</string>
|
||||
<string name="interval_custom">Personalizar...</string>
|
||||
<string name="pref_toggle_title">Marcar repetições com um toque curto</string>
|
||||
<string name="pref_toggle_description_2">Adicione marcações com um simples toque, ao invés de pressionar e segurar.</string>
|
||||
<string name="pref_rate_this_app">Avaliar esse app no Google Play</string>
|
||||
<string name="pref_send_feedback">Mandar sugestões para o desenvolvedor</string>
|
||||
<string name="pref_view_source_code">Ver código-fonte no GitHub</string>
|
||||
@@ -146,6 +147,7 @@
|
||||
<string name="none">Nenhum</string>
|
||||
<string name="filter">Filtro</string>
|
||||
<string name="hide_completed">Ocultar concluído</string>
|
||||
<string name="hide_entered" comment=""Hide entered" appears in place of "hide completed" if the user has enabled the question marks option. This option hides all habits that have any data entered, not just the ones that have been completed. This allows the user to hide habits that have already failed early in the day.">Ocultar marcado</string>
|
||||
<string name="hide_archived">Ocultar arquivado</string>
|
||||
<string name="sticky_notifications">Tornar notificações persistentes</string>
|
||||
<string name="sticky_notifications_description">Impede que as notificações sejam removidas.</string>
|
||||
@@ -165,8 +167,12 @@
|
||||
<string name="by_status">Por status</string>
|
||||
<string name="export">Exportar</string>
|
||||
<string name="long_press_to_edit">Pressione e segure para alterar o valor</string>
|
||||
<string name="value">Valor</string>
|
||||
<string name="calendar">Calendário</string>
|
||||
<string name="unit">Unidade</string>
|
||||
<string name="target_type">Tipo de meta</string>
|
||||
<string name="target_type_at_least">Pelo menos</string>
|
||||
<string name="target_type_at_most">No máximo</string>
|
||||
<string name="example_question_boolean">ex.: Você se exercitou hoje?</string>
|
||||
<string name="question">Questão</string>
|
||||
<string name="target">Alvo</string>
|
||||
|
||||
@@ -151,5 +151,20 @@
|
||||
<string name="pref_view_privacy">Consultați politica de confidențialitate</string>
|
||||
<string name="view_all_contributors">Vizualizați toți colaboratorii…</string>
|
||||
<string name="database">Bază de date</string>
|
||||
<string name="notes">Notițe</string>
|
||||
<string name="example_notes">(Opţional)</string>
|
||||
<string name="yes_or_no_example">ex. Te-ai trezit mai devreme astăzi? Ai făcut exerciții? Ai jucat șah?</string>
|
||||
<string name="measurable">Măsurabil</string>
|
||||
<string name="x_times_per_y_days">%d ori în %d zile</string>
|
||||
<string name="color">Culoare</string>
|
||||
<string name="measurable_units_example">de exemplu mile</string>
|
||||
<string name="every_month">În fiecare lună</string>
|
||||
<string name="validation_cannot_be_blank">nu poate fi gol</string>
|
||||
<string name="today">Astăzi</string>
|
||||
<string name="enter">Introducere</string>
|
||||
<string name="no_habits">Nici un obicei găsit</string>
|
||||
<string name="pref_skip_title">Activați omiterea de zile</string>
|
||||
<string name="pref_unknown_title">Arată semnele de întrebare pentru datele lipsă</string>
|
||||
<string name="you_are_now_a_developer">Acum ești un dezvoltator</string>
|
||||
<string name="pref_midnight_delay_title">Extinde ziua câteva ore după miezul nopții</string>
|
||||
</resources>
|
||||
|
||||
@@ -75,6 +75,7 @@
|
||||
<string name="interval_always_ask">Her zaman sor</string>
|
||||
<string name="interval_custom">Özel...</string>
|
||||
<string name="pref_toggle_title">Tek dokunuşla işaretle</string>
|
||||
<string name="pref_toggle_description_2">Basılı tutma yerine tek bir dokunuşla onay işaretleri koy.</string>
|
||||
<string name="pref_rate_this_app">Google Play\'de uygulamayı oyla</string>
|
||||
<string name="pref_send_feedback">Geliştiriciye geri bildirim gönder</string>
|
||||
<string name="pref_view_source_code">Github\'da kaynak kodunu görüntüle</string>
|
||||
@@ -146,6 +147,7 @@
|
||||
<string name="none">Sessiz</string>
|
||||
<string name="filter">Filtre</string>
|
||||
<string name="hide_completed">Tamamlananları gizle</string>
|
||||
<string name="hide_entered" comment=""Hide entered" appears in place of "hide completed" if the user has enabled the question marks option. This option hides all habits that have any data entered, not just the ones that have been completed. This allows the user to hide habits that have already failed early in the day.">Girileni gizle</string>
|
||||
<string name="hide_archived">Arşivlenenleri gizle</string>
|
||||
<string name="sticky_notifications">Bildirimleri kalıcı yap</string>
|
||||
<string name="sticky_notifications_description">Bildirimlerin kaydırılmasını engeller.</string>
|
||||
@@ -165,8 +167,12 @@
|
||||
<string name="by_status">Duruma göre</string>
|
||||
<string name="export">Dışarı aktar</string>
|
||||
<string name="long_press_to_edit">Değeri değiştirmek için basılı tut</string>
|
||||
<string name="value">Değer</string>
|
||||
<string name="calendar">Takvim</string>
|
||||
<string name="unit">Birim</string>
|
||||
<string name="target_type">Hedef Türü</string>
|
||||
<string name="target_type_at_least">En az</string>
|
||||
<string name="target_type_at_most">En fazla</string>
|
||||
<string name="example_question_boolean">örn: Bugün egzersiz yaptın mı?</string>
|
||||
<string name="question">Soru</string>
|
||||
<string name="target">Hedef</string>
|
||||
|
||||
@@ -43,11 +43,11 @@ kotlin {
|
||||
val jvmMain by getting {
|
||||
dependencies {
|
||||
implementation(kotlin("stdlib-jdk8"))
|
||||
compileOnly("com.google.dagger:dagger:2.43.1")
|
||||
compileOnly("com.google.dagger:dagger:2.41")
|
||||
implementation("com.google.guava:guava:31.1-android")
|
||||
implementation("org.jetbrains.kotlin:kotlin-stdlib:1.7.10")
|
||||
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.3")
|
||||
implementation("androidx.annotation:annotation:1.4.0")
|
||||
implementation("org.jetbrains.kotlin:kotlin-stdlib:1.6.21")
|
||||
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.1")
|
||||
implementation("androidx.annotation:annotation:1.3.0")
|
||||
implementation("com.google.code.findbugs:jsr305:3.0.2")
|
||||
implementation("com.opencsv:opencsv:5.6")
|
||||
implementation("commons-codec:commons-codec:1.15")
|
||||
|
||||
@@ -25,6 +25,12 @@ class StringUtils {
|
||||
|
||||
fun joinLongs(values: LongArray): String = values.joinToString(separator = ",")
|
||||
|
||||
fun splitLongs(str: String): LongArray = str.split(",").map { it.toLong() }.toLongArray()
|
||||
fun splitLongs(str: String): LongArray {
|
||||
return try {
|
||||
str.split(",").map { it.toLong() }.toLongArray()
|
||||
} catch (e: NumberFormatException) {
|
||||
LongArray(0)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,6 +30,7 @@ data class FrequencyCardState(
|
||||
val firstWeekday: Int,
|
||||
val frequency: HashMap<Timestamp, Array<Int>>,
|
||||
val theme: Theme,
|
||||
val isNumerical: Boolean
|
||||
)
|
||||
|
||||
class FrequencyCardPresenter {
|
||||
@@ -40,6 +41,7 @@ class FrequencyCardPresenter {
|
||||
theme: Theme
|
||||
) = FrequencyCardState(
|
||||
color = habit.color,
|
||||
isNumerical = habit.isNumerical,
|
||||
frequency = habit.originalEntries.computeWeekdayFrequency(
|
||||
isNumerical = habit.isNumerical
|
||||
),
|
||||
|
||||
@@ -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<Double>()
|
||||
if (habit.frequency.denominator <= 1) values.add(valueToday / 1e3)
|
||||
|
||||
@@ -92,7 +92,7 @@ class BarChart(
|
||||
val r = round(barWidth * 0.15)
|
||||
if (2 * r < barHeight) {
|
||||
canvas.fillRect(x, y + r, barWidth, barHeight - r)
|
||||
canvas.fillRect(x + r, y, barWidth - 2 * r, r)
|
||||
canvas.fillRect(x + r, y, barWidth - 2 * r, r + 1)
|
||||
canvas.fillCircle(x + r, y + r, r)
|
||||
canvas.fillCircle(x + barWidth - r, y + r, r)
|
||||
} else {
|
||||
|
||||
@@ -34,7 +34,7 @@ application {
|
||||
|
||||
dependencies {
|
||||
val ktorVersion = "1.6.8"
|
||||
val kotlinVersion = "1.7.0"
|
||||
val kotlinVersion = "1.6.21"
|
||||
val logbackVersion = "1.2.11"
|
||||
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlinVersion")
|
||||
implementation("io.ktor:ktor-server-netty:$ktorVersion")
|
||||
@@ -43,9 +43,9 @@ dependencies {
|
||||
implementation("io.ktor:ktor-html-builder:$ktorVersion")
|
||||
implementation("io.ktor:ktor-jackson:$ktorVersion")
|
||||
implementation("org.jetbrains:kotlin-css-jvm:1.0.0-pre.148-kotlin-1.4.30")
|
||||
implementation("io.prometheus:simpleclient:0.16.0")
|
||||
implementation("io.prometheus:simpleclient_httpserver:0.16.0")
|
||||
implementation("io.prometheus:simpleclient_hotspot:0.16.0")
|
||||
implementation("io.prometheus:simpleclient:0.15.0")
|
||||
implementation("io.prometheus:simpleclient_httpserver:0.15.0")
|
||||
implementation("io.prometheus:simpleclient_hotspot:0.15.0")
|
||||
testImplementation("io.ktor:ktor-server-tests:$ktorVersion")
|
||||
testImplementation("com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0")
|
||||
testImplementation(kotlin("test"))
|
||||
|
||||
Reference in New Issue
Block a user