Compare commits

...

29 Commits

Author SHA1 Message Date
98abebe099 Merge branch 'hotfix/v1.8.12' 2021-01-30 20:47:36 -06:00
0f86cb4d53 Update list of developers 2021-01-30 20:39:19 -06:00
Kristian Tashkov
4dd77463fb Update widgets at midnight (#634) 2021-01-30 20:36:37 -06:00
Quentin Hibon
2cf3347f8c Set dataOffset when attaching a new CardView
Fixes #713.
2021-01-30 20:15:26 -06:00
5516f40571 Bump version to 1.8.12; update CHANGELOG and release notes 2021-01-30 19:53:57 -06:00
56f91526e6 Update CHANGELOG 2020-12-29 18:51:12 -06:00
dbc6a16a98 Set forceDarkAllowed to false 2020-12-29 18:43:09 -06:00
011abf62a0 Bump version to 1.8.11 2020-12-09 20:01:35 -06:00
Sunxy88
9c96857262 Use dark theme in settings window. (#655) 2020-12-09 19:57:03 -06:00
1bb6ad41b2 Merge branch 'hotfix/1.8.10' 2020-11-26 08:22:50 -06:00
56c180183e Update release notes 2020-11-26 08:22:37 -06:00
af8d983cca Add dummy settings.gradle file to help F-Droid locate app metadata 2020-11-26 08:20:10 -06:00
cff8e26428 Update translations 2020-11-25 22:33:41 -06:00
e892bccb32 Bump version to 1.8.10 2020-11-25 18:23:27 -06:00
83c1ab35d5 GH Actions: Update publish.yml 2020-11-18 06:57:22 -06:00
7a6563736a Merge branch 'hotfix/1.8.9' 2020-11-18 06:47:44 -06:00
55c50c1119 Update CHANGELOG 2020-11-18 06:47:29 -06:00
ba08968600 Fix tests 2020-11-18 06:45:47 -06:00
79459c373e Manage exceptions for when activities don't exist to handle intents
Fixes #181
2020-08-23 08:57:00 -05:00
590298bf5b MemoryHabitList: Inherit parent's order
Fixes #598
2020-08-23 07:43:20 -05:00
09bf49a9ce Remove notification groups; revert to default system behavior 2020-08-15 14:45:40 -05:00
38fb37cde2 Remove SyncManager and Internet permission 2020-08-15 13:54:29 -05:00
d0b4e3e163 Bump version to 1.8.9 2020-08-15 13:35:48 -05:00
0cce6b30b1 Merge branch 'hotfix/1.8.8' 2020-06-21 11:39:25 -05:00
bf650a7565 Fix crash when saving habit (some languages only) 2020-06-21 11:31:53 -05:00
b78cd1dd0d Update tests 2020-06-21 11:00:00 -05:00
6d9ad8c56c Tweak snapIntervalsTogether so that "1 time every x days" habits work better 2020-06-21 10:59:31 -05:00
e7a3f0cffa Fix build script; remove some obsolete tests 2020-06-21 10:45:46 -05:00
6aa72caf6c Bump version to 1.8.8 2020-06-21 10:39:27 -05:00
129 changed files with 1945 additions and 1860 deletions

View File

@@ -8,6 +8,8 @@ on:
jobs:
build:
runs-on: macOS-latest
env:
ACTIONS_ALLOW_UNSECURE_COMMANDS: true
steps:
- uses: actions/checkout@v1
- name: Install GPG

1
.gitignore vendored
View File

@@ -5,6 +5,7 @@
*.swp
*~.nib
.DS_Store
._.DS_Store
.externalNativeBuild
.gradle
.idea

View File

@@ -1,5 +1,31 @@
# Changelog
### 1.8.12 (TBD)
* Fix bug that caused incorrect check marks to show after scrolling (#713)
* Fix issue preventing widgets from updating at midnight (#680)
### 1.8.11 (Dev 29, 2020)
* Fix theme issues on Xiaomi phones
### 1.8.10 (Nov 26, 2020)
* Update translations
### 1.8.9 (Nov 18, 2020)
* Remove INTERNET permission
* Manage exceptions for when activities don't exist to handle intents (#181)
* MemoryHabitList: Inherit parent's order (#598)
* Remove notification groups; revert to default system behavior
* Remove SyncManager and Internet permission
### 1.8.8 (June 21, 2020)
* Make small changes to the habit scheduling algorithm, so that "1 time every x days" habits work more predictably.
* Fix crash when saving habit
### 1.8.0 (Jan 1, 2020)
* New bar chart showing number of repetitions performed in each week, month, quarter or year.

1
android/.gitignore vendored
View File

@@ -23,6 +23,7 @@ docs/
gen/
local.properties
crowdin.yaml
crowdin.yml
local
tmp/
secret/

View File

@@ -126,4 +126,18 @@ abstract public class BaseActivity extends AppCompatActivity
super.onResume();
if(screen != null) screen.reattachDialogs();
}
@Override
public void startActivity(Intent intent)
{
try
{
super.startActivity(intent);
}
catch (ActivityNotFoundException e)
{
if (this.screen != null)
this.screen.showMessage(R.string.activity_not_found);
}
}
}

View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2016-2020 Álinson Santos Xavier <isoron@gmail.com>
~
~ 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/>.
-->
<resources>
<string name="activity_not_found">No app was found to support this action</string>
</resources>

View File

@@ -25,294 +25,255 @@ OUTPUTS_DIR=uhabits-android/build/outputs
VERSION=$(cat gradle.properties | grep VERSION_NAME | sed -e 's/.*=//g;s/ //g')
if [ ! -f "${ANDROID_HOME}/platform-tools/adb" ]; then
echo "Error: ANDROID_HOME is not set correctly"
exit 1
echo "Error: ANDROID_HOME is not set correctly"
exit 1
fi
log_error() {
if [ ! -z "$TEAMCITY_VERSION" ]; then
echo "###teamcity[progressMessage '$1']"
else
local COLOR='\033[1;31m'
local NC='\033[0m'
echo -e "$COLOR>>> $1 $NC"
fi
if [ ! -z "$TEAMCITY_VERSION" ]; then
echo "###teamcity[progressMessage '$1']"
else
local COLOR='\033[1;31m'
local NC='\033[0m'
echo -e "$COLOR>>> $1 $NC"
fi
}
log_info() {
if [ ! -z "$TEAMCITY_VERSION" ]; then
echo "###teamcity[progressMessage '$1']"
else
local COLOR='\033[1;32m'
local NC='\033[0m'
echo -e "$COLOR>>> $1 $NC"
fi
if [ ! -z "$TEAMCITY_VERSION" ]; then
echo "###teamcity[progressMessage '$1']"
else
local COLOR='\033[1;32m'
local NC='\033[0m'
echo -e "$COLOR>>> $1 $NC"
fi
}
fail() {
if [ ! -z ${AVD_NAME} ]; then
stop_emulator
stop_gradle_daemon
fi
log_error "BUILD FAILED"
exit 1
log_error "BUILD FAILED"
exit 1
}
if [ ! -z $RELEASE ]; then
log_info "Reading secret env variables from ../.secret/env"
source ../.secret/env || fail
log_info "Reading secret env variables from ../.secret/env"
source ../.secret/env || fail
fi
start_emulator() {
log_info "Starting emulator ($AVD_NAME)"
$EMULATOR -avd ${AVD_NAME} -port ${AVD_SERIAL} -no-audio -no-window &
$ADB wait-for-device shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done; input keyevent 82'
}
stop_emulator() {
log_info "Stopping emulator"
$ADB emu kill
}
stop_gradle_daemon() {
log_info "Stopping gradle daemon"
$GRADLE --stop
}
run_adb_as_root() {
log_info "Running adb as root"
$ADB root
log_info "Running adb as root"
$ADB root
}
build_apk() {
log_info "Removing old APKs..."
rm -vf build/*.apk
log_info "Removing old APKs..."
rm -vf build/*.apk
if [ ! -z $RELEASE ]; then
log_info "Building release APK"
./gradlew assembleRelease
cp -v uhabits-android/build/outputs/apk/release/uhabits-android-release.apk build/loop-$VERSION-release.apk
fi
if [ ! -z $RELEASE ]; then
log_info "Building release APK"
./gradlew assembleRelease
cp -v uhabits-android/build/outputs/apk/release/uhabits-android-release.apk build/loop-$VERSION-release.apk
fi
log_info "Building debug APK"
./gradlew assembleDebug || fail
cp -v uhabits-android/build/outputs/apk/debug/uhabits-android-debug.apk build/loop-$VERSION-debug.apk
log_info "Building debug APK"
./gradlew assembleDebug || fail
cp -v uhabits-android/build/outputs/apk/debug/uhabits-android-debug.apk build/loop-$VERSION-debug.apk
}
build_instrumentation_apk() {
log_info "Building instrumentation APK"
if [ ! -z $RELEASE ]; then
$GRADLE assembleAndroidTest \
-Pandroid.injected.signing.store.file=$LOOP_KEY_STORE \
-Pandroid.injected.signing.store.password=$LOOP_STORE_PASSWORD \
-Pandroid.injected.signing.key.alias=$LOOP_KEY_ALIAS \
-Pandroid.injected.signing.key.password=$LOOP_KEY_PASSWORD || fail
else
$GRADLE assembleAndroidTest || fail
fi
}
clean_output_dir() {
log_info "Cleaning output directory"
rm -rf ${OUTPUTS_DIR}
mkdir -p ${OUTPUTS_DIR}
log_info "Building instrumentation APK"
if [ ! -z $RELEASE ]; then
$GRADLE assembleAndroidTest \
-Pandroid.injected.signing.store.file=$LOOP_KEY_STORE \
-Pandroid.injected.signing.store.password=$LOOP_STORE_PASSWORD \
-Pandroid.injected.signing.key.alias=$LOOP_KEY_ALIAS \
-Pandroid.injected.signing.key.password=$LOOP_KEY_PASSWORD || fail
else
$GRADLE assembleAndroidTest || fail
fi
}
uninstall_apk() {
log_info "Uninstalling existing APK"
$ADB uninstall ${PACKAGE_NAME}
log_info "Uninstalling existing APK"
$ADB uninstall ${PACKAGE_NAME}
}
install_test_butler() {
log_info "Installing Test Butler"
$ADB uninstall com.linkedin.android.testbutler
$ADB install tools/test-butler-app-2.0.2.apk
log_info "Installing Test Butler"
$ADB uninstall com.linkedin.android.testbutler
$ADB install tools/test-butler-app-2.0.2.apk
}
install_apk() {
log_info "Installing APK"
if [ ! -z $RELEASE ]; then
$ADB install -r ${OUTPUTS_DIR}/apk/release/uhabits-android-release.apk || fail
else
$ADB install -t -r ${OUTPUTS_DIR}/apk/debug/uhabits-android-debug.apk || fail
fi
log_info "Installing APK"
if [ ! -z $RELEASE ]; then
$ADB install -r ${OUTPUTS_DIR}/apk/release/uhabits-android-release.apk || fail
else
$ADB install -t -r ${OUTPUTS_DIR}/apk/debug/uhabits-android-debug.apk || fail
fi
}
install_test_apk() {
log_info "Uninstalling existing test APK"
$ADB uninstall ${PACKAGE_NAME}.test
log_info "Uninstalling existing test APK"
$ADB uninstall ${PACKAGE_NAME}.test
log_info "Installing test APK"
$ADB install -r ${OUTPUTS_DIR}/apk/androidTest/debug/uhabits-android-debug-androidTest.apk || fail
log_info "Installing test APK"
$ADB install -r ${OUTPUTS_DIR}/apk/androidTest/debug/uhabits-android-debug-androidTest.apk || fail
}
run_instrumented_tests() {
SIZE=$1
log_info "Running instrumented tests"
$ADB shell am instrument \
-r -e coverage true -e size $SIZE \
-w ${PACKAGE_NAME}.test/android.support.test.runner.AndroidJUnitRunner \
| tee ${OUTPUTS_DIR}/instrument.txt
SIZE=$1
log_info "Running instrumented tests"
$ADB shell am instrument \
-r -e coverage true -e size $SIZE \
-w ${PACKAGE_NAME}.test/androidx.test.runner.AndroidJUnitRunner \
| tee ${OUTPUTS_DIR}/instrument.txt
if grep FAILURES $OUTPUTS_DIR/instrument.txt; then
log_error "Some instrumented tests failed"
fetch_images
fetch_logcat
exit 1
fi
if grep "\(INSTRUMENTATION_STATUS_CODE.*-1\|FAILURES\)" $OUTPUTS_DIR/instrument.txt; then
log_error "Some instrumented tests failed"
fetch_images
fetch_logcat
exit 1
fi
#mkdir -p ${OUTPUTS_DIR}/code-coverage/connected/
#$ADB pull /data/user/0/${PACKAGE_NAME}/files/coverage.ec \
# ${OUTPUTS_DIR}/code-coverage/connected/ \
# || log_error "COVERAGE REPORT NOT AVAILABLE"
#mkdir -p ${OUTPUTS_DIR}/code-coverage/connected/
#$ADB pull /data/user/0/${PACKAGE_NAME}/files/coverage.ec \
# ${OUTPUTS_DIR}/code-coverage/connected/ \
# || log_error "COVERAGE REPORT NOT AVAILABLE"
}
parse_instrumentation_results() {
log_info "Parsing instrumented test results"
java -jar tools/automator-log-converter-1.5.0.jar ${OUTPUTS_DIR}/instrument.txt || fail
log_info "Parsing instrumented test results"
java -jar tools/automator-log-converter-1.5.0.jar ${OUTPUTS_DIR}/instrument.txt || fail
}
generate_coverage_badge() {
log_info "Generating code coverage badge"
CORE_REPORT=uhabits-core/build/reports/jacoco/test/jacocoTestReport.xml
rm -f ${OUTPUTS_DIR}/coverage-badge.svg
python3 tools/coverage-badge/badge.py -i $CORE_REPORT -o ${OUTPUTS_DIR}/coverage-badge
log_info "Generating code coverage badge"
CORE_REPORT=uhabits-core/build/reports/jacoco/test/jacocoTestReport.xml
rm -f ${OUTPUTS_DIR}/coverage-badge.svg
python3 tools/coverage-badge/badge.py -i $CORE_REPORT -o ${OUTPUTS_DIR}/coverage-badge
}
fetch_logcat() {
log_info "Fetching logcat"
$ADB logcat -d > ${OUTPUTS_DIR}/logcat.txt
log_info "Fetching logcat"
$ADB logcat -d > ${OUTPUTS_DIR}/logcat.txt
}
run_jvm_tests() {
log_info "Running JVM tests"
if [ ! -z $RELEASE ]; then
$GRADLE testReleaseUnitTest :uhabits-core:check || fail
else
$GRADLE testDebugUnitTest :uhabits-core:check || fail
fi
log_info "Running JVM tests"
if [ ! -z $RELEASE ]; then
$GRADLE testReleaseUnitTest :uhabits-core:check || fail
else
$GRADLE testDebugUnitTest :uhabits-core:check || fail
fi
}
uninstall_test_apk() {
log_info "Uninstalling test APK"
$ADB uninstall ${PACKAGE_NAME}.test
log_info "Uninstalling test APK"
$ADB uninstall ${PACKAGE_NAME}.test
}
fetch_images() {
log_info "Fetching images"
rm -rf $OUTPUTS_DIR/test-screenshots
$ADB pull /sdcard/Android/data/${PACKAGE_NAME}/files/test-screenshots/ $OUTPUTS_DIR
$ADB shell rm -r /sdcard/Android/data/${PACKAGE_NAME}/files/test-screenshots/
log_info "Fetching images"
rm -rf $OUTPUTS_DIR/test-screenshots
$ADB pull /sdcard/Android/data/${PACKAGE_NAME}/files/test-screenshots/ $OUTPUTS_DIR
$ADB shell rm -r /sdcard/Android/data/${PACKAGE_NAME}/files/test-screenshots/
}
accept_images() {
find tmp/test-screenshots -name '*.expected*' -delete
rsync -av tmp/test-screenshots/ uhabits-android/src/androidTest/assets/
find $OUTPUTS_DIR/test-screenshots -name '*.expected*' -delete
rsync -av $OUTPUTS_DIR/test-screenshots/ uhabits-android/src/androidTest/assets/
}
run_tests() {
SIZE=$1
run_adb_as_root
install_test_butler
uninstall_apk
install_apk
install_test_apk
run_instrumented_tests $SIZE
parse_instrumentation_results
fetch_logcat
uninstall_test_apk
SIZE=$1
run_adb_as_root
install_test_butler
uninstall_apk
install_apk
install_test_apk
run_instrumented_tests $SIZE
parse_instrumentation_results
fetch_logcat
uninstall_test_apk
}
parse_opts() {
OPTS=`getopt -o ur --long uninstall-first,release -n 'build.sh' -- "$@"`
if [ $? != 0 ] ; then exit 1; fi
eval set -- "$OPTS"
OPTS=`getopt -o r --long release -n 'build.sh' -- "$@"`
if [ $? != 0 ] ; then exit 1; fi
eval set -- "$OPTS"
while true; do
case "$1" in
-u | --uninstall-first ) UNINSTALL_FIRST=1; shift ;;
-r | --release ) RELEASE=1; shift ;;
* ) break ;;
esac
done
while true; do
case "$1" in
-r | --release ) RELEASE=1; shift ;;
* ) break ;;
esac
done
}
remove_build_dir() {
rm -rfv build
rm -rfv android-base/build
rm -rfv android-pickers/build
rm -rfv uhabits-android/build
rm -rfv uhabits-core/build
}
case "$1" in
build)
shift; parse_opts $*
build)
shift; parse_opts $*
build_apk
build_instrumentation_apk
run_jvm_tests
#generate_coverage_badge
;;
build_apk
build_instrumentation_apk
run_jvm_tests
#generate_coverage_badge
;;
ci-tests)
if [ -z $3 ]; then
cat <<- END
Usage: $0 ci-tests AVD_NAME AVD_SERIAL [options]
medium-tests)
shift; parse_opts $*
run_tests medium
;;
Parameters:
AVD_NAME name of the virtual android device to start
AVD_SERIAL adb port to use (e.g. 5560)
large-tests)
shift; parse_opts $*
run_tests large
;;
Options:
-u --uninstall-first Uninstall existing APK first
-r --release Test release APK, instead of debug
END
exit 1
fi
fetch-images)
fetch_images
;;
shift; AVD_NAME=$1
shift; AVD_SERIAL=$1
shift; parse_opts $*
ADB="${ADB} -s emulator-${AVD_SERIAL}"
accept-images)
accept_images
;;
start_emulator
run_tests medium
stop_emulator
stop_gradle_daemon
;;
install)
shift; parse_opts $*
build_apk
install_apk
;;
medium-tests)
shift; parse_opts $*
run_tests medium
;;
clean)
remove_build_dir
;;
large-tests)
shift; parse_opts $*
run_tests large
;;
*)
cat <<END
Usage: $0 <command> [options]
Builds, installs and tests Loop Habit Tracker
fetch-images)
fetch_images
;;
Commands:
accept-images Copies fetched images to corresponding assets folder
build Build APK and run JVM tests
clean Remove build directory
fetch-images Fetches failed view test images from device
install Install app on connected device
large-tests Run large-sized tests on connected device
medium-tests Run medium-sized tests on connected device
accept-images)
accept_images
;;
install)
shift; parse_opts $*
build_apk
install_apk
;;
*)
cat <<- END
Usage: $0 <command> [options]
Builds, installs and tests Loop Habit Tracker
Commands:
ci-tests Start emulator silently, run tests then kill emulator
local-tests Run all tests on connected device
install Install app on connected device
fetch-images Fetches failed view test images from device
accept-images Copies fetched images to corresponding assets folder
Options:
-r --release Build and test release APK, instead of debug
END
exit 1
Options:
-r --release Build and test release APK, instead of debug
END
exit 1
;;
esac

View File

@@ -1,5 +1,5 @@
VERSION_CODE = 50
VERSION_NAME = 1.8.7
VERSION_CODE = 10812
VERSION_NAME = 1.8.12
MIN_SDK_VERSION = 21
TARGET_SDK_VERSION = 29

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 31 KiB

View File

@@ -1,61 +0,0 @@
/*
* Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com>
*
* 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.tasks;
import androidx.test.filters.*;
import androidx.test.runner.*;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.isoron.uhabits.*;
import org.junit.*;
import org.junit.runner.*;
@RunWith(AndroidJUnit4.class)
@MediumTest
public class ExportCSVTaskTest extends BaseAndroidTest
{
@Before
@Override
public void setUp()
{
super.setUp();
}
// @Test
// public void testExportCSV() throws Throwable
// {
// fixtures.purgeHabits(habitList);
// fixtures.createShortHabit();
//
// List<Habit> selected = new LinkedList<>();
// for (Habit h : habitList) selected.add(h);
// File outputDir = new AndroidDirFinder(targetContext).getFilesDir("CSV");
// assertNotNull(outputDir);
//
// taskRunner.execute(
// new ExportCSVTask(habitList, selected, outputDir, archiveFilename -> {
// assertThat(archiveFilename, is(not(nullValue())));
// File f = new File(archiveFilename);
// assertTrue(f.exists());
// assertTrue(f.canRead());
// }));
// }
}

View File

@@ -1,57 +0,0 @@
/*
* Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com>
*
* 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.tasks;
import androidx.test.filters.*;
import androidx.test.runner.*;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.isoron.uhabits.*;
import org.junit.*;
import org.junit.runner.*;
@RunWith(AndroidJUnit4.class)
@MediumTest
public class ExportDBTaskTest extends BaseAndroidTest
{
@Override
@Before
public void setUp()
{
super.setUp();
}
// @Test
// public void testExportCSV() throws Throwable
// {
// ExportDBTask task =
// new ExportDBTask(targetContext, new AndroidDirFinder(targetContext),
// filename ->
// {
// assertNotNull(filename);
// File f = new File(filename);
// assertTrue(f.exists());
// assertTrue(f.canRead());
// });
//
// taskRunner.execute(task);
// }
}

View File

@@ -25,8 +25,6 @@
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
@@ -218,12 +216,6 @@
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"/>
</provider>
<service
android:name=".sync.SyncService"
android:enabled="true"
android:exported="false">
</service>
</application>
</manifest>

View File

@@ -62,6 +62,7 @@ class HabitsApplication : Application() {
widgetUpdater = component.widgetUpdater
widgetUpdater.startListening()
widgetUpdater.scheduleStartDayWidgetUpdate()
reminderScheduler = component.reminderScheduler
reminderScheduler.startListening()

View File

@@ -34,7 +34,6 @@ import org.isoron.uhabits.core.ui.screens.habits.list.*;
import org.isoron.uhabits.core.utils.*;
import org.isoron.uhabits.intents.*;
import org.isoron.uhabits.receivers.*;
import org.isoron.uhabits.sync.*;
import org.isoron.uhabits.tasks.*;
import org.isoron.uhabits.widgets.*;
@@ -81,8 +80,6 @@ public interface HabitsApplicationComponent
ReminderController getReminderController();
SyncManager getSyncManager();
TaskRunner getTaskRunner();
WidgetPreferences getWidgetPreferences();

View File

@@ -57,7 +57,13 @@ public class TargetPanel extends FrameLayout
public double getTargetValue()
{
String sValue = tvTargetValue.getText().toString();
return Double.parseDouble(sValue);
double value = 0;
try {
value = Double.parseDouble(sValue);
} catch (NumberFormatException e) {
// NOP
}
return value;
}
public void setTargetValue(double targetValue)

View File

@@ -206,7 +206,7 @@ public class HabitCardListAdapter
int viewType)
{
if (listView == null) return null;
View view = listView.createHabitCardView();
HabitCardView view = listView.createHabitCardView();
return new HabitCardViewHolder(view);
}

View File

@@ -62,7 +62,7 @@ class HabitCardListView(
super.setAdapter(adapter)
}
fun createHabitCardView(): View {
fun createHabitCardView(): HabitCardView {
return cardViewFactory.create()
}
@@ -91,6 +91,7 @@ class HabitCardListView(
}
fun attachCardView(holder: HabitCardViewHolder) {
(holder.itemView as HabitCardView).dataOffset = dataOffset
attachedHolders.add(holder)
}

View File

@@ -19,8 +19,6 @@
package org.isoron.uhabits.activities.habits.list.views
import androidx.appcompat.widget.*
import android.view.*
import androidx.recyclerview.widget.RecyclerView
class HabitCardViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
class HabitCardViewHolder(itemView: HabitCardView) : RecyclerView.ViewHolder(itemView)

View File

@@ -23,17 +23,25 @@ import android.os.*;
import org.isoron.androidbase.activities.*;
import org.isoron.androidbase.utils.*;
import org.isoron.uhabits.R;
import org.isoron.uhabits.*;
import org.isoron.uhabits.activities.*;
/**
* Activity that allows the user to view and modify the app settings.
*/
public class SettingsActivity extends BaseActivity
{
private AndroidThemeSwitcher themeSwitcher;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
HabitsApplicationComponent compoenent = ((HabitsApplication) getApplication()).getComponent();
themeSwitcher = new AndroidThemeSwitcher(this, compoenent.getPreferences());
themeSwitcher.apply();
setContentView(R.layout.settings_activity);
setupActionBarColor();
}

View File

@@ -155,8 +155,6 @@ public class SettingsFragment extends PreferenceFragmentCompat
// Temporarily disable this; we now always ask
findPreference("reminderSound").setVisible(false);
findPreference("pref_snooze_interval").setVisible(false);
updateSync();
}
private void updateWeekdayPreference()
@@ -183,7 +181,6 @@ public class SettingsFragment extends PreferenceFragmentCompat
}
if (key.equals("pref_first_weekday")) updateWeekdayPreference();
BackupManager.dataChanged("org.isoron.uhabits");
updateSync();
}
private void setResultOnPreferenceClick(String key, final int result)
@@ -218,24 +215,4 @@ public class SettingsFragment extends PreferenceFragmentCompat
Preference ringtonePreference = findPreference("reminderSound");
ringtonePreference.setSummary(ringtoneName);
}
private void updateSync()
{
if (prefs == null) return;
boolean enabled = prefs.isSyncEnabled();
Preference syncKey = findPreference("pref_sync_key");
if (syncKey != null)
{
syncKey.setSummary(prefs.getSyncKey());
syncKey.setVisible(enabled);
}
Preference syncAddress = findPreference("pref_sync_address");
if (syncAddress != null)
{
syncAddress.setSummary(prefs.getSyncAddress());
syncAddress.setVisible(enabled);
}
}
}

View File

@@ -45,7 +45,7 @@ class IntentScheduler
private val manager =
context.getSystemService(ALARM_SERVICE) as AlarmManager
fun schedule(timestamp: Long, intent: PendingIntent) {
fun schedule(timestamp: Long, intent: PendingIntent, alarmType: Int) {
Log.d("IntentScheduler",
"timestamp=" + timestamp + " current=" + System.currentTimeMillis())
if (timestamp < System.currentTimeMillis()) {
@@ -54,19 +54,24 @@ class IntentScheduler
return;
}
if (SDK_INT >= M)
manager.setExactAndAllowWhileIdle(RTC_WAKEUP, timestamp, intent)
manager.setExactAndAllowWhileIdle(alarmType, timestamp, intent)
else
manager.setExact(RTC_WAKEUP, timestamp, intent)
manager.setExact(alarmType, timestamp, intent)
}
override fun scheduleShowReminder(reminderTime: Long,
habit: Habit,
timestamp: Long) {
val intent = pendingIntents.showReminder(habit, reminderTime, timestamp)
schedule(reminderTime, intent)
schedule(reminderTime, intent, RTC_WAKEUP)
logReminderScheduled(habit, reminderTime)
}
override fun scheduleWidgetUpdate(updateTime: Long) {
val intent = pendingIntents.updateWidgets()
schedule(updateTime, intent, RTC)
}
override fun log(componentName: String, msg: String) {
Log.d(componentName, msg)
}

View File

@@ -103,4 +103,12 @@ class PendingIntentFactory
if (timestamp != null) putExtra("timestamp", timestamp)
},
FLAG_UPDATE_CURRENT)
fun updateWidgets(): PendingIntent =
PendingIntent.getBroadcast(
context, 0,
Intent(context, WidgetReceiver::class.java).apply {
action = WidgetReceiver.ACTION_UPDATE_WIDGETS_VALUE
},
FLAG_UPDATE_CURRENT)
}

View File

@@ -51,7 +51,6 @@ class AndroidNotificationTray
Log.d("AndroidNotificationTray", msg)
}
override fun removeNotification(id: Int) {
val manager = NotificationManagerCompat.from(context)
manager.cancel(id)
@@ -63,8 +62,6 @@ class AndroidNotificationTray
timestamp: Timestamp,
reminderTime: Long) {
val notificationManager = NotificationManagerCompat.from(context)
//val summary = buildSummary(habit, reminderTime)
//notificationManager.notify(Int.MAX_VALUE, summary)
val notification = buildNotification(habit, reminderTime, timestamp)
createAndroidNotificationChannel(context)
try {
@@ -109,7 +106,7 @@ class AndroidNotificationTray
.addAction(removeRepetitionAction)
val defaultText = context.getString(R.string.default_reminder_question)
val builder = NotificationCompat.Builder(context, REMINDERS_CHANNEL_ID)
val builder = Builder(context, REMINDERS_CHANNEL_ID)
.setSmallIcon(R.drawable.ic_notification)
.setContentTitle(habit.name)
.setContentText(if(habit.description.isBlank()) defaultText else habit.description)
@@ -121,7 +118,6 @@ class AndroidNotificationTray
.setWhen(reminderTime)
.setShowWhen(true)
.setOngoing(preferences.shouldMakeNotificationsSticky())
.setGroup("group" + habit.getId())
if (!disableSound)
builder.setSound(ringtoneManager.getURI())
@@ -139,18 +135,6 @@ class AndroidNotificationTray
return builder.build()
}
private fun buildSummary(habit: Habit,
reminderTime: Long): Notification {
return NotificationCompat.Builder(context, REMINDERS_CHANNEL_ID)
.setSmallIcon(R.drawable.ic_notification)
.setContentTitle(context.getString(R.string.app_name))
.setWhen(reminderTime)
.setShowWhen(true)
.setGroup("group" + habit.getId())
.setGroupSummary(true)
.build()
}
companion object {
private const val REMINDERS_CHANNEL_ID = "REMINDERS"
fun createAndroidNotificationChannel(context: Context) {

View File

@@ -1,38 +0,0 @@
/*
* Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com>
*
* 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.receivers
import android.content.*
import android.content.Context.*
import android.net.*
import org.isoron.uhabits.*
class ConnectivityReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
if (context == null || intent == null) return
val app = context.applicationContext as HabitsApplication
val networkInfo = (context.getSystemService(CONNECTIVITY_SERVICE)
as ConnectivityManager).activeNetworkInfo
val isConnected = (networkInfo != null) &&
networkInfo.isConnectedOrConnecting
val syncManager = app.component.syncManager
syncManager.onNetworkStatusChanged(isConnected)
}
}

View File

@@ -26,7 +26,7 @@ import org.isoron.uhabits.*;
import org.isoron.uhabits.core.preferences.*;
import org.isoron.uhabits.core.ui.widgets.*;
import org.isoron.uhabits.intents.*;
import org.isoron.uhabits.sync.*;
import org.isoron.uhabits.widgets.*;
import dagger.*;
@@ -49,6 +49,9 @@ public class WidgetReceiver extends BroadcastReceiver
public static final String ACTION_TOGGLE_REPETITION =
"org.isoron.uhabits.ACTION_TOGGLE_REPETITION";
public static final String ACTION_UPDATE_WIDGETS_VALUE =
"org.isoron.uhabits.ACTION_UPDATE_WIDGETS_VALUE";
private static final String TAG = "WidgetReceiver";
@Override
@@ -65,16 +68,17 @@ public class WidgetReceiver extends BroadcastReceiver
IntentParser parser = app.getComponent().getIntentParser();
WidgetBehavior controller = component.getWidgetController();
Preferences prefs = app.getComponent().getPreferences();
WidgetUpdater widgetUpdater = app.getComponent().getWidgetUpdater();
Log.i(TAG, String.format("Received intent: %s", intent.toString()));
if (prefs.isSyncEnabled())
context.startService(new Intent(context, SyncService.class));
try
{
IntentParser.CheckmarkIntentData data;
data = parser.parseCheckmarkIntent(intent);
IntentParser.CheckmarkIntentData data = null;
if (intent.getAction() != ACTION_UPDATE_WIDGETS_VALUE)
{
data = parser.parseCheckmarkIntent(intent);
}
switch (intent.getAction())
{
@@ -104,6 +108,11 @@ public class WidgetReceiver extends BroadcastReceiver
controller.onRemoveRepetition(data.getHabit(),
data.getTimestamp());
break;
case ACTION_UPDATE_WIDGETS_VALUE:
widgetUpdater.updateWidgets();
widgetUpdater.scheduleStartDayWidgetUpdate();
break;
}
}
catch (RuntimeException e)

View File

@@ -1,59 +0,0 @@
/*
* Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com>
*
* 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.sync;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.isoron.uhabits.core.database.*;
@Table(name = "Events")
public class Event
{
@Nullable
@Column
public Long id;
@NonNull
@Column(name = "timestamp")
public Long timestamp;
@NonNull
@Column(name = "message")
public String message;
@NonNull
@Column(name = "server_id")
public String serverId;
public Event()
{
timestamp = 0L;
message = "";
serverId = "";
}
public Event(@NonNull String serverId, long timestamp, @NonNull String message)
{
this.serverId = serverId;
this.timestamp = timestamp;
this.message = message;
}
}

View File

@@ -1,380 +0,0 @@
/*
* Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com>
*
* 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.sync;
import android.util.*;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.isoron.androidbase.*;
import org.isoron.uhabits.BuildConfig;
import org.isoron.uhabits.core.*;
import org.isoron.uhabits.core.commands.*;
import org.isoron.uhabits.core.database.*;
import org.isoron.uhabits.core.preferences.*;
import org.isoron.uhabits.database.*;
import org.isoron.uhabits.utils.*;
import org.json.*;
import java.net.*;
import java.util.*;
import javax.inject.*;
import io.socket.client.*;
import io.socket.client.Socket;
import io.socket.emitter.*;
import static io.socket.client.Socket.EVENT_CONNECT;
import static io.socket.client.Socket.EVENT_CONNECTING;
import static io.socket.client.Socket.EVENT_CONNECT_ERROR;
import static io.socket.client.Socket.EVENT_CONNECT_TIMEOUT;
import static io.socket.client.Socket.EVENT_DISCONNECT;
import static io.socket.client.Socket.EVENT_PING;
import static io.socket.client.Socket.EVENT_PONG;
import static io.socket.client.Socket.EVENT_RECONNECT;
import static io.socket.client.Socket.EVENT_RECONNECT_ATTEMPT;
import static io.socket.client.Socket.EVENT_RECONNECT_ERROR;
import static io.socket.client.Socket.EVENT_RECONNECT_FAILED;
@AppScope
public class SyncManager implements CommandRunner.Listener
{
public static final String EVENT_AUTH = "auth";
public static final String EVENT_AUTH_OK = "authOK";
public static final String EVENT_EXECUTE_EVENT = "execute";
public static final String EVENT_FETCH = "fetch";
public static final String EVENT_FETCH_OK = "fetchOK";
public static final String EVENT_POST_EVENT = "postEvent";
@NonNull
private String clientId;
@NonNull
private String groupKey;
@NonNull
private Socket socket;
@NonNull
private LinkedList<Event> pendingConfirmation;
@NonNull
private LinkedList<Event> pendingEmit;
private boolean readyToEmit = false;
@NonNull
private final Preferences prefs;
@NonNull
private CommandRunner commandRunner;
@NonNull
private CommandParser commandParser;
private boolean isListening;
private SSLContextProvider sslProvider;
private final Repository<Event> repository;
@Inject
public SyncManager(@NonNull SSLContextProvider sslProvider,
@NonNull Preferences prefs,
@NonNull CommandRunner commandRunner,
@NonNull CommandParser commandParser)
{
Log.i("SyncManager", this.toString());
this.sslProvider = sslProvider;
this.prefs = prefs;
this.commandRunner = commandRunner;
this.commandParser = commandParser;
this.isListening = false;
repository = new Repository<>(Event.class,
new AndroidDatabase(DatabaseUtils.openDatabase()));
pendingConfirmation = new LinkedList<>();
pendingEmit = new LinkedList<>(repository.findAll("order by timestamp"));
groupKey = prefs.getSyncKey();
clientId = prefs.getSyncClientId();
String serverURL = prefs.getSyncAddress();
Log.d("SyncManager", clientId);
connect(serverURL);
}
@Override
public void onCommandExecuted(@NonNull Command command,
@Nullable Long refreshKey)
{
if (command.isRemote()) return;
JSONObject msg = toJSONObject(command.toJson());
Long now = new Date().getTime();
Event e = new Event(command.getId(), now, msg.toString());
repository.save(e);
Log.i("SyncManager", "Adding to outbox: " + msg.toString());
pendingEmit.add(e);
if (readyToEmit) emitPending();
}
public void onNetworkStatusChanged(boolean isConnected)
{
if (!isListening) return;
if (isConnected) socket.connect();
else socket.disconnect();
}
public void startListening()
{
if (!prefs.isSyncEnabled()) return;
if (groupKey.isEmpty()) return;
if (isListening) return;
isListening = true;
socket.connect();
commandRunner.addListener(this);
}
public void stopListening()
{
if (!isListening) return;
commandRunner.removeListener(this);
socket.close();
isListening = false;
}
private void connect(String serverURL)
{
try
{
IO.setDefaultSSLContext(sslProvider.getCACertSSLContext());
socket = IO.socket(serverURL);
logSocketEvent(socket, EVENT_CONNECT, "Connected");
logSocketEvent(socket, EVENT_CONNECT_TIMEOUT, "Connect timeout");
logSocketEvent(socket, EVENT_CONNECTING, "Connecting...");
logSocketEvent(socket, EVENT_CONNECT_ERROR, "Connect error");
logSocketEvent(socket, EVENT_DISCONNECT, "Disconnected");
logSocketEvent(socket, EVENT_RECONNECT, "Reconnected");
logSocketEvent(socket, EVENT_RECONNECT_ATTEMPT, "Reconnecting...");
logSocketEvent(socket, EVENT_RECONNECT_ERROR, "Reconnect error");
logSocketEvent(socket, EVENT_RECONNECT_FAILED, "Reconnect failed");
logSocketEvent(socket, EVENT_DISCONNECT, "Disconnected");
logSocketEvent(socket, EVENT_PING, "Ping");
logSocketEvent(socket, EVENT_PONG, "Pong");
socket.on(EVENT_CONNECT, new OnConnectListener());
socket.on(EVENT_DISCONNECT, new OnDisconnectListener());
socket.on(EVENT_EXECUTE_EVENT, new OnExecuteCommandListener());
socket.on(EVENT_AUTH_OK, new OnAuthOKListener());
socket.on(EVENT_FETCH_OK, new OnFetchOKListener());
}
catch (URISyntaxException e)
{
throw new RuntimeException(e);
}
}
private void emitPending()
{
try
{
for (Event e : pendingEmit)
{
Log.i("SyncManager", "Emitting: " + e.message);
socket.emit(EVENT_POST_EVENT, new JSONObject(e.message));
pendingConfirmation.add(e);
}
pendingEmit.clear();
}
catch (JSONException e)
{
throw new RuntimeException(e);
}
}
private void logSocketEvent(Socket socket, String event, final String msg)
{
socket.on(event, args ->
{
Log.i("SyncManager", msg);
for (Object o : args)
if (o instanceof SocketIOException)
((SocketIOException) o).printStackTrace();
});
}
private JSONObject toJSONObject(String json)
{
try
{
return new JSONObject(json);
}
catch (JSONException e)
{
throw new RuntimeException(e);
}
}
private void updateLastSync(Long timestamp)
{
prefs.setLastSync(timestamp + 1);
}
private class OnAuthOKListener implements Emitter.Listener
{
@Override
public void call(Object... args)
{
Log.i("SyncManager", "Auth OK");
Log.i("SyncManager", "Requesting commands since last sync");
Long lastSync = prefs.getLastSync();
socket.emit(EVENT_FETCH, buildFetchMessage(lastSync));
}
private JSONObject buildFetchMessage(Long lastSync)
{
try
{
JSONObject json = new JSONObject();
json.put("since", lastSync);
return json;
}
catch (JSONException e)
{
throw new RuntimeException(e);
}
}
}
private class OnConnectListener implements Emitter.Listener
{
@Override
public void call(Object... args)
{
Log.i("SyncManager", "Sending auth message");
socket.emit(EVENT_AUTH, buildAuthMessage());
}
private JSONObject buildAuthMessage()
{
try
{
JSONObject json = new JSONObject();
json.put("groupKey", groupKey);
json.put("clientId", clientId);
json.put("version", BuildConfig.VERSION_NAME);
return json;
}
catch (JSONException e)
{
throw new RuntimeException(e);
}
}
}
private class OnDisconnectListener implements Emitter.Listener
{
@Override
public void call(Object... args)
{
readyToEmit = false;
for (Event e : pendingConfirmation) pendingEmit.add(e);
pendingConfirmation.clear();
}
}
private class OnExecuteCommandListener implements Emitter.Listener
{
@Override
public void call(Object... args)
{
try
{
Log.d("SyncManager",
String.format("Received command: %s", args[0].toString()));
JSONObject root = new JSONObject(args[0].toString());
updateLastSync(root.getLong("timestamp"));
executeCommand(root);
}
catch (JSONException e)
{
throw new RuntimeException(e);
}
}
private void executeCommand(JSONObject root) throws JSONException
{
Command received = commandParser.parse(root.toString());
received.setRemote(true);
for (Event e : pendingConfirmation)
{
if (e.serverId.equals(received.getId()))
{
Log.i("SyncManager", "Pending command confirmed");
pendingConfirmation.remove(e);
repository.remove(e);
return;
}
}
Log.d("SyncManager", "Executing received command");
commandRunner.execute(received, null);
}
}
private class OnFetchOKListener implements Emitter.Listener
{
@Override
public void call(Object... args)
{
try
{
Log.i("SyncManager", "Fetch OK");
JSONObject json = (JSONObject) args[0];
updateLastSync(json.getLong("timestamp"));
emitPending();
readyToEmit = true;
}
catch (JSONException e)
{
throw new RuntimeException(e);
}
}
}
}

View File

@@ -1,90 +0,0 @@
/*
* Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com>
*
* 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.sync;
import android.app.*;
import android.content.*;
import android.net.*;
import android.os.*;
import androidx.core.app.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.core.preferences.*;
import org.isoron.uhabits.receivers.*;
public class SyncService extends Service implements Preferences.Listener
{
private SyncManager syncManager;
private Preferences prefs;
private ConnectivityReceiver connectivityReceiver;
public SyncService()
{
}
@Override
public IBinder onBind(Intent intent)
{
return null;
}
@Override
public void onCreate()
{
Intent notificationIntent = new Intent(this, SyncService.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
Notification notification = new NotificationCompat.Builder(this)
.setContentTitle("Loop Habit Tracker")
.setContentText("Sync service running")
.setSmallIcon(R.drawable.ic_notification)
.setPriority(NotificationCompat.PRIORITY_MIN)
.setContentIntent(pendingIntent)
.build();
startForeground(99999, notification);
connectivityReceiver = new ConnectivityReceiver();
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
this.registerReceiver(connectivityReceiver, filter);
HabitsApplication app = (HabitsApplication) getApplicationContext();
syncManager = app.getComponent().getSyncManager();
syncManager.startListening();
prefs = app.getComponent().getPreferences();
prefs.addListener(this);
}
@Override
public void onSyncFeatureChanged()
{
if(!prefs.isSyncEnabled()) stopSelf();
}
@Override
public void onDestroy()
{
unregisterReceiver(connectivityReceiver);
syncManager.stopListening();
}
}

View File

@@ -25,6 +25,8 @@ import org.isoron.androidbase.*
import org.isoron.uhabits.core.commands.*
import org.isoron.uhabits.core.preferences.*
import org.isoron.uhabits.core.tasks.*
import org.isoron.uhabits.core.utils.*
import org.isoron.uhabits.intents.*
import javax.inject.*
/**
@@ -36,7 +38,8 @@ class WidgetUpdater
@AppContext private val context: Context,
private val commandRunner: CommandRunner,
private val taskRunner: TaskRunner,
private val widgetPrefs: WidgetPreferences
private val widgetPrefs: WidgetPreferences,
private val intentScheduler: IntentScheduler
) : CommandRunner.Listener {
override fun onCommandExecuted(command: Command, refreshKey: Long?) {
@@ -60,6 +63,11 @@ class WidgetUpdater
commandRunner.removeListener(this)
}
fun scheduleStartDayWidgetUpdate() {
val timestamp = DateUtils.getStartOfTomorrow()
intentScheduler.scheduleWidgetUpdate(timestamp);
}
fun updateWidgets(modifiedHabitId: Long?) {
taskRunner.execute {
updateWidgets(modifiedHabitId, CheckmarkWidgetProvider::class.java)

View File

@@ -0,0 +1 @@
https://loophabits.org

View File

@@ -0,0 +1,29 @@
حلقة تعقب الحبوب تساعدك على إنشاء عادات إيجابية طويلة الأجل والحفاظ عليها في حياتك. تعطيكم الرسوم البيانية والإحصاءات التفصيلية صورة واضحة للكيفية التي تحسنت بها عاداتك مع مرور الوقت. التطبيق خالٍ تمامًا من الإعلانات ومفتوح المصدر ويحترم خصوصيتك.
<b>واجهة جميلة وبسيطة</b>
يحتوي Loop على واجهة أنيقة وبسيطة وسهلة الاستخدام للغاية ، حتى للمستخدمين لأول مرة. تم تحسين التطبيق ليكون ذي سرعة عالية ، ويعمل التطبيق بشكل جيد حتى على الهواتف القديمة.
<b>درجة العادة</b>
يحتوي Loop على صيغة متقدمة لحساب قوة عاداتك. كل تكرار يجعل عادتك أقوى وكل يوم ضائع يجعلها أضعف. بضعة أيام فاتت بدون ممارسة بعد سلسلة طويلة من الممارسة لن تدمر تقدمك بشكل كامل، خلافا للكثير من التطبيقات الأخرى التي تحتوي على نفس الخاصية.
<b>جداول مرنة</b>
بالإضافة إلى العادات اليومية ، تدعم Loop العادات بجداول أكثر تعقيدًا ، مثل 3 مرات في الأسبوع أو كل يوم.
<b>تذكير</b>
جدولة الإشعارات لتذكيرك بالعادات الخاصة بك. ويمكن لكل عادة أن يكون لها تذكير خاص بها، في وقت مختار من اليوم. تحقق بسهولة من عادتك أو تجاهلها مباشرة من الإخطار.
<b>الأدوات</b>
تذكر عاداتك كلما فتحت قفل هاتفك. تسمح لك الأدوات الملونة بتتبع عاداتك مباشرة من شاشتك الرئيسية ، دون حتى فتح التطبيق.
<b>تحكم في بياناتك</b>
إذا كنت تريد إجراء مزيد من التحليل لبياناتك ، أو نقلها إلى خدمة أخرى ، فإن Loop تسمح لك بتصديرها إلى جداول البيانات (CSV) أو إلى ملف قاعدة بيانات (SQLite). بالنسبة للمستخدمين المحترفين، يمكن إضافة علامات الاختيار من خلال تطبيقات أخرى ، مثل تاسكر.
<b>لا قيود</b>
تتبع العديد من العادات كما يحلو لك. Loop imposes no artificial limits on how many habits you can have. All features are available to all users. There are no in-app purchases.
Arabic
لا توجد إعلانات أو إشعارات مزعجة أو أذونات تدخلية في هذا التطبيق ، ولن تكون هناك أبدًا. التطبيق مفتوح المصدر بالكامل (GPLv3).
<b>يعمل دون اتصال ويحترم خصوصيتك</b>
Loop لا يتطلب اتصالاً بالإنترنت أو تسجيل حساب عبر الإنترنت. لا يتم إرسال البيانات السرية الخاصة بك إلى أي شخص. لا يتمكن المطورين ولا أي طرف ثالث من الوصول إليها.

View File

@@ -0,0 +1,2 @@
اخلق عادات جيدة وتابع تطورها مع مرور الوقت
(خالية من الإعلانات)

View File

@@ -0,0 +1,29 @@
Loop Seguiment d'hàbits t'ajuda a crear i mantenir en la teva vida hàbits positius de llarg termini. Estadístiques i gràfiques detallades et donen una imatge clara de com els teus hàbits han millorat en el temps. L'app és completament sense anuncis, de codi obert i respecta la teva privadesa.
<b>Interfície minimalista, lleugera i bonica</b>
Loop té una interfície elegant i minimalista que es molt fàcil d'usar, inclús per als usuaris primerencs. Altament optimitzada per a que sigui ràpida, l'app funciona bé inclús en telèfons antics.
<b>Puntuació d'hàbit</b>
Loop té una fórmula avançada per a calcular la fortalesa dels teus hàbits. Cada repetició fa el teu hàbit més fort i cada dia perdut el fa més dèbil. Però si perds alguns pocs dies després d'una llarga ratxa, això no destruirà completament el teu progrès, a diferència de moltes altres aplicacions.
<b>Planificacions flexibles</b>
A més d'hàbits diaris, Loop permet hàbits més complexes, com per exemple 3 cops per setmana o cada cert dia.
<b>Recordatoris</b>
Planifica notificaciones per a recordar-te dels teus hàbits. Cada hàbit pot tenir el seu propi recordatori, a una hora escollida del dia. Marca o refusa fàcilment el teu hàbit directament des de la notificació.
<b>Ginys</b>
Tingues recordatoris dels teus hàbits quan desbloqueges el teu telèfon. Ginys plens de color et permeten fer el seguiment dels teus hàbits directament des de la pantalla d'inici, sense obrir l'app.
<b>Pren el control de les teves dades</b>
Si vols analitzar més les teves dades, o moure-les a un altre servei, Loop et permet exportar-les a fulles de càlcul (CSV) o a un fitxer de base de dades (SQLite). Per a usuaris avançats, les marques de verificació poden ser afegides mitjançant altres apps, com per exemple Tasker.
<b>Sense limitacions</b>
Fes el seguiment de tants hàbits com vulguis. Loop no imposa cap límit artificial a quants hàbits pots tenir. Totes les característiques estan disponibles per a tots els usuaris. No hi ha comandes adicionals per a comprar dintre de l'app.
<b>Completament sense anuncis i de codi obert</b>
No hi ha anuncis, notificacions molestes o permisos intrusius en aquesta app, i no n'hi haurà mai. L'app és completament de codi obert (GPLv3).
<b>Funciona sense connexió i respecta la teva privacitat</b>
Loop no necessita connexió a Internet o registrar un compte d'usuari. Les teves dades confidencials mai són enviades a ningú. Ni els desenvolupadors ni terceres parts tenen accés a les dades.

View File

@@ -0,0 +1 @@
Crear bons hàbits i fer-ne el seguiment en el temps (sense anuncis)

View File

@@ -0,0 +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í.
<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.
<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".
<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.
<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.
<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.
<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.
<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.
<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).
<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.

View File

@@ -0,0 +1 @@
Vytvářejte si pozitivní návyky a sledujte jejich zlepšení v průběhu času (bez reklam)

View File

@@ -0,0 +1,29 @@
Loop Habit Tracker hilft dir dabei, positive Gewohnheiten in dein Leben zu integrieren und sie dauerhaft zu verfolgen. Detaillierte Diagramme und Statistiken geben Aufschluss darüber, wie sich die Gewohnheiten über die Zeit verändern und verbessern. Die App ist werbefrei, open source und respektiert die Privatsphäre.
<b>Schöne, minimalistisch und übersichtliche Benutzeroberfläche</b>
Loop hat eine elegante und minimalistische Benutzeroberfläche, die selbst für Erstnutzer eine einfache Verwendung möglich macht. Dank vieler Geschwindigkeitsoptimierungen funktioniert die App auch auf älteren Geräten einwandfrei.
<b>Gewohnheitserfolge</b>
Loop berechnet mit einer ausgereiften Berechnungsart die Stärke der Gewohnheiten. Jede Wiederholung macht sie stärker und jeder ausgelassene Tag schwächt sie wieder. Ein paar wenige versäumte Tage zerstören den Fortschritt allerdings nicht komplett, wie es bei diversen anderen "Don't-break-the-chain" Apps der Fall ist.
<b>Flexible Zeitplanung</b>
Zusätzlich zu täglichen Gewohnheiten bietet Loop auch eine komplexere Zeitplanung an, wie zum Beispiel drei mal pro Woche oder jeden zweiten Tag.
<b>Erinnerungen</b>
Benachrichtigungen können zeitlich konfiguriert und als Erinnerung verwendet werden. Für jede Gewohnheit kann eine individuelle Erinnerungen zu einer einstellbaren Tageszeit aktiviert werden. Die Gewohnheiten können dann einfach über die Benachrichtigung überprüft oder verworfen werden.
<b>Widgets</b>
Denken Sie immer an Erinnerungen, Sie ihr Telefon entsperren. Mit farbenfrohen Widgets behalten Sie Ihre Gewohnheiten immer im Überblick, direkt auf dem Homescreen ihn die App zu öffnen.
<b>Behalten Sie die Kontrolle über Ihre Daten</b>
Daten können zur weiteren Analyse, oder auch zum Verschieben zu einem weiteren Anbieter, als Tabelle (CSV) oder Datenbank (SQLite) exportiert werden. Power User können Checkmarks in anderen Apps hinzufügen, wie zum Beispiel Tasker.
<b>Keine Einschränkungen</b>
Erstellen Sie so viele Gewohnheiten, wie Sie möchten. Loop setzt keinerlei Einschränkungen was die Anzahl der erstellbaren Gewohnheiten betrifft. Alle Funktionen sind für alle User verfügbar. Es gibt keine In-App-Käufe.
<b>Komplett werbefrei und open source</b>
Loop beinhaltet keine Werbung, lästige Benachrichtigungen oder unnötige Berechtigungen - und wir so wird es auch immer bleiben. Die App ist komplett open source (GPLv3).
<b>Funktioniert offline und respektiert Ihre Privatsphäre</b>
Loop benötigt keine Internetverbindung oder Online-Registrierung. Ihre privaten Daten werden nie an Dritte weitergegeben. Weder die Entwickler, noch Dritte haben Zugriff darauf.

View File

@@ -0,0 +1 @@
Erstelle gute Gewohnheiten und verfolge ihren Fortschritt (ohne Werbung)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

View File

@@ -0,0 +1 @@
Krei bonajn kutimojn kaj spuri ilian progreson kun la tempo (anonc-senpaga)

View File

@@ -0,0 +1,29 @@
Loop Habit Tracker te ayuda a crear y mantener hábitos positivos y a largo plazo en tu vida. Gráficos detallados y las estadísticas te dan una idea clara de cómo tus hábitos han mejorado con el tiempo. La aplicación es completamente gratis, de código abierto y respeta tu privacidad.
<b>Interfase hermosa, minimalista y liviana</b>
Loop tiene una interfaz elegante y minimalista que es muy fácil de usar, incluso para usuarios nuevos. Muy optimizada para la velocidad, la aplicación funciona bien incluso en teléfonos más antiguos.
<b>Puntaje de hábitos</b>
Loop tiene una fórmula avanzada para calcular la fuerza de tus hábitos. Cada repetición fortalece tu hábito y cada día perdido lo debilita. Sin embargo, unos días perdidos después de una larga racha no destruirán por completo tu progreso, a diferencia de muchas otras aplicaciones del tipo "no rompas la cadena".
<b>Horarios flexibles</b>
Además de los hábitos diarios, Loop admite hábitos con horarios más complejos, como 3 veces por semana o día por medio.
<b>Recordatorios</b>
Programa notificaciones para recordarte tus hábitos. Cada hábito puede tener su propio recordatorio, a la hora elegida del día. Marca o descarta fácilmente tu hábito directamente de la notificación.
<b>Widgets</b>
Recuerda tus hábitos apenas desbloqueando el teléfono. Los widgets de colores te permiten rastrear tus hábitos directamente desde tu pantalla de inicio, sin siquiera abrir la aplicación.
<b>Toma el control de tus datos</b>
Si quieres analizar más tus datos o moverlos a otro servicio, Loop le permite exportarlo a hojas de cálculo, (CSV) o a un archivo de base de datos (SQLite). Para usuarios avanzados, se pueden marcar hábitos a través de otras aplicaciones, como Tasker.
<b>Sin limitaciones</b>
Rastrea tantos hábitos como desees. Loop no impone límites artificiales sobre cuántos hábitos puedes tener. Todas las características están disponibles para todos los usuarios. No hay compras dentro de la aplicación.
<b>Completamente sin publicidades y código abierto</b>
No hay publicidades, notificaciones molestas o permisos intrusivos en esta aplicación, y nunca los habrá. La aplicación es completamente de código abierto (Licencia GPLv3).
<b>Funciona sin conexión y respeta tu privacidad</b>
Loop no requiere una conexión a Internet o registrarse una cuenta. Tus datos confidenciales nunca se envían a nadie. Ni los desarrolladores ni terceros tienen acceso a ella.

View File

@@ -0,0 +1 @@
Crea buenos hábitos y rastrea su progreso en el tiempo (sin publicidades)

View File

@@ -0,0 +1,29 @@
Loop Habit Tracker aplikazioak epe luzeko ohitura positiboak sortzen eta mantentzen laguntzen dizu. Grafiko xehatuek eta estatistikek zure ohiturak denboran zehar nola hobetu diren azaltzen dute. Aplikazioa erabat iragarki gabekoa da, kode irekikoa da eta zure pribatutasuna errespetatzen du.
<b>Interfaze ederra, minimalista eta arina</b>
Loop-ek interfaze dotorea eta minimalista du, oso erraza da erabiltzeko, baita lehen aldiz erabiltzen dutenentzat. Abiadura oso optimizatuta, aplikazioak ondo funtzionatzen du telefono zaharretan ere.
<b>Ohitura-puntuazioa</b>
Loop-ek zure ohituren indarra kalkulatzeko formula aurreratua du. Errepikapen bakoitzarekin zure ohitura indartsuagoa da eta galdutako egun bakoitzarekin ahulagoa. Dena den, bolada luze baten ondoren galdutako egun gutxi batzuk ez dute zure progresioa erabat suntsituko, ez-apurtu-katea motako aplikazioetan ez bezala.
<b>Ordutegi malguak</b>
Eguneroko ohiturez gain, Loop-ek ordutegi konplexuagoak dituzten ohiturak onartzen ditu, hala nola astean 3 aldiz edo bi egunetik behin.
<b>Oroigarriak</b>
Programatu jakinarazpenak zure ohiturak gogorarazteko. Ohitura bakoitzak bere oroigarria izan dezake, aukeratutako eguneko unean. Egiaztatu edo baztertu zure ohitura zuzenean jakinarazpenetik.
<b>Trepetak</b>
Jaso zure ohituren oroigarria telefonoa desblokeatzean. Trepeta koloretsuek ohiturak zuzenean zure pantailatik jarraitzeko aukera ematen dizute, aplikazioa ireki gabe ere.
<b>Hartu zure datuen kontrola</b>
Zure datuak sakonago aztertu nahi badituzu edo beste zerbitzu batera eraman nahi baduzu, Loop-ek kalkulu orrietara (CSV) edo datu-basearen fitxategira (SQLite) esportatzea ahalbidetzen dizu. Erabiltzaile aurreratuei begira, markak gehitu daitezke beste aplikazio batzuen bidez, adibidez Tasker.
<b>Mugarik gabe</b>
Jarraitu nahi adina ohitura. Loop-ek ez du muga artifizialik ezartzen sor ditzakezun ohituretan. Ezaugarri guztiak erabiltzaile guztien eskura daude. Ez dago aplikazioko erosketarik.
<b>Erabat iragarkiz libre eta iturri irekikoa</b>
Ez dago iragarkirik, jakinarazpen gogaikarririk edo baimen intrusiborik aplikazio honetan, eta ez da inoiz egongo. Aplikazioa guztiz irekia da (GPLv3).
<b>Lineaz kanpo funtzionatzen du eta zure pribatutasuna errespetatzen du</b>
Loop-ek ez du Interneteko konexiorik edo lineako kontuen erregistrorik behar. Zure datu konfidentzialak ez zaizkio inori bidaliko. Inork ez dauka sarbidea zure datuetara, ez garatzaileek ez beste inor.

View File

@@ -0,0 +1 @@
Sortu ohitura onak eta jarraitu haien aurrerapenak denboran zehar

View File

@@ -0,0 +1 @@
ایجاد عادت های خوب و پیگیری پیشرفت آنها در طول زمان (بدون تبلیغ)

View File

@@ -0,0 +1,29 @@
Loop Habit Tracker vous aide à développer et à maintenir des habitudes positives à long terme dans votre vie. Des graphiques et des statistiques détaillés vous donnent des images claires de l'amélioration de vos habitudes au fil du temps. L'application ne présente aucune publicité, elle est open source et elle respecte votre vie privée.
<b>Interface magnifique, minimaliste et légère</b>
Loop a une interface élégante et minimaliste qui est très facile à utiliser, même pour les nouveaux utilisateurs. Hautement optimisée pour la vitesse, l'application fonctionne bien même sur les téléphones plus anciens.
<b>Score d'habitude</b>
Loop a une formule avancée pour calculer la force de vos habitudes. Chaque répétition renforce votre habitude et chaque jour manqué la rend plus faible. Cependant, quelques jours manqués après une longue séquence ne détruiront pas complètement votre progression, contrairement à de nombreuses autres applications.
<b>Horaires flexibles</b>
En plus des habitudes quotidiennes, Loop prend en charge des habitudes avec des horaires plus complexes, comme 3 fois par semaine ou tous les deux jours.
<b>Rappels</b>
Planifiez des notifications pour vous rappeler vos habitudes. Chaque habitude peut avoir son propre rappel, à un moment choisi de la journée. Vérifiez ou rejetez facilement votre habitude directement à partir de la notification.
<b>Widgets</b>
Obtenez un rappel de vos habitudes à chaque fois que vous déverrouillez votre téléphone. Des widgets colorés vous permettent de suivre vos habitudes directement depuis votre écran d'accueil, sans même ouvrir l'application.
<b>Prenez le contrôle de vos données</b>
Si vous souhaitez analyser davantage vos données ou les déplacer vers un autre service, Loop vous permet de les exporter vers des feuilles de calcul (CSV) ou vers un fichier de base de données (SQLite). Pour les utilisateurs expérimentés, des crochets peuvent être ajoutées via d'autres applications, telles que Tasker.
<b>Pas de limites</b>
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).
<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.

View File

@@ -0,0 +1 @@
Créez de bonnes habitudes et suivez leurs progrès au fil du temps (sans publicité)

View File

@@ -0,0 +1,29 @@
Loop Habit Tracker membantu Anda menciptakan dan memelihara kebiasaan positif jangka panjang dalam hidup Anda. Grafik dan statistik terperinci memberi Anda gambaran yang jelas tentang bagaimana kebiasaan Anda meningkat dari waktu ke waktu. Aplikasi ini sepenuhnya bebas iklan, kode sumber terbuka dan menghargai privasi Anda.
<b>Antarmuka yang indah, minimalis, dan ringan</b>
Loop memiliki antarmuka yang elegan dan minimalis yang sangat mudah digunakan, bahkan untuk pengguna pertama kali. Sangat dioptimalkan untuk kecepatan, aplikasi ini bekerja dengan baik bahkan pada ponsel lama.
<b>Skor Kebiasaan</b>
Loop memiliki formula canggih untuk menghitung kekuatan kebiasaan Anda. Setiap pengulangan membuat kebiasaan Anda lebih kuat dan setiap hari yang terlewat menjadikannya lebih lemah. Namun, beberapa hari yang terlewatkan setelah rentetan panjang, tidak akan sepenuhnya menghancurkan kemajuan Anda, tidak seperti banyak aplikasi lain yang tidak putus rantai.
<b>Jadwal fleksibel</b>
Selain kebiasaan sehari-hari, Loop mendukung kebiasaan dengan jadwal yang lebih kompleks, seperti 3 kali per minggu atau setiap hari.
<b>Pengingat</b>
Jadwalkan pemberitahuan untuk mengingatkan Anda tentang kebiasaan Anda. Setiap kebiasaan dapat memiliki pengingatnya sendiri, pada waktu yang dipilih hari itu. Periksa atau abaikan kebiasaan Anda langsung dari notifikasi.
<b>Widget</b>
Ingatkan kebiasaan Anda setiap kali Anda membuka kunci ponsel. Widget berwarna-warni memungkinkan Anda untuk melacak kebiasaan Anda langsung dari layar utama, bahkan tanpa membuka aplikasi.
<b>Kendalikan data Anda</b>
Jika Anda ingin menganalisis lebih lanjut data Anda, atau memindahkannya ke layanan lain, Loop mengizinkan Anda untuk mengekspornya ke spreadsheet (CSV) atau ke file database (SQLite). Untuk pengguna tingkat lanjut, tanda centang dapat ditambahkan melalui aplikasi lain, seperti Tasker.
<b>Tidak ada batasan</b>
Lacak kebiasaan sebanyak yang Anda inginkan. Loop tidak membatasi seberapa banyak kebiasaan yang dapat Anda miliki. Semua fitur tersedia untuk semua pengguna. Tidak ada pembelian di dalam aplikasi (IAP)
<b>Bebas iklan dan open source</b>
Tidak ada iklan, pemberitahuan yang mengganggu, atau izin yang mengganggu dalam aplikasi ini, dan tidak akan pernah ada. Aplikasi ini sepenuhnya bersumber terbuka (GPLv3).
<b>Tidak membutuhkan koneksi internet dan menghargai privasi anda</b>
Loop tidak membutuhkan koneksi internet atau pendaftaran akun secara online Data rahasia anda tidak akan pernah dikirim kepada siapapun Tidak juga pengembang maupun pihak ketiga punya akses pada itu

View File

@@ -0,0 +1 @@
Ciptakan kebiasaan baik dan lacak perkembangannya dari waktu ke waktu (bebas iklan)

View File

@@ -0,0 +1,29 @@
Loop Habit Tracker ti aiuta a creare e mantenere abitudini positive a lungo termine nella tua vita. Grafici e statistiche dettagliate ti danno un quadro chiaro di come le tue abitudini sono migliorate nel tempo. L'app è completamente priva di pubblicità, open source e rispetta la tua privacy.
<b>Interfaccia gradevole, minimalista e leggera</b>
Loop ha un'interfaccia elegante e minimalista molto facile da usare, anche per i nuovi utenti. Altamente ottimizzata per la velocità, l'app funziona bene anche sui vecchi telefoni.
<b>Punteggio abitudine</b>
Loop ha una formula avanzata per calcolare la forza delle tue abitudini. Ogni ripetizione rende la tua abitudine più forte e ogni giorno perso la rende più debole. Alcuni giorni persi dopo una lunga serie, tuttavia, non distruggeranno completamente i tuoi progressi, a differenza di molte altre app.
<b>Pianificazioni flessibili</b>
Oltre alle abitudini quotidiane, Loop supporta abitudini con programmi più complessi, come 3 volte a settimana o a giorni alterni.
<b>Promemoria</b>
Pianifica le notifiche per ricordarti le tue abitudini. Ogni abitudine può avere il suo promemoria, all'ora prescelta del giorno. Controlla o elimina facilmente l'abitudine direttamente dalla notifica.
<b>Widget</b>
Ricorda le tue abitudini ogni volta che sblocchi il telefono. I widget colorati ti consentono di monitorare le tue abitudini direttamente dalla schermata iniziale, senza nemmeno aprire l'app.
<b>Prendi il controllo dei tuoi dati</b>
Se desideri analizzare ulteriormente i tuoi dati o spostarli su un altro servizio, Loop ti consente di esportarli in fogli di calcolo (CSV) o in un file di database (SQLite). Per gli utenti esperti, i segni di spunta possono essere aggiunti tramite altre app, come Tasker.
<b>Nessuna limitazione</b>
Tieni traccia di tutte le abitudini che desideri. Il loop non impone limiti riguardo il numero di abitudini che puoi avere. Tutte le funzionalità sono disponibili per tutti gli utenti. Non ci sono acquisti in-app.
<b>Senza pubblicità e open source</b>
Non ci sono pubblicità, fastidiose notifiche o permessi intrusivi in questa app, e non ci saranno mai. L'app è completamente open-source (GPLv3).
<b>Funziona offline e rispetta la tua privacy</b>
Loop non richiede una connessione Internet o la registrazione dell'account online. I tuoi dati riservati non vengono mai inviati a nessuno. Né gli sviluppatori né terze parti hanno accesso ad esso.

View File

@@ -0,0 +1 @@
Crea buone abitudini e monitora i loro progressi nel tempo (senza pubblicità)

View File

@@ -0,0 +1 @@
良い習慣を作り、その進捗を長期にわたって追跡できる便利なツール(広告なし)

View File

@@ -0,0 +1 @@
좋은 습관을 만들고, 시간이 지나면서 습관이 어떻게 발전하는지 지켜보세요.

View File

@@ -0,0 +1,29 @@
Loop Habit Tracker helpt je bij het creëren van positieve gewoontes in je leven en deze langdurig vast te houden. Gedetailleerde grafieken en statistieken geven je een duidelijk beeld van hoe je gewoontes in de loop van de tijd zijn verbeterd. De app is volledig advertentievrij, open source en respecteert je privacy.
<b>Mooi, minimalistisch met een simpele database-achtige interface</b>
Loop heeft een elegante en simpele interface die erg makkelijk in gebruik is, zelfs voor beginners. De app is zeer geoptimaliseerd voor snelheid en werkt zelfs goed op oudere telefoons.
<b>Gewoontescore</b>
Loop heeft een geavanceerde formule om de sterkte van je gewoontes te berekenen. Elke herhaling maakt je gewoonte sterker en elke gemiste dag maakt hem zwakker. Een paar gemiste dagen na een lange reeks zullen je voortgang niet volledig tenietdoen, in tegenstelling tot vele andere verbreek-de-reeks-niet apps.
<b>Flexibele schema's</b>
Naast dagelijkse gewoontes ondersteunt Loop gewoontes met complexere schema's, zoals 3 keer per week of elke andere dag.
<b>Herinneringen</b>
Plan notificaties om jezelf te herinneren aan je gewoontes. Elke gewoonte kan zijn eigen herinnering krijgen, op een zelf gekozen tijd. Je gewoonte kun je direct vanuit de melding als gedaan afwijzen of aanvinken.
<b>Widgets</b>
Wordt bij elke telefoonontgrendeling herinnerd aan je gewoontes. Kleurrijke widgets maken het mogelijk je gewoontes direct vanuit het startscherm te tracken, zonder de app te openen.
<b>Neem controle over uw gegevens</b>
Als je jouw gegevens verder wilt analyseren, of wil verplaatsen in een andere service, dan geeft Loop je de mogelijkheid het te exporteren naar spreadsheets (CSV) of naar een databasebestand (SQlite). Voor hoofdgebruikers kunnen vinkjes worden toegevoegd via andere apps, zoals Tasker.
<b>Geen beperkingen</b>
Track zoveel gewoontes als je wil. Loop legt geen kunstmatige grenzen op aan het aantal gewoontes dat je kan hebben. Alle functies zijn beschikbaar voor alle gebruikers. Er zijn geen in-app aankopen.
<b>Volledig advertentievrij en open source</b>
Er zijn geen advertenties, vervelende meldingen of opdringerige machtigingen in deze app, en dat zal nooit zo zijn. De app is volledig open source (GPLv3).
<b>Werkt offline en respecteert je privacy</b>
Loop vereist geen internetverbinding of online accountregistratie. Je vertrouwelijke gegevens zullen nooit met anderen worden gedeeld. Noch de ontwikkelaars noch derden hebben er toegang toe.

View File

@@ -0,0 +1 @@
Creëer goede gewoontes en track hun voortgang in de loop van de tijd (advertentievrij)

View File

@@ -0,0 +1,29 @@
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ść.
<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.
Ocena nawyku
Aplikacja wykorzystuje zaawansowany algorytm obliczający siłę twoich nawyków. Każde powtórzenie sprawia, że twój nawyk staje się silniejszy, a każdy stracony dzień sprawia, że jest słabszy. Jednak kilka opuszczonych dni po długiej passie nie zrujnuje całkowicie Twoich postępów, w przeciwieństwie do wielu innych aplikacji typu "dont-break-the-chain"
<b>Elastyczne harmonogramy</b>
Oprócz codziennych nawyków obsługuje nawyki z bardziej złożonymi harmonogramami, na przykład "3 razy w tygodniu" lub "co drugi dzień".
<b>Przypomnienia</b>
Zaplanuj powiadomienia przypominające o swoich nawykach. Każdy nawyk może mieć własne przypomnienie o wybranej porze dnia. Łatwo sprawdź lub odrzuć swój nawyk bezpośrednio z powiadomienia.
<b>Widżety</b>
Przypominaj o swoich nawykach za każdym razem, gdy odblokujesz telefon. Kolorowe widżety pozwalają śledzić swoje nawyki bezpośrednio z ekranu głównego, nawet bez otwierania aplikacji.
<b>Przejmij kontrolę nad swoimi danymi</b>
Jeśli chcesz dalej analizować swoje dane lub przenieść je do innej usługi, Loop umożliwia wyeksportowanie ich do arkusza kalkulacyjnego (CSV) lub do pliku bazy danych (SQLite). W przypadku zaawansowanych użytkowników znaczniki wyboru można dodawać za pośrednictwem innych aplikacji, takich jak Tasker.
<b>Brak ograniczeń</b>
Śledź tyle nawyków, ile chcesz. Aplikacja Loop nie nakłada sztucznych ograniczeń na liczbę stworzonych nawyków. Te funkcje są dostępne we wszystkich planach. Brak zakupów w aplikacji.
<b>Całkowicie wolna od reklam i otwartoźródłowa</b>
W aplikacji brak, teraz i w przyszłości, reklam, irytujących powiadomień lub inwazyjnych uprawnień. Aplikacja jest całkowicie otwartoźródłowa (GPLv3).
<b>Działa w trybie offline i szanuje Twoją prywatność</b>
Aplikacja nie wymaga połączenia z Internetem ani rejestracji konta online. Twoje poufne dane nie są nigdy nikomu wysyłane. Ani programiści, ani osoby trzecie nie mają do nich dostępu.

View File

@@ -0,0 +1 @@
Twórz dobre nawyki i śledź ich postępy w czasie (bez reklam)

View File

@@ -0,0 +1,29 @@
O Rastreador de Hábitos Loop ajuda a criar e manter hábitos positivos a longo prazo em sua vida. Gráficos e estatísticas detalhados fornecem uma imagem clara de como seus hábitos melhoraram ao longo do tempo. O aplicativo é totalmente livre de anúncios, de código aberto e respeita a sua privacidade.
Bonito, minimalista e interface leve
O Loop possui uma interface elegante e minimalista, muito fácil de usar, mesmo para usuários iniciantes. Altamente otimizado para velocidade, o aplicativo funciona bem mesmo em telefones mais antigos.
<b>Contagem de hábito</b>
O Loop possui uma fórmula avançada para calcular a força de seus hábitos. Cada repetição fortalece seu hábito e todos os dias perdidos o tornam mais fraco. Alguns dias perdidos após uma longa sequência, no entanto, não destruirão completamente seu progresso, ao contrário de muitos outros aplicativos não-quebre-a-maré.
<b>Cronogramas flexíveis</b>
Além dos hábitos diários, o Loop suporta hábitos com cronogramas mais complexos, como 3 vezes por semana ou em dias alternados.
<b>Lembretes</b>
Agende notificações para lembrá-lo de seus hábitos. Cada hábito pode ter seu próprio lembrete, no horário escolhido. Verifique ou dispense facilmente seu hábito diretamente da notificação.
<b>Widgets</b>
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.
<b>Sem limitações</b>
Acompanhe quantos hábitos desejar. O loop não impõe limites artificiais para quantos hábitos você pode ter. Todos os recursos estão disponíveis para todos os usuários. Não há compras no aplicativo.
<b>Código-fonte aberto e completamente livre de anúncios</b>
Não há anúncios, notificações irritantes ou permissões intrusivas neste aplicativo, e nunca haverá. O aplicativo é completamente de código aberto (GPLv3).
<b>Funciona offline e respeita sua privacidade</b>
O loop não requer conexão com a Internet ou registro de conta online. Seus dados confidenciais nunca são enviados a ninguém. Nem os desenvolvedores nem terceiros têm acesso a ele.

View File

@@ -0,0 +1 @@
Crie bons hábitos e acompanhe seu progresso ao longo do tempo (sem anúncios)

View File

@@ -0,0 +1,29 @@
Loop - Rastreador de Hábitos ajuda-te a criar e a manter na tua vida, bons hábitos de longo prazo . Gráficos e estatísticas detalhadas fornecem uma imagem clara de como os seus hábitos melhoram ao longo do tempo. Esta app é completamente livre de anúncios, criada em código aberto com respeito à sua privacidade.
<b>Interface bonita, minimalista e rápida</b>
Loop possui uma interface elegante e minimalista que é muito fácil de usar, mesmo para utilizadores inexperientes. Altamente optimizado para rapidez e estabilidade, o aplicativo funciona bem mesmo em telemóveis mais antigos.
<b>Pontuação dos hábitos</b>
Loop tem uma fórmula avançada para calcular a força dos seus hábitos. Cada repetição concluída torna o seu hábito mais forte e a cada dia perdido o tornará mais fraco. No entanto, após alguns dias perdidos numa longa série, não irá destruir completamente o seu progresso, ao contrário de muitos outras app's de rastreamento de hábitos em cadeia.
<b>Horários flexíveis</b>
Para além dos hábitos diários, o Loop oferece suporte a hábitos com horários mais complexos, como 3 vezes por semana ou em dias alternados.
<b>Lembretes</b>
Agende notificações para lembrá-lo dos seus hábitos. Cada hábito pode ter o seu próprio lembrete numa determinada hora do dia. Marque ou desmarque facilmente o seu hábito directamente na notificação.
<b>Widgets</b>
Seja lembrado dos seus hábitos sempre que desbloquear o telefone. Os widgets coloridos permitem-lhe que rastreie os seus hábitos diretamente da tela inicial, sem ter que abrir a app.
<b>Assuma o controle dos seus dados</b>
Se você quiser analisar mais detalhadamente os seus dados, ou movê-los para outro serviço, Loop permite exportar para folhas de cálculo (CSV) ou para um arquivo de base de dados (SQLite). Para usuários mais avançados, as marcas de verificação podem ser adicionadas por meio de outros aplicativos, como o Tasker.
<b>Sem limites</b>
Rastreie tantos hábitos quanto desejar. Loop não impõe limites artificiais sobre quantos hábitos você pode ter. Todas as funcionalidades estão disponíveis para todos os utilizadores. Não existe qualquer tipo de compras in-app.
<b>Código aberto e completamente livre de anúncios</b>
Não há anúncios, notificações irritantes ou permissões intrusivas nesta app, nem nunca irá existir. A app é totalmente criada em código aberto (GPLv3).
<b>Funciona offline e respeita a tua privacidade</b>
Loop não precisa de uma ligação à Internet ou registo de uma conta online. Os teus dados confidenciais nunca serão enviados a ninguém. Nem os programadores, nem terceiros têm acesso aos dados.

View File

@@ -0,0 +1 @@
Crie bons hábitos e acompanhe o seu progresso ao longo do tempo (sem anúncios)

View File

@@ -0,0 +1,29 @@
Трекер привычек Loop помогает вам создавать и поддерживать долгосрочные позитивные привычки в своей жизни. Подробные графики и статистика дадут вам чёткое представление о том, как ваши привычки улучшились с течением времени. Приложение полностью без рекламы, с открытым исходным кодом и с уважением к вашей конфиденциальности.
<b>Красивый, минималистичный и лёгкий интерфейс</b>
У Loop изящный и минималистичный интерфейс, который очень прост в использовании даже для начинающих пользователей. Высокооптимизированное для скорости, приложение хорошо работает даже на старых телефонах.
<b>Показатель привычек</b>
У Loop есть продвинутая формула для расчёта силы ваших привычек. Каждое повторение делает вашу привычку сильнее, а каждый пропущенный день - слабее. Однако несколько пропущенных дней после долгой полосы не погубят ваш прогресс в отличие от многих других приложений типа "не разрывай цепь".
<b>Гибкий график</b>
В дополнение к ежедневным привычкам, Loop поддерживает привычки с более сложным расписанием, таким как 3 раза в неделю или через день.
<b>Напоминания</b>
Назначайте уведомления для напоминания о ваших привычках. У каждой привычки может быть своё напоминание в выбранное время дня. С лёгкостью отмечайте или отклоняйте привычку прямо из уведомления.
<b>Виджеты</b>
Получайте напоминание о ваших привычках при разблокировке телефона. Красочные виджеты позволяют отслеживать ваши привычки прямо с домашнего экрана, даже не открывая приложение.
<b>Возьмите под контроль свои данные</b>
Если вы хотите дополнительно проанализировать свои данные или переместить их в другой сервис, Loop позволит вам экспортировать их в электронные таблицы (CSV) или в файл базы данных (SQLite). Опытные пользователи могут делать отметки через другие приложения, такие как Tasker.
<b>Без ограничений</b>
Отслеживайте так много привычек, сколько хотите. Loop не накладывает никаких искусственных ограничений на количество ваших привычек. Все функции доступны всем пользователям. В приложении нет покупок.
<b>Полностью без рекламы и с открытым исходным кодом</b>
В этом приложении нет рекламы, раздражающих уведомлений или навязчивых разрешений, и их никогда не будет. Приложение полностью с открытым исходным кодом (GPLv3).
<b>Работает без сети и уважает вашу конфиденциальность</b>
Loop не требует подключения к Интернету или регистрации учётной записи в сети. Ваши конфиденциальные данные никогда никому не отправляются. Ни разработчики, ни третьи стороны не имеют к ним доступа.

View File

@@ -0,0 +1 @@
Создавайте хорошие привычки и отслеживайте их прогресс со временем (без рекламы)

View File

@@ -0,0 +1,29 @@
Loop Habit Tracker vám pomáha vytvárať a udržiavať dlhodobé pozitívne návyky vo vašom živote. Podrobné grafy a štatistiky vám poskytujú jasný obraz o tom, ako sa vaše návyky v priebehu času zlepšili. Aplikácia je úplne bez reklám, s otvoreným zdrojovým kódom a rešpektuje vaše súkromie.
<b>Krásne, minimalistické a prehľadné rozhranie</b>
Loop má elegantné a minimalistické rozhranie, ktoré sa veľmi ľahko používa, dokonca aj pre začínajúcich používateľov. Aplikácia je vysoko optimalizovaná na rýchlosť a funguje dobre aj na starších telefónoch.
<b>Skóre návyku</b>
Loop má pokročilý vzorec na výpočet sily vašich návykov. Každé opakovanie robí váš návyk silnejším a každý zmeškaný deň ho oslabuje. Niekoľko zmeškaných dní po dlhej sérii vám však na rozdiel od mnohých iných aplikácií neprerušujúcich reťazec úplne nezničí váš pokrok.
<b>Flexibilné plány</b>
Okrem denných návykov podporuje Loop návyky aj pri zložitejších plánoch, napríklad trikrát týždenne alebo každý druhý deň.
<b>Pripomienky</b>
Naplánujte si upozornenia, ktoré vám pripomenú vaše návyky. Každý návyk môže mať svoje vlastné pripomenutie vo zvolenú dennú dobu. Svoj návyk môžete ľahko potvrdiť alebo vylúčiť priamo z oznámenia.
<b>Widgety</b>
Nechajte si pri každom odomknutí telefónu pripomenúť vaše navyky. Farebné widgety vám umožňujú sledovať vaše návyky priamo z domovskej obrazovky bez toho, aby ste aplikáciu vôbec otvorili.
<b>Prevezmite kontrolu nad svojimi údajmi</b>
Ak chcete svoje údaje ďalej analyzovať alebo ich presunúť do inej služby, Loop vám umožní exportovať ich do tabuliek (CSV) alebo do databázového súboru (SQLite). Pre pokročilých používateľov môžu byť začiarkavacie značky pridané prostredníctvom ďalších aplikácií, ako napríklad Tasker.
<b>Žiadne obmedzenia</b>
Sledujte toľko návykov, koľko si prajete. Loop nijako umelo neobmedzuje počet návykov, ktoré môžete mať. Všetky funkcie sú k dispozícii všetkým používateľom. Neexistujú žiadne nákupy v aplikácii.
<b>Úplne bez reklám a s otvoreným zdrojovým kódom</b>
V tejto aplikácii nie sú žiadne reklamy, nepríjemné upozornenia ani dotieravé povolenia a nikdy nebudú. Aplikácia je úplne otvorená (GPLv3).
<b>Funguje offline a rešpektuje vaše súkromie</b>
Loop nevyžaduje pripojenie na internet ani registráciu online účtu. Vaše dôverné údaje sa nikdy nikomu neodosielajú. Prístup k nim nemajú vývojári ani tretie strany.

View File

@@ -0,0 +1 @@
Vytvárajte dobré návyky a sledujte ich vývoj v priebehu času (bez reklám)

View File

@@ -0,0 +1,29 @@
Loop Habit Tracker hjälper dig att skapa och upprätthålla långsiktiga, gynnsamma vanor i ditt liv. Detaljrika diagram och statistik ger dig en tydlig bild av hur dina vanor har förbättrats med tiden. Appen är helt fri från annonser, har öppen källkod och respekterar din integritet.
<b>Vackert, minimalistiskt och stilrent gränssnitt</b>
Loop har ett elegant och minimalistiskt gränssnitt som är mycket lättanvänt, även för förstagångsanvändare. Appen är optimerad för hastighet och fungerar bra även på äldre telefoner.
<b>Vanepoäng</b>
Loop har en avancerad formel för att beräkna dina vanors styrka. Varje upprepning gör din vana starkare och varje missad dag gör den svagare. Ett par missade dagar efter en lång serie kommer dock inte förstöra dina framsteg helt, till skillnad från många andra "don't-break-the-chain"-appar.
<b>Flexibla scheman</b>
Förutom dagliga vanor stödjer Loop vanor med mer komplexa scheman, t.ex. 3 gånger per vecka eller varannan dag.
<b>Påminnelser</b>
Schemalägg aviseringar för att påminna dig om dina vanor. Varje vana kan ha en egen påminnelse, vid en vald tidpunkt på dagen. Bocka av eller avfärda din vana enkelt direkt i aviseringen.
<b>Widgetar</b>
Bli påmind om dina vanor när du låser upp din telefon. Färgglada widgetar låter dig hålla koll på dina vanor direkt från din hemskärm, utan att ens behöva öppna appen.
<b>Ta kontroll över din data</b>
Om du vill analysera din data ytterligare eller byta till en annan tjänst låter Loop dig exportera den till ett kalkylark (CSV) eller en databasfil (SQLite). För avancerade användare kan vanor bockas av via andra appar, t.ex. Tasker.
<b>Inga begränsningar</b>
Håll koll på hur många vanor du vill. Loop sätter inga godtyckliga gränser för hur många vanor du kan ha. Alla funktioner är tillgängliga för samtliga användare. Det finns inga köp i appen.
<b>Helt fri från annonser och med öppen källkod</b>
Det finns inga annonser, irriterande aviseringar eller inkräktande behörigheter i den här appen, och så kommer det förbli. Appen har helt öppen källkod (GPLv3).
<b>Fungerar offline och respekterar din integritet</b>
Loop kräver ingen internetanslutning eller kontoregistrering. Dina konfidentiella uppgifter skickas aldrig till någon. Varken utvecklarna eller någon tredje part har tillgång till dem.

View File

@@ -0,0 +1 @@
Skapa goda vanor och håll koll på dina framsteg över tid (fri från annonser)

View File

@@ -0,0 +1 @@
మంచి అలవాట్లను సృష్టించండి మరియు కాలక్రమేణా వారి పురోగతిని ట్రాక్ చేయండి

View File

@@ -0,0 +1,29 @@
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.
<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.
<b>Alışkanlık puanı</b>
Loop, alışkanlıklarınızın kalıcılığını hesaplamak için gelişmiş bir formül kullanır. Her tekrar, alışkanlığınızı güçlendirir ve kaçırdığınız her gün onu zayıflatır. Ayrıca, uzun bir tekrar serisinin ardından kaçırılan birkaç gün, diğer birçok uygulamanın aksine gelişim grafiğinizi tamamen bozmayacaktır.
<b>Esnek programlar</b>
Loop, günlük alışkanlıkların yanında, daha karmaşık programları da (örneğin haftada 3 kez veya gün aşırı gibi) destekler.
<b>Hatırlatmalar</b>
Alışkanlıklarınızı size hatırlatması için bildirimler ayarlayabilirsiniz. Her alışkanlık için özel bir bildirim ayarlayabilirsiniz, belirlediğiniz zamanda hatırlatmak üzere. Alışkanlığınızı doğrudan bildirimlerden kolayca işaretleyin veya erteleyin.
<b>Widget'lar</b>
Telefonunuzun kilidini her açtığınızda alışkanlıklarınız size hatırlatılır. Renkli widget'lar, uygulamayı açmadan bile alışkanlıklarınızı doğrudan ana ekranınızdan izlemenizi sağlar.
<b>Verilerinizin kontrolünü elinize alın</b>
Loop, daha ayrıntılı analiz etmek veya başka bir uygulamaya taşımak için alışkanlık verilerinizi elektronik tablolara (CSV) veya bir veritabanı dosyasına (SQLite) aktarmanıza olanak tanır. İleri düzey kullanıcılar için, yapıldı işaretleri Tasker gibi diğer uygulamalar aracılığıyla konulabilir.
<b>Kısıtlama yok</b>
İstediğiniz kadar alışkanlığı takip edin. Loop, sahip olabileceğiniz alışkanlık miktarına hiçbir kısıtlama getirmez. Tüm özellikler tüm kullanıcılar tarafından kullanılabilir. Tamamen ücretsizdir.
<b>Reklamsız ve açık kaynaktır</b>
Bu uygulamada hiçbir reklam, sinir bozucu bildirim veya sürekli çıkan izin isteği yoktur ve asla olmayacaktır. Uygulama tamamen açık kaynaklıdır (GPLv3).
<b>Çevrimdışı çalışır ve gizliliğinize saygı duyar</b>
Loop, internet bağlantısı veya çevrimiçi hesap kaydı gerektirmez. Gizli verileriniz asla kimseye gönderilmez. Ne geliştiricilerin ne de üçüncü şahısların verilerinize erişimi yoktur.

View File

@@ -0,0 +1 @@
İyi alışkanlıklar oluşturun ve zaman içindeki ilerlemelerini izleyin (reklamsız)

View File

@@ -0,0 +1,29 @@
Трекер звичок Loop допоможе Вам у створенні та підтримці тривалих позитивних звичок у Вашому житті. Детальні діяграми та статистика дадуть вам чітке уявлення про те, як Ваші звички покращилися з плином часу. Застосунок є абсолютно безкоштовним, з відкритим вихідним кодом, а також поважає Вашу конфіденційність.
<b>Гарний, мінімалістський і легкий інтерфейс</b>
Застосунок має елегантний та мінімалістичний інтерфейс, який дуже простий у використанні, навіть для користувачів-новачків програми. Гарно оптимізована для роботи, програма працює навіть на старих телефонах.
<b>Результат звички</b>
В Loop є просунута форма для розрахунку сили Ваших звичок. Кожне повторення робить звичку сильнішою, а кожний пропущений день — слабкішою. Однак кілька пропущених днів після тривалої серії не знищать Ваш поступ, на відміну від багатьох інших додатків, на кшталт «не рвіть ланцюжок".
<b>Гнучкі графіки</b>
На додачу до щоденних звичок, Loop підтримує звички з більш складним графіком, як-от 3 рази на тиждень або через день.
<b>Нагадування</b>
Розплануйте сповіщення для нагадувань про Ваші звички. Кожна звичка може мати своє нагадування у вибраний час дня. Легко відзначайте або відхиляйте Вашу звичку прямо у сповіщенні.
<b>Віджети</b>
Отримуйте нагадування про Ваші звички при розблокуванні телефону. Яскраві віджети дозволяють відстежувати Ваші звички просто з головного екрану, навіть не відкриваючи програму.
<b>Візьміть під контроль Ваші дані</b>
Якщо Ви хочете додатково проаналізувати свої дані або перемістити їх ув інший сервіс, Loop дозволить Вам експортувати їх до таблиць (CSV) або файлів бази даних (SQLite). Досвідчені користувачі можуть робити позначки через інші програми, як-от Tasker.
<b>Жодних обмежень</b>
Відслідковуйте стільки звичок, скільки бажаєте. Loop не накладає жодних штучних обмежень на кількість Ваших звичок. Усі функції доступні для всіх користувачів. У програмі немає покупок.
<b>Повністю без реклами та з відкритим вихідним кодом</b>
У цій програмі немає реклами, дратівливих сповіщень або нав'язливих дозволів, і їх ніколи не буде. Застосунок повністю з відкритим кодом (GPLv3).
<b>Працює в режимі офлайн і поважає Вашу конфіденційність</b>
Loop не вимагає під'єднання до Інтернету або реєстрації облікового запису в мережі. Ваші конфіденційні дані ніколи нікому не надсилаються. Ні розробники, ні треті особи не мають до них доступу.

View File

@@ -0,0 +1 @@
Створюйте хороші звички і відстежуйте поступ з часом (без реклами)

View File

@@ -0,0 +1,29 @@
Loop Habit Tracker giúp bạn tạo và duy trì những thói quen lâu dài tích cực trong cuộc sống. Biểu đồ và số liệu thống kê chi tiết cung cấp cho bạn một cái nhìn cụ thể về cách các thói quen của bạn đã được cải thiện theo thời gian. Ứng dụng này hoàn toàn không có quảng cáo, mã nguồn mở và tôn trọng quyền riêng tư của bạn.
<b>Giao diện đẹp, đơn giản và nhẹ</b>
Loop có giao diện thanh lịch và tối giản, rất dễ sử dụng, ngay cả đối với người dùng lần đầu. Tối ưu hóa cao về tốc độ, ứng dụng hoạt động tốt ngay cả trên điện thoại cũ.
<b>Điểm thói quen</b>
Loop có một công thức để tính toán độ mạnh của các thói quen của bạn. Mỗi lần lặp lại một thói quen làm cho thói quen của bạn mạnh hơn và mỗi ngày bạn bỏ qua thói quen đó làm cho nó yếu đi. Tuy nhiên, một vài ngày bị bỏ lỡ sau một chuỗi ngày dài sẽ không phá hủy hoàn toàn tiến trình của bạn, không giống như nhiều ứng dụng không-được-phá-chuỗi khác.
<b>Lịch trình linh hoạt</b>
Ngoài thói quen hàng ngày, Loop hỗ trợ các thói quen với lịch trình phức tạp hơn, chẳng hạn như 3 lần mỗi tuần hoặc mỗi hai ngày.
<b>Nhắc nhở</b>
Lịch trình thông báo để nhắc nhở bạn về thói quen của bạn. Mỗi thói quen có thể có lời nhắc riêng, vào một thời điểm được chọn trong ngày. Dễ dàng kiểm tra hoặc loại bỏ thói quen của bạn trực tiếp từ thông báo.
<b>Tiện ích</b>
Bạn sẽ được nhắc nhở về thói quen của bạn bất cứ khi nào bạn mở khóa điện thoại của bạn. Các vật dụng đầy màu sắc cho phép bạn theo dõi thói quen của mình trực tiếp từ màn hình chính mà không cần mở ứng dụng.
<b>Kiểm soát dữ liệu của bạn</b>
Nếu bạn muốn phân tích thêm dữ liệu của mình hoặc chuyển dữ liệu sang dịch vụ khác, Loop cho phép bạn xuất dữ liệu sang bảng tính (CSV) hoặc tệp cơ sở dữ liệu (SQLite). Đối với người dùng cấp cao, có thể thêm dấu thông qua các ứng dụng khác, chẳng hạn như Tasker.
<b>Không giới hạn</b>
Theo dõi bao nhiêu thói quen tùy ý. Loop áp đặt không có giới hạn về số lượng thói quen bạn có thể có. Tất cả các tính năng có sẵn cho tất cả người dùng. Không có tính năng mua trong ứng dụng.
<b>Hoàn toàn không có quảng cáo và mã nguồn mở</b>
Không có quảng cáo, thông báo gây phiền nhiễu hoặc quyền xâm nhập trong ứng dụng này và sẽ không bao giờ có. Ứng dụng này hoàn toàn là mã nguồn mở (GPLv3).
<b>Hoạt động ngoại tuyến và tôn trọng quyền riêng tư của bạn</b>
Loop không yêu cầu kết nối Internet hoặc đăng ký tài khoản trực tuyến. Dữ liệu bí mật của bạn không bao giờ được gửi cho bất cứ ai. Cả nhà phát triển lẫn bất kỳ bên thứ ba nào cũng không có quyền truy cập nó.

View File

@@ -0,0 +1 @@
Tạo thói quen tốt và theo dõi tiến trình của họ theo thời gian

View File

@@ -0,0 +1,29 @@
Loop 循环习惯记录以下简称“Loop”可以帮助您建立好习惯且随着时间记录你的进步。 详细的图表和统计数据,可以使您更清楚地看到自己的进步。 该应用是完全无广告的开源软件,并且它尊重您的隐私。
<b>优雅、简约、轻巧</b>
Loop 具有优雅而简约的界面,即使对于初次使用的用户,也非常易于使用。 该应用针对速度进行了高度优化,即使在较旧的手机上也可以正常运行。
<b>习惯强度</b>
Loop 有高级的公式来计算您习惯的强度。 多多重复会使你的习惯更牢固, 但是,与其他记录的应用不同,即便您有几天没有记录习惯,依然不会破坏您的进度。
<b>弹性计划</b>
除了每天习惯之外Loop 还支持更加复杂的时间安排,例如每周三次或每天三次。
<b>提醒</b>
设定通知以提醒您完成习惯。 每一种习惯都有属于自己的通知,您可以选定当天的某个时间提醒该习惯。 同时从通知中轻松地检查或取消您的习惯。
<b>小部件</b>
当您解锁手机时, 多彩的小部件可让您直接从主屏幕记录自己的习惯,而无需打开应用程序。
<b>掌控您的数据</b>
如果您想进一步分析数据或将数据备份,则可以使用 Loop 将其导出为电子表格CSV或数据库文件SQLite。 对于高级用户可以通过其他应用程序例如Tasker使其自动化操作。
<b>无限制</b>
想记录多少习惯都没问题! Loop 对您的习惯没有任何限制, 所有用户均可使用所有功能, 并且没有应用内购买。
<b>完全无广告的开源软件</b>
此应用程序中永远没有任何广告,烦人的通知或侵入性权限, 应用程序是完全开源的完整的代码在GPLv3。
<b>脱机工作并尊重您的隐私</b>
Loop 不需要网络连接或在线帐户注册。 您的用户数据永远不会发送给任何人, 包括开发人员和任何第三方都无法访问它。

View File

@@ -0,0 +1 @@
建立好习惯且随着时间记录你的进步(无广告)

View File

@@ -0,0 +1,29 @@
「Loop 習以為常」會幫助您建立和維持長期的良好習慣。 將用清晰的統計圖表秀出你的進步過程。 這是一個尊重您的隱私、且完全免費的開源軟體。
</b>簡單、美觀、時尚的介面</b>
輕便型的設計讓菜鳥仔可以順利上手。 本程式在速度方面有著大幅改善,就算在舊手機上面也能正常運作。
<b>習慣評分</b>
內建高級的演算法來統計習慣的強度。 每完成一次就會提高強度;反之錯過則會減弱。 但中斷幾天並不會影響進度,這裡和其他的鎖鏈型記錄軟體有所不同。
<b>靈活的時間表</b>
一併支援日常習慣與複雜的計畫設定(例:每 1 週 3 次、每 2 天 3 次)。
<b>通知提醒</b>
可以選擇為每個習慣 加入通知提醒的時間。 不需要打開程式就能在通知欄作記錄。
<b>小工具</b>
只要解鎖手機, 就有豐富的的小工具可以直接在桌面追蹤記錄。
<b>掌握你自己的資料</b>
如果你想額外備份或分析資料這邊支援匯出資料表CSV和資料庫SQLite檔案。 對於更進階的使用者標記也可以自動從其他程式加入記錄Tasker
<b>沒有限制</b>
想記錄多少習慣就記多少。 程式裡面沒有假掰的一堆限制。 大家都能直接使用完整的功能, ,不需要靠內購課金來解鎖。
<b>完全零廣告的開源軟體</b>
永遠不會有煩躁的廣告或權限打擾。 本程式屬於開源軟體GPLv3
<b>支援離線作業、並且尊重隱私</b>
無需網路連線或線上註冊就可以使用。 本程式不會將您的資料傳給其他人、 開發者抑是第三方人員。

View File

@@ -0,0 +1 @@
養成良好的習慣並隨時將過程記錄起來(無廣告)

View File

@@ -1,11 +0,0 @@
1.8.7
* Fix notification issues
1.8:
* New bar chart showing number of repetitions performed each week, month or year
* Performing habits on irregular weekdays will no longer break your streak
* More colors to choose from (now 20 in total)
* Ability to customize how transparent the widgets are
* Ability to customize the first day of the week
* Yes/No buttons on notifications instead of just "Check"
* Automatic dark theme (Android 10)
* Smaller APK and backup files

View File

@@ -1,12 +0,0 @@
1.8.2:
* Fix issues with reminders
* Fix crash (HUAWEI)
1.8:
* New bar chart showing number of repetitions performed each week, month or year
* Performing habits on irregular weekdays will no longer break your streak
* More colors to choose from (now 20 in total)
* Ability to customize how transparent the widgets are
* Ability to customize the first day of the week
* Yes/No buttons on notifications instead of just "Check"
* Automatic dark theme (Android 10)
* Smaller APK and backup files

View File

@@ -0,0 +1,3 @@
1.8.12:
* Fix bug that caused incorrect check marks to show after scrolling
* Fix issue preventing widgets from updating at midnight

View File

@@ -1,5 +0,0 @@
Version 1.7.11:
* Fix bug that produced corrupted CSV files in some countries
Version 1.7.10:
* Fix bug that prevented notifications from appearing on some phones
* Update target SDK to Android Pie 9 (API Level 28)

View File

@@ -129,6 +129,8 @@
<TextView style="@style/About.Item" android:text="Nikhil (regularcoder)"/>
<TextView style="@style/About.Item" android:text="JanetQC"/>
<TextView style="@style/About.Item" android:text="olegivo"/>
<TextView style="@style/About.Item" android:text="Kristian Tashkov"/>
<TextView style="@style/About.Item" android:text="Quentin Hibon (hiqua)"/>
<TextView
android:id="@+id/tvContributors"
style="@style/About.Item.Clickable"

View File

@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<!--
~ Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com>
~
@@ -30,42 +29,28 @@
<string name="color_picker_default_title">تغيير اللون</string>
<string name="toast_habit_created">تم إنشاء عادة</string>
<string name="toast_habit_deleted">تم حذف العادات</string>
<string name="toast_habit_restored">تم إستعادة العادات</string>
<string name="toast_nothing_to_undo">لا شيء للتراجع</string>
<string name="toast_nothing_to_redo">لا شيء للإعادة</string>
<string name="toast_habit_changed">تم تغيير عادة</string>
<string name="toast_habit_changed_back">تمت إعادة العادة إلى أصلها</string>
<string name="toast_habit_archived">تم أرشفه العادات</string>
<string name="toast_habit_unarchived">تم الغاء ارشفه العادات</string>
<string name="overview">نظرة عامة</string>
<string name="habit_strength">قوة العادة</string>
<string name="history">السجل</string>
<string name="clear">إزالة</string>
<string name="description_hint">السؤال (هل قمت بـ ... اليوم؟)</string>
<string name="repeat">تكرار</string>
<string name="times_every">مرات في</string>
<string name="days">أيام</string>
<string name="reminder">تذكير</string>
<string name="discard">تجاهل</string>
<string name="save">حفظ</string>
<string name="streaks">الإنجازات</string>
<string name="no_habits_found"> لا يوجد لديك عادات مفعله</string>
<string name="long_press_to_toggle">إلمس و إستمر لتحقق أو ازل</string>
<string name="reminder_off">إيقاف</string>
<string name="validation_name_should_not_be_blank">لا يمكن أن يكون الإسم فارغ</string>
<string name="validation_number_should_be_positive">يجب أن يكون الرقم إيجابي</string>
<string name="validation_at_most_one_rep_per_day">يجب أن يكون التكرار مرة واحدة فقط كل يوم</string>
<string name="create_habit">انشاء العادة</string>
<string name="edit_habit">تعديل العادة</string>
<string name="check">حقق</string>
<string name="snooze">لاحقاً</string>
<!-- App introduction -->
<string name="intro_title_1">أهلا بك</string>
<string name="intro_description_1">Loop Habit Tracker يساعدك في بدء عادات جيدة والحفاظ عليها.</string>
<string name="intro_title_2">إنشاء بعض عادات جديدة</string>
<string name="intro_description_2">كل يوم، بعد أداء عادتك، ضع علامة عليها في التطبيق.</string>
<string name="intro_title_3">حافظ على القيام بذلك</string>
<string name="intro_description_3">العادات المنجزة باستمرار لمدة طويلة تحصل على نجمة.</string>
<string name="intro_title_4">تتبع تقدمك</string>
<string name="intro_description_4">رسوم بيانية مفصلة تُريك كيف تحسنت عاداتك مع مرور الوقت.</string>
<string name="interval_15_minutes">15 دقيقة</string>
@@ -75,18 +60,19 @@
<string name="interval_4_hour">أربع ساعات</string>
<string name="interval_8_hour">8 ساعات</string>
<string name="interval_24_hour">٢٤ ساعة</string>
<string name="interval_always_ask">اسأل دائماً</string>
<string name="interval_custom">مخصص...</string>
<string name="pref_toggle_title">تبديل وضعية العادة بضغطة قصيرة</string>
<string name="pref_toggle_description">وضع علامات الاختيار الموجودة بنقرة واحدة بدلاً من الصحافة وعقد. أكثر ملاءمة، ولكن قد يتسبب في تبديل عرضي.</string>
<string name="pref_snooze_interval_title">فترتي الغفوى على التذكير</string>
<string name="pref_rate_this_app">تقييم هذا التطبيق على جوجل بلاي</string>
<string name="pref_send_feedback">أرسل الملاحظات إلى المطور</string>
<string name="pref_view_source_code">إفحص التعليمات البرمجية على GitHub</string>
<string name="pref_view_app_introduction">عرض المقدمه</string>
<string name="links">روابط</string>
<string name="behavior">سلوك</string>
<string name="name">اسم</string>
<string name="settings">إعدادات</string>
<string name="snooze_interval">فترتي الغفوه</string>
<string name="select_snooze_delay">حدد تأخير الغفوة</string>
<string name="hint_title">هل كنت تعلم؟</string>
<string name="hint_drag">لإعادة ترتيب القوائم، أضغط اسم من هذه العادة، ثم اسحبه إلى المكان الصحيح.</string>
<string name="hint_landscape">يمكنك ان ترى المزيد أيام عن طريق وضع الهاتف في وضع أفقي.</string>
@@ -108,26 +94,14 @@
<string name="version_n">الإصدار %s</string>
<string name="frequency">تردد</string>
<string name="checkmark">علامة الاختيار</string>
<string name="strength">القوة</string>
<string name="best_streaks">أكثر تقدم</string>
<string name="current_streaks">تقدم الحالي</string>
<string name="number_of_repetitions">عدد من حالات التكرار</string>
<string name="last_x_days">آخر %d أيام</string>
<string name="last_x_weeks">آخر %d أسابيع</string>
<string name="last_x_months">آخر %d أشهر</string>
<string name="last_x_years">آخر %d سنين</string>
<string name="all_time">كل الوقت</string>
<string name="every_day">كل يوم</string>
<string name="every_week">كل اسبوع</string>
<string name="two_times_per_week">مرتين في الأسبوع</string>
<string name="five_times_per_week">خمس مرات في الأسبوع</string>
<string name="custom_frequency">مخصص...</string>
<string name="help">مساعدة والأسئلة المتداولة</string>
<string name="could_not_export">فشل في تصدير البيانات.</string>
<string name="could_not_import">فشل في استيراد البيانات.</string>
<string name="file_not_recognized">لم يتم التعرف على الملف.</string>
<string name="habits_imported">نجح إستيراد العادات.</string>
<string name="full_backup_success">نجح تصدير النسخ الاحتياطي الكامل.</string>
<string name="import_data">استيراد بيانات.</string>
<string name="export_full_backup">صدر نسخة احتياطية كاملة.</string>
<string name="import_data_summary">تدعم النسخ الاحتياطي الكامل المصدرة من هذا التطبيق، فضلا عن الملفات التي تم إنشاؤها من Tickmate, HabitBull و Rewire. انظر التعليمات لمزيد من المعلومات.</string>
@@ -149,12 +123,9 @@
<string name="quarter">ربع سنه</string>
<string name="year">عام</string>
<string name="total">المجموع</string>
<!-- Different types of habits -->
<!-- Middle part of the sentence '1 time in xx days' -->
<string name="time_every">مرات في</string>
<string name="yes_or_no">نعم أو لا</string>
<string name="every_x_days">كل %d أيام</string>
<string name="every_x_weeks">كل %d أسابيع</string>
<string name="every_x_months">كل %d أشهر</string>
<string name="score">النقاط</string>
<string name="reminder_sound">صوت تذكير</string>
<string name="none">صامت</string>
@@ -163,6 +134,8 @@
<string name="hide_archived">إخفاء المؤرشفة</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>
@@ -173,7 +146,40 @@
<string name="manually">يدوياً</string>
<string name="by_name">حسب الإسم</string>
<string name="by_color">حسب اللون</string>
<string name="by_score">حسب النقاط</string>
<string name="download">تحميل</string>
<string name="by_score">By score</string>
<string name="export">استخراج</string>
<string name="long_press_to_edit">Press-and-hold to change the value</string>
<string name="change_value">تغيير القيمة</string>
<string name="calendar">التقويم</string>
<string name="unit">الوحدة</string>
<string name="example_question_boolean">e.g. Did you exercise today?</string>
<string name="question">السؤال</string>
<string name="target">الهدف</string>
<string name="yes">نعم</string>
<string name="no">لا</string>
<string name="customize_notification_summary">Change sound, vibration, light and other notification settings</string>
<string name="customize_notification">Customize notifications</string>
<string name="pref_view_privacy">عرض نهج الخصوصية</string>
<string name="view_all_contributors">عرض جميع المساهمين&#8230;</string>
<string name="database">قاعدة البيانات</string>
<string name="widget_opacity_title">شفافية اختصار الشاشة الرئيسية</string>
<string name="widget_opacity_description">Makes widgets more transparent or more opaque in your home screen.</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" comment="Feel free to replace &quot;miles&quot; by &quot;km&quot;">مثلا: كم كيلومتراً قطعته اليوم؟ كم صفحة قرأتها؟ كم عدد السعرات الحرارية التي أكلتها؟</string>
<string name="x_times_per_week">%d مرة في الأسبوع</string>
<string name="x_times_per_month">%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" comment="Feel free to replace &quot;miles&quot; by &quot;km&quot; if that is more common in your country">مثلا: كم كيلومترًا جريته اليوم؟</string>
<string name="measurable_units_example" comment="Feel free to replace by &quot;km&quot; if that is more common in your country">مثلا: كيلومترات</string>
<string name="every_month">كل شهر</string>
<string name="validation_cannot_be_blank">لا يمكن أن يكون الإسم فارغًا</string>
<string name="today">اليوم</string>
</resources>

View File

@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<!--
~ Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com>
~
@@ -30,42 +29,28 @@
<string name="color_picker_default_title">Canviar color</string>
<string name="toast_habit_created">Hàbit creat.</string>
<string name="toast_habit_deleted">Hàbits esborrats.</string>
<string name="toast_habit_restored">Hàbits restaurats.</string>
<string name="toast_nothing_to_undo">Res a desfer.</string>
<string name="toast_nothing_to_redo">Res a refer.</string>
<string name="toast_habit_changed">Hàbit modificat.</string>
<string name="toast_habit_changed_back">Hàbit restaurat.</string>
<string name="toast_habit_archived">Hàbits arxivats.</string>
<string name="toast_habit_unarchived">Hàbits trets de l\'arxiu.</string>
<string name="overview">Visió general</string>
<string name="habit_strength">Fortalesa de l\'hàbit</string>
<string name="history">Història</string>
<string name="clear">Netejar</string>
<string name="description_hint">Pregunta (Has ... avui?)</string>
<string name="repeat">Repetir</string>
<string name="times_every">vegades en</string>
<string name="days">dies</string>
<string name="reminder">Recordatori</string>
<string name="discard">Descartar</string>
<string name="save">Desar</string>
<string name="streaks">Ratxa</string>
<string name="no_habits_found">No tens hàbits actius</string>
<string name="long_press_to_toggle">Prem i manté per a marcar o desmarcar</string>
<string name="reminder_off">Desactivat</string>
<string name="validation_name_should_not_be_blank">El nom no pot estar buit</string>
<string name="validation_number_should_be_positive">El número ha de ser positiu</string>
<string name="validation_at_most_one_rep_per_day">Pots tenir com a màxim una repetició per dia</string>
<string name="create_habit">Crear hàbit</string>
<string name="edit_habit">Editar hàbit</string>
<string name="check">Revisar</string>
<string name="snooze">Més tard</string>
<!-- App introduction -->
<string name="intro_title_1">Benvingut</string>
<string name="intro_description_1">Loop Habit Tracker t\'ajuda a crear i mantenir bons hàbits</string>
<string name="intro_title_2">Crear alguns hàbits nous</string>
<string name="intro_description_2">Cada dia, després de complir el teu hàbit, posa una marca amb l\'aplicació.</string>
<string name="intro_title_3">Continua fent-ho</string>
<string name="intro_description_3">Els hàbits que facis consistentment durant una llarga temporada obtindran una estrella</string>
<string name="intro_title_4">Segueix el teu progrès</string>
<string name="intro_description_4">Els gràfics detallats et mostren com han mirollat els teus hàbits al llarg del temps</string>
<string name="interval_15_minutes">15 minuts</string>
@@ -75,18 +60,19 @@
<string name="interval_4_hour">4 hores</string>
<string name="interval_8_hour">8 hores</string>
<string name="interval_24_hour">24 hores</string>
<string name="interval_always_ask">Pregunta sempre</string>
<string name="interval_custom">Personalitza...</string>
<string name="pref_toggle_title">Activar/desactivar repeticions prement curt</string>
<string name="pref_toggle_description">Més adequat, però pot causar activacions accidentals</string>
<string name="pref_toggle_description">Posar les marques de verificació amb un sol toc enlloc de prémer i mantenir. Més adequat, però pot causar activacions accidentals.</string>
<string name="pref_snooze_interval_title">Interval d\'endarreriment en recordatoris</string>
<string name="pref_rate_this_app">Valora aquesta app a Google Play</string>
<string name="pref_send_feedback">Enviar resposta al desenvolupador</string>
<string name="pref_view_source_code">Veure codi font a Github</string>
<string name="pref_view_app_introduction">Veure introducció de l\'app</string>
<string name="links">Enllaços</string>
<string name="behavior">Comportament</string>
<string name="name">Nom</string>
<string name="settings">Ajustaments</string>
<string name="snooze_interval">Interval d\'endarreriment</string>
<string name="select_snooze_delay">Selecciona el retard de l\'endarreriment</string>
<string name="hint_title">Ho sabies?</string>
<string name="hint_drag">Per a ordenar les entrades, prem i mantè sobre el nom de l\'hàbit, després arrossega\'l al lloc correcte.</string>
<string name="hint_landscape">Pots veure més dies posant el teu telèfon en orientació apaisada.</string>
@@ -108,26 +94,14 @@
<string name="version_n">Versió %s</string>
<string name="frequency">Freqüència</string>
<string name="checkmark">Marca</string>
<string name="strength">Fortalesa</string>
<string name="best_streaks">Millors ratxes</string>
<string name="current_streaks">Ratxa actual</string>
<string name="number_of_repetitions">Nombre de repeticions</string>
<string name="last_x_days">Últims %d dies</string>
<string name="last_x_weeks">Últimes %d setmanes</string>
<string name="last_x_months">Últims %d mesos</string>
<string name="last_x_years">Últims %d anys</string>
<string name="all_time">Tot el temps</string>
<string name="every_day">Cada dia</string>
<string name="every_week">Cada setmana</string>
<string name="two_times_per_week">2 cops per setmana</string>
<string name="five_times_per_week">5 cops per setmana</string>
<string name="custom_frequency">Personalitzar ...</string>
<string name="help">Ajuda i Preguntes Freqüents</string>
<string name="could_not_export">Error exportant dades.</string>
<string name="could_not_import">Error important dades.</string>
<string name="file_not_recognized">Fitxer no reconegut.</string>
<string name="habits_imported">Hàbits importats correctament.</string>
<string name="full_backup_success">Còpia de seguretat sencera exportada satisfactòriament.</string>
<string name="import_data">Importar dades</string>
<string name="export_full_backup">Exportar còpia de seguretat sencera</string>
<string name="import_data_summary">Suporta còpies de seguretat exportades per aquesta app, també fitxers generats per Tickmate, HabitBull o Rewire. Mira les Preguntes Freqüents per a més informació.</string>
@@ -149,12 +123,9 @@
<string name="quarter">Quatrimestre</string>
<string name="year">Any</string>
<string name="total">Total</string>
<!-- Different types of habits -->
<!-- Middle part of the sentence '1 time in xx days' -->
<string name="time_every">vegades en</string>
<string name="yes_or_no">Sí o No</string>
<string name="every_x_days">Cada %d dies</string>
<string name="every_x_weeks">Cada %d setmanes</string>
<string name="every_x_months">Cada %d mesos</string>
<string name="score">Puntuació</string>
<string name="reminder_sound">So de recordatori</string>
<string name="none">Cap</string>
@@ -163,6 +134,8 @@
<string name="hide_archived">Amaga arxivades</string>
<string name="sticky_notifications">Fer les notificacions enganxós</string>
<string name="sticky_notifications_description">Evita les notificacions de ser pispat lluny.</string>
<string name="led_notifications">Llum de notificació</string>
<string name="led_notifications_description">Mostra una llum parpallejant per als recordatoris. Només disponible en telèfons amb llums de notificació LED.</string>
<string name="repair_database">Base de dades de reparació</string>
<string name="database_repaired">Reparar base de dades.</string>
<string name="uncheck">Desmarca</string>
@@ -174,6 +147,39 @@
<string name="by_name">Per nom</string>
<string name="by_color">Pel color</string>
<string name="by_score">Per marcador</string>
<string name="download">Descarrega</string>
<string name="export">Exportar</string>
<string name="long_press_to_edit">Prémer i mantenir per a canviar el valor</string>
<string name="change_value">Canviar el valor</string>
<string name="calendar">Calendari</string>
<string name="unit">Unitat</string>
<string name="example_question_boolean">p.e. Has fet exercici avui?</string>
<string name="question">Pregunta</string>
<string name="target">Objectiu</string>
<string name="yes"></string>
<string name="no">No</string>
<string name="customize_notification_summary">Canviar so, vibració, llum i altres ajustaments de notificacions</string>
<string name="customize_notification">Personalitzar les notificacions</string>
<string name="pref_view_privacy">Veure la política de privadesa</string>
<string name="view_all_contributors">Veure tots els col·laboradors&#8230;</string>
<string name="database">Base de dades</string>
<string name="widget_opacity_title">Opacitat del giny</string>
<string name="widget_opacity_description">Fa que els ginys siguin més transparents o més opacs a la pantalla d\'inici.</string>
<string name="first_day_of_the_week">Primer dia de la setmana</string>
<string name="default_reminder_question">Has completat aquest hàbit avui?</string>
<string name="notes">Notes</string>
<string name="example_notes">Opcional</string>
<string name="yes_or_no_example">Per exemple, us heu despertat aviat? Heu fet exercici? Heu jugat a escacs?</string>
<string name="measurable">Mesurable</string>
<string name="measurable_example" comment="Feel free to replace &quot;miles&quot; by &quot;km&quot;">Per exemple, quants quilòmetres heu recorregut avui? Quantes pàgines heu llegit? Quantes calories heu menjat?</string>
<string name="x_times_per_week">%d vegades per setmana</string>
<string name="x_times_per_month">%d vegades al mes</string>
<string name="yes_or_no_short_example">Ex. Exercici</string>
<string name="color">Color</string>
<string name="example_target">ex. 15</string>
<string name="measurable_short_example">Per exemple: córrer</string>
<string name="measurable_question_example" comment="Feel free to replace &quot;miles&quot; by &quot;km&quot; if that is more common in your country">Per exemple, quants quilòmetres heu recorregut avui?</string>
<string name="measurable_units_example" comment="Feel free to replace by &quot;km&quot; if that is more common in your country">per exemple, quilòmetres</string>
<string name="every_month">Cada mes</string>
<string name="validation_cannot_be_blank">No es pot deixar en blanc</string>
<string name="today">Avui</string>
</resources>

View File

@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<!--
~ Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com>
~
@@ -30,42 +29,28 @@
<string name="color_picker_default_title">Změnit barvu</string>
<string name="toast_habit_created">Zvyk vytvořen.</string>
<string name="toast_habit_deleted">Zvyky smazány.</string>
<string name="toast_habit_restored">Zvyky obnoveny.</string>
<string name="toast_nothing_to_undo">Nelze jít zpět.</string>
<string name="toast_nothing_to_redo">Nelze jít vpřed.</string>
<string name="toast_habit_changed">Zvyk změněn.</string>
<string name="toast_habit_changed_back">Zvyk změněn zpět.</string>
<string name="toast_habit_archived">Archivováno.</string>
<string name="toast_habit_unarchived">Zvyky obnoveny.</string>
<string name="overview">Přehled</string>
<string name="habit_strength">Síla zvyku</string>
<string name="history">Historie</string>
<string name="clear">Smazat</string>
<string name="description_hint">Otázka (Dělal jsi dnes...?)</string>
<string name="repeat">Opakovat</string>
<string name="times_every">krát za</string>
<string name="days">dní</string>
<string name="reminder">Připomenutí</string>
<string name="discard">Zrušit</string>
<string name="save">Uložit</string>
<string name="streaks">Série</string>
<string name="no_habits_found">Nemáte žádné nedokončené zvyky</string>
<string name="long_press_to_toggle">Stiskni a drž pro označení</string>
<string name="reminder_off">Vyp.</string>
<string name="validation_name_should_not_be_blank">Musíte vyplnit jméno.</string>
<string name="validation_number_should_be_positive">Číslo musí být kladné.</string>
<string name="validation_at_most_one_rep_per_day">Můžete mít maximálně jedno označení denně.</string>
<string name="create_habit">Vytvořit zvyk</string>
<string name="edit_habit">Upravit zvyk</string>
<string name="check">Hotovo</string>
<string name="snooze">Odložit</string>
<!-- App introduction -->
<string name="intro_title_1">Vítejte</string>
<string name="intro_description_1">Sledování zvyků ti pomůže vytvořit a dosáhnout dobrých návyků.</string>
<string name="intro_title_2">Vytvoř si nové zvyky</string>
<string name="intro_description_2">Každý den po splnění zvyku, si ho v aplikaci zaškrtni.</string>
<string name="intro_title_3">Jen tak dál</string>
<string name="intro_description_3">Zvyky, které vykonáváš pravidelně delší dobu, se označí hvězdou.</string>
<string name="intro_title_4">Sleduj svůj postup</string>
<string name="intro_description_4">Detailní grafy ti ukážou, jak se tvé zvyky v průběhu času zlepšily.</string>
<string name="interval_15_minutes">15 minut</string>
@@ -75,18 +60,19 @@
<string name="interval_4_hour">4 hodiny</string>
<string name="interval_8_hour">8 hodin</string>
<string name="interval_24_hour">24 hodin</string>
<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">Praktičtější, ale může způsobit nechtěné označení.</string>
<string name="pref_snooze_interval_title">Doba odložení upomínky</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>
<string name="pref_view_app_introduction">Představení aplikace</string>
<string name="links">Odkazy</string>
<string name="behavior">Chování</string>
<string name="name">Jméno</string>
<string name="settings">Nastavení</string>
<string name="snooze_interval">Interval odkladu</string>
<string name="select_snooze_delay">Nastavit délku odložení</string>
<string name="hint_title">Věděli jste?</string>
<string name="hint_drag">Přeřazení záznamů proveď stisknutím a podržením názvu zvyku a poté přesunutím na správné místo.</string>
<string name="hint_landscape">Můžeš vidět více dnů otočením telefonu na šířku.</string>
@@ -108,26 +94,14 @@
<string name="version_n">Verze %s</string>
<string name="frequency">Frekvence</string>
<string name="checkmark">Zatržítko</string>
<string name="strength">Síla</string>
<string name="best_streaks">Nejlepší serie</string>
<string name="current_streaks">Aktuální serie</string>
<string name="number_of_repetitions">Počet opakování</string>
<string name="last_x_days">Posledních %d dnů</string>
<string name="last_x_weeks">Posledních %d týdnů</string>
<string name="last_x_months">Posledních %d měsíců</string>
<string name="last_x_years">Posledních %d roků</string>
<string name="all_time">Bez omezení</string>
<string name="every_day">Každý den</string>
<string name="every_week">Každý týden</string>
<string name="two_times_per_week">2 krát týdně</string>
<string name="five_times_per_week">5 krát týdně</string>
<string name="custom_frequency">Vlastní...</string>
<string name="help">Pomoc a FAQ</string>
<string name="could_not_export">Export selhal.</string>
<string name="could_not_import">Import selhal.</string>
<string name="file_not_recognized">Soubor netozpoznán.</string>
<string name="habits_imported">Zvyky úspěšně importovány.</string>
<string name="full_backup_success">Kompletní záloha úspěšně exportována.</string>
<string name="import_data">Importovat</string>
<string name="export_full_backup">Kompletní export</string>
<string name="import_data_summary">Podpora exportů z této aplikace, ale také souborů vygenerovaných aplikacemi od Tickmate, HabitBull nebo Rewire. Pro více info si prečti FAQ.</string>
@@ -149,12 +123,9 @@
<string name="quarter">Čtvrtletí</string>
<string name="year">Rok</string>
<string name="total">Celkem</string>
<!-- Different types of habits -->
<!-- Middle part of the sentence '1 time in xx days' -->
<string name="time_every">krát za</string>
<string name="yes_or_no">Ano, či Ne</string>
<string name="every_x_days">Každých %d dní</string>
<string name="every_x_weeks">Každých %d týdnů</string>
<string name="every_x_months">Každých %d měsíců</string>
<string name="score">Skóre</string>
<string name="reminder_sound">Zvuk upomínky</string>
<string name="none">Žádný</string>
@@ -163,6 +134,8 @@
<string name="hide_archived">Skrýt archivované</string>
<string name="sticky_notifications">Připnout notifikaci</string>
<string name="sticky_notifications_description">Zabraňuje notifikaci její odstranění odsunutím.</string>
<string name="led_notifications">Světelná notifikace</string>
<string name="led_notifications_description">Telefon zabliká při upozornění. Fungující pouze na telefonech s notifikační LED diodou.</string>
<string name="repair_database">Opravit databázi</string>
<string name="database_repaired">Databáze opravena.</string>
<string name="uncheck">Odznačit</string>
@@ -174,6 +147,39 @@
<string name="by_name">Abecedně</string>
<string name="by_color">Podle barvy</string>
<string name="by_score">Podle skóre</string>
<string name="download">Stáhnout</string>
<string name="export">Export</string>
<string name="long_press_to_edit">Stiskni a drž pro změnu hodnoty</string>
<string name="change_value">Změnit hodnotu</string>
<string name="calendar">Kalendář</string>
<string name="unit">Jednotka</string>
<string name="example_question_boolean">např. Cvičil jsi dnes?</string>
<string name="question">Otázka</string>
<string name="target">Cíl</string>
<string name="yes">Ano</string>
<string name="no">Ne</string>
<string name="customize_notification_summary">Změnit zvuk, vibrace, světlo a další nastavení notifikací</string>
<string name="customize_notification">Přizpůsobit oznámení</string>
<string name="pref_view_privacy">Zobrazit zásady ochrany osobních údajů</string>
<string name="view_all_contributors">Zobrazit všechny přispěvatele&#8230;</string>
<string name="database">Databáze</string>
<string name="widget_opacity_title">Neprůhlednost widgetu</string>
<string name="widget_opacity_description">Udělá widgety průhlednější nebo neprůhlednější na domovské obrazovce.</string>
<string name="first_day_of_the_week">První den v týdnu</string>
<string name="default_reminder_question">Dokončili jste dnes tento návyk?</string>
<string name="notes">Poznámky</string>
<string name="example_notes">(nepovinné)</string>
<string name="yes_or_no_example">např. Vzbudil ses dnes brzy? Cvičil jsi dnes? Hrál jsi šachy?</string>
<string name="measurable">Měřitelný</string>
<string name="measurable_example" comment="Feel free to replace &quot;miles&quot; by &quot;km&quot;">např. Kolik kilometrů jsi dnes uběhl? Kolik stránek jsi přečetl? Kolik kalorií jsi snědl?</string>
<string name="x_times_per_week">%d krát týdně</string>
<string name="x_times_per_month">%d krát za měsíc</string>
<string name="yes_or_no_short_example">např. Cvičení</string>
<string name="color">Barva</string>
<string name="example_target">např. 15</string>
<string name="measurable_short_example">např. Běh</string>
<string name="measurable_question_example" comment="Feel free to replace &quot;miles&quot; by &quot;km&quot; if that is more common in your country">Např. kolik mil jste dnes uběhl?</string>
<string name="measurable_units_example" comment="Feel free to replace by &quot;km&quot; if that is more common in your country">např. míle</string>
<string name="every_month">Každý měsíc</string>
<string name="validation_cannot_be_blank">Musíte vyplnit</string>
<string name="today">Dnes</string>
</resources>

View File

@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<!--
~ Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com>
~
@@ -30,42 +29,28 @@
<string name="color_picker_default_title">Farbe ändern</string>
<string name="toast_habit_created">Gewohnheit erstellt</string>
<string name="toast_habit_deleted">Gewohnheiten gelöscht</string>
<string name="toast_habit_restored">Gewohnheiten wiederhergestellt</string>
<string name="toast_nothing_to_undo">Nichts zum Rückgängig machen</string>
<string name="toast_nothing_to_redo">Nichts zum Wiederherstellen</string>
<string name="toast_habit_changed">Gewohnheit geändert</string>
<string name="toast_habit_changed_back">Gewohnheit zurückgeändert</string>
<string name="toast_habit_archived">Gewohnheiten archiviert</string>
<string name="toast_habit_unarchived">Gewohnheiten dearchiviert</string>
<string name="overview">Übersicht</string>
<string name="habit_strength">Stärke</string>
<string name="history">Verlauf</string>
<string name="clear">Löschen</string>
<string name="description_hint">Frage (Hast du heute ...?)</string>
<string name="repeat">Wiederhole</string>
<string name="times_every">Mal in</string>
<string name="days">Tagen</string>
<string name="reminder">Erinnerung</string>
<string name="discard">Verwerfen</string>
<string name="save">Speichern</string>
<string name="streaks">Serien</string>
<string name="no_habits_found">Du hast keine aktiven Gewohnheiten</string>
<string name="long_press_to_toggle">Tippe und halte um aus- bzw. abzuwählen</string>
<string name="reminder_off">Aus</string>
<string name="validation_name_should_not_be_blank">Name darf nicht leer sein.</string>
<string name="validation_number_should_be_positive">Zahl muss positiv sein.</string>
<string name="validation_at_most_one_rep_per_day">Du kannst höchstens eine Wiederholung pro Tag haben</string>
<string name="create_habit">Gewohnheit erstellen</string>
<string name="edit_habit">Gewohnheit bearbeiten</string>
<string name="check">Abhaken</string>
<string name="snooze">Später</string>
<!-- App introduction -->
<string name="intro_title_1">Willkommen</string>
<string name="intro_description_1">Loop Habit Tracker hilft dir dabei, gute Gewohnheiten anzunehmen.</string>
<string name="intro_title_2">Erstelle neue Gewohnheiten</string>
<string name="intro_description_2">Hake die Gewohnheit jeden Tag in der App ab, nachdem du sie erledigt hast.</string>
<string name="intro_title_3">Bleib dran</string>
<string name="intro_description_3">Gewohnheiten, die über einen längeren Zeitraum absolviert werden, bekommen einen ganzen Stern.</string>
<string name="intro_title_4">Verfolge deinen Fortschritt</string>
<string name="intro_description_4">Detaillierte Diagramme zeigen dir an, wie sich deine Gewohnheiten entwickelt haben.</string>
<string name="interval_15_minutes">15 Minuten</string>
@@ -76,18 +61,18 @@
<string name="interval_8_hour">8 Stunden</string>
<string name="interval_24_hour">24 Stunden</string>
<string name="interval_always_ask">Immer fragen</string>
<string name="interval_custom">Benutzerdeffiniert...</string>
<string name="pref_toggle_title">Markierung durch kurzes Drücken ändern</string>
<string name="pref_toggle_description">Markierungen durch einfaches Tippen setzen anstatt durch Tippen und Halten. Bequemer, kann aber versehentlich eine Markierung ändern.</string>
<string name="pref_snooze_interval_title">\"Später erinnern\"-Intervall bei Erinnerungen</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>
<string name="pref_view_app_introduction">Zeige die App-Einführung</string>
<string name="links">Links</string>
<string name="behavior">Verhalten</string>
<string name="name">Name</string>
<string name="settings">Einstellungen</string>
<string name="snooze_interval">\"Später erinnern\"-Intervall</string>
<string name="select_snooze_delay">Schlummer-Intervall auswählen</string>
<string name="hint_title">Wusstest du?</string>
<string name="hint_drag">Um Einträge umzusortieren, tippe, halte und ziehe sie an die richtige Stelle.</string>
<string name="hint_landscape">Du kannst mehr Tage sehen, wenn du dein Smartphone quer hältst.</string>
@@ -109,26 +94,14 @@
<string name="version_n">Version %s</string>
<string name="frequency">Häufigkeit</string>
<string name="checkmark">Häkchen</string>
<string name="strength">Stärke</string>
<string name="best_streaks">Beste Serien</string>
<string name="current_streaks">Derzeitige Serie</string>
<string name="number_of_repetitions">Anzahl der Wiederholungen</string>
<string name="last_x_days">Letzten %d Tage</string>
<string name="last_x_weeks">Letzten %d Wochen</string>
<string name="last_x_months">Letzten %d Monate</string>
<string name="last_x_years">Letzten %d Jahre</string>
<string name="all_time">Allzeit</string>
<string name="every_day">Jeden Tag</string>
<string name="every_week">Jede Woche</string>
<string name="two_times_per_week">2 Mal pro Woche</string>
<string name="five_times_per_week">5 Mal pro Woche</string>
<string name="custom_frequency">Benutzerdefiniert</string>
<string name="help">Hilfe &amp; FAQ</string>
<string name="could_not_export">Fehler beim Exportieren der Daten.</string>
<string name="could_not_import">Fehler beim Importieren der Daten.</string>
<string name="file_not_recognized">Datei nicht erkannt.</string>
<string name="habits_imported">Gewohnheiten erfolgreich importiert.</string>
<string name="full_backup_success">Vollständige Sicherung erfolgreich exportiert.</string>
<string name="import_data">Importiere Daten</string>
<string name="export_full_backup">Exportiere vollständige Sicherung</string>
<string name="import_data_summary">Unterstützt vollständige Sicherungen dieser App sowie Sicherungen von Tickmate, HabitBull und Rewire. Siehe FAQ für weitere Informationen.</string>
@@ -150,13 +123,9 @@
<string name="quarter">Quartal</string>
<string name="year">Jahr</string>
<string name="total">Gesamt</string>
<!-- Different types of habits -->
<string name="yes_or_no">Ja / Nein</string>
<!-- Middle part of the sentence '1 time in xx days' -->
<string name="time_every">Mal in</string>
<string name="every_x_days">Alle %d Tage</string>
<string name="every_x_weeks">Alle %d Wochen</string>
<string name="every_x_months">Alle %d Monate</string>
<string name="score">Wertung</string>
<string name="reminder_sound">Erinnerungston</string>
<string name="none">Keiner</string>
@@ -165,6 +134,8 @@
<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>
<string name="led_notifications">Benachrichtigungs-LED</string>
<string name="led_notifications_description">Blinkende LED für Erinnerungen anzeigen. Nur verfügbar in Geräten mit LED Benachrichtigungs-LED.</string>
<string name="repair_database">Repariere Datenbank</string>
<string name="database_repaired">Datenbank repariert.</string>
<string name="uncheck">Abwählen</string>
@@ -176,9 +147,39 @@
<string name="by_name">Nach Name</string>
<string name="by_color">Nach Farbe</string>
<string name="by_score">Nach Wertung</string>
<string name="download">Runterladen</string>
<string name="export">Exportieren</string>
<string name="long_press_to_edit">Gedrückt halten, um den Wert zu ändern</string>
<string name="change_value">Wert ändern</string>
<string name="calendar">Kalendar</string>
<string name="unit">Einheit</string>
<string name="example_question_boolean">z.B. Hast du heute trainiert?</string>
<string name="question">Frage</string>
<string name="target">Ziel</string>
<string name="yes">Ja</string>
<string name="no">Nein</string>
<string name="customize_notification_summary">Töne, Vibrationen, Licht und weitere Einstellungen ändern</string>
<string name="customize_notification">Benachrichtigungen anpassen</string>
<string name="pref_view_privacy">Datenschutzrichtlinie anzeigen</string>
<string name="view_all_contributors">Alle Mitwirkende anzeigen&#8230;</string>
<string name="database">Datenbank</string>
<string name="widget_opacity_title">Widget Deckkraft</string>
<string name="widget_opacity_description">Stellt das durchscheinen des Hintergrundes beim Widget auf dem Startbildschirm ein.</string>
<string name="first_day_of_the_week">Erster Tag der Woche</string>
<string name="default_reminder_question">Hast du diese Gewohnheit heute abgeschlossen?</string>
<string name="notes">Notiz</string>
<string name="example_notes">(Optional)</string>
<string name="yes_or_no_example">z.B. Bist du heute früh wach geworden? Hast du trainiert? Hast du Schach gespielt?</string>
<string name="measurable">Messbar</string>
<string name="measurable_example" comment="Feel free to replace &quot;miles&quot; by &quot;km&quot;">z.B. Wie viele Kilometer bist du heute gelaufen? Wie viele Seiten hast du gelesen? Wie viele Kalorien hast du gegessen?</string>
<string name="x_times_per_week">%d mal pro Woche</string>
<string name="x_times_per_month">%d mal pro Monat</string>
<string name="yes_or_no_short_example">z.B. Übung</string>
<string name="color">Farbe</string>
<string name="example_target">z.B. 15</string>
<string name="measurable_short_example">z.B. Laufen</string>
<string name="measurable_question_example" comment="Feel free to replace &quot;miles&quot; by &quot;km&quot; if that is more common in your country">z.B. Wie viele Kilometer bist du heute gelaufen?</string>
<string name="measurable_units_example" comment="Feel free to replace by &quot;km&quot; if that is more common in your country">z.B. Kilometer</string>
<string name="every_month">Monatlich</string>
<string name="validation_cannot_be_blank">Darf nicht leer sein</string>
<string name="today">Heute</string>
</resources>

Some files were not shown because too many files have changed in this diff Show More