diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
new file mode 100644
index 000000000..64043843f
--- /dev/null
+++ b/.github/workflows/main.yml
@@ -0,0 +1,31 @@
+name: Build & Test
+
+on:
+ push:
+ branches:
+ - dev
+ pull_request:
+ branches:
+ - dev
+
+jobs:
+ build:
+ runs-on: macOS-latest
+ steps:
+ - uses: actions/checkout@v1
+ - name: Install Java Development Kit 1.8
+ uses: actions/setup-java@v1
+ with:
+ java-version: 1.8
+ - name: Build APK & Run small tests
+ run: android/build.sh build
+ - name: Run medium tests
+ uses: ReactiveCircus/android-emulator-runner@v2.2.0
+ with:
+ api-level: 29
+ script: android/build.sh medium-tests
+ - name: Upload artifacts
+ uses: actions/upload-artifact@v1
+ with:
+ name: Build
+ path: android/uhabits-android/build/outputs/
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
new file mode 100644
index 000000000..d52e446ab
--- /dev/null
+++ b/.github/workflows/publish.yml
@@ -0,0 +1,40 @@
+name: Build, Test & Publish
+
+on:
+ push:
+ branches:
+ - master
+
+jobs:
+ build:
+ runs-on: macOS-latest
+ steps:
+ - uses: actions/checkout@v1
+ - name: Install GPG
+ uses: olafurpg/setup-gpg@v2
+ - name: Decrypt secrets
+ env:
+ GPG_PASSWORD: ${{ secrets.GPG_PASSWORD }}
+ run: .secret/decrypt.sh
+ - name: Install Java Development Kit 1.8
+ uses: actions/setup-java@v1
+ with:
+ java-version: 1.8
+ - name: Build APK & Run small tests
+ env:
+ RELEASE: 1
+ run: android/build.sh build
+ - name: Run medium tests
+ uses: ReactiveCircus/android-emulator-runner@v2.2.0
+ env:
+ RELEASE: 1
+ with:
+ api-level: 29
+ script: android/build.sh medium-tests
+ - name: Upload build to GitHub
+ uses: actions/upload-artifact@v1
+ with:
+ name: Build
+ path: android/uhabits-android/build/outputs/
+ - name: Upload APK to Google Play
+ run: cd android && ./gradlew publishReleaseApk
diff --git a/.gitignore b/.gitignore
index a8c758cef..ac138eede 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,13 +4,20 @@
*.perspectivev3
*.swp
*~.nib
+*.hprof
.DS_Store
+._.DS_Store
.externalNativeBuild
.gradle
.idea
+.secret
build
build/
captures
local.properties
node_modules
*xcuserdata*
+*.sketch
+/design
+/releases
+/screenshots
diff --git a/.secret/decrypt.sh b/.secret/decrypt.sh
new file mode 100755
index 000000000..bde9192bb
--- /dev/null
+++ b/.secret/decrypt.sh
@@ -0,0 +1,16 @@
+#!/bin/sh
+cd "$(dirname "$0")"
+if [ -z "$GPG_PASSWORD" ]; then
+ echo Env variable GPG_PASSWORD must be defined
+ exit 1
+fi
+gpg \
+ --quiet \
+ --batch \
+ --yes \
+ --decrypt \
+ --passphrase="$GPG_PASSWORD" \
+ --output secret.tar.gz \
+ secret
+tar -xzf secret.tar.gz
+rm secret.tar.gz
diff --git a/.secret/secret b/.secret/secret
new file mode 100644
index 000000000..e3f06089b
Binary files /dev/null and b/.secret/secret differ
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 08782a1ad..e976b8d35 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,22 @@
# Changelog
+### 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.
+* Improved calculation of streaks for non-daily habits: performing habits on irregular weekdays will no longer break your streak.
+* Many more colors to choose from (now 20 in total).
+* Ability to customize how transparent the widgets are on your home screen.
+* Ability to customize the first day of the week.
+* Yes/No buttons on notifications, instead of just "Check".
+* Automatic dark theme according to phone settings (Android 10).
+* Smaller APK and backup files.
+* Many other internal code changes improving performance and stability.
+
### 1.7.11 (Aug 10, 2019)
* Fix bug that produced corrupted CSV files in some countries
diff --git a/README.md b/README.md
index abc463653..72836df95 100644
--- a/README.md
+++ b/README.md
@@ -7,7 +7,7 @@ source.
-
+
## Screenshots
@@ -21,34 +21,32 @@ source.
## Features
-* **Simple, beautiful and modern interface.** Loop has a minimalistic interface
- that is easy to use and follows the material design guidelines.
+* Beautiful, minimalistic and lightweight interface.
+Loop has an elegant and minimalistic interface that is very easy to use, even for first-time users. Highly optimized for speed, the app works well even on older phones.
-* **Habit score.** In addition to showing your current streak, Loop has an
- advanced algorithm for calculating the strength of your habits. Every
- repetition makes your habit stronger, and every missed day makes it weaker. A
- few missed days after a long streak, however, will not completely destroy
- your entire progress.
+* Habit score.
+Loop has an advanced formula for calculating the strength of your habits. Every repetition makes your habit stronger and every missed day makes it weaker. A few missed days after a long streak, however, will not completely destroy your progress, unlike many other don't-break-the-chain apps.
-* **Detailed graphs and statistics.** Clearly see how your habits improved over
- time with beautiful and detailed graphs. Scroll back to see the complete
- history of your habits.
+* Flexible schedules.
+In addition to daily habits, Loop supports habits with more complex schedules, such as 3 times per week or every other day.
-* **Flexible schedules.** Supports both daily habits and habits with more
- complex schedules, such as 3 times every week; one time every other week; or
- every other day.
+* Reminders.
+Schedule notifications to remind you of your habits. Each habit can have its own reminder, at a chosen time of the day. Easily check or dismiss your habit directly from the notification.
-* **Reminders.** Create an individual reminder for each habit, at a chosen hour
- of the day. Easily check, dismiss or snooze your habit directly from the
- notification, without opening the app.
+* Widgets.
+Be reminded of your habits whenever you unlock your phone. Colorful widgets allow you to track your habits directly from your home screen, without even opening the app.
-* **Optimized for smartwatches.** Reminders can be checked, snoozed or
- dismissed directly from your Android Wear watch.
+* Take control of your data.
+If you want to further analyze your data, or move it to another service, Loop allows you to export it to spreadsheets (CSV) or to a database file (SQLite). For power users, checkmarks can be added through other apps, such as Tasker.
-* **Completely ad-free and open source.** There are absolutely no
- advertisements, annoying notifications or intrusive permissions in this app,
- and there will never be. The complete source code is available under the
- GPLv3.
+* No limitations.
+Track as many habits as you wish. 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.
+
+* Completely ad-free and open source.
+There are no advertisements, annoying notifications or intrusive permissions in this app, and there will never be. The app is completely open-source (GPLv3).
+
+* Works offline and respects your privacy.
+Loop doesn't require an Internet connection or online account registration. Your confidential data is never sent to anyone. Neither the developers nor any third-parties have access to it.
## Installing
@@ -85,33 +83,33 @@ contribute, even if you are not a software developer.
- Copyright (C) 2016-2019 Álinson Santos Xavier
-
- 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 .
-
-[screen1]: screenshots/original/uhabits1.png
-[screen2]: screenshots/original/uhabits2.png
-[screen3]: screenshots/original/uhabits3.png
-[screen4]: screenshots/original/uhabits4.png
-[screen5]: screenshots/original/uhabits5.png
-[screen6]: screenshots/original/uhabits6.png
-[screen1th]: screenshots/thumbs/uhabits1.png
-[screen2th]: screenshots/thumbs/uhabits2.png
-[screen3th]: screenshots/thumbs/uhabits3.png
-[screen4th]: screenshots/thumbs/uhabits4.png
-[screen5th]: screenshots/thumbs/uhabits5.png
-[screen6th]: screenshots/thumbs/uhabits6.png
+ Copyright (C) 2016-2019 Álinson Santos Xavier
+
+ 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 .
+
+[screen1]: screenshots/uhabits1.png
+[screen2]: screenshots/uhabits2.png
+[screen3]: screenshots/uhabits3.png
+[screen4]: screenshots/uhabits4.png
+[screen5]: screenshots/uhabits5.png
+[screen6]: screenshots/uhabits6.png
+[screen1th]: screenshots/uhabits1_th.png
+[screen2th]: screenshots/uhabits2_th.png
+[screen3th]: screenshots/uhabits3_th.png
+[screen4th]: screenshots/uhabits4_th.png
+[screen5th]: screenshots/uhabits5_th.png
+[screen6th]: screenshots/uhabits6_th.png
[poedit]: http://translate.loophabits.org
[playstore]: https://play.google.com/store/apps/details?id=org.isoron.uhabits
[releases]: https://github.com/iSoron/uhabits/releases
diff --git a/android/.gitignore b/android/.gitignore
index 9ad9f8ab3..29f35cce8 100644
--- a/android/.gitignore
+++ b/android/.gitignore
@@ -13,6 +13,7 @@
.gradle
.idea
.project
+.secret
Thumbs.db
art/
bin/
diff --git a/android/android-base/build.gradle b/android/android-base/build.gradle
index f1967eb3e..f10169233 100644
--- a/android/android-base/build.gradle
+++ b/android/android-base/build.gradle
@@ -1,4 +1,5 @@
apply plugin: 'com.android.library'
+apply plugin: 'kotlin-android'
android {
compileSdkVersion COMPILE_SDK_VERSION as Integer
@@ -6,17 +7,8 @@ android {
defaultConfig {
minSdkVersion MIN_SDK_VERSION as Integer
targetSdkVersion TARGET_SDK_VERSION as Integer
- versionCode 1
- versionName "1.0"
- testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
-
- }
-
- buildTypes {
- release {
- minifyEnabled false
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- }
+ versionCode VERSION_CODE as Integer
+ versionName "$VERSION_NAME"
}
compileOptions {
@@ -28,24 +20,14 @@ android {
checkReleaseBuilds false
abortOnError false
}
-
}
dependencies {
implementation "com.google.dagger:dagger:$DAGGER_VERSION"
- implementation "com.android.support:design:$SUPPORT_LIBRARY_VERSION"
- implementation "com.android.support:appcompat-v7:$SUPPORT_LIBRARY_VERSION"
+ implementation 'com.google.android.material:material:1.0.0'
+ implementation 'androidx.appcompat:appcompat:1.0.0'
implementation "org.apache.commons:commons-lang3:3.5"
annotationProcessor "com.google.dagger:dagger-compiler:$DAGGER_VERSION"
- androidTestAnnotationProcessor "com.google.dagger:dagger-compiler:$DAGGER_VERSION"
- androidTestImplementation "com.google.dagger:dagger:$DAGGER_VERSION"
- testAnnotationProcessor "com.google.dagger:dagger-compiler:$DAGGER_VERSION"
- testImplementation "junit:junit:4.12"
-
- androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
- exclude group: 'com.android.support', module: 'support-annotations'
- })
-
-
+ implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$KOTLIN_VERSION"
}
diff --git a/android/android-base/src/main/java/org/isoron/androidbase/AndroidBugReporter.java b/android/android-base/src/main/java/org/isoron/androidbase/AndroidBugReporter.java
deleted file mode 100644
index e50e2b04d..000000000
--- a/android/android-base/src/main/java/org/isoron/androidbase/AndroidBugReporter.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright (C) 2017 Álinson Santos Xavier
- *
- * This file is part of Loop Habit Tracker.
- *
- * Loop Habit Tracker is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by the
- * Free Software Foundation, either version 3 of the License, or (at your
- * option) any later version.
- *
- * Loop Habit Tracker is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see .
- */
-
-package org.isoron.androidbase;
-
-import android.content.*;
-import android.os.*;
-import android.support.annotation.*;
-import android.view.*;
-
-import java.io.*;
-import java.text.*;
-import java.util.*;
-
-import javax.inject.*;
-
-public class AndroidBugReporter
-{
- private final Context context;
-
- @Inject
- public AndroidBugReporter(@NonNull @AppContext Context context)
- {
- this.context = context;
- }
-
- /**
- * Captures and returns a bug report. The bug report contains some device
- * information and the logcat.
- *
- * @return a String containing the bug report.
- * @throws IOException when any I/O error occur.
- */
- @NonNull
- public String getBugReport() throws IOException
- {
- String logcat = getLogcat();
- String deviceInfo = getDeviceInfo();
-
- String log = "---------- BUG REPORT BEGINS ----------\n";
- log += deviceInfo + "\n" + logcat;
- log += "---------- BUG REPORT ENDS ------------\n";
-
- return log;
- }
-
- public String getDeviceInfo()
- {
- if (context == null) return "null context\n";
-
- WindowManager wm =
- (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
-
- return
- String.format("App Version Name: %s\n", BuildConfig.VERSION_NAME) +
- String.format("App Version Code: %s\n", BuildConfig.VERSION_CODE) +
- String.format("OS Version: %s (%s)\n",
- System.getProperty("os.version"), Build.VERSION.INCREMENTAL) +
- String.format("OS API Level: %s\n", Build.VERSION.SDK) +
- String.format("Device: %s\n", Build.DEVICE) +
- String.format("Model (Product): %s (%s)\n", Build.MODEL,
- Build.PRODUCT) +
- String.format("Manufacturer: %s\n", Build.MANUFACTURER) +
- String.format("Other tags: %s\n", Build.TAGS) +
- String.format("Screen Width: %s\n",
- wm.getDefaultDisplay().getWidth()) +
- String.format("Screen Height: %s\n",
- wm.getDefaultDisplay().getHeight()) +
- String.format("External storage state: %s\n\n",
- Environment.getExternalStorageState());
- }
-
- public String getLogcat() throws IOException
- {
- int maxLineCount = 250;
- StringBuilder builder = new StringBuilder();
-
- String[] command = new String[]{ "logcat", "-d" };
- java.lang.Process process = Runtime.getRuntime().exec(command);
-
- InputStreamReader in = new InputStreamReader(process.getInputStream());
- BufferedReader bufferedReader = new BufferedReader(in);
-
- LinkedList log = new LinkedList<>();
-
- String line;
- while ((line = bufferedReader.readLine()) != null)
- {
- log.addLast(line);
- if (log.size() > maxLineCount) log.removeFirst();
- }
-
- for (String l : log)
- {
- builder.append(l);
- builder.append('\n');
- }
-
- return builder.toString();
- }
-
- /**
- * Captures a bug report and saves it to a file in the SD card.
- *
- * The contents of the file are generated by the method {@link
- * #getBugReport()}. The file is saved in the apps's external private
- * storage.
- *
- * @return the generated file.
- * @throws IOException when I/O errors occur.
- */
- @NonNull
- public void dumpBugReportToFile()
- {
- try
- {
-
- String date =
- new SimpleDateFormat("yyyy-MM-dd HHmmss", Locale.US).format(
- new Date());
-
- if (context == null) throw new IllegalStateException();
-
- File dir = new AndroidDirFinder(context).getFilesDir("Logs");
- if (dir == null)
- throw new IOException("log dir should not be null");
-
- File logFile =
- new File(String.format("%s/Log %s.txt", dir.getPath(), date));
- FileWriter output = new FileWriter(logFile);
- output.write(getBugReport());
- output.close();
- }
- catch (IOException e)
- {
- e.printStackTrace();
- }
- }
-}
diff --git a/android/android-base/src/main/java/org/isoron/androidbase/AndroidBugReporter.kt b/android/android-base/src/main/java/org/isoron/androidbase/AndroidBugReporter.kt
new file mode 100644
index 000000000..ea013ceef
--- /dev/null
+++ b/android/android-base/src/main/java/org/isoron/androidbase/AndroidBugReporter.kt
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2017 Álinson Santos Xavier
+ *
+ * This file is part of Loop Habit Tracker.
+ *
+ * Loop Habit Tracker is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Loop Habit Tracker is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see .
+ */
+package org.isoron.androidbase
+
+import android.content.Context
+import android.os.Build
+import android.os.Environment
+import android.view.WindowManager
+import java.io.*
+import java.text.SimpleDateFormat
+import java.util.*
+import javax.inject.Inject
+
+open class AndroidBugReporter @Inject constructor(@AppContext private val context: Context) {
+
+ /**
+ * Captures and returns a bug report. The bug report contains some device
+ * information and the logcat.
+ *
+ * @return a String containing the bug report.
+ * @throws IOException when any I/O error occur.
+ */
+ @Throws(IOException::class)
+ fun getBugReport(): String {
+ var log = "---------- BUG REPORT BEGINS ----------\n"
+ log += "${getLogcat()}\n"
+ log += "${getDeviceInfo()}\n"
+ log += "---------- BUG REPORT ENDS ------------\n"
+ return log
+ }
+
+ @Throws(IOException::class)
+ fun getLogcat(): String {
+ val maxLineCount = 250
+ val builder = StringBuilder()
+ val process = Runtime.getRuntime().exec(arrayOf("logcat", "-d"))
+ val inputReader = InputStreamReader(process.inputStream)
+ val bufferedReader = BufferedReader(inputReader)
+ val log = LinkedList()
+ var line: String?
+ while (true) {
+ line = bufferedReader.readLine()
+ if (line == null) break;
+ log.addLast(line)
+ if (log.size > maxLineCount) log.removeFirst()
+ }
+ for (l in log) {
+ builder.appendln(l)
+ }
+ return builder.toString()
+ }
+
+ /**
+ * Captures a bug report and saves it to a file in the SD card.
+ *
+ * The contents of the file are generated by the method [ ][.getBugReport]. The file is saved
+ * in the apps's external private storage.
+ *
+ * @return the generated file.
+ * @throws IOException when I/O errors occur.
+ */
+ fun dumpBugReportToFile() {
+ try {
+ val date = SimpleDateFormat("yyyy-MM-dd HHmmss", Locale.US).format(Date())
+ val dir = AndroidDirFinder(context).getFilesDir("Logs")
+ ?: throw IOException("log dir should not be null")
+ val logFile = File(String.format("%s/Log %s.txt", dir.path, date))
+ val output = FileWriter(logFile)
+ output.write(getBugReport())
+ output.close()
+ } catch (e: IOException) {
+ e.printStackTrace()
+ }
+ }
+
+ private fun getDeviceInfo(): String {
+ val wm = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
+ return buildString {
+ appendln("App Version Name: ${BuildConfig.VERSION_NAME}")
+ appendln("App Version Code: ${BuildConfig.VERSION_CODE}")
+ appendln("OS Version: ${System.getProperty("os.version")} (${Build.VERSION.INCREMENTAL})")
+ appendln("OS API Level: ${Build.VERSION.SDK}")
+ appendln("Device: ${Build.DEVICE}")
+ appendln("Model (Product): ${Build.MODEL} (${Build.PRODUCT})")
+ appendln("Manufacturer: ${Build.MANUFACTURER}")
+ appendln("Other tags: ${Build.TAGS}")
+ appendln("Screen Width: ${wm.defaultDisplay.width}")
+ appendln("Screen Height: ${wm.defaultDisplay.height}")
+ appendln("External storage state: ${Environment.getExternalStorageState()}")
+ appendln()
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/android/android-base/src/main/java/org/isoron/androidbase/AndroidDirFinder.java b/android/android-base/src/main/java/org/isoron/androidbase/AndroidDirFinder.java
deleted file mode 100644
index 3e40aed4d..000000000
--- a/android/android-base/src/main/java/org/isoron/androidbase/AndroidDirFinder.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2017 Álinson Santos Xavier
- *
- * This file is part of Loop Habit Tracker.
- *
- * Loop Habit Tracker is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by the
- * Free Software Foundation, either version 3 of the License, or (at your
- * option) any later version.
- *
- * Loop Habit Tracker is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see .
- */
-
-package org.isoron.androidbase;
-
-import android.content.*;
-import android.support.annotation.*;
-import android.support.v4.content.*;
-import android.util.*;
-
-import org.isoron.androidbase.utils.*;
-
-import java.io.*;
-
-import javax.inject.*;
-
-public class AndroidDirFinder
-{
- @NonNull
- private Context context;
-
- @Inject
- public AndroidDirFinder(@NonNull @AppContext Context context)
- {
- this.context = context;
- }
-
- @Nullable
- public File getFilesDir(@Nullable String relativePath)
- {
- File externalFilesDirs[] =
- ContextCompat.getExternalFilesDirs(context, null);
- if (externalFilesDirs == null)
- {
- Log.e("BaseSystem",
- "getFilesDir: getExternalFilesDirs returned null");
- return null;
- }
-
- return FileUtils.getDir(externalFilesDirs, relativePath);
- }
-}
diff --git a/android/android-base/src/main/java/org/isoron/androidbase/AndroidDirFinder.kt b/android/android-base/src/main/java/org/isoron/androidbase/AndroidDirFinder.kt
new file mode 100644
index 000000000..ec1d6d783
--- /dev/null
+++ b/android/android-base/src/main/java/org/isoron/androidbase/AndroidDirFinder.kt
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2017 Álinson Santos Xavier
+ *
+ * This file is part of Loop Habit Tracker.
+ *
+ * Loop Habit Tracker is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Loop Habit Tracker is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see .
+ */
+package org.isoron.androidbase
+
+import android.content.Context
+import androidx.core.content.ContextCompat
+import org.isoron.androidbase.utils.FileUtils
+import java.io.File
+import javax.inject.Inject
+
+class AndroidDirFinder @Inject constructor(@param:AppContext private val context: Context) {
+ fun getFilesDir(relativePath: String): File? {
+ return FileUtils.getDir(
+ ContextCompat.getExternalFilesDirs(context, null),
+ relativePath
+ )
+ }
+}
\ No newline at end of file
diff --git a/android/android-base/src/main/java/org/isoron/androidbase/activities/ActivityContext.java b/android/android-base/src/main/java/org/isoron/androidbase/AppContext.kt
similarity index 80%
rename from android/android-base/src/main/java/org/isoron/androidbase/activities/ActivityContext.java
rename to android/android-base/src/main/java/org/isoron/androidbase/AppContext.kt
index 5749c4ecc..3146da5e2 100644
--- a/android/android-base/src/main/java/org/isoron/androidbase/activities/ActivityContext.java
+++ b/android/android-base/src/main/java/org/isoron/androidbase/AppContext.kt
@@ -16,16 +16,14 @@
* You should have received a copy of the GNU General Public License along
* with this program. If not, see .
*/
+package org.isoron.androidbase
-package org.isoron.androidbase.activities;
-
-import java.lang.annotation.*;
-
-import javax.inject.*;
+import java.lang.annotation.Documented
+import java.lang.annotation.Retention
+import java.lang.annotation.RetentionPolicy
+import javax.inject.Qualifier
@Qualifier
@Documented
@Retention(RetentionPolicy.RUNTIME)
-public @interface ActivityContext
-{
-}
+annotation class AppContext
\ No newline at end of file
diff --git a/android/android-base/src/main/java/org/isoron/androidbase/BaseExceptionHandler.java b/android/android-base/src/main/java/org/isoron/androidbase/BaseExceptionHandler.java
deleted file mode 100644
index 3a04b8b4f..000000000
--- a/android/android-base/src/main/java/org/isoron/androidbase/BaseExceptionHandler.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2017 Álinson Santos Xavier
- *
- * This file is part of Loop Habit Tracker.
- *
- * Loop Habit Tracker is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by the
- * Free Software Foundation, either version 3 of the License, or (at your
- * option) any later version.
- *
- * Loop Habit Tracker is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see .
- */
-
-package org.isoron.androidbase;
-
-import android.support.annotation.*;
-
-import org.isoron.androidbase.activities.*;
-
-public class BaseExceptionHandler implements Thread.UncaughtExceptionHandler
-{
- @Nullable
- private Thread.UncaughtExceptionHandler originalHandler;
-
- @NonNull
- private BaseActivity activity;
-
- public BaseExceptionHandler(@NonNull BaseActivity activity)
- {
- this.activity = activity;
- originalHandler = Thread.getDefaultUncaughtExceptionHandler();
- }
-
- @Override
- public void uncaughtException(@Nullable Thread thread,
- @Nullable Throwable ex)
- {
- if (ex == null) return;
-
- try
- {
- ex.printStackTrace();
- new AndroidBugReporter(activity).dumpBugReportToFile();
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
-
-// if (ex.getCause() instanceof InconsistentDatabaseException)
-// {
-// HabitsApplication app = (HabitsApplication) activity.getApplication();
-// HabitList habits = app.getComponent().getHabitList();
-// habits.repair();
-// System.exit(0);
-// }
-
- if (originalHandler != null)
- originalHandler.uncaughtException(thread, ex);
- }
-}
diff --git a/android/android-base/src/main/java/org/isoron/androidbase/BaseExceptionHandler.kt b/android/android-base/src/main/java/org/isoron/androidbase/BaseExceptionHandler.kt
new file mode 100644
index 000000000..c6907f3ec
--- /dev/null
+++ b/android/android-base/src/main/java/org/isoron/androidbase/BaseExceptionHandler.kt
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2017 Álinson Santos Xavier
+ *
+ * This file is part of Loop Habit Tracker.
+ *
+ * Loop Habit Tracker is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Loop Habit Tracker is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see .
+ */
+package org.isoron.androidbase
+
+import org.isoron.androidbase.activities.BaseActivity
+
+class BaseExceptionHandler(private val activity: BaseActivity) : Thread.UncaughtExceptionHandler {
+
+ private val originalHandler: Thread.UncaughtExceptionHandler? =
+ Thread.getDefaultUncaughtExceptionHandler()
+
+ override fun uncaughtException(thread: Thread?, ex: Throwable?) {
+ if (ex == null) return
+ if (thread == null) return
+ try {
+ ex.printStackTrace()
+ AndroidBugReporter(activity).dumpBugReportToFile()
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ originalHandler?.uncaughtException(thread, ex)
+ }
+}
\ No newline at end of file
diff --git a/android/android-base/src/main/java/org/isoron/androidbase/SSLContextProvider.java b/android/android-base/src/main/java/org/isoron/androidbase/SSLContextProvider.java
deleted file mode 100644
index c488bbc16..000000000
--- a/android/android-base/src/main/java/org/isoron/androidbase/SSLContextProvider.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2017 Álinson Santos Xavier
- *
- * This file is part of Loop Habit Tracker.
- *
- * Loop Habit Tracker is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by the
- * Free Software Foundation, either version 3 of the License, or (at your
- * option) any later version.
- *
- * Loop Habit Tracker is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see .
- */
-
-package org.isoron.androidbase;
-
-import android.content.*;
-import android.support.annotation.*;
-
-import org.isoron.androidbase.*;
-
-import java.io.*;
-import java.security.*;
-import java.security.cert.Certificate;
-import java.security.cert.*;
-
-import javax.inject.*;
-import javax.net.ssl.*;
-
-public class SSLContextProvider
-{
- private Context context;
-
- @Inject
- public SSLContextProvider(@NonNull @AppContext Context context)
- {
- this.context = context;
- }
-
- public SSLContext getCACertSSLContext()
- {
- try
- {
- CertificateFactory cf = CertificateFactory.getInstance("X.509");
- InputStream caInput = context.getAssets().open("cacert.pem");
- Certificate ca = cf.generateCertificate(caInput);
-
- KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
- ks.load(null, null);
- ks.setCertificateEntry("ca", ca);
-
- TrustManagerFactory tmf = TrustManagerFactory.getInstance(
- TrustManagerFactory.getDefaultAlgorithm());
- tmf.init(ks);
-
- SSLContext ctx = SSLContext.getInstance("TLS");
- ctx.init(null, tmf.getTrustManagers(), null);
-
- return ctx;
- }
- catch (Exception e)
- {
- throw new RuntimeException(e);
- }
- }
-}
diff --git a/android/android-base/src/main/java/org/isoron/androidbase/SSLContextProvider.kt b/android/android-base/src/main/java/org/isoron/androidbase/SSLContextProvider.kt
new file mode 100644
index 000000000..797d6c93d
--- /dev/null
+++ b/android/android-base/src/main/java/org/isoron/androidbase/SSLContextProvider.kt
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2017 Álinson Santos Xavier
+ *
+ * This file is part of Loop Habit Tracker.
+ *
+ * Loop Habit Tracker is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Loop Habit Tracker is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see .
+ */
+package org.isoron.androidbase
+
+import android.content.Context
+import java.security.KeyStore
+import java.security.cert.CertificateFactory
+import javax.inject.Inject
+import javax.net.ssl.SSLContext
+import javax.net.ssl.TrustManagerFactory
+
+class SSLContextProvider @Inject constructor(@param:AppContext private val context: Context) {
+ fun getCACertSSLContext(): SSLContext {
+ try {
+ val cf = CertificateFactory.getInstance("X.509")
+ val ca = cf.generateCertificate(context.assets.open("cacert.pem"))
+ val ks = KeyStore.getInstance(KeyStore.getDefaultType()).apply {
+ load(null, null)
+ setCertificateEntry("ca", ca)
+ }
+ val alg = TrustManagerFactory.getDefaultAlgorithm()
+ val tmf = TrustManagerFactory.getInstance(alg).apply {
+ init(ks)
+ }
+ return SSLContext.getInstance("TLS").apply {
+ init(null, tmf.trustManagers, null)
+ }
+ } catch (e: Exception) {
+ throw RuntimeException(e)
+ }
+ }
+}
\ No newline at end of file
diff --git a/android/android-base/src/main/java/org/isoron/androidbase/AppContext.java b/android/android-base/src/main/java/org/isoron/androidbase/activities/ActivityContext.kt
similarity index 82%
rename from android/android-base/src/main/java/org/isoron/androidbase/AppContext.java
rename to android/android-base/src/main/java/org/isoron/androidbase/activities/ActivityContext.kt
index d7521e26d..3ff33478d 100644
--- a/android/android-base/src/main/java/org/isoron/androidbase/AppContext.java
+++ b/android/android-base/src/main/java/org/isoron/androidbase/activities/ActivityContext.kt
@@ -16,16 +16,11 @@
* You should have received a copy of the GNU General Public License along
* with this program. If not, see .
*/
+package org.isoron.androidbase.activities
-package org.isoron.androidbase;
-
-import java.lang.annotation.*;
-
-import javax.inject.*;
+import javax.inject.*
@Qualifier
-@Documented
-@Retention(RetentionPolicy.RUNTIME)
-public @interface AppContext
-{
-}
+@MustBeDocumented
+@kotlin.annotation.Retention(AnnotationRetention.RUNTIME)
+annotation class ActivityContext
\ No newline at end of file
diff --git a/android/android-base/src/main/java/org/isoron/androidbase/activities/ActivityScope.java b/android/android-base/src/main/java/org/isoron/androidbase/activities/ActivityScope.kt
similarity index 89%
rename from android/android-base/src/main/java/org/isoron/androidbase/activities/ActivityScope.java
rename to android/android-base/src/main/java/org/isoron/androidbase/activities/ActivityScope.kt
index 82dad3ce9..957e980da 100644
--- a/android/android-base/src/main/java/org/isoron/androidbase/activities/ActivityScope.java
+++ b/android/android-base/src/main/java/org/isoron/androidbase/activities/ActivityScope.kt
@@ -16,13 +16,12 @@
* You should have received a copy of the GNU General Public License along
* with this program. If not, see .
*/
+package org.isoron.androidbase.activities
-package org.isoron.androidbase.activities;
-
-import javax.inject.*;
+import javax.inject.*
/**
* Scope used by objects that live as long as the activity is alive.
*/
@Scope
-public @interface ActivityScope { }
+annotation class ActivityScope
\ No newline at end of file
diff --git a/android/android-base/src/main/java/org/isoron/androidbase/activities/BaseActivity.java b/android/android-base/src/main/java/org/isoron/androidbase/activities/BaseActivity.java
index fae8c82ba..2dea22e50 100644
--- a/android/android-base/src/main/java/org/isoron/androidbase/activities/BaseActivity.java
+++ b/android/android-base/src/main/java/org/isoron/androidbase/activities/BaseActivity.java
@@ -21,8 +21,9 @@ package org.isoron.androidbase.activities;
import android.content.*;
import android.os.*;
-import android.support.annotation.*;
-import android.support.v7.app.*;
+
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.*;
import android.view.*;
import org.isoron.androidbase.*;
diff --git a/android/android-base/src/main/java/org/isoron/androidbase/activities/BaseMenu.java b/android/android-base/src/main/java/org/isoron/androidbase/activities/BaseMenu.java
index 7cba01ddc..c5113a3fa 100644
--- a/android/android-base/src/main/java/org/isoron/androidbase/activities/BaseMenu.java
+++ b/android/android-base/src/main/java/org/isoron/androidbase/activities/BaseMenu.java
@@ -19,9 +19,11 @@
package org.isoron.androidbase.activities;
-import android.support.annotation.*;
import android.view.*;
+import androidx.annotation.MenuRes;
+import androidx.annotation.NonNull;
+
/**
* Base class for all the menus in the application.
*
diff --git a/android/android-base/src/main/java/org/isoron/androidbase/activities/BaseRootView.java b/android/android-base/src/main/java/org/isoron/androidbase/activities/BaseRootView.java
index 21c0322f7..3ff339387 100644
--- a/android/android-base/src/main/java/org/isoron/androidbase/activities/BaseRootView.java
+++ b/android/android-base/src/main/java/org/isoron/androidbase/activities/BaseRootView.java
@@ -20,8 +20,10 @@
package org.isoron.androidbase.activities;
import android.content.*;
-import android.support.annotation.*;
-import android.support.v7.widget.Toolbar;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.appcompat.widget.Toolbar;
import android.view.*;
import android.widget.*;
diff --git a/android/android-base/src/main/java/org/isoron/androidbase/activities/BaseScreen.java b/android/android-base/src/main/java/org/isoron/androidbase/activities/BaseScreen.java
index f135a6e62..331d91742 100644
--- a/android/android-base/src/main/java/org/isoron/androidbase/activities/BaseScreen.java
+++ b/android/android-base/src/main/java/org/isoron/androidbase/activities/BaseScreen.java
@@ -24,15 +24,19 @@ import android.graphics.*;
import android.graphics.drawable.*;
import android.net.*;
import android.os.*;
-import android.support.annotation.*;
-import android.support.design.widget.*;
-import android.support.v4.content.res.*;
-import android.support.v7.app.*;
-import android.support.v7.view.ActionMode;
-import android.support.v7.widget.Toolbar;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.StringRes;
+import androidx.core.content.res.*;
+import androidx.appcompat.app.*;
+import androidx.appcompat.view.ActionMode;
+import androidx.appcompat.widget.Toolbar;
import android.view.*;
import android.widget.*;
+import com.google.android.material.snackbar.Snackbar;
+
import org.isoron.androidbase.*;
import org.isoron.androidbase.utils.*;
@@ -40,7 +44,7 @@ import java.io.*;
import static android.os.Build.VERSION.SDK_INT;
import static android.os.Build.VERSION_CODES.LOLLIPOP;
-import static android.support.v4.content.FileProvider.getUriForFile;
+import static androidx.core.content.FileProvider.getUriForFile;
/**
* Base class for all screens in the application.
@@ -214,7 +218,7 @@ public class BaseScreen
if (snackbar == null)
{
snackbar = Snackbar.make(rootView, stringId, Snackbar.LENGTH_SHORT);
- int tvId = android.support.design.R.id.snackbar_text;
+ int tvId = R.id.snackbar_text;
TextView tv = (TextView) snackbar.getView().findViewById(tvId);
tv.setTextColor(Color.WHITE);
}
diff --git a/android/android-base/src/main/java/org/isoron/androidbase/activities/BaseSelectionMenu.java b/android/android-base/src/main/java/org/isoron/androidbase/activities/BaseSelectionMenu.java
index 87396e216..a1b486555 100644
--- a/android/android-base/src/main/java/org/isoron/androidbase/activities/BaseSelectionMenu.java
+++ b/android/android-base/src/main/java/org/isoron/androidbase/activities/BaseSelectionMenu.java
@@ -19,8 +19,9 @@
package org.isoron.androidbase.activities;
-import android.support.annotation.*;
-import android.support.v7.view.ActionMode;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.appcompat.view.ActionMode;
import android.view.*;
/**
diff --git a/android/android-base/src/main/java/org/isoron/androidbase/utils/ColorUtils.java b/android/android-base/src/main/java/org/isoron/androidbase/utils/ColorUtils.java
deleted file mode 100644
index 58199d2dd..000000000
--- a/android/android-base/src/main/java/org/isoron/androidbase/utils/ColorUtils.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2016 Álinson Santos Xavier
- *
- * This file is part of Loop Habit Tracker.
- *
- * Loop Habit Tracker is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by the
- * Free Software Foundation, either version 3 of the License, or (at your
- * option) any later version.
- *
- * Loop Habit Tracker is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see .
- */
-
-package org.isoron.androidbase.utils;
-
-import android.graphics.*;
-
-public abstract class ColorUtils
-{
- public static int mixColors(int color1, int color2, float amount)
- {
- final byte ALPHA_CHANNEL = 24;
- final byte RED_CHANNEL = 16;
- final byte GREEN_CHANNEL = 8;
- final byte BLUE_CHANNEL = 0;
-
- final float inverseAmount = 1.0f - amount;
-
- int a = ((int) (((float) (color1 >> ALPHA_CHANNEL & 0xff) * amount) +
- ((float) (color2 >> ALPHA_CHANNEL & 0xff) *
- inverseAmount))) & 0xff;
- int r = ((int) (((float) (color1 >> RED_CHANNEL & 0xff) * amount) +
- ((float) (color2 >> RED_CHANNEL & 0xff) *
- inverseAmount))) & 0xff;
- int g = ((int) (((float) (color1 >> GREEN_CHANNEL & 0xff) * amount) +
- ((float) (color2 >> GREEN_CHANNEL & 0xff) *
- inverseAmount))) & 0xff;
- int b = ((int) (((float) (color1 & 0xff) * amount) +
- ((float) (color2 & 0xff) * inverseAmount))) & 0xff;
-
- return a << ALPHA_CHANNEL | r << RED_CHANNEL | g << GREEN_CHANNEL |
- b << BLUE_CHANNEL;
- }
-
- public static int setAlpha(int color, float newAlpha)
- {
- int intAlpha = (int) (newAlpha * 255);
- return Color.argb(intAlpha, Color.red(color), Color.green(color),
- Color.blue(color));
- }
-
- public static int setMinValue(int color, float newValue)
- {
- float hsv[] = new float[3];
- Color.colorToHSV(color, hsv);
- hsv[2] = Math.max(hsv[2], newValue);
- return Color.HSVToColor(hsv);
- }
-
-}
\ No newline at end of file
diff --git a/android/android-base/src/main/java/org/isoron/androidbase/utils/ColorUtils.kt b/android/android-base/src/main/java/org/isoron/androidbase/utils/ColorUtils.kt
new file mode 100644
index 000000000..5f3d3e9e8
--- /dev/null
+++ b/android/android-base/src/main/java/org/isoron/androidbase/utils/ColorUtils.kt
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2016 Álinson Santos Xavier
+ *
+ * This file is part of Loop Habit Tracker.
+ *
+ * Loop Habit Tracker is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Loop Habit Tracker is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see .
+ */
+package org.isoron.androidbase.utils
+
+import android.graphics.Color
+import kotlin.math.max
+
+object ColorUtils {
+ private const val ALPHA_CHANNEL = 24
+ private const val RED_CHANNEL = 16
+ private const val GREEN_CHANNEL = 8
+ private const val BLUE_CHANNEL = 0
+
+ @JvmStatic
+ fun mixColors(color1: Int, color2: Int, amount: Float): Int {
+ val a = mixColorChannel(color1, color2, amount, ALPHA_CHANNEL)
+ val r = mixColorChannel(color1, color2, amount, RED_CHANNEL)
+ val g = mixColorChannel(color1, color2, amount, GREEN_CHANNEL)
+ val b = mixColorChannel(color1, color2, amount, BLUE_CHANNEL)
+ return a or r or g or b
+ }
+
+ @JvmStatic
+ fun setAlpha(color: Int, newAlpha: Float): Int {
+ val intAlpha = (newAlpha * 255).toInt()
+ return Color.argb(intAlpha, Color.red(color), Color.green(color), Color.blue(color))
+ }
+
+ @JvmStatic
+ fun setMinValue(color: Int, newValue: Float): Int {
+ val hsv = FloatArray(3)
+ Color.colorToHSV(color, hsv)
+ hsv[2] = max(hsv[2], newValue)
+ return Color.HSVToColor(hsv)
+ }
+
+ private fun mixColorChannel(color1: Int, color2: Int, amount: Float, channel: Int): Int {
+ val fl = (color1 shr channel and 0xff).toFloat() * amount
+ val f2 = (color2 shr channel and 0xff).toFloat() * (1.0f - amount)
+ return (fl + f2).toInt() and 0xff shl channel
+ }
+}
\ No newline at end of file
diff --git a/android/android-base/src/main/java/org/isoron/androidbase/utils/FileUtils.java b/android/android-base/src/main/java/org/isoron/androidbase/utils/FileUtils.java
deleted file mode 100644
index 59ca4a9b4..000000000
--- a/android/android-base/src/main/java/org/isoron/androidbase/utils/FileUtils.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (C) 2017 Álinson Santos Xavier
- *
- * This file is part of Loop Habit Tracker.
- *
- * Loop Habit Tracker is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by the
- * Free Software Foundation, either version 3 of the License, or (at your
- * option) any later version.
- *
- * Loop Habit Tracker is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see .
- */
-
-package org.isoron.androidbase.utils;
-
-import android.os.*;
-import android.support.annotation.*;
-import android.util.*;
-
-import java.io.*;
-
-public abstract class FileUtils
-{
- public static void copy(File src, File dst) throws IOException
- {
- FileInputStream inStream = new FileInputStream(src);
- FileOutputStream outStream = new FileOutputStream(dst);
- copy(inStream, outStream);
- }
-
- public static void copy(InputStream inStream, File dst) throws IOException
- {
- FileOutputStream outStream = new FileOutputStream(dst);
- copy(inStream, outStream);
- }
-
- public static void copy(InputStream in, OutputStream out) throws IOException
- {
- int numBytes;
- byte[] buffer = new byte[1024];
-
- while ((numBytes = in.read(buffer)) != -1)
- out.write(buffer, 0, numBytes);
- }
-
- @Nullable
- public static File getDir(@NonNull File potentialParentDirs[],
- @Nullable String relativePath)
- {
- if (relativePath == null) relativePath = "";
-
- File chosenDir = null;
- for (File dir : potentialParentDirs)
- {
- if (dir == null || !dir.canWrite()) continue;
- chosenDir = dir;
- break;
- }
-
- if (chosenDir == null)
- {
- Log.e("FileUtils",
- "getDir: all potential parents are null or non-writable");
- return null;
- }
-
- File dir = new File(
- String.format("%s/%s/", chosenDir.getAbsolutePath(), relativePath));
- if (!dir.exists() && !dir.mkdirs())
- {
- Log.e("FileUtils",
- "getDir: chosen dir does not exist and cannot be created");
- return null;
- }
-
- return dir;
- }
-
- @Nullable
- public static File getSDCardDir(@Nullable String relativePath)
- {
- File parents[] =
- new File[]{ Environment.getExternalStorageDirectory() };
- return getDir(parents, relativePath);
- }
-}
diff --git a/android/android-base/src/main/java/org/isoron/androidbase/utils/FileUtils.kt b/android/android-base/src/main/java/org/isoron/androidbase/utils/FileUtils.kt
new file mode 100644
index 000000000..7e6b68f88
--- /dev/null
+++ b/android/android-base/src/main/java/org/isoron/androidbase/utils/FileUtils.kt
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2017 Álinson Santos Xavier
+ *
+ * This file is part of Loop Habit Tracker.
+ *
+ * Loop Habit Tracker is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Loop Habit Tracker is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see .
+ */
+package org.isoron.androidbase.utils
+
+import android.os.Environment
+import android.util.Log
+import java.io.*
+
+
+fun File.copyTo(dst: File) {
+ val inStream = FileInputStream(this)
+ val outStream = FileOutputStream(dst)
+ inStream.copyTo(outStream)
+}
+
+fun InputStream.copyTo(dst: File) {
+ val outStream = FileOutputStream(dst)
+ this.copyTo(outStream)
+}
+
+fun InputStream.copyTo(out: OutputStream) {
+ var numBytes: Int
+ val buffer = ByteArray(1024)
+ while (this.read(buffer).also { numBytes = it } != -1) {
+ out.write(buffer, 0, numBytes)
+ }
+}
+
+object FileUtils {
+ @JvmStatic
+ fun getDir(potentialParentDirs: Array, relativePath: String): File? {
+ val chosenDir: File? = potentialParentDirs.firstOrNull { dir -> dir.canWrite() }
+ if (chosenDir == null) {
+ Log.e("FileUtils", "getDir: all potential parents are null or non-writable")
+ return null
+ }
+ val dir = File("${chosenDir.absolutePath}/${relativePath}/")
+ if (!dir.exists() && !dir.mkdirs()) {
+ Log.e("FileUtils", "getDir: chosen dir does not exist and cannot be created")
+ return null
+ }
+ return dir
+ }
+
+ @JvmStatic
+ fun getSDCardDir(relativePath: String): File? {
+ val parents = arrayOf(Environment.getExternalStorageDirectory())
+ return getDir(parents, relativePath)
+ }
+}
\ No newline at end of file
diff --git a/android/android-base/src/main/java/org/isoron/androidbase/utils/InterfaceUtils.java b/android/android-base/src/main/java/org/isoron/androidbase/utils/InterfaceUtils.java
deleted file mode 100644
index e1fea418b..000000000
--- a/android/android-base/src/main/java/org/isoron/androidbase/utils/InterfaceUtils.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 2016 Álinson Santos Xavier
- *
- * This file is part of Loop Habit Tracker.
- *
- * Loop Habit Tracker is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by the
- * Free Software Foundation, either version 3 of the License, or (at your
- * option) any later version.
- *
- * Loop Habit Tracker is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see .
- */
-
-package org.isoron.androidbase.utils;
-
-import android.content.*;
-import android.content.res.*;
-import android.graphics.*;
-import android.support.annotation.*;
-import android.support.v4.view.*;
-import android.util.*;
-import android.view.*;
-import android.widget.*;
-
-public abstract class InterfaceUtils
-{
- private static Typeface fontAwesome;
-
- @Nullable
- private static Float fixedResolution = null;
-
- public static void setFixedResolution(@NonNull Float f)
- {
- fixedResolution = f;
- }
-
- public static Typeface getFontAwesome(Context context)
- {
- if(fontAwesome == null) fontAwesome =
- Typeface.createFromAsset(context.getAssets(),
- "fontawesome-webfont.ttf");
-
- return fontAwesome;
- }
-
- public static float dpToPixels(Context context, float dp)
- {
- if(fixedResolution != null) return dp * fixedResolution;
-
- Resources resources = context.getResources();
- DisplayMetrics metrics = resources.getDisplayMetrics();
- return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, metrics);
- }
-
- public static float spToPixels(Context context, float sp)
- {
- if(fixedResolution != null) return sp * fixedResolution;
-
- Resources resources = context.getResources();
- DisplayMetrics metrics = resources.getDisplayMetrics();
- return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, metrics);
- }
-
- public static float getDimension(Context context, int id)
- {
- float dim = context.getResources().getDimension(id);
- if (fixedResolution == null) return dim;
- else
- {
- DisplayMetrics dm = context.getResources().getDisplayMetrics();
- float actualDensity = dm.density;
- return dim / actualDensity * fixedResolution;
- }
- }
-
- public static void setupEditorAction(@NonNull ViewGroup parent,
- @NonNull TextView.OnEditorActionListener listener)
- {
- for (int i = 0; i < parent.getChildCount(); i++)
- {
- View child = parent.getChildAt(i);
-
- if (child instanceof ViewGroup)
- setupEditorAction((ViewGroup) child, listener);
-
- if (child instanceof TextView)
- ((TextView) child).setOnEditorActionListener(listener);
- }
- }
-
- public static boolean isLayoutRtl(View view)
- {
- return ViewCompat.getLayoutDirection(view) ==
- ViewCompat.LAYOUT_DIRECTION_RTL;
- }
-}
diff --git a/android/android-base/src/main/java/org/isoron/androidbase/utils/InterfaceUtils.kt b/android/android-base/src/main/java/org/isoron/androidbase/utils/InterfaceUtils.kt
new file mode 100644
index 000000000..6ce0abae8
--- /dev/null
+++ b/android/android-base/src/main/java/org/isoron/androidbase/utils/InterfaceUtils.kt
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2016 Álinson Santos Xavier
+ *
+ * This file is part of Loop Habit Tracker.
+ *
+ * Loop Habit Tracker is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Loop Habit Tracker is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see .
+ */
+package org.isoron.androidbase.utils
+
+import android.content.*
+import android.graphics.*
+import android.util.*
+import android.view.*
+import android.widget.*
+import android.widget.TextView.*
+import androidx.core.view.*
+
+object InterfaceUtils {
+ private var fontAwesome: Typeface? = null
+ private var fixedResolution: Float? = null
+
+ @JvmStatic
+ fun setFixedResolution(f: Float) {
+ fixedResolution = f
+ }
+
+ @JvmStatic
+ fun getFontAwesome(context: Context): Typeface? {
+ if (fontAwesome == null) {
+ fontAwesome = Typeface.createFromAsset(context.assets, "fontawesome-webfont.ttf")
+ }
+ return fontAwesome
+ }
+
+ @JvmStatic
+ fun dpToPixels(context: Context, dp: Float): Float {
+ if (fixedResolution != null) return dp * fixedResolution!!
+ return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
+ dp,
+ context.resources.displayMetrics)
+ }
+
+ @JvmStatic
+ fun spToPixels(context: Context, sp: Float): Float {
+ if (fixedResolution != null) return sp * fixedResolution!!
+ return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,
+ sp,
+ context.resources.displayMetrics)
+ }
+
+ @JvmStatic
+ fun getDimension(context: Context, id: Int): Float {
+ val dim = context.resources.getDimension(id)
+ if (fixedResolution != null) {
+ val actualDensity = context.resources.displayMetrics.density
+ return dim / actualDensity * fixedResolution!!
+ }
+ return dim
+ }
+
+ fun setupEditorAction(parent: ViewGroup,
+ listener: OnEditorActionListener) {
+ for (i in 0 until parent.childCount) {
+ val child = parent.getChildAt(i)
+ if (child is ViewGroup) setupEditorAction(child, listener)
+ if (child is TextView) child.setOnEditorActionListener(listener)
+ }
+ }
+
+ fun isLayoutRtl(view: View?): Boolean {
+ return ViewCompat.getLayoutDirection(view!!) ==
+ ViewCompat.LAYOUT_DIRECTION_RTL
+ }
+}
\ No newline at end of file
diff --git a/android/android-base/src/main/java/org/isoron/androidbase/utils/StyledResources.java b/android/android-base/src/main/java/org/isoron/androidbase/utils/StyledResources.java
deleted file mode 100644
index d15766f95..000000000
--- a/android/android-base/src/main/java/org/isoron/androidbase/utils/StyledResources.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (C) 2016 Álinson Santos Xavier
- *
- * This file is part of Loop Habit Tracker.
- *
- * Loop Habit Tracker is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by the
- * Free Software Foundation, either version 3 of the License, or (at your
- * option) any later version.
- *
- * Loop Habit Tracker is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see .
- */
-
-package org.isoron.androidbase.utils;
-
-import android.content.*;
-import android.content.res.*;
-import android.graphics.drawable.*;
-import android.support.annotation.*;
-
-import org.isoron.androidbase.*;
-
-public class StyledResources
-{
- private static Integer fixedTheme;
-
- private final Context context;
-
- public StyledResources(@NonNull Context context)
- {
- this.context = context;
- }
-
- public static void setFixedTheme(Integer theme)
- {
- fixedTheme = theme;
- }
-
- public boolean getBoolean(@AttrRes int attrId)
- {
- TypedArray ta = getTypedArray(attrId);
- boolean bool = ta.getBoolean(0, false);
- ta.recycle();
-
- return bool;
- }
-
- public int getDimension(@AttrRes int attrId)
- {
- TypedArray ta = getTypedArray(attrId);
- int dim = ta.getDimensionPixelSize(0, 0);
- ta.recycle();
-
- return dim;
- }
-
- public int getColor(@AttrRes int attrId)
- {
- TypedArray ta = getTypedArray(attrId);
- int color = ta.getColor(0, 0);
- ta.recycle();
-
- return color;
- }
-
- public Drawable getDrawable(@AttrRes int attrId)
- {
- TypedArray ta = getTypedArray(attrId);
- Drawable drawable = ta.getDrawable(0);
- ta.recycle();
-
- return drawable;
- }
-
- public float getFloat(@AttrRes int attrId)
- {
- TypedArray ta = getTypedArray(attrId);
- float f = ta.getFloat(0, 0);
- ta.recycle();
-
- return f;
- }
-
- public int[] getPalette()
- {
- int resourceId = getResource(R.attr.palette);
- if (resourceId < 0) throw new RuntimeException("resource not found");
-
- return context.getResources().getIntArray(resourceId);
- }
-
- public int getResource(@AttrRes int attrId)
- {
- TypedArray ta = getTypedArray(attrId);
- int resourceId = ta.getResourceId(0, -1);
- ta.recycle();
-
- return resourceId;
- }
-
- private TypedArray getTypedArray(@AttrRes int attrId)
- {
- int[] attrs = new int[]{ attrId };
-
- if (fixedTheme != null)
- return context.getTheme().obtainStyledAttributes(fixedTheme, attrs);
-
- return context.obtainStyledAttributes(attrs);
- }
-}
diff --git a/android/android-base/src/main/java/org/isoron/androidbase/utils/StyledResources.kt b/android/android-base/src/main/java/org/isoron/androidbase/utils/StyledResources.kt
new file mode 100644
index 000000000..3ef22d052
--- /dev/null
+++ b/android/android-base/src/main/java/org/isoron/androidbase/utils/StyledResources.kt
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2016 Álinson Santos Xavier
+ *
+ * This file is part of Loop Habit Tracker.
+ *
+ * Loop Habit Tracker is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Loop Habit Tracker is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see .
+ */
+package org.isoron.androidbase.utils
+
+import android.content.Context
+import android.content.res.TypedArray
+import android.graphics.drawable.Drawable
+import androidx.annotation.AttrRes
+import org.isoron.androidbase.R
+
+class StyledResources(private val context: Context) {
+
+ fun getBoolean(@AttrRes attrId: Int): Boolean {
+ val ta = getTypedArray(attrId)
+ val bool = ta.getBoolean(0, false)
+ ta.recycle()
+ return bool
+ }
+
+ fun getDimension(@AttrRes attrId: Int): Int {
+ val ta = getTypedArray(attrId)
+ val dim = ta.getDimensionPixelSize(0, 0)
+ ta.recycle()
+ return dim
+ }
+
+ fun getColor(@AttrRes attrId: Int): Int {
+ val ta = getTypedArray(attrId)
+ val color = ta.getColor(0, 0)
+ ta.recycle()
+ return color
+ }
+
+ fun getDrawable(@AttrRes attrId: Int): Drawable? {
+ val ta = getTypedArray(attrId)
+ val drawable = ta.getDrawable(0)
+ ta.recycle()
+ return drawable
+ }
+
+ fun getFloat(@AttrRes attrId: Int): Float {
+ val ta = getTypedArray(attrId)
+ val f = ta.getFloat(0, 0f)
+ ta.recycle()
+ return f
+ }
+
+ fun getPalette(): IntArray {
+ val resourceId = getResource(R.attr.palette)
+ if (resourceId < 0) throw RuntimeException("palette resource not found")
+ return context.resources.getIntArray(resourceId)
+ }
+
+ fun getResource(@AttrRes attrId: Int): Int {
+ val ta = getTypedArray(attrId)
+ val resourceId = ta.getResourceId(0, -1)
+ ta.recycle()
+ return resourceId
+ }
+
+ private fun getTypedArray(@AttrRes attrId: Int): TypedArray {
+ val attrs = intArrayOf(attrId)
+ if (fixedTheme != null) {
+ return context.theme.obtainStyledAttributes(fixedTheme!!, attrs)
+ }
+ return context.obtainStyledAttributes(attrs)
+ }
+
+ companion object {
+ private var fixedTheme: Int? = null
+
+ @JvmStatic
+ fun setFixedTheme(theme: Int?) {
+ fixedTheme = theme
+ }
+ }
+}
\ No newline at end of file
diff --git a/android/android-pickers/build.gradle b/android/android-pickers/build.gradle
index 41b55a8d5..0627c16ca 100644
--- a/android/android-pickers/build.gradle
+++ b/android/android-pickers/build.gradle
@@ -6,16 +6,6 @@ android {
defaultConfig {
minSdkVersion MIN_SDK_VERSION as Integer
targetSdkVersion TARGET_SDK_VERSION as Integer
- versionCode 1
- versionName "1.0"
- testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
- }
-
- buildTypes {
- release {
- minifyEnabled false
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- }
}
compileOptions {
@@ -30,5 +20,5 @@ android {
}
dependencies {
- implementation "com.android.support:appcompat-v7:$SUPPORT_LIBRARY_VERSION"
+ implementation 'androidx.appcompat:appcompat:1.0.0'
}
diff --git a/android/android-pickers/src/main/java/com/android/colorpicker/ColorPickerDialog.java b/android/android-pickers/src/main/java/com/android/colorpicker/ColorPickerDialog.java
index 1060faf5b..a4f503392 100644
--- a/android/android-pickers/src/main/java/com/android/colorpicker/ColorPickerDialog.java
+++ b/android/android-pickers/src/main/java/com/android/colorpicker/ColorPickerDialog.java
@@ -18,8 +18,8 @@ package com.android.colorpicker;
import android.app.*;
import android.os.*;
-import android.support.v7.app.AlertDialog;
-import android.support.v7.app.*;
+import androidx.appcompat.app.AlertDialog;
+import androidx.appcompat.app.*;
import android.view.*;
import android.widget.*;
diff --git a/android/android-pickers/src/main/java/com/android/datetimepicker/date/MonthView.java b/android/android-pickers/src/main/java/com/android/datetimepicker/date/MonthView.java
index eff8b8186..79cda6b80 100644
--- a/android/android-pickers/src/main/java/com/android/datetimepicker/date/MonthView.java
+++ b/android/android-pickers/src/main/java/com/android/datetimepicker/date/MonthView.java
@@ -21,13 +21,15 @@ import android.content.res.*;
import android.graphics.*;
import android.graphics.Paint.*;
import android.os.*;
-import android.support.v4.view.*;
-import android.support.v4.view.accessibility.*;
-import android.support.v4.widget.*;
+import androidx.core.view.*;
+import androidx.core.view.accessibility.*;
+import androidx.core.widget.*;
import android.text.format.*;
import android.view.*;
import android.view.accessibility.*;
+import androidx.customview.widget.ExploreByTouchHelper;
+
import com.android.*;
import com.android.datetimepicker.*;
import com.android.datetimepicker.date.MonthAdapter.*;
diff --git a/android/android-pickers/src/main/java/com/android/datetimepicker/time/AmPmCirclesView.java b/android/android-pickers/src/main/java/com/android/datetimepicker/time/AmPmCirclesView.java
index f310a1d85..3c6316521 100644
--- a/android/android-pickers/src/main/java/com/android/datetimepicker/time/AmPmCirclesView.java
+++ b/android/android-pickers/src/main/java/com/android/datetimepicker/time/AmPmCirclesView.java
@@ -41,8 +41,8 @@ public class AmPmCirclesView extends View {
private final Paint mPaint = new Paint();
private int mSelectedAlpha;
private int mUnselectedColor;
- private int mAmPmTextColor;
- private int mSelectedColor;
+ protected int mAmPmTextColor = Color.WHITE;
+ protected int mSelectedColor = Color.BLUE;
private float mCircleRadiusMultiplier;
private float mAmPmCircleRadiusMultiplier;
private String mAmText;
@@ -73,8 +73,8 @@ public class AmPmCirclesView extends View {
Resources res = context.getResources();
mUnselectedColor = res.getColor(R.color.white);
- mSelectedColor = res.getColor(R.color.blue);
- mAmPmTextColor = res.getColor(R.color.ampm_text_color);
+ //mSelectedColor = res.getColor(R.color.blue);
+ //mAmPmTextColor = res.getColor(R.color.ampm_text_color);
mSelectedAlpha = SELECTED_ALPHA;
String typefaceFamily = res.getString(R.string.sans_serif);
Typeface tf = Typeface.create(typefaceFamily, Typeface.NORMAL);
@@ -105,8 +105,8 @@ public class AmPmCirclesView extends View {
mSelectedAlpha = SELECTED_ALPHA_THEME_DARK;
} else {
mUnselectedColor = res.getColor(R.color.white);
- mSelectedColor = res.getColor(R.color.blue);
- mAmPmTextColor = res.getColor(R.color.ampm_text_color);
+ //mSelectedColor = res.getColor(R.color.blue);
+ //mAmPmTextColor = res.getColor(R.color.ampm_text_color);
mSelectedAlpha = SELECTED_ALPHA;
}
}
diff --git a/android/android-pickers/src/main/java/com/android/datetimepicker/time/RadialPickerLayout.java b/android/android-pickers/src/main/java/com/android/datetimepicker/time/RadialPickerLayout.java
index 265b98cf8..307424a3e 100644
--- a/android/android-pickers/src/main/java/com/android/datetimepicker/time/RadialPickerLayout.java
+++ b/android/android-pickers/src/main/java/com/android/datetimepicker/time/RadialPickerLayout.java
@@ -84,6 +84,14 @@ public class RadialPickerLayout extends FrameLayout implements OnTouchListener {
private AnimatorSet mTransition;
private Handler mHandler = new Handler();
+ public void setColor(int selectedColor)
+ {
+ mHourRadialSelectorView.mPaint.setColor(selectedColor);
+ mMinuteRadialSelectorView.mPaint.setColor(selectedColor);
+ mAmPmCirclesView.mSelectedColor = selectedColor;
+ mAmPmCirclesView.mAmPmTextColor = selectedColor;
+ }
+
public interface OnValueSelectedListener {
void onValueSelected(int pickerIndex, int newValue, boolean autoAdvance);
}
diff --git a/android/android-pickers/src/main/java/com/android/datetimepicker/time/RadialSelectorView.java b/android/android-pickers/src/main/java/com/android/datetimepicker/time/RadialSelectorView.java
index 48e4385b5..018147efa 100644
--- a/android/android-pickers/src/main/java/com/android/datetimepicker/time/RadialSelectorView.java
+++ b/android/android-pickers/src/main/java/com/android/datetimepicker/time/RadialSelectorView.java
@@ -40,7 +40,7 @@ public class RadialSelectorView extends View {
// Alpha level for the line.
private static final int FULL_ALPHA = Utils.FULL_ALPHA;
- private final Paint mPaint = new Paint();
+ protected final Paint mPaint = new Paint();
private boolean mIsInitialized;
private boolean mDrawValuesReady;
@@ -96,8 +96,6 @@ public class RadialSelectorView extends View {
Resources res = context.getResources();
- int blue = res.getColor(R.color.blue);
- mPaint.setColor(blue);
mPaint.setAntiAlias(true);
mSelectionAlpha = SELECTED_ALPHA;
@@ -139,15 +137,11 @@ public class RadialSelectorView extends View {
/* package */ void setTheme(Context context, boolean themeDark) {
Resources res = context.getResources();
- int color;
if (themeDark) {
- color = res.getColor(R.color.red);
mSelectionAlpha = SELECTED_ALPHA_THEME_DARK;
} else {
- color = res.getColor(R.color.blue);
mSelectionAlpha = SELECTED_ALPHA;
}
- mPaint.setColor(color);
}
/**
diff --git a/android/android-pickers/src/main/java/com/android/datetimepicker/time/TimePickerDialog.java b/android/android-pickers/src/main/java/com/android/datetimepicker/time/TimePickerDialog.java
index 06c121b3c..0a8411bc5 100644
--- a/android/android-pickers/src/main/java/com/android/datetimepicker/time/TimePickerDialog.java
+++ b/android/android-pickers/src/main/java/com/android/datetimepicker/time/TimePickerDialog.java
@@ -23,7 +23,9 @@ import android.app.*;
import android.content.*;
import android.content.res.*;
import android.os.*;
-import android.support.v7.app.*;
+
+import androidx.appcompat.app.*;
+
import android.util.*;
import android.view.*;
import android.view.View.*;
@@ -39,7 +41,8 @@ import java.util.*;
/**
* Dialog to set a time.
*/
-public class TimePickerDialog extends AppCompatDialogFragment implements OnValueSelectedListener{
+public class TimePickerDialog extends AppCompatDialogFragment implements OnValueSelectedListener
+{
private static final String TAG = "TimePickerDialog";
private static final String KEY_HOUR_OF_DAY = "hour_of_day";
@@ -49,6 +52,7 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue
private static final String KEY_IN_KB_MODE = "in_kb_mode";
private static final String KEY_TYPED_TIMES = "typed_times";
private static final String KEY_DARK_THEME = "dark_theme";
+ private static final String KEY_SELECTED_COLOR = "selected_color";
public static final int HOUR_INDEX = 0;
public static final int MINUTE_INDEX = 1;
@@ -108,37 +112,50 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue
* The callback interface used to indicate the user is done filling in
* the time (they clicked on the 'Set' button).
*/
- public interface OnTimeSetListener {
+ public interface OnTimeSetListener
+ {
/**
- * @param view The view associated with this listener.
+ * @param view The view associated with this listener.
* @param hourOfDay The hour that was set.
- * @param minute The minute that was set.
+ * @param minute The minute that was set.
*/
void onTimeSet(RadialPickerLayout view, int hourOfDay, int minute);
-
- default void onTimeCleared(RadialPickerLayout view) {}
+
+ default void onTimeCleared(RadialPickerLayout view)
+ {
+ }
}
- public TimePickerDialog() {
+ public TimePickerDialog()
+ {
// Empty constructor required for dialog fragment.
}
@SuppressLint("Java")
public TimePickerDialog(Context context, int theme, OnTimeSetListener callback,
- int hourOfDay, int minute, boolean is24HourMode) {
+ int hourOfDay, int minute, boolean is24HourMode)
+ {
// Empty constructor required for dialog fragment.
}
public static TimePickerDialog newInstance(OnTimeSetListener callback,
- int hourOfDay, int minute, boolean is24HourMode) {
+ int hourOfDay,
+ int minute,
+ boolean is24HourMode,
+ int color)
+ {
TimePickerDialog ret = new TimePickerDialog();
- ret.initialize(callback, hourOfDay, minute, is24HourMode);
+ ret.initialize(callback, hourOfDay, minute, is24HourMode, color);
return ret;
}
public void initialize(OnTimeSetListener callback,
- int hourOfDay, int minute, boolean is24HourMode) {
+ int hourOfDay,
+ int minute,
+ boolean is24HourMode,
+ int color)
+ {
mCallback = callback;
mInitialHourOfDay = hourOfDay;
@@ -146,40 +163,47 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue
mIs24HourMode = is24HourMode;
mInKbMode = false;
mThemeDark = false;
+ mSelectedColor = color;
}
/**
* Set a dark or light theme. NOTE: this will only take effect for the next onCreateView.
*/
- public void setThemeDark(boolean dark) {
+ public void setThemeDark(boolean dark)
+ {
mThemeDark = dark;
}
- public boolean isThemeDark() {
+ public boolean isThemeDark()
+ {
return mThemeDark;
}
- public void setOnTimeSetListener(OnTimeSetListener callback) {
+ public void setOnTimeSetListener(OnTimeSetListener callback)
+ {
mCallback = callback;
}
- public void setStartTime(int hourOfDay, int minute) {
+ public void setStartTime(int hourOfDay, int minute)
+ {
mInitialHourOfDay = hourOfDay;
mInitialMinute = minute;
mInKbMode = false;
}
@Override
- public void onCreate(Bundle savedInstanceState) {
+ public void onCreate(Bundle savedInstanceState)
+ {
super.onCreate(savedInstanceState);
if (savedInstanceState != null && savedInstanceState.containsKey(KEY_HOUR_OF_DAY)
- && savedInstanceState.containsKey(KEY_MINUTE)
- && savedInstanceState.containsKey(KEY_IS_24_HOUR_VIEW)) {
+ && savedInstanceState.containsKey(KEY_MINUTE)
+ && savedInstanceState.containsKey(KEY_IS_24_HOUR_VIEW)) {
mInitialHourOfDay = savedInstanceState.getInt(KEY_HOUR_OF_DAY);
mInitialMinute = savedInstanceState.getInt(KEY_MINUTE);
mIs24HourMode = savedInstanceState.getBoolean(KEY_IS_24_HOUR_VIEW);
mInKbMode = savedInstanceState.getBoolean(KEY_IN_KB_MODE);
mThemeDark = savedInstanceState.getBoolean(KEY_DARK_THEME);
+ mSelectedColor = savedInstanceState.getInt(KEY_SELECTED_COLOR);
}
}
@@ -191,7 +215,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
+ Bundle savedInstanceState)
+ {
getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);
View view = inflater.inflate(R.layout.time_picker_dialog, null);
@@ -203,8 +228,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue
mSelectHours = res.getString(R.string.select_hours);
mMinutePickerDescription = res.getString(R.string.minute_picker_description);
mSelectMinutes = res.getString(R.string.select_minutes);
- mSelectedColor = res.getColor(mThemeDark? R.color.red : R.color.blue);
- mUnselectedColor = res.getColor(mThemeDark? R.color.white : R.color.numbers_text_color);
+ //mSelectedColor = res.getColor(mThemeDark ? R.color.red : R.color.blue);
+ mUnselectedColor = res.getColor(mThemeDark ? R.color.white : R.color.numbers_text_color);
mHourView = (TextView) view.findViewById(R.id.hours);
mHourView.setOnKeyListener(keyboardListener);
@@ -223,8 +248,9 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue
mTimePicker = (RadialPickerLayout) view.findViewById(R.id.time_picker);
mTimePicker.setOnValueSelectedListener(this);
mTimePicker.setOnKeyListener(keyboardListener);
+ mTimePicker.setColor(mSelectedColor);
mTimePicker.initialize(getActivity(), mHapticFeedbackController, mInitialHourOfDay,
- mInitialMinute, mIs24HourMode);
+ mInitialMinute, mIs24HourMode);
int currentItemShowing = HOUR_INDEX;
if (savedInstanceState != null &&
@@ -234,25 +260,31 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue
setCurrentItemShowing(currentItemShowing, false, true, true);
mTimePicker.invalidate();
- mHourView.setOnClickListener(new OnClickListener() {
+ mHourView.setOnClickListener(new OnClickListener()
+ {
@Override
- public void onClick(View v) {
+ public void onClick(View v)
+ {
setCurrentItemShowing(HOUR_INDEX, true, false, true);
tryVibrate();
}
});
- mMinuteView.setOnClickListener(new OnClickListener() {
+ mMinuteView.setOnClickListener(new OnClickListener()
+ {
@Override
- public void onClick(View v) {
+ public void onClick(View v)
+ {
setCurrentItemShowing(MINUTE_INDEX, true, false, true);
tryVibrate();
}
});
mDoneButton = (TextView) view.findViewById(R.id.done_button);
- mDoneButton.setOnClickListener(new OnClickListener() {
+ mDoneButton.setOnClickListener(new OnClickListener()
+ {
@Override
- public void onClick(View v) {
+ public void onClick(View v)
+ {
if (mInKbMode && isTypedTimeFullyLegal()) {
finishKbMode(false);
} else {
@@ -260,25 +292,25 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue
}
if (mCallback != null) {
mCallback.onTimeSet(mTimePicker,
- mTimePicker.getHours(), mTimePicker.getMinutes());
+ mTimePicker.getHours(), mTimePicker.getMinutes());
}
dismiss();
}
});
mDoneButton.setOnKeyListener(keyboardListener);
-
+
mClearButton = (TextView) view.findViewById(R.id.clear_button);
mClearButton.setOnClickListener(new OnClickListener()
- {
- @Override
- public void onClick(View v)
- {
- if(mCallback != null) {
- mCallback.onTimeCleared(mTimePicker);
- }
- dismiss();
- }
- });
+ {
+ @Override
+ public void onClick(View v)
+ {
+ if (mCallback != null) {
+ mCallback.onTimeCleared(mTimePicker);
+ }
+ dismiss();
+ }
+ });
mClearButton.setOnKeyListener(keyboardListener);
// Enable or disable the AM/PM view.
@@ -293,15 +325,17 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue
separatorView.setLayoutParams(paramsSeparator);
} else {
mAmPmTextView.setVisibility(View.VISIBLE);
- updateAmPmDisplay(mInitialHourOfDay < 12? AM : PM);
- mAmPmHitspace.setOnClickListener(new OnClickListener() {
+ updateAmPmDisplay(mInitialHourOfDay < 12 ? AM : PM);
+ mAmPmHitspace.setOnClickListener(new OnClickListener()
+ {
@Override
- public void onClick(View v) {
+ public void onClick(View v)
+ {
tryVibrate();
int amOrPm = mTimePicker.getIsCurrentlyAmOrPm();
if (amOrPm == AM) {
amOrPm = PM;
- } else if (amOrPm == PM){
+ } else if (amOrPm == PM) {
amOrPm = AM;
}
updateAmPmDisplay(amOrPm);
@@ -328,56 +362,61 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue
mTypedTimes = new ArrayList();
}
- // Set the theme at the end so that the initialize()s above don't counteract the theme.
- mTimePicker.setTheme(getActivity().getApplicationContext(), mThemeDark);
- // Prepare some palette to use.
- int white = res.getColor(R.color.white);
- int circleBackground = res.getColor(R.color.circle_background);
- int line = res.getColor(R.color.line_background);
- int timeDisplay = res.getColor(R.color.numbers_text_color);
- ColorStateList doneTextColor = res.getColorStateList(R.color.done_text_color);
- int doneBackground = R.drawable.done_background_color;
- int darkGray = res.getColor(R.color.dark_gray);
- int lightGray = res.getColor(R.color.light_gray);
- int darkLine = res.getColor(R.color.line_dark);
- ColorStateList darkDoneTextColor = res.getColorStateList(R.color.done_text_color_dark);
- int darkDoneBackground = R.drawable.done_background_color_dark;
+// // Set the theme at the end so that the initialize()s above don't counteract the theme.
+// mTimePicker.setTheme(getActivity().getApplicationContext(), mThemeDark);
+// // Prepare some palette to use.
+// int white = res.getColor(R.color.white);
+// int circleBackground = res.getColor(R.color.circle_background);
+// int line = res.getColor(R.color.line_background);
+// int timeDisplay = res.getColor(R.color.numbers_text_color);
+// ColorStateList doneTextColor = res.getColorStateList(R.color.done_text_color);
+// int doneBackground = R.drawable.done_background_color;
+//
+// int darkGray = res.getColor(R.color.dark_gray);
+// int lightGray = res.getColor(R.color.light_gray);
+// int darkLine = res.getColor(R.color.line_dark);
+// ColorStateList darkDoneTextColor = res.getColorStateList(R.color.done_text_color_dark);
+// int darkDoneBackground = R.drawable.done_background_color_dark;
// Set the palette for each view based on the theme.
- view.findViewById(R.id.time_display_background).setBackgroundColor(mThemeDark? darkGray : white);
- view.findViewById(R.id.time_display).setBackgroundColor(mThemeDark? darkGray : white);
- ((TextView) view.findViewById(R.id.separator)).setTextColor(mThemeDark? white : timeDisplay);
- ((TextView) view.findViewById(R.id.ampm_label)).setTextColor(mThemeDark? white : timeDisplay);
- view.findViewById(R.id.line).setBackgroundColor(mThemeDark? darkLine : line);
- mDoneButton.setTextColor(mThemeDark? darkDoneTextColor : doneTextColor);
- mTimePicker.setBackgroundColor(mThemeDark? lightGray : circleBackground);
- mDoneButton.setBackgroundResource(mThemeDark? darkDoneBackground : doneBackground);
+// view.findViewById(R.id.time_display_background).setBackgroundColor(mThemeDark? darkGray : white);
+// view.findViewById(R.id.time_display).setBackgroundColor(mThemeDark? darkGray : white);
+// ((TextView) view.findViewById(R.id.separator)).setTextColor(mThemeDark? white : timeDisplay);
+// ((TextView) view.findViewById(R.id.ampm_label)).setTextColor(mThemeDark? white : timeDisplay);
+// view.findViewById(R.id.line).setBackgroundColor(mThemeDark? darkLine : line);
+// mDoneButton.setTextColor(mThemeDark? darkDoneTextColor : doneTextColor);
+// mTimePicker.setBackgroundColor(mThemeDark? lightGray : circleBackground);
+// mDoneButton.setBackgroundResource(mThemeDark? darkDoneBackground : doneBackground);
return view;
}
@Override
- public void onResume() {
+ public void onResume()
+ {
super.onResume();
mHapticFeedbackController.start();
}
@Override
- public void onPause() {
+ public void onPause()
+ {
super.onPause();
mHapticFeedbackController.stop();
}
- public void tryVibrate() {
+ public void tryVibrate()
+ {
mHapticFeedbackController.tryVibrate();
}
- private void updateAmPmDisplay(int amOrPm) {
+ private void updateAmPmDisplay(int amOrPm)
+ {
if (amOrPm == AM) {
mAmPmTextView.setText(mAmText);
Utils.tryAccessibilityAnnounce(mTimePicker, mAmText);
mAmPmHitspace.setContentDescription(mAmText);
- } else if (amOrPm == PM){
+ } else if (amOrPm == PM) {
mAmPmTextView.setText(mPmText);
Utils.tryAccessibilityAnnounce(mTimePicker, mPmText);
mAmPmHitspace.setContentDescription(mPmText);
@@ -387,7 +426,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue
}
@Override
- public void onSaveInstanceState(Bundle outState) {
+ public void onSaveInstanceState(Bundle outState)
+ {
if (mTimePicker != null) {
outState.putInt(KEY_HOUR_OF_DAY, mTimePicker.getHours());
outState.putInt(KEY_MINUTE, mTimePicker.getMinutes());
@@ -398,6 +438,7 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue
outState.putIntegerArrayList(KEY_TYPED_TIMES, mTypedTimes);
}
outState.putBoolean(KEY_DARK_THEME, mThemeDark);
+ outState.putInt(KEY_SELECTED_COLOR, mSelectedColor);
}
}
@@ -405,7 +446,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue
* Called by the picker for updating the header display.
*/
@Override
- public void onValueSelected(int pickerIndex, int newValue, boolean autoAdvance) {
+ public void onValueSelected(int pickerIndex, int newValue, boolean autoAdvance)
+ {
if (pickerIndex == HOUR_INDEX) {
setHour(newValue, false);
String announcement = String.format("%d", newValue);
@@ -417,7 +459,7 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue
}
Utils.tryAccessibilityAnnounce(mTimePicker, announcement);
- } else if (pickerIndex == MINUTE_INDEX){
+ } else if (pickerIndex == MINUTE_INDEX) {
setMinute(newValue);
mTimePicker.setContentDescription(mMinutePickerDescription + ": " + newValue);
} else if (pickerIndex == AMPM_INDEX) {
@@ -430,7 +472,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue
}
}
- private void setHour(int value, boolean announce) {
+ private void setHour(int value, boolean announce)
+ {
String format;
if (mIs24HourMode) {
format = "%02d";
@@ -450,7 +493,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue
}
}
- private void setMinute(int value) {
+ private void setMinute(int value)
+ {
if (value == 60) {
value = 0;
}
@@ -462,7 +506,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue
// Show either Hours or Minutes.
private void setCurrentItemShowing(int index, boolean animateCircle, boolean delayLabelAnimate,
- boolean announce) {
+ boolean announce)
+ {
mTimePicker.setCurrentItemShowing(index, animateCircle);
TextView labelToAnimate;
@@ -485,8 +530,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue
labelToAnimate = mMinuteView;
}
- int hourColor = (index == HOUR_INDEX)? mSelectedColor : mUnselectedColor;
- int minuteColor = (index == MINUTE_INDEX)? mSelectedColor : mUnselectedColor;
+ int hourColor = (index == HOUR_INDEX) ? mSelectedColor : mUnselectedColor;
+ int minuteColor = (index == MINUTE_INDEX) ? mSelectedColor : mUnselectedColor;
mHourView.setTextColor(hourColor);
mMinuteView.setTextColor(minuteColor);
@@ -499,15 +544,17 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue
/**
* For keyboard mode, processes key events.
+ *
* @param keyCode the pressed key.
* @return true if the key was successfully processed, false otherwise.
*/
- private boolean processKeyUp(int keyCode) {
+ private boolean processKeyUp(int keyCode)
+ {
if (keyCode == KeyEvent.KEYCODE_ESCAPE || keyCode == KeyEvent.KEYCODE_BACK) {
dismiss();
return true;
} else if (keyCode == KeyEvent.KEYCODE_TAB) {
- if(mInKbMode) {
+ if (mInKbMode) {
if (isTypedTimeFullyLegal()) {
finishKbMode(true);
}
@@ -522,7 +569,7 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue
}
if (mCallback != null) {
mCallback.onTimeSet(mTimePicker,
- mTimePicker.getHours(), mTimePicker.getMinutes());
+ mTimePicker.getHours(), mTimePicker.getMinutes());
}
dismiss();
return true;
@@ -539,7 +586,7 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue
deletedKeyStr = String.format("%d", getValFromKeyCode(deleted));
}
Utils.tryAccessibilityAnnounce(mTimePicker,
- String.format(mDeletedKeyFormat, deletedKeyStr));
+ String.format(mDeletedKeyFormat, deletedKeyStr));
updateDisplay(true);
}
}
@@ -549,7 +596,7 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue
|| keyCode == KeyEvent.KEYCODE_6 || keyCode == KeyEvent.KEYCODE_7
|| keyCode == KeyEvent.KEYCODE_8 || keyCode == KeyEvent.KEYCODE_9
|| (!mIs24HourMode &&
- (keyCode == getAmOrPmKeyCode(AM) || keyCode == getAmOrPmKeyCode(PM)))) {
+ (keyCode == getAmOrPmKeyCode(AM) || keyCode == getAmOrPmKeyCode(PM)))) {
if (!mInKbMode) {
if (mTimePicker == null) {
// Something's wrong, because time picker should definitely not be null.
@@ -572,11 +619,13 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue
/**
* Try to start keyboard mode with the specified key, as long as the timepicker is not in the
* middle of a touch-event.
+ *
* @param keyCode The key to use as the first press. Keyboard mode will not be started if the
- * key is not legal to start with. Or, pass in -1 to get into keyboard mode without a starting
- * key.
+ * key is not legal to start with. Or, pass in -1 to get into keyboard mode without a starting
+ * key.
*/
- private void tryStartingKbMode(int keyCode) {
+ private void tryStartingKbMode(int keyCode)
+ {
if (mTimePicker.trySettingInputEnabled(false) &&
(keyCode == -1 || addKeyIfLegal(keyCode))) {
mInKbMode = true;
@@ -585,7 +634,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue
}
}
- private boolean addKeyIfLegal(int keyCode) {
+ private boolean addKeyIfLegal(int keyCode)
+ {
// If we're in 24hour mode, we'll need to check if the input is full. If in AM/PM mode,
// we'll need to see if AM/PM have been typed.
if ((mIs24HourMode && mTypedTimes.size() == 4) ||
@@ -617,7 +667,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue
* Traverse the tree to see if the keys that have been typed so far are legal as is,
* or may become legal as more keys are typed (excluding backspace).
*/
- private boolean isTypedTimeLegalSoFar() {
+ private boolean isTypedTimeLegalSoFar()
+ {
Node node = mLegalTimesTree;
for (int keyCode : mTypedTimes) {
node = node.canReach(keyCode);
@@ -631,7 +682,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue
/**
* Check if the time that has been typed so far is completely legal, as is.
*/
- private boolean isTypedTimeFullyLegal() {
+ private boolean isTypedTimeFullyLegal()
+ {
if (mIs24HourMode) {
// For 24-hour mode, the time is legal if the hours and minutes are each legal. Note:
// getEnteredTime() will ONLY call isTypedTimeFullyLegal() when NOT in 24hour mode.
@@ -645,7 +697,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue
}
}
- private int deleteLastTypedKey() {
+ private int deleteLastTypedKey()
+ {
int deleted = mTypedTimes.remove(mTypedTimes.size() - 1);
if (!isTypedTimeFullyLegal()) {
mDoneButton.setEnabled(false);
@@ -655,9 +708,11 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue
/**
* Get out of keyboard mode. If there is nothing in typedTimes, revert to TimePicker's time.
+ *
* @param changeDisplays If true, update the displays with the relevant time.
*/
- private void finishKbMode(boolean updateDisplays) {
+ private void finishKbMode(boolean updateDisplays)
+ {
mInKbMode = false;
if (!mTypedTimes.isEmpty()) {
int values[] = getEnteredTime(null);
@@ -677,29 +732,31 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue
* Update the hours, minutes, and AM/PM displays with the typed times. If the typedTimes is
* empty, either show an empty display (filled with the placeholder text), or update from the
* timepicker's values.
+ *
* @param allowEmptyDisplay if true, then if the typedTimes is empty, use the placeholder text.
- * Otherwise, revert to the timepicker's values.
+ * Otherwise, revert to the timepicker's values.
*/
- private void updateDisplay(boolean allowEmptyDisplay) {
+ private void updateDisplay(boolean allowEmptyDisplay)
+ {
if (!allowEmptyDisplay && mTypedTimes.isEmpty()) {
int hour = mTimePicker.getHours();
int minute = mTimePicker.getMinutes();
setHour(hour, true);
setMinute(minute);
if (!mIs24HourMode) {
- updateAmPmDisplay(hour < 12? AM : PM);
+ updateAmPmDisplay(hour < 12 ? AM : PM);
}
setCurrentItemShowing(mTimePicker.getCurrentItemShowing(), true, true, true);
mDoneButton.setEnabled(true);
} else {
Boolean[] enteredZeros = {false, false};
int[] values = getEnteredTime(enteredZeros);
- String hourFormat = enteredZeros[0]? "%02d" : "%2d";
- String minuteFormat = (enteredZeros[1])? "%02d" : "%2d";
- String hourStr = (values[0] == -1)? mDoublePlaceholderText :
- String.format(hourFormat, values[0]).replace(' ', mPlaceholderText);
- String minuteStr = (values[1] == -1)? mDoublePlaceholderText :
- String.format(minuteFormat, values[1]).replace(' ', mPlaceholderText);
+ String hourFormat = enteredZeros[0] ? "%02d" : "%2d";
+ String minuteFormat = (enteredZeros[1]) ? "%02d" : "%2d";
+ String hourStr = (values[0] == -1) ? mDoublePlaceholderText :
+ String.format(hourFormat, values[0]).replace(' ', mPlaceholderText);
+ String minuteStr = (values[1] == -1) ? mDoublePlaceholderText :
+ String.format(minuteFormat, values[1]).replace(' ', mPlaceholderText);
mHourView.setText(hourStr);
mHourSpaceView.setText(hourStr);
mHourView.setTextColor(mUnselectedColor);
@@ -712,7 +769,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue
}
}
- private static int getValFromKeyCode(int keyCode) {
+ private static int getValFromKeyCode(int keyCode)
+ {
switch (keyCode) {
case KeyEvent.KEYCODE_0:
return 0;
@@ -741,20 +799,22 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue
/**
* Get the currently-entered time, as integer values of the hours and minutes typed.
+ *
* @param enteredZeros A size-2 boolean array, which the caller should initialize, and which
- * may then be used for the caller to know whether zeros had been explicitly entered as either
- * hours of minutes. This is helpful for deciding whether to show the dashes, or actual 0's.
+ * may then be used for the caller to know whether zeros had been explicitly entered as either
+ * hours of minutes. This is helpful for deciding whether to show the dashes, or actual 0's.
* @return A size-3 int array. The first value will be the hours, the second value will be the
* minutes, and the third will be either TimePickerDialog.AM or TimePickerDialog.PM.
*/
- private int[] getEnteredTime(Boolean[] enteredZeros) {
+ private int[] getEnteredTime(Boolean[] enteredZeros)
+ {
int amOrPm = -1;
int startIndex = 1;
if (!mIs24HourMode && isTypedTimeFullyLegal()) {
int keyCode = mTypedTimes.get(mTypedTimes.size() - 1);
if (keyCode == getAmOrPmKeyCode(AM)) {
amOrPm = AM;
- } else if (keyCode == getAmOrPmKeyCode(PM)){
+ } else if (keyCode == getAmOrPmKeyCode(PM)) {
amOrPm = PM;
}
startIndex = 2;
@@ -765,15 +825,15 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue
int val = getValFromKeyCode(mTypedTimes.get(mTypedTimes.size() - i));
if (i == startIndex) {
minute = val;
- } else if (i == startIndex+1) {
- minute += 10*val;
+ } else if (i == startIndex + 1) {
+ minute += 10 * val;
if (enteredZeros != null && val == 0) {
enteredZeros[1] = true;
}
- } else if (i == startIndex+2) {
+ } else if (i == startIndex + 2) {
hour = val;
- } else if (i == startIndex+3) {
- hour += 10*val;
+ } else if (i == startIndex + 3) {
+ hour += 10 * val;
if (enteredZeros != null && val == 0) {
enteredZeros[0] = true;
}
@@ -787,7 +847,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue
/**
* Get the keycode value for AM and PM in the current language.
*/
- private int getAmOrPmKeyCode(int amOrPm) {
+ private int getAmOrPmKeyCode(int amOrPm)
+ {
// Cache the codes.
if (mAmKeyCode == -1 || mPmKeyCode == -1) {
// Find the first character in the AM/PM text that is unique.
@@ -822,7 +883,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue
/**
* Create a tree for deciding what keys can legally be typed.
*/
- private void generateLegalTimesTree() {
+ private void generateLegalTimesTree()
+ {
// Create a quick cache of numbers to their keycodes.
int k0 = KeyEvent.KEYCODE_0;
int k1 = KeyEvent.KEYCODE_1;
@@ -878,7 +940,7 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue
// When the first digit is 2, the second digit may be 4-5.
secondDigit = new Node(k4, k5);
firstDigit.addChild(secondDigit);
- // We must now be followd by the last minute digit. E.g. 2:40, 2:53.
+ // We must now be followed by the last minute digit. E.g. 2:40, 2:53.
secondDigit.addChild(minuteSecondDigit);
// The first digit may be 3-9.
@@ -955,20 +1017,24 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue
* mLegalKeys represents the keys that can be typed to get to the node.
* mChildren are the children that can be reached from this node.
*/
- private class Node {
+ private class Node
+ {
private int[] mLegalKeys;
private ArrayList mChildren;
- public Node(int... legalKeys) {
+ public Node(int... legalKeys)
+ {
mLegalKeys = legalKeys;
mChildren = new ArrayList();
}
- public void addChild(Node child) {
+ public void addChild(Node child)
+ {
mChildren.add(child);
}
- public boolean containsKey(int key) {
+ public boolean containsKey(int key)
+ {
for (int i = 0; i < mLegalKeys.length; i++) {
if (mLegalKeys[i] == key) {
return true;
@@ -977,7 +1043,8 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue
return false;
}
- public Node canReach(int key) {
+ public Node canReach(int key)
+ {
if (mChildren == null) {
return null;
}
@@ -990,9 +1057,11 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue
}
}
- private class KeyboardListener implements OnKeyListener {
+ private class KeyboardListener implements OnKeyListener
+ {
@Override
- public boolean onKey(View v, int keyCode, KeyEvent event) {
+ public boolean onKey(View v, int keyCode, KeyEvent event)
+ {
if (event.getAction() == KeyEvent.ACTION_UP) {
return processKeyUp(keyCode);
}
@@ -1000,14 +1069,16 @@ public class TimePickerDialog extends AppCompatDialogFragment implements OnValue
}
}
- public void setDismissListener( DialogInterface.OnDismissListener listener ) {
+ public void setDismissListener(DialogInterface.OnDismissListener listener)
+ {
dismissListener = listener;
}
@Override
- public void onDismiss(DialogInterface dialog) {
+ public void onDismiss(DialogInterface dialog)
+ {
super.onDismiss(dialog);
- if( dismissListener != null )
+ if (dismissListener != null)
dismissListener.onDismiss(dialog);
}
}
diff --git a/android/android-pickers/src/main/res/layout/time_picker_dialog.xml b/android/android-pickers/src/main/res/layout/time_picker_dialog.xml
index 44393dca6..cefb56099 100644
--- a/android/android-pickers/src/main/res/layout/time_picker_dialog.xml
+++ b/android/android-pickers/src/main/res/layout/time_picker_dialog.xml
@@ -49,33 +49,33 @@
android:layout_height="1dip"
android:background="@color/line_background" />
-
-
-
-
+
\ No newline at end of file
diff --git a/android/build.sh b/android/build.sh
index 17f67e9f8..bb15f5541 100755
--- a/android/build.sh
+++ b/android/build.sh
@@ -15,305 +15,266 @@
# You should have received a copy of the GNU General Public License along
# with this program. If not, see .
+cd "$(dirname "$0")"
+
ADB="${ANDROID_HOME}/platform-tools/adb"
EMULATOR="${ANDROID_HOME}/tools/emulator"
GRADLE="./gradlew --stacktrace"
PACKAGE_NAME=org.isoron.uhabits
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
-}
-
-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'
+ log_error "BUILD FAILED"
+ exit 1
}
-stop_emulator() {
- log_info "Stopping emulator"
- $ADB emu kill
-}
+if [ ! -z $RELEASE ]; then
+ log_info "Reading secret env variables from ../.secret/env"
+ source ../.secret/env || fail
+fi
-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() {
- if [ ! -z $RELEASE ]; then
- if [ -z "$KEY_FILE" -o -z "$STORE_PASSWORD" -o -z "$KEY_ALIAS" -o -z "$KEY_PASSWORD" ]; then
- log_error "Environment variables KEY_FILE, KEY_ALIAS, KEY_PASSWORD and STORE_PASSWORD must be defined"
- exit 1
- fi
- log_info "Building release APK"
- ./gradlew assembleRelease \
- -Pandroid.injected.signing.store.file=$KEY_FILE \
- -Pandroid.injected.signing.store.password=$STORE_PASSWORD \
- -Pandroid.injected.signing.key.alias=$KEY_ALIAS \
- -Pandroid.injected.signing.key.password=$KEY_PASSWORD || fail
- else
- log_info "Building debug APK"
- ./gradlew assembleDebug || fail
- fi
+ 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
+
+ log_info "Building debug APK"
+ ./gradlew assembleDebug --stacktrace || 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=$KEY_FILE \
- -Pandroid.injected.signing.store.password=$STORE_PASSWORD \
- -Pandroid.injected.signing.key.alias=$KEY_ALIAS \
- -Pandroid.injected.signing.key.password=$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
-
- 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"
+ 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 "\(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"
}
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
-}
-
-fetch_artifacts() {
- log_info "Fetching generated artifacts"
- mkdir -p ${OUTPUTS_DIR}/failed
- $ADB pull /mnt/sdcard/test-screenshots/ ${OUTPUTS_DIR}/failed
- $ADB pull /storage/sdcard/test-screenshots/ ${OUTPUTS_DIR}/failed
- $ADB pull /sdcard/Android/data/${PACKAGE_NAME}/files/test-screenshots/ ${OUTPUTS_DIR}/failed
+ 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 to ${OUTPUTS_DIR}/logcat.txt"
- $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() {
- rm -rf tmp/test-screenshots > /dev/null
- mkdir -p tmp/
- $ADB pull /mnt/sdcard/test-screenshots/ tmp/
- $ADB pull /storage/sdcard/test-screenshots/ tmp/
- $ADB pull /sdcard/Android/data/${PACKAGE_NAME}/files/test-screenshots/ tmp/
-
- $ADB shell rm -r /mnt/sdcard/test-screenshots/
- $ADB shell rm -r /storage/sdcard/test-screenshots/
- $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_artifacts
- 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"
-
- while true; do
- case "$1" in
- -u | --uninstall-first ) UNINSTALL_FIRST=1; shift ;;
- -r | --release ) RELEASE=1; shift ;;
- * ) break ;;
- esac
- done
+ OPTS=`getopt -o r --long release -n 'build.sh' -- "$@"`
+ if [ $? != 0 ] ; then exit 1; fi
+ eval set -- "$OPTS"
+
+ while true; do
+ case "$1" in
+ -r | --release ) RELEASE=1; shift ;;
+ * ) break ;;
+ esac
+ done
+}
+
+remove_build_dir() {
+ rm -rfv .gradle
+ 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_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]
-
- Parameters:
- AVD_NAME name of the virtual android device to start
- AVD_SERIAL adb port to use (e.g. 5560)
-
- Options:
- -u --uninstall-first Uninstall existing APK first
- -r --release Build and install release version, instead of debug
- END
- exit 1
- fi
-
- shift; AVD_NAME=$1
- shift; AVD_SERIAL=$1
- shift; parse_opts $*
- ADB="${ADB} -s emulator-${AVD_SERIAL}"
-
- start_emulator
- run_tests medium
- stop_emulator
- stop_gradle_daemon
- ;;
-
- medium-tests)
- shift; parse_opts $*
- run_tests medium
- ;;
-
- large-tests)
- shift; parse_opts $*
- run_tests large
- ;;
-
- fetch-images)
- fetch_images
- ;;
-
- accept-images)
- accept_images
- ;;
-
- install)
- shift; parse_opts $*
- build_apk
- install_apk
- ;;
-
- *)
- cat <<- END
- Usage: $0 [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 install release version, instead of debug
- END
- exit 1
+ build)
+ shift; parse_opts $*
+
+ build_apk
+ build_instrumentation_apk
+ run_jvm_tests
+ #generate_coverage_badge
+ ;;
+
+ medium-tests)
+ shift; parse_opts $*
+ run_tests medium
+ ;;
+
+ large-tests)
+ shift; parse_opts $*
+ run_tests large
+ ;;
+
+ fetch-images)
+ fetch_images
+ ;;
+
+ accept-images)
+ accept_images
+ ;;
+
+ install)
+ shift; parse_opts $*
+ build_apk
+ install_apk
+ ;;
+
+ clean)
+ remove_build_dir
+ ;;
+
+ *)
+cat < [options]
+Builds, installs and tests Loop Habit Tracker
+
+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
+
+Options:
+ -r --release Build and test release APK, instead of debug
+END
+ exit 1
+ ;;
esac
diff --git a/android/gradle.properties b/android/gradle.properties
index 49afd37ce..6e98ecfec 100644
--- a/android/gradle.properties
+++ b/android/gradle.properties
@@ -1,16 +1,18 @@
-VERSION_CODE = 39
-VERSION_NAME = 1.8.0
+VERSION_CODE = 51
+VERSION_NAME = 1.8.8
-MIN_SDK_VERSION = 19
+MIN_SDK_VERSION = 21
TARGET_SDK_VERSION = 29
COMPILE_SDK_VERSION = 29
-DAGGER_VERSION = 2.25.2
-KOTLIN_VERSION = 1.3.50
+DAGGER_VERSION = 2.25.4
+KOTLIN_VERSION = 1.3.61
SUPPORT_LIBRARY_VERSION = 28.0.0
AUTO_FACTORY_VERSION = 1.0-beta6
-BUILD_TOOLS_VERSION = 3.5.2
+BUILD_TOOLS_VERSION = 4.0.0
org.gradle.parallel=false
org.gradle.daemon=true
org.gradle.jvmargs=-Xms2048m -Xmx2048m -XX:MaxPermSize=2048m
+android.useAndroidX=true
+android.enableJetifier=true
diff --git a/android/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar
index 8c0fb64a8..cc4fdc293 100644
Binary files a/android/gradle/wrapper/gradle-wrapper.jar and b/android/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties
index 26c59f416..84337ad35 100644
--- a/android/gradle/wrapper/gradle-wrapper.properties
+++ b/android/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,5 @@
-#Wed Sep 04 13:05:58 MSK 2019
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
diff --git a/android/gradlew b/android/gradlew
index 91a7e269e..2fe81a7d9 100755
--- a/android/gradlew
+++ b/android/gradlew
@@ -1,4 +1,20 @@
-#!/usr/bin/env bash
+#!/usr/bin/env sh
+
+#
+# Copyright 2015 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
##############################################################################
##
@@ -6,20 +22,38 @@
##
##############################################################################
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
-warn ( ) {
+warn () {
echo "$*"
}
-die ( ) {
+die () {
echo
echo "$*"
echo
@@ -30,6 +64,7 @@ die ( ) {
cygwin=false
msys=false
darwin=false
+nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
@@ -40,31 +75,11 @@ case "`uname`" in
MINGW* )
msys=true
;;
+ NONSTOP* )
+ nonstop=true
+ ;;
esac
-# For Cygwin, ensure paths are in UNIX format before anything is touched.
-if $cygwin ; then
- [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
-fi
-
-# Attempt to set APP_HOME
-# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
- ls=`ls -ld "$PRG"`
- link=`expr "$ls" : '.*-> \(.*\)$'`
- if expr "$link" : '/.*' > /dev/null; then
- PRG="$link"
- else
- PRG=`dirname "$PRG"`"/$link"
- fi
-done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >&-
-APP_HOME="`pwd -P`"
-cd "$SAVED" >&-
-
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
@@ -90,7 +105,7 @@ location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
@@ -110,10 +125,11 @@ if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin ; then
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
@@ -138,27 +154,30 @@ if $cygwin ; then
else
eval `echo args$i`="\"$arg\""
fi
- i=$((i+1))
+ i=`expr $i + 1`
done
case $i in
- (0) set -- ;;
- (1) set -- "$args0" ;;
- (2) set -- "$args0" "$args1" ;;
- (3) set -- "$args0" "$args1" "$args2" ;;
- (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
- (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
- (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
- (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
- (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
- (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ 0) set -- ;;
+ 1) set -- "$args0" ;;
+ 2) set -- "$args0" "$args1" ;;
+ 3) set -- "$args0" "$args1" "$args2" ;;
+ 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
-# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
-function splitJvmOpts() {
- JVM_OPTS=("$@")
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
}
-eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
-JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+APP_ARGS=`save "$@"`
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
-exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
+exec "$JAVACMD" "$@"
diff --git a/android/gradlew.bat b/android/gradlew.bat
index aec99730b..24467a141 100644
--- a/android/gradlew.bat
+++ b/android/gradlew.bat
@@ -1,3 +1,19 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@@ -8,14 +24,14 @@
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
-
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
@@ -46,10 +62,9 @@ echo location of your Java installation.
goto fail
:init
-@rem Get command-line arguments, handling Windowz variants
+@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
-if "%@eval[2+2]" == "4" goto 4NT_args
:win9xME_args
@rem Slurp the command line arguments.
@@ -60,11 +75,6 @@ set _SKIP=2
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
-goto execute
-
-:4NT_args
-@rem Get arguments from the 4NT Shell from JP Software
-set CMD_LINE_ARGS=%$
:execute
@rem Setup the command line
diff --git a/android/play b/android/play
new file mode 120000
index 000000000..1ecaa16de
--- /dev/null
+++ b/android/play
@@ -0,0 +1 @@
+uhabits-android/src/main/play/
\ No newline at end of file
diff --git a/android/tools/coverage-badge/badge.py b/android/tools/coverage-badge/badge.py
index 0e1ffe421..3e6bae8bb 100644
--- a/android/tools/coverage-badge/badge.py
+++ b/android/tools/coverage-badge/badge.py
@@ -55,7 +55,7 @@ def get_total(report):
def get_color(total):
"""
- Return color for current coverage precent
+ Return color for current coverage percent
"""
try:
xtotal = int(total)
diff --git a/android/uhabits-android/build.gradle b/android/uhabits-android/build.gradle
index 4c305d56b..45d2a0416 100644
--- a/android/uhabits-android/build.gradle
+++ b/android/uhabits-android/build.gradle
@@ -1,25 +1,25 @@
-apply plugin: 'idea'
-apply plugin: 'com.android.application'
-apply plugin: 'kotlin-android'
-apply plugin: 'kotlin-kapt'
-import org.ajoberstar.grgit.Grgit
-
-ext {
- git = Grgit.open(currentDir: projectDir)
- GIT_COMMIT = git.head().id.substring(0, 8)
- GIT_BRANCH = git.branch.current.name
+plugins {
+ id 'idea'
+ id 'com.android.application'
+ id 'kotlin-android'
+ id 'kotlin-kapt'
+ id 'com.github.triplet.play' version '2.6.2'
+ id 'kotlin-android-extensions'
}
android {
compileSdkVersion COMPILE_SDK_VERSION as Integer
- if(project.hasProperty("LOOP_STORE_FILE")) {
+ def secretPropsFile = file("../../.secret/gradle.properties")
+ if (secretPropsFile.exists()) {
+ def secrets = new Properties()
+ secretPropsFile.withInputStream { secrets.load(it) }
signingConfigs {
release {
- storeFile file(LOOP_STORE_FILE)
- storePassword LOOP_STORE_PASSWORD
- keyAlias LOOP_KEY_ALIAS
- keyPassword LOOP_KEY_PASSWORD
+ storeFile file(secrets.LOOP_KEY_STORE)
+ storePassword secrets.LOOP_STORE_PASSWORD
+ keyAlias secrets.LOOP_KEY_ALIAS
+ keyPassword secrets.LOOP_KEY_PASSWORD
}
}
buildTypes.release.signingConfig signingConfigs.release
@@ -27,12 +27,12 @@ android {
defaultConfig {
versionCode VERSION_CODE as Integer
- versionName "$VERSION_NAME ($GIT_BRANCH $GIT_COMMIT)"
+ versionName "$VERSION_NAME"
minSdkVersion MIN_SDK_VERSION as Integer
targetSdkVersion TARGET_SDK_VERSION as Integer
applicationId "org.isoron.uhabits"
- testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
@@ -49,6 +49,7 @@ android {
lintOptions {
checkReleaseBuilds false
abortOnError false
+ disable 'GoogleAppIndexingWarning'
}
compileOptions {
@@ -69,6 +70,10 @@ android {
sourceSets {
main.assets.srcDirs += '../uhabits-core/src/main/resources/'
}
+
+ buildFeatures {
+ viewBinding true
+ }
}
dependencies {
@@ -76,34 +81,36 @@ dependencies {
implementation project(":android-base")
implementation project(":android-pickers")
- implementation "com.android.support:appcompat-v7:$SUPPORT_LIBRARY_VERSION"
- implementation "com.android.support:design:$SUPPORT_LIBRARY_VERSION"
- implementation "com.android.support:preference-v14:$SUPPORT_LIBRARY_VERSION"
- implementation "com.android.support:support-v4:$SUPPORT_LIBRARY_VERSION"
+ implementation 'androidx.appcompat:appcompat:1.0.0'
+ implementation 'com.google.android.material:material:1.0.0'
+ implementation 'androidx.legacy:legacy-preference-v14:1.0.0'
+ implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation "com.github.paolorotolo:appintro:3.4.0"
implementation "com.google.dagger:dagger:$DAGGER_VERSION"
implementation "com.jakewharton:butterknife:8.6.1-SNAPSHOT"
implementation "org.apmem.tools:layouts:1.10"
- implementation "com.google.code.gson:gson:2.7"
+ implementation "com.google.code.gson:gson:2.8.5"
implementation "com.google.code.findbugs:jsr305:3.0.2"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$KOTLIN_VERSION"
+ implementation "androidx.constraintlayout:constraintlayout:2.0.0-beta4"
+ implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
compileOnly "javax.annotation:jsr250-api:1.0"
- compileOnly "com.google.auto.factory:auto-factory:${AUTO_FACTORY_VERSION}"
+ compileOnly "com.google.auto.factory:auto-factory:$AUTO_FACTORY_VERSION"
kapt "com.google.dagger:dagger-compiler:$DAGGER_VERSION"
- kapt "com.jakewharton:butterknife-compiler:9.0.0"
- annotationProcessor "com.google.auto.factory:auto-factory:${AUTO_FACTORY_VERSION}"
+ kapt "com.jakewharton:butterknife-compiler:10.2.1"
+ annotationProcessor "com.google.auto.factory:auto-factory:$AUTO_FACTORY_VERSION"
- androidTestImplementation "com.android.support.test.espresso:espresso-contrib:2.2.2"
- androidTestImplementation "com.android.support.test.espresso:espresso-core:2.2.2"
- androidTestImplementation "com.android.support.test.uiautomator:uiautomator-v18:2.1.1"
+ androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.1.0'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0'
+ androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0'
androidTestImplementation "com.google.dagger:dagger:$DAGGER_VERSION"
androidTestImplementation "com.linkedin.testbutler:test-butler-library:1.3.1"
- androidTestCompileOnly "com.google.auto.factory:auto-factory:${AUTO_FACTORY_VERSION}"
- androidTestAnnotationProcessor "com.google.auto.factory:auto-factory:${AUTO_FACTORY_VERSION}"
- androidTestImplementation "com.android.support:support-annotations:$SUPPORT_LIBRARY_VERSION"
- androidTestImplementation "com.android.support.test:rules:0.5"
- androidTestImplementation "com.android.support.test:runner:0.5"
+ androidTestCompileOnly "com.google.auto.factory:auto-factory:$AUTO_FACTORY_VERSION"
+ androidTestAnnotationProcessor "com.google.auto.factory:auto-factory:$AUTO_FACTORY_VERSION"
+ androidTestImplementation 'androidx.annotation:annotation:1.0.0'
+ androidTestImplementation 'androidx.test:rules:1.1.1'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation "com.google.guava:guava:24.1-android"
androidTestImplementation project(":uhabits-core")
kaptAndroidTest "com.google.dagger:dagger-compiler:$DAGGER_VERSION"
@@ -111,15 +118,15 @@ dependencies {
// mockito-android 2+ includes net.bytebuddy, which causes tests to fail.
// Excluding the package net.bytebuddy on AndroidManifest.xml breaks some
// AndroidJUnitRunner functionality, such as running individual methods.
- androidTestImplementation "org.mockito:mockito-core:1+"
- androidTestImplementation "com.google.dexmaker:dexmaker-mockito:+"
+ androidTestImplementation "org.mockito:mockito-core:1.10.19"
+ androidTestImplementation "com.google.dexmaker:dexmaker-mockito:1.2"
testImplementation "com.google.dagger:dagger:$DAGGER_VERSION"
testImplementation "org.mockito:mockito-core:2.8.9"
testImplementation "org.mockito:mockito-inline:2.8.9"
- testImplementation "junit:junit:4+"
+ testImplementation "junit:junit:4.12"
- implementation('com.opencsv:opencsv:3.9') {
+ implementation('com.opencsv:opencsv:3.10') {
exclude group: 'commons-logging', module: 'commons-logging'
}
implementation('io.socket:socket.io-client:0.8.3') {
@@ -127,11 +134,11 @@ dependencies {
}
}
-repositories {
- google()
- jcenter()
-}
-
kapt {
correctErrorTypes = true
}
+
+play {
+ serviceAccountCredentials = file("../../.secret/gcp-key.json")
+ track = "alpha"
+}
diff --git a/android/uhabits-android/src/androidTest/assets/views-v26/common/HistoryChart/render.png b/android/uhabits-android/src/androidTest/assets/views-v26/common/HistoryChart/render.png
index 95c71e671..d7a66cc79 100644
Binary files a/android/uhabits-android/src/androidTest/assets/views-v26/common/HistoryChart/render.png and b/android/uhabits-android/src/androidTest/assets/views-v26/common/HistoryChart/render.png differ
diff --git a/android/uhabits-android/src/androidTest/assets/views-v26/common/HistoryChart/renderDataOffset.png b/android/uhabits-android/src/androidTest/assets/views-v26/common/HistoryChart/renderDataOffset.png
index 9fbec7ea3..b094d1e3d 100644
Binary files a/android/uhabits-android/src/androidTest/assets/views-v26/common/HistoryChart/renderDataOffset.png and b/android/uhabits-android/src/androidTest/assets/views-v26/common/HistoryChart/renderDataOffset.png differ
diff --git a/android/uhabits-android/src/androidTest/assets/views-v26/common/HistoryChart/renderDifferentSize.png b/android/uhabits-android/src/androidTest/assets/views-v26/common/HistoryChart/renderDifferentSize.png
index f2a712b89..4507f30ba 100644
Binary files a/android/uhabits-android/src/androidTest/assets/views-v26/common/HistoryChart/renderDifferentSize.png and b/android/uhabits-android/src/androidTest/assets/views-v26/common/HistoryChart/renderDifferentSize.png differ
diff --git a/android/uhabits-android/src/androidTest/assets/views-v26/common/HistoryChart/renderTransparent.png b/android/uhabits-android/src/androidTest/assets/views-v26/common/HistoryChart/renderTransparent.png
index 860b326d4..5d997f32c 100644
Binary files a/android/uhabits-android/src/androidTest/assets/views-v26/common/HistoryChart/renderTransparent.png and b/android/uhabits-android/src/androidTest/assets/views-v26/common/HistoryChart/renderTransparent.png differ
diff --git a/android/uhabits-android/src/androidTest/assets/views-v26/common/ScoreChart/render.png b/android/uhabits-android/src/androidTest/assets/views-v26/common/ScoreChart/render.png
index 4ea430a67..c80bd6b5e 100644
Binary files a/android/uhabits-android/src/androidTest/assets/views-v26/common/ScoreChart/render.png and b/android/uhabits-android/src/androidTest/assets/views-v26/common/ScoreChart/render.png differ
diff --git a/android/uhabits-android/src/androidTest/assets/views-v26/common/ScoreChart/renderDataOffset.png b/android/uhabits-android/src/androidTest/assets/views-v26/common/ScoreChart/renderDataOffset.png
index e0bfe6fd3..3575b52c1 100644
Binary files a/android/uhabits-android/src/androidTest/assets/views-v26/common/ScoreChart/renderDataOffset.png and b/android/uhabits-android/src/androidTest/assets/views-v26/common/ScoreChart/renderDataOffset.png differ
diff --git a/android/uhabits-android/src/androidTest/assets/views-v26/common/ScoreChart/renderDifferentSize.png b/android/uhabits-android/src/androidTest/assets/views-v26/common/ScoreChart/renderDifferentSize.png
index b550f9814..be33abc00 100644
Binary files a/android/uhabits-android/src/androidTest/assets/views-v26/common/ScoreChart/renderDifferentSize.png and b/android/uhabits-android/src/androidTest/assets/views-v26/common/ScoreChart/renderDifferentSize.png differ
diff --git a/android/uhabits-android/src/androidTest/assets/views-v26/common/ScoreChart/renderMonthly.png b/android/uhabits-android/src/androidTest/assets/views-v26/common/ScoreChart/renderMonthly.png
index 11ec0904b..85d4cc2ff 100644
Binary files a/android/uhabits-android/src/androidTest/assets/views-v26/common/ScoreChart/renderMonthly.png and b/android/uhabits-android/src/androidTest/assets/views-v26/common/ScoreChart/renderMonthly.png differ
diff --git a/android/uhabits-android/src/androidTest/assets/views-v26/common/ScoreChart/renderTransparent.png b/android/uhabits-android/src/androidTest/assets/views-v26/common/ScoreChart/renderTransparent.png
index e34f4d671..ffe41bb0a 100644
Binary files a/android/uhabits-android/src/androidTest/assets/views-v26/common/ScoreChart/renderTransparent.png and b/android/uhabits-android/src/androidTest/assets/views-v26/common/ScoreChart/renderTransparent.png differ
diff --git a/android/uhabits-android/src/androidTest/assets/views-v26/common/ScoreChart/renderYearly.png b/android/uhabits-android/src/androidTest/assets/views-v26/common/ScoreChart/renderYearly.png
index df13dae29..301d43f0a 100644
Binary files a/android/uhabits-android/src/androidTest/assets/views-v26/common/ScoreChart/renderYearly.png and b/android/uhabits-android/src/androidTest/assets/views-v26/common/ScoreChart/renderYearly.png differ
diff --git a/android/uhabits-android/src/androidTest/assets/views-v26/common/StreakChart/render.png b/android/uhabits-android/src/androidTest/assets/views-v26/common/StreakChart/render.png
index 9eb67f547..657d433fa 100644
Binary files a/android/uhabits-android/src/androidTest/assets/views-v26/common/StreakChart/render.png and b/android/uhabits-android/src/androidTest/assets/views-v26/common/StreakChart/render.png differ
diff --git a/android/uhabits-android/src/androidTest/assets/views-v26/common/StreakChart/renderSmallSize.png b/android/uhabits-android/src/androidTest/assets/views-v26/common/StreakChart/renderSmallSize.png
index 6701961bc..4014e47cf 100644
Binary files a/android/uhabits-android/src/androidTest/assets/views-v26/common/StreakChart/renderSmallSize.png and b/android/uhabits-android/src/androidTest/assets/views-v26/common/StreakChart/renderSmallSize.png differ
diff --git a/android/uhabits-android/src/androidTest/assets/views-v26/common/StreakChart/renderTransparent.png b/android/uhabits-android/src/androidTest/assets/views-v26/common/StreakChart/renderTransparent.png
index 9eb67f547..657d433fa 100644
Binary files a/android/uhabits-android/src/androidTest/assets/views-v26/common/StreakChart/renderTransparent.png and b/android/uhabits-android/src/androidTest/assets/views-v26/common/StreakChart/renderTransparent.png differ
diff --git a/android/uhabits-android/src/androidTest/assets/views-v26/habits/show/HistoryCard/render.png b/android/uhabits-android/src/androidTest/assets/views-v26/habits/show/HistoryCard/render.png
index 295b4e1be..284fc59df 100644
Binary files a/android/uhabits-android/src/androidTest/assets/views-v26/habits/show/HistoryCard/render.png and b/android/uhabits-android/src/androidTest/assets/views-v26/habits/show/HistoryCard/render.png differ
diff --git a/android/uhabits-android/src/androidTest/assets/views-v26/habits/show/NotesCard/render-empty-description.png b/android/uhabits-android/src/androidTest/assets/views-v26/habits/show/NotesCard/render-empty-description.png
new file mode 100644
index 000000000..f9b378f6c
Binary files /dev/null and b/android/uhabits-android/src/androidTest/assets/views-v26/habits/show/NotesCard/render-empty-description.png differ
diff --git a/android/uhabits-android/src/androidTest/assets/views-v26/habits/show/NotesCard/render.png b/android/uhabits-android/src/androidTest/assets/views-v26/habits/show/NotesCard/render.png
new file mode 100644
index 000000000..dafb53f4f
Binary files /dev/null and b/android/uhabits-android/src/androidTest/assets/views-v26/habits/show/NotesCard/render.png differ
diff --git a/android/uhabits-android/src/androidTest/assets/views-v26/habits/show/ScoreCard/render.png b/android/uhabits-android/src/androidTest/assets/views-v26/habits/show/ScoreCard/render.png
index 12aaa2785..9a7eacb9c 100644
Binary files a/android/uhabits-android/src/androidTest/assets/views-v26/habits/show/ScoreCard/render.png and b/android/uhabits-android/src/androidTest/assets/views-v26/habits/show/ScoreCard/render.png differ
diff --git a/android/uhabits-android/src/androidTest/assets/views-v26/habits/show/SubtitleCard/render.png b/android/uhabits-android/src/androidTest/assets/views-v26/habits/show/SubtitleCard/render.png
index 17d4c44ab..a75130414 100644
Binary files a/android/uhabits-android/src/androidTest/assets/views-v26/habits/show/SubtitleCard/render.png and b/android/uhabits-android/src/androidTest/assets/views-v26/habits/show/SubtitleCard/render.png differ
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.java
index 5aede98f5..f7b351e36 100644
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.java
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.java
@@ -23,11 +23,15 @@ import android.appwidget.*;
import android.content.*;
import android.content.res.*;
import android.os.*;
-import android.support.annotation.*;
-import android.support.test.*;
-import android.support.test.filters.*;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.StyleRes;
+import androidx.test.*;
+import androidx.test.filters.*;
import android.util.*;
+import androidx.test.platform.app.InstrumentationRegistry;
+
import junit.framework.*;
import org.isoron.androidbase.*;
@@ -62,8 +66,6 @@ public class BaseAndroidTest extends TestCase
protected TaskRunner taskRunner;
- protected HabitLogger logger;
-
protected HabitFixtures fixtures;
protected CountDownLatch latch;
@@ -82,8 +84,8 @@ public class BaseAndroidTest extends TestCase
{
if (Looper.myLooper() == null) Looper.prepare();
- targetContext = InstrumentationRegistry.getTargetContext();
- testContext = InstrumentationRegistry.getContext();
+ targetContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ testContext = InstrumentationRegistry.getInstrumentation().getContext();
DateUtils.setFixedLocalTime(FIXED_LOCAL_TIME);
setResolution(2.0f);
@@ -101,7 +103,6 @@ public class BaseAndroidTest extends TestCase
prefs = appComponent.getPreferences();
habitList = appComponent.getHabitList();
taskRunner = appComponent.getTaskRunner();
- logger = appComponent.getHabitsLogger();
modelFactory = appComponent.getModelFactory();
prefs.clear();
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseUserInterfaceTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseUserInterfaceTest.java
index a7de248f9..6b5a1931c 100644
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseUserInterfaceTest.java
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseUserInterfaceTest.java
@@ -20,7 +20,8 @@
package org.isoron.uhabits;
import android.content.*;
-import android.support.test.uiautomator.*;
+
+import androidx.test.uiautomator.*;
import com.linkedin.android.testbutler.*;
@@ -30,12 +31,15 @@ import org.isoron.uhabits.core.ui.screens.habits.list.*;
import org.isoron.uhabits.core.utils.*;
import org.junit.*;
-import static android.support.test.InstrumentationRegistry.*;
-import static android.support.test.uiautomator.UiDevice.*;
+import static androidx.test.InstrumentationRegistry.getContext;
+import static androidx.test.InstrumentationRegistry.getTargetContext;
+import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
+import static androidx.test.uiautomator.UiDevice.*;
public class BaseUserInterfaceTest
{
private static final String PKG = "org.isoron.uhabits";
+ public static final String EMPTY_DESCRIPTION_HABIT_NAME = "Read books";
public static UiDevice device;
@@ -93,26 +97,36 @@ public class BaseUserInterfaceTest
Habit h1 = fixtures.createEmptyHabit();
h1.setName("Wake up early");
- h1.setDescription("Did you wake up early today?");
+ h1.setQuestion("Did you wake up early today?");
+ h1.setDescription("test description 1");
h1.setColor(5);
habitList.update(h1);
Habit h2 = fixtures.createShortHabit();
h2.setName("Track time");
- h2.setDescription("Did you track your time?");
+ h2.setQuestion("Did you track your time?");
+ h2.setDescription("test description 2");
h2.setColor(5);
habitList.update(h2);
Habit h3 = fixtures.createLongHabit();
h3.setName("Meditate");
- h3.setDescription("Did meditate today?");
+ h3.setQuestion("Did meditate today?");
+ h3.setDescription("test description 3");
h3.setColor(10);
habitList.update(h3);
Habit h4 = fixtures.createEmptyHabit();
- h4.setName("Read books");
- h4.setDescription("Did you read books today?");
+ h4.setName(EMPTY_DESCRIPTION_HABIT_NAME);
+ h4.setQuestion("Did you read books today?");
+ h4.setDescription("");
h4.setColor(2);
habitList.update(h4);
}
+
+ protected void rotateDevice() throws Exception
+ {
+ device.setOrientationLeft();
+ device.setOrientationNatural();
+ }
}
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseViewTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseViewTest.java
index 62f4841d4..fcd6ff9f6 100644
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseViewTest.java
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseViewTest.java
@@ -20,11 +20,14 @@
package org.isoron.uhabits;
import android.graphics.*;
-import android.support.annotation.*;
-import android.support.test.*;
+
+import androidx.annotation.NonNull;
+import androidx.test.*;
import android.view.*;
import android.widget.*;
+import androidx.test.platform.app.InstrumentationRegistry;
+
import org.isoron.androidbase.*;
import org.isoron.androidbase.utils.*;
import org.isoron.uhabits.widgets.*;
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitFixtures.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitFixtures.java
index c636f682b..364166de7 100644
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitFixtures.java
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitFixtures.java
@@ -52,7 +52,8 @@ public class HabitFixtures
{
Habit habit = modelFactory.buildHabit();
habit.setName("Meditate");
- habit.setDescription("Did you meditate this morning?");
+ habit.setQuestion("Did you meditate this morning?");
+ habit.setDescription("This is a test description");
habit.setColor(5);
habit.setFrequency(Frequency.DAILY);
habit.setId(id);
@@ -81,7 +82,7 @@ public class HabitFixtures
{
Habit habit = modelFactory.buildHabit();
habit.setName("Take a walk");
- habit.setDescription("How many steps did you walk today?");
+ habit.setQuestion("How many steps did you walk today?");
habit.setType(Habit.NUMBER_HABIT);
habit.setTargetType(Habit.AT_LEAST);
habit.setTargetValue(200.0);
@@ -103,7 +104,7 @@ public class HabitFixtures
{
Habit habit = modelFactory.buildHabit();
habit.setName("Wake up early");
- habit.setDescription("Did you wake up before 6am?");
+ habit.setQuestion("Did you wake up before 6am?");
habit.setFrequency(new Frequency(2, 3));
habitList.add(habit);
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitLoggerTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitLoggerTest.java
deleted file mode 100644
index 75f821787..000000000
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitLoggerTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2016 Álinson Santos Xavier
- *
- * This file is part of Loop Habit Tracker.
- *
- * Loop Habit Tracker is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by the
- * Free Software Foundation, either version 3 of the License, or (at your
- * option) any later version.
- *
- * Loop Habit Tracker is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see .
- */
-
-package org.isoron.uhabits;
-
-import android.os.*;
-import android.support.test.filters.*;
-import android.support.test.runner.*;
-
-import org.isoron.androidbase.*;
-import org.isoron.uhabits.core.models.*;
-import org.junit.*;
-import org.junit.runner.*;
-
-import java.io.*;
-
-import static org.hamcrest.CoreMatchers.*;
-import static org.hamcrest.MatcherAssert.*;
-
-@RunWith(AndroidJUnit4.class)
-@MediumTest
-public class HabitLoggerTest extends BaseAndroidTest
-{
- @Test
- public void testLogReminderScheduled() throws IOException
- {
- if (!isLogcatAvailable()) return;
-
- long time = 1422277200000L; // 13:00 jan 26, 2015 (UTC)
- Habit habit = fixtures.createEmptyHabit();
- habit.setName("Write journal");
-
- logger.logReminderScheduled(habit, time);
-
- String expectedMsg = "Setting alarm (2015-01-26 130000): Wri\n";
- assertLogcatContains(expectedMsg);
- }
-
- protected void assertLogcatContains(String expectedMsg) throws IOException
- {
- String logcat = new AndroidBugReporter(targetContext).getLogcat();
- assertThat(logcat, containsString(expectedMsg));
- }
-
- protected boolean isLogcatAvailable()
- {
- return Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN;
- }
-}
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitsActivityTestComponent.kt b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitsActivityTestComponent.kt
index dde1b5a90..508077ac7 100644
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitsActivityTestComponent.kt
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitsActivityTestComponent.kt
@@ -37,7 +37,6 @@ class TestModule {
@ActivityScope
@Component(modules = arrayOf(
ActivityContextModule::class,
- AboutModule::class,
HabitsActivityModule::class,
ListHabitsModule::class,
ShowHabitModule::class,
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitsApplicationTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitsApplicationTest.java
index ea625adc6..222d7e93f 100644
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitsApplicationTest.java
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitsApplicationTest.java
@@ -19,8 +19,10 @@
package org.isoron.uhabits;
-import android.support.test.filters.*;
-import android.support.test.runner.*;
+import androidx.test.filters.*;
+import androidx.test.runner.*;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.isoron.androidbase.*;
import org.junit.*;
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/AboutTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/AboutTest.java
index 7fcd2d312..6ee63aba6 100644
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/AboutTest.java
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/AboutTest.java
@@ -19,8 +19,10 @@
package org.isoron.uhabits.acceptance;
-import android.support.test.filters.*;
-import android.support.test.runner.*;
+import androidx.test.filters.*;
+import androidx.test.runner.*;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.isoron.uhabits.*;
import org.junit.*;
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/HabitsTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/HabitsTest.java
index 035e0c150..d8950ef04 100644
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/HabitsTest.java
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/HabitsTest.java
@@ -19,8 +19,9 @@
package org.isoron.uhabits.acceptance;
-import android.support.test.filters.*;
-import android.support.test.runner.*;
+import androidx.test.filters.*;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.isoron.uhabits.*;
import org.junit.*;
@@ -37,22 +38,36 @@ import static org.isoron.uhabits.acceptance.steps.ListHabitsSteps.*;
public class HabitsTest extends BaseUserInterfaceTest
{
@Test
- public void shouldCreateHabit() throws Exception
+ public void shouldCreateHabit() throws Exception {
+ shouldCreateHabit("this is a test description");
+ }
+
+ @Test
+ public void shouldCreateHabitBlankDescription() throws Exception {
+ shouldCreateHabit("");
+ }
+
+ private void shouldCreateHabit(String description) throws Exception
{
launchApp();
verifyShowsScreen(LIST_HABITS);
clickMenu(ADD);
+ verifyShowsScreen(SELECT_HABIT_TYPE);
+ clickText("Yes or No");
+
verifyShowsScreen(EDIT_HABIT);
- typeName("Hello world");
+ String testName = "Hello world";
+ typeName(testName);
typeQuestion("Did you say hello to the world today?");
- pickFrequency("Every week");
+ typeDescription(description);
+ pickFrequency();
pickColor(5);
clickSave();
verifyShowsScreen(LIST_HABITS);
- verifyDisplaysText("Hello world");
+ verifyDisplaysText(testName);
}
@Test
@@ -79,7 +94,16 @@ public class HabitsTest extends BaseUserInterfaceTest
}
@Test
- public void shouldEditHabit() throws Exception
+ public void shouldEditHabit() throws Exception {
+ shouldEditHabit("this is a test description");
+ }
+
+ @Test
+ public void shouldEditHabitBlankDescription() throws Exception {
+ shouldEditHabit("");
+ }
+
+ private void shouldEditHabit(String description) throws Exception
{
launchApp();
@@ -90,6 +114,7 @@ public class HabitsTest extends BaseUserInterfaceTest
verifyShowsScreen(EDIT_HABIT);
typeName("Take a walk");
typeQuestion("Did you take a walk today?");
+ typeDescription(description);
clickSave();
verifyShowsScreen(LIST_HABITS);
@@ -172,4 +197,12 @@ public class HabitsTest extends BaseUserInterfaceTest
verifyDisplaysText("Track time");
verifyDisplaysText("Wake up early");
}
+
+ @Test
+ public void shouldHideNotesCard() throws Exception
+ {
+ launchApp();
+ clickText(EMPTY_DESCRIPTION_HABIT_NAME);
+ verifyShowsScreen(SHOW_HABIT, false);
+ }
}
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/LinksTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/LinksTest.java
index fc0a729d1..e229b34e2 100644
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/LinksTest.java
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/LinksTest.java
@@ -19,8 +19,10 @@
package org.isoron.uhabits.acceptance;
-import android.support.test.filters.*;
-import android.support.test.runner.*;
+import androidx.test.filters.*;
+import androidx.test.runner.*;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.isoron.uhabits.*;
import org.junit.*;
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/WidgetTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/WidgetTest.java
index f5bcb4285..2c0f89527 100644
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/WidgetTest.java
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/WidgetTest.java
@@ -19,7 +19,7 @@
package org.isoron.uhabits.acceptance;
-import android.support.test.filters.*;
+import androidx.test.filters.*;
import org.isoron.uhabits.*;
import org.junit.*;
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/steps/CommonSteps.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/steps/CommonSteps.java
index ab28be55b..28e09a1b3 100644
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/steps/CommonSteps.java
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/steps/CommonSteps.java
@@ -19,24 +19,26 @@
package org.isoron.uhabits.acceptance.steps;
-import android.os.*;
-import android.support.annotation.*;
-import android.support.test.espresso.*;
-import android.support.test.espresso.contrib.*;
-import android.support.test.uiautomator.*;
-import android.support.v7.widget.*;
+import android.view.View;
+import androidx.annotation.StringRes;
+import androidx.test.espresso.*;
+import androidx.test.espresso.contrib.*;
+import androidx.test.uiautomator.*;
+
+import androidx.recyclerview.widget.RecyclerView;
+
+import org.hamcrest.Matcher;
import org.isoron.uhabits.*;
import org.isoron.uhabits.R;
import org.isoron.uhabits.activities.habits.list.*;
-import static android.os.Build.VERSION.SDK_INT;
-import static android.os.Build.VERSION_CODES.LOLLIPOP;
-import static android.support.test.espresso.Espresso.*;
-import static android.support.test.espresso.action.ViewActions.*;
-import static android.support.test.espresso.assertion.PositionAssertions.*;
-import static android.support.test.espresso.assertion.ViewAssertions.*;
-import static android.support.test.espresso.matcher.ViewMatchers.*;
+import static android.os.Build.VERSION.*;
+import static androidx.test.espresso.Espresso.*;
+import static androidx.test.espresso.action.ViewActions.*;
+import static androidx.test.espresso.assertion.PositionAssertions.*;
+import static androidx.test.espresso.assertion.ViewAssertions.*;
+import static androidx.test.espresso.matcher.ViewMatchers.*;
import static junit.framework.Assert.*;
import static org.hamcrest.CoreMatchers.*;
@@ -150,10 +152,14 @@ public class CommonSteps extends BaseUserInterfaceTest
public enum Screen
{
- LIST_HABITS, SHOW_HABIT, EDIT_HABIT
+ LIST_HABITS, SHOW_HABIT, EDIT_HABIT, SELECT_HABIT_TYPE
+ }
+
+ public static void verifyShowsScreen(Screen screen) {
+ verifyShowsScreen(screen, true);
}
- public static void verifyShowsScreen(Screen screen)
+ public static void verifyShowsScreen(Screen screen, boolean notesCardVisibleExpected)
{
switch(screen)
{
@@ -163,12 +169,22 @@ public class CommonSteps extends BaseUserInterfaceTest
break;
case SHOW_HABIT:
+ Matcher noteCardViewMatcher = notesCardVisibleExpected ? isDisplayed() :
+ withEffectiveVisibility(Visibility.GONE);
onView(withId(R.id.subtitleCard)).check(matches(isDisplayed()));
+ onView(withId(R.id.notesCard)).check(matches(noteCardViewMatcher));
break;
case EDIT_HABIT:
- onView(withId(R.id.tvDescription)).check(matches(isDisplayed()));
+ onView(withId(R.id.questionInput)).check(matches(isDisplayed()));
break;
+
+ case SELECT_HABIT_TYPE:
+ onView(withText(R.string.yes_or_no_example)).check(matches(isDisplayed()));
+ break;
+
+ default:
+ throw new IllegalStateException();
}
}
}
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/steps/EditHabitSteps.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/steps/EditHabitSteps.java
index 467c33959..af17ecd00 100644
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/steps/EditHabitSteps.java
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/steps/EditHabitSteps.java
@@ -19,14 +19,14 @@
package org.isoron.uhabits.acceptance.steps;
-import android.support.test.uiautomator.*;
+import androidx.test.uiautomator.*;
import org.isoron.uhabits.*;
-import static android.support.test.espresso.Espresso.*;
-import static android.support.test.espresso.action.ViewActions.*;
-import static android.support.test.espresso.action.ViewActions.closeSoftKeyboard;
-import static android.support.test.espresso.matcher.ViewMatchers.*;
+import static androidx.test.espresso.Espresso.*;
+import static androidx.test.espresso.action.ViewActions.*;
+import static androidx.test.espresso.action.ViewActions.closeSoftKeyboard;
+import static androidx.test.espresso.matcher.ViewMatchers.*;
import static org.isoron.uhabits.BaseUserInterfaceTest.*;
public class EditHabitSteps
@@ -36,26 +36,53 @@ public class EditHabitSteps
onView(withId(R.id.buttonSave)).perform(click());
}
- public static void pickFrequency(String freq)
+ public static void pickFrequency()
{
- onView(withId(R.id.spinner)).perform(click());
- device.findObject(By.text(freq)).click();
+ onView(withId(R.id.boolean_frequency_picker)).perform(click());
+ onView(withText("SAVE")).perform(click());
}
public static void pickColor(int color)
{
- onView(withId(R.id.buttonPickColor)).perform(click());
+ onView(withId(R.id.colorButton)).perform(click());
device.findObject(By.descStartsWith(String.format("Color %d", color))).click();
}
public static void typeName(String name)
{
- typeTextWithId(R.id.tvName, name);
+ typeTextWithId(R.id.nameInput, name);
}
public static void typeQuestion(String name)
{
- typeTextWithId(R.id.tvDescription, name);
+ typeTextWithId(R.id.questionInput, name);
+ }
+
+ public static void typeDescription(String description)
+ {
+ typeTextWithId(R.id.notesInput, description);
+ }
+
+ public static void setReminder()
+ {
+ onView(withId(R.id.reminderTimePicker)).perform(click());
+ onView(withId(R.id.done_button)).perform(click());
+ }
+
+ public static void clickReminderDays()
+ {
+ onView(withId(R.id.reminderDatePicker)).perform(click());
+ }
+
+ public static void unselectAllDays()
+ {
+ onView(withText("Saturday")).perform(click());
+ onView(withText("Sunday")).perform(click());
+ onView(withText("Monday")).perform(click());
+ onView(withText("Tuesday")).perform(click());
+ onView(withText("Wednesday")).perform(click());
+ onView(withText("Thursday")).perform(click());
+ onView(withText("Friday")).perform(click());
}
private static void typeTextWithId(int id, String name)
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/steps/ListHabitsSteps.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/steps/ListHabitsSteps.java
index fe93da24e..39154b529 100644
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/steps/ListHabitsSteps.java
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/steps/ListHabitsSteps.java
@@ -19,7 +19,7 @@
package org.isoron.uhabits.acceptance.steps;
-import android.support.test.espresso.*;
+import androidx.test.espresso.*;
import android.view.*;
import org.hamcrest.*;
@@ -28,15 +28,15 @@ import org.isoron.uhabits.activities.habits.list.views.*;
import java.util.*;
-import static android.support.test.espresso.Espresso.onView;
-import static android.support.test.espresso.action.ViewActions.click;
-import static android.support.test.espresso.matcher.ViewMatchers.hasDescendant;
-import static android.support.test.espresso.matcher.ViewMatchers.isEnabled;
-import static android.support.test.espresso.matcher.ViewMatchers.withClassName;
-import static android.support.test.espresso.matcher.ViewMatchers.withContentDescription;
-import static android.support.test.espresso.matcher.ViewMatchers.withId;
-import static android.support.test.espresso.matcher.ViewMatchers.withParent;
-import static android.support.test.espresso.matcher.ViewMatchers.withText;
+import static androidx.test.espresso.Espresso.onView;
+import static androidx.test.espresso.action.ViewActions.click;
+import static androidx.test.espresso.matcher.ViewMatchers.hasDescendant;
+import static androidx.test.espresso.matcher.ViewMatchers.isEnabled;
+import static androidx.test.espresso.matcher.ViewMatchers.withClassName;
+import static androidx.test.espresso.matcher.ViewMatchers.withContentDescription;
+import static androidx.test.espresso.matcher.ViewMatchers.withId;
+import static androidx.test.espresso.matcher.ViewMatchers.withParent;
+import static androidx.test.espresso.matcher.ViewMatchers.withText;
import static org.hamcrest.CoreMatchers.*;
import static org.isoron.uhabits.BaseUserInterfaceTest.device;
import static org.isoron.uhabits.acceptance.steps.CommonSteps.clickText;
@@ -60,7 +60,7 @@ public abstract class ListHabitsSteps
break;
case ADD:
- clickViewWithId(R.id.actionCreateBooleanHabit);
+ clickViewWithId(R.id.actionCreateHabit);
break;
case EDIT:
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/steps/WidgetSteps.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/steps/WidgetSteps.java
index c8d70f22c..3cb5a201c 100644
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/steps/WidgetSteps.java
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/steps/WidgetSteps.java
@@ -19,7 +19,7 @@
package org.isoron.uhabits.acceptance.steps;
-import android.support.test.uiautomator.*;
+import androidx.test.uiautomator.*;
import static android.os.Build.VERSION.SDK_INT;
import static junit.framework.Assert.*;
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/BarChartTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/BarChartTest.java
index 5a5b4255c..832b6c78f 100644
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/BarChartTest.java
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/BarChartTest.java
@@ -19,8 +19,10 @@
package org.isoron.uhabits.activities.common.views;
-import android.support.test.filters.*;
-import android.support.test.runner.*;
+import androidx.test.filters.*;
+import androidx.test.runner.*;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.isoron.uhabits.*;
import org.isoron.uhabits.core.models.*;
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/FrequencyChartTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/FrequencyChartTest.java
index eaf1c2568..ff492ef41 100644
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/FrequencyChartTest.java
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/FrequencyChartTest.java
@@ -19,8 +19,10 @@
package org.isoron.uhabits.activities.common.views;
-import android.support.test.filters.*;
-import android.support.test.runner.*;
+import androidx.test.filters.*;
+import androidx.test.runner.*;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.isoron.uhabits.*;
import org.isoron.uhabits.core.models.*;
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/HistoryChartTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/HistoryChartTest.java
index e4d1ba763..d3fef3755 100644
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/HistoryChartTest.java
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/HistoryChartTest.java
@@ -19,8 +19,10 @@
package org.isoron.uhabits.activities.common.views;
-import android.support.test.filters.*;
-import android.support.test.runner.*;
+import androidx.test.filters.*;
+import androidx.test.runner.*;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.isoron.uhabits.*;
import org.isoron.uhabits.core.models.*;
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/RingViewTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/RingViewTest.java
index 3b6907ca5..55f994e4a 100644
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/RingViewTest.java
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/RingViewTest.java
@@ -20,8 +20,10 @@
package org.isoron.uhabits.activities.common.views;
import android.graphics.*;
-import android.support.test.filters.*;
-import android.support.test.runner.*;
+import androidx.test.filters.*;
+import androidx.test.runner.*;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.isoron.uhabits.*;
import org.isoron.uhabits.utils.*;
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/ScoreChartTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/ScoreChartTest.java
index 610631a30..216392129 100644
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/ScoreChartTest.java
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/ScoreChartTest.java
@@ -19,8 +19,10 @@
package org.isoron.uhabits.activities.common.views;
-import android.support.test.filters.*;
-import android.support.test.runner.*;
+import androidx.test.filters.*;
+import androidx.test.runner.*;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.isoron.uhabits.*;
import org.isoron.uhabits.core.models.*;
@@ -29,6 +31,8 @@ import org.isoron.uhabits.utils.*;
import org.junit.*;
import org.junit.runner.*;
+import java.util.*;
+
@RunWith(AndroidJUnit4.class)
@MediumTest
public class ScoreChartTest extends BaseViewTest
@@ -80,7 +84,7 @@ public class ScoreChartTest extends BaseViewTest
@Test
public void testRender_withMonthlyBucket() throws Throwable
{
- view.setScores(habit.getScores().groupBy(DateUtils.TruncateField.MONTH));
+ view.setScores(habit.getScores().groupBy(DateUtils.TruncateField.MONTH, Calendar.SUNDAY));
view.setBucketSize(30);
view.invalidate();
@@ -97,7 +101,7 @@ public class ScoreChartTest extends BaseViewTest
@Test
public void testRender_withYearlyBucket() throws Throwable
{
- view.setScores(habit.getScores().groupBy(DateUtils.TruncateField.YEAR));
+ view.setScores(habit.getScores().groupBy(DateUtils.TruncateField.YEAR, Calendar.SUNDAY));
view.setBucketSize(365);
view.invalidate();
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/StreakChartTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/StreakChartTest.java
index c145b4799..fc82e1b5f 100644
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/StreakChartTest.java
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/StreakChartTest.java
@@ -19,8 +19,10 @@
package org.isoron.uhabits.activities.common.views;
-import android.support.test.filters.*;
-import android.support.test.runner.*;
+import androidx.test.filters.*;
+import androidx.test.runner.*;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.isoron.uhabits.*;
import org.isoron.uhabits.core.models.*;
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonViewTest.kt b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonViewTest.kt
index 9c6e52533..41dc80c0a 100644
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonViewTest.kt
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonViewTest.kt
@@ -19,8 +19,9 @@
package org.isoron.uhabits.activities.habits.list.views
-import android.support.test.filters.*
-import android.support.test.runner.*
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.*
+import androidx.test.runner.*
import org.isoron.uhabits.*
import org.isoron.uhabits.core.models.*
import org.isoron.uhabits.utils.*
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkPanelViewTest.kt b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkPanelViewTest.kt
index b02e7c280..024b0fa7f 100644
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkPanelViewTest.kt
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkPanelViewTest.kt
@@ -19,8 +19,9 @@
package org.isoron.uhabits.activities.habits.list.views
-import android.support.test.filters.*
-import android.support.test.runner.*
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.*
+import androidx.test.runner.*
import org.hamcrest.CoreMatchers.*
import org.hamcrest.MatcherAssert.*
import org.isoron.uhabits.*
@@ -61,7 +62,6 @@ class CheckmarkPanelViewTest : BaseViewTest() {
@After
public override fun tearDown() {
-// view.onDetachedFromWindow()
super.tearDown()
}
@@ -70,23 +70,26 @@ class CheckmarkPanelViewTest : BaseViewTest() {
assertRenders(view, "$PATH/render.png")
}
- @Test
- fun testRender_withDifferentColor() {
- view.color = PaletteUtils.getAndroidTestColor(1)
- assertRenders(view, "$PATH/render_different_color.png")
- }
+// // Flaky test
+// @Test
+// fun testRender_withDifferentColor() {
+// view.color = PaletteUtils.getAndroidTestColor(1)
+// assertRenders(view, "$PATH/render_different_color.png")
+// }
- @Test
- fun testRender_Reversed() {
- prefs.isCheckmarkSequenceReversed = true
- assertRenders(view, "$PATH/render_reversed.png")
- }
+// // Flaky test
+// @Test
+// fun testRender_Reversed() {
+// prefs.isCheckmarkSequenceReversed = true
+// assertRenders(view, "$PATH/render_reversed.png")
+// }
- @Test
- fun testRender_withOffset() {
- view.dataOffset = 3
- assertRenders(view, "$PATH/render_offset.png")
- }
+// // Flaky test
+// @Test
+// fun testRender_withOffset() {
+// view.dataOffset = 3
+// assertRenders(view, "$PATH/render_offset.png")
+// }
@Test
fun testToggle() {
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/HabitCardViewTest.kt b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/HabitCardViewTest.kt
index 5660b862e..19a482136 100644
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/HabitCardViewTest.kt
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/HabitCardViewTest.kt
@@ -19,8 +19,9 @@
package org.isoron.uhabits.activities.habits.list.views
-import android.support.test.filters.*
-import android.support.test.runner.*
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.*
+import androidx.test.runner.*
import org.isoron.uhabits.*
import org.isoron.uhabits.core.models.*
import org.junit.*
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/HeaderViewTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/HeaderViewTest.java
index 4c347c2a5..71f203e40 100644
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/HeaderViewTest.java
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/HeaderViewTest.java
@@ -19,8 +19,10 @@
package org.isoron.uhabits.activities.habits.list.views;
-import android.support.test.filters.*;
-import android.support.test.runner.*;
+import androidx.test.filters.*;
+import androidx.test.runner.*;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.isoron.uhabits.*;
import org.isoron.uhabits.core.preferences.*;
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/HintViewTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/HintViewTest.java
index 2bae80483..b6baabb30 100644
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/HintViewTest.java
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/HintViewTest.java
@@ -19,8 +19,10 @@
package org.isoron.uhabits.activities.habits.list.views;
-import android.support.test.filters.*;
-import android.support.test.runner.*;
+import androidx.test.filters.*;
+import androidx.test.runner.*;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.isoron.uhabits.*;
import org.isoron.uhabits.core.ui.screens.habits.list.*;
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonViewTest.kt b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonViewTest.kt
index d64830e21..1c83fdb4b 100644
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonViewTest.kt
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonViewTest.kt
@@ -19,8 +19,9 @@
package org.isoron.uhabits.activities.habits.list.views
-import android.support.test.filters.*
-import android.support.test.runner.*
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.*
+import androidx.test.runner.*
import org.hamcrest.CoreMatchers.*
import org.hamcrest.MatcherAssert.*
import org.isoron.uhabits.*
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/NumberPanelViewTest.kt b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/NumberPanelViewTest.kt
index 489f65247..2a660b2a0 100644
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/NumberPanelViewTest.kt
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/NumberPanelViewTest.kt
@@ -19,8 +19,9 @@
package org.isoron.uhabits.activities.habits.list.views
-import android.support.test.filters.*
-import android.support.test.runner.*
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.*
+import androidx.test.runner.*
import org.hamcrest.CoreMatchers.*
import org.hamcrest.MatcherAssert.*
import org.isoron.uhabits.*
@@ -65,23 +66,26 @@ class NumberPanelViewTest : BaseViewTest() {
assertRenders(view, "$PATH/render.png")
}
- @Test
- fun testRender_withDifferentColor() {
- view.color = PaletteUtils.getAndroidTestColor(1)
- assertRenders(view, "$PATH/render_different_color.png")
- }
+// // Flaky test
+// @Test
+// fun testRender_withDifferentColor() {
+// view.color = PaletteUtils.getAndroidTestColor(1)
+// assertRenders(view, "$PATH/render_different_color.png")
+// }
- @Test
- fun testRender_Reversed() {
- prefs.isCheckmarkSequenceReversed = true
- assertRenders(view, "$PATH/render_reversed.png")
- }
+// // Flaky test
+// @Test
+// fun testRender_Reversed() {
+// prefs.isCheckmarkSequenceReversed = true
+// assertRenders(view, "$PATH/render_reversed.png")
+// }
- @Test
- fun testRender_withOffset() {
- view.dataOffset = 3
- assertRenders(view, "$PATH/render_offset.png")
- }
+// // Flaky test
+// @Test
+// fun testRender_withOffset() {
+// view.dataOffset = 3
+// assertRenders(view, "$PATH/render_offset.png")
+// }
@Test
fun testEdit() {
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/FrequencyCardTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/FrequencyCardTest.java
index 571f00c41..d8ceac381 100644
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/FrequencyCardTest.java
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/FrequencyCardTest.java
@@ -19,10 +19,12 @@
package org.isoron.uhabits.activities.habits.show.views;
-import android.support.test.filters.*;
-import android.support.test.runner.*;
+import androidx.test.filters.*;
+import androidx.test.runner.*;
import android.view.*;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.isoron.uhabits.*;
import org.isoron.uhabits.core.models.*;
import org.junit.*;
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/HistoryCardTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/HistoryCardTest.java
index 1313e8afc..a912f24a7 100644
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/HistoryCardTest.java
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/HistoryCardTest.java
@@ -19,10 +19,12 @@
package org.isoron.uhabits.activities.habits.show.views;
-import android.support.test.filters.*;
-import android.support.test.runner.*;
+import androidx.test.filters.*;
+import androidx.test.runner.*;
import android.view.*;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.isoron.uhabits.*;
import org.isoron.uhabits.core.models.*;
import org.junit.*;
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/NotesCardTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/NotesCardTest.java
new file mode 100644
index 000000000..6f91bf4d6
--- /dev/null
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/NotesCardTest.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2016 Álinson Santos Xavier
+ *
+ * This file is part of Loop Habit Tracker.
+ *
+ * Loop Habit Tracker is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Loop Habit Tracker is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see .
+ */
+
+package org.isoron.uhabits.activities.habits.show.views;
+
+import android.view.LayoutInflater;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.MediumTest;
+
+import org.isoron.uhabits.BaseViewTest;
+import org.isoron.uhabits.R;
+import org.isoron.uhabits.core.models.Habit;
+import org.isoron.uhabits.core.models.Reminder;
+import org.isoron.uhabits.core.models.WeekdayList;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@MediumTest
+public class NotesCardTest extends BaseViewTest
+{
+ public static final String PATH = "habits/show/NotesCard/";
+
+ private NotesCard view;
+
+ private Habit habit;
+
+ @Before
+ @Override
+ public void setUp()
+ {
+ super.setUp();
+
+ habit = fixtures.createLongHabit();
+ habit.setReminder(new Reminder(8, 30, WeekdayList.EVERY_DAY));
+
+ view = LayoutInflater
+ .from(targetContext)
+ .inflate(R.layout.show_habit, null)
+ .findViewById(R.id.notesCard);
+
+ view.setHabit(habit);
+ view.refreshData();
+
+ measureView(view, 800, 200);
+ }
+
+ @Test
+ public void testRender() throws Exception
+ {
+ assertRenders(view, PATH + "render.png");
+ }
+
+ @Test
+ public void testRenderEmptyDescription() throws Exception
+ {
+ habit.setDescription("");
+ view.refreshData();
+ assertRenders(view, PATH + "render-empty-description.png");
+ }
+}
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/OverviewCardTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/OverviewCardTest.java
index 82b28ef76..9afe0014d 100644
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/OverviewCardTest.java
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/OverviewCardTest.java
@@ -19,10 +19,12 @@
package org.isoron.uhabits.activities.habits.show.views;
-import android.support.test.filters.*;
-import android.support.test.runner.*;
+import androidx.test.filters.*;
+import androidx.test.runner.*;
import android.view.*;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.isoron.uhabits.*;
import org.isoron.uhabits.core.models.*;
import org.junit.*;
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/ScoreCardTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/ScoreCardTest.java
index 39aee8640..51901e896 100644
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/ScoreCardTest.java
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/ScoreCardTest.java
@@ -19,10 +19,12 @@
package org.isoron.uhabits.activities.habits.show.views;
-import android.support.test.filters.*;
-import android.support.test.runner.*;
+import androidx.test.filters.*;
+import androidx.test.runner.*;
import android.view.*;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.isoron.uhabits.*;
import org.isoron.uhabits.core.models.*;
import org.junit.*;
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/StreakCardTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/StreakCardTest.java
index 07927bccb..ebe8aed46 100644
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/StreakCardTest.java
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/StreakCardTest.java
@@ -19,10 +19,12 @@
package org.isoron.uhabits.activities.habits.show.views;
-import android.support.test.filters.*;
-import android.support.test.runner.*;
+import androidx.test.filters.*;
+import androidx.test.runner.*;
import android.view.*;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.isoron.uhabits.*;
import org.isoron.uhabits.core.models.*;
import org.junit.*;
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/SubtitleCardTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/SubtitleCardTest.java
index eb29d1155..63aa74407 100644
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/SubtitleCardTest.java
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/SubtitleCardTest.java
@@ -19,10 +19,12 @@
package org.isoron.uhabits.activities.habits.show.views;
-import android.support.test.filters.*;
-import android.support.test.runner.*;
+import androidx.test.filters.*;
+import androidx.test.runner.*;
import android.view.*;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.isoron.uhabits.*;
import org.isoron.uhabits.core.models.*;
import org.junit.*;
@@ -47,7 +49,7 @@ public class SubtitleCardTest extends BaseViewTest
habit = fixtures.createLongHabit();
habit.setReminder(new Reminder(8, 30, WeekdayList.EVERY_DAY));
- view = (SubtitleCard) LayoutInflater
+ view = LayoutInflater
.from(targetContext)
.inflate(R.layout.show_habit, null)
.findViewById(R.id.subtitleCard);
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/integration/SavedStateTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/integration/SavedStateTest.java
deleted file mode 100644
index 391e4e37b..000000000
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/integration/SavedStateTest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2017 Álinson Santos Xavier
- *
- * This file is part of Loop Habit Tracker.
- *
- * Loop Habit Tracker is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by the
- * Free Software Foundation, either version 3 of the License, or (at your
- * option) any later version.
- *
- * Loop Habit Tracker is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see .
- */
-
-package org.isoron.uhabits.integration;
-
-import android.support.test.filters.*;
-import android.support.test.runner.*;
-
-import org.isoron.uhabits.*;
-import org.isoron.uhabits.activities.about.*;
-import org.isoron.uhabits.activities.habits.list.*;
-import org.junit.*;
-import org.junit.runner.*;
-
-import static java.lang.Thread.*;
-
-@RunWith(AndroidJUnit4.class)
-@LargeTest
-public class SavedStateTest extends BaseUserInterfaceTest
-{
- /**
- * Make sure that the main activity can be recreated by using
- * BundleSavedState after being destroyed. See bug:
- * https://github.com/iSoron/uhabits/issues/287
- */
- @Test
- public void testBundleSavedState() throws Exception
- {
- startActivity(ListHabitsActivity.class);
- device.waitForIdle();
- startActivity(AboutActivity.class);
- sleep(1000);
- device.pressBack();
- }
-}
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/performance/PerformanceTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/performance/PerformanceTest.java
index 49ea79bc4..0dba9879f 100644
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/performance/PerformanceTest.java
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/performance/PerformanceTest.java
@@ -19,8 +19,10 @@
package org.isoron.uhabits.performance;
-import android.support.test.filters.*;
-import android.support.test.runner.*;
+import androidx.test.filters.*;
+import androidx.test.runner.*;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.isoron.uhabits.*;
import org.isoron.uhabits.core.models.*;
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/regression/ListHabitsRegressionTest.kt b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/regression/ListHabitsRegressionTest.kt
new file mode 100644
index 000000000..18ed417ec
--- /dev/null
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/regression/ListHabitsRegressionTest.kt
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2020 Álinson Santos Xavier
+ *
+ * This file is part of Loop Habit Tracker.
+ *
+ * Loop Habit Tracker is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Loop Habit Tracker is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see .
+ */
+
+package org.isoron.uhabits.regression
+
+import androidx.test.filters.*
+import org.isoron.uhabits.*
+import org.isoron.uhabits.acceptance.steps.CommonSteps.*
+import org.isoron.uhabits.acceptance.steps.CommonSteps.Screen.*
+import org.isoron.uhabits.acceptance.steps.EditHabitSteps.*
+import org.isoron.uhabits.acceptance.steps.ListHabitsSteps.*
+import org.isoron.uhabits.acceptance.steps.ListHabitsSteps.MenuItem.*
+import org.junit.*
+
+
+@LargeTest
+class ListHabitsRegressionTest : BaseUserInterfaceTest() {
+ /**
+ * https://github.com/iSoron/uhabits/issues/539
+ */
+ @Test
+ @Throws(Exception::class)
+ fun should_not_crash_after_deleting_then_adding_a_habit() {
+ launchApp()
+ verifyShowsScreen(LIST_HABITS)
+ longClickText("Track time")
+ clickMenu(DELETE)
+ clickOK()
+
+ clickMenu(ADD)
+ verifyShowsScreen(EDIT_HABIT)
+ typeName("Hello world")
+ clickSave()
+
+ verifyDisplaysText("Hello world")
+ longPressCheckmarks("Hello world", 3)
+ }
+}
\ No newline at end of file
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/regression/SavedStateTest.kt b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/regression/SavedStateTest.kt
new file mode 100644
index 000000000..5d783ad1f
--- /dev/null
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/regression/SavedStateTest.kt
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2020 Álinson Santos Xavier
+ *
+ * This file is part of Loop Habit Tracker.
+ *
+ * Loop Habit Tracker is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Loop Habit Tracker is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see .
+ */
+
+package org.isoron.uhabits.regression
+
+import androidx.test.filters.*
+
+import org.isoron.uhabits.*
+import org.junit.*
+
+import org.isoron.uhabits.acceptance.steps.CommonSteps.*
+import org.isoron.uhabits.acceptance.steps.EditHabitSteps.*
+import org.isoron.uhabits.acceptance.steps.ListHabitsSteps.*
+import org.isoron.uhabits.acceptance.steps.ListHabitsSteps.MenuItem.*
+import org.isoron.uhabits.acceptance.steps.WidgetSteps.clickText
+import org.isoron.uhabits.activities.about.*
+import org.isoron.uhabits.activities.habits.list.*
+import java.lang.Thread.*
+
+@LargeTest
+class SavedStateTest : BaseUserInterfaceTest() {
+
+ @Test
+ @Throws(Exception::class)
+ fun shouldNotCrashWhenRotatingWeekdayPickerDialog() {
+ // https://github.com/iSoron/uhabits/issues/534
+ launchApp()
+ clickMenu(ADD)
+ setReminder()
+ clickReminderDays()
+ unselectAllDays()
+ rotateDevice()
+ clickText("Monday")
+ }
+
+ /**
+ * Make sure that the main activity can be recreated by using
+ * BundleSavedState after being destroyed. See bug:
+ * https://github.com/iSoron/uhabits/issues/287
+ */
+ @Test
+ @Throws(Exception::class)
+ fun testBundleSavedState() {
+ launchApp()
+ startActivity(AboutActivity::class.java)
+ sleep(1000)
+ device.pressBack()
+ }
+}
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/tasks/ExportCSVTaskTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/tasks/ExportCSVTaskTest.java
deleted file mode 100644
index 0546713fa..000000000
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/tasks/ExportCSVTaskTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2016 Álinson Santos Xavier
- *
- * This file is part of Loop Habit Tracker.
- *
- * Loop Habit Tracker is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by the
- * Free Software Foundation, either version 3 of the License, or (at your
- * option) any later version.
- *
- * Loop Habit Tracker is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see .
- */
-
-package org.isoron.uhabits.tasks;
-
-import android.support.test.filters.*;
-import android.support.test.runner.*;
-
-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 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());
-// }));
-// }
-}
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/tasks/ExportDBTaskTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/tasks/ExportDBTaskTest.java
deleted file mode 100644
index 1033233b4..000000000
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/tasks/ExportDBTaskTest.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2016 Álinson Santos Xavier
- *
- * This file is part of Loop Habit Tracker.
- *
- * Loop Habit Tracker is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by the
- * Free Software Foundation, either version 3 of the License, or (at your
- * option) any later version.
- *
- * Loop Habit Tracker is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see .
- */
-
-package org.isoron.uhabits.tasks;
-
-import android.support.test.filters.*;
-import android.support.test.runner.*;
-
-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);
-// }
-}
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/CheckmarkWidgetTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/CheckmarkWidgetTest.java
index e7da51e49..0aeb4762f 100644
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/CheckmarkWidgetTest.java
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/CheckmarkWidgetTest.java
@@ -19,10 +19,12 @@
package org.isoron.uhabits.widgets;
-import android.support.test.filters.*;
-import android.support.test.runner.*;
+import androidx.test.filters.*;
+import androidx.test.runner.*;
import android.widget.*;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.isoron.uhabits.*;
import org.isoron.uhabits.core.models.*;
import org.junit.*;
@@ -48,7 +50,7 @@ public class CheckmarkWidgetTest extends BaseViewTest
public void setUp()
{
super.setUp();
- setTheme(R.style.TransparentWidgetTheme);
+ setTheme(R.style.WidgetTheme);
habit = fixtures.createShortHabit();
checkmarks = habit.getCheckmarks();
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/FrequencyWidgetTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/FrequencyWidgetTest.java
index 7dccac3f2..31a459af3 100644
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/FrequencyWidgetTest.java
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/FrequencyWidgetTest.java
@@ -19,15 +19,19 @@
package org.isoron.uhabits.widgets;
-import android.support.test.filters.*;
-import android.support.test.runner.*;
+import androidx.test.filters.*;
+import androidx.test.runner.*;
import android.widget.*;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.isoron.uhabits.*;
import org.isoron.uhabits.core.models.*;
import org.junit.*;
import org.junit.runner.*;
+import java.util.*;
+
@RunWith(AndroidJUnit4.class)
@MediumTest
public class FrequencyWidgetTest extends BaseViewTest
@@ -42,10 +46,10 @@ public class FrequencyWidgetTest extends BaseViewTest
public void setUp()
{
super.setUp();
- setTheme(R.style.TransparentWidgetTheme);
+ setTheme(R.style.WidgetTheme);
habit = fixtures.createLongHabit();
- FrequencyWidget widget = new FrequencyWidget(targetContext, 0, habit);
+ FrequencyWidget widget = new FrequencyWidget(targetContext, 0, habit, Calendar.SUNDAY);
view = convertToView(widget, 400, 400);
}
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/HistoryWidgetTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/HistoryWidgetTest.java
index b6f19b4e9..f059d99c1 100644
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/HistoryWidgetTest.java
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/HistoryWidgetTest.java
@@ -19,15 +19,19 @@
package org.isoron.uhabits.widgets;
-import android.support.test.filters.*;
-import android.support.test.runner.*;
+import androidx.test.filters.*;
+import androidx.test.runner.*;
import android.widget.*;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.isoron.uhabits.*;
import org.isoron.uhabits.core.models.*;
import org.junit.*;
import org.junit.runner.*;
+import java.util.*;
+
@RunWith(AndroidJUnit4.class)
@MediumTest
public class HistoryWidgetTest extends BaseViewTest
@@ -42,10 +46,10 @@ public class HistoryWidgetTest extends BaseViewTest
public void setUp()
{
super.setUp();
- setTheme(R.style.TransparentWidgetTheme);
+ setTheme(R.style.WidgetTheme);
habit = fixtures.createLongHabit();
- HistoryWidget widget = new HistoryWidget(targetContext, 0, habit);
+ HistoryWidget widget = new HistoryWidget(targetContext, 0, habit, Calendar.SUNDAY);
view = convertToView(widget, 400, 400);
}
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/ScoreWidgetTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/ScoreWidgetTest.java
index fbf79770a..550984b65 100644
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/ScoreWidgetTest.java
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/ScoreWidgetTest.java
@@ -19,10 +19,12 @@
package org.isoron.uhabits.widgets;
-import android.support.test.filters.*;
-import android.support.test.runner.*;
+import androidx.test.filters.*;
+import androidx.test.runner.*;
import android.widget.*;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.isoron.uhabits.*;
import org.isoron.uhabits.core.models.*;
import org.junit.*;
@@ -42,7 +44,7 @@ public class ScoreWidgetTest extends BaseViewTest
public void setUp()
{
super.setUp();
- setTheme(R.style.TransparentWidgetTheme);
+ setTheme(R.style.WidgetTheme);
habit = fixtures.createLongHabit();
ScoreWidget widget = new ScoreWidget(targetContext, 0, habit);
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/StreakWidgetTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/StreakWidgetTest.java
index 338eceb53..a9d4e6f8f 100644
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/StreakWidgetTest.java
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/StreakWidgetTest.java
@@ -19,10 +19,12 @@
package org.isoron.uhabits.widgets;
-import android.support.test.filters.*;
-import android.support.test.runner.*;
+import androidx.test.filters.*;
+import androidx.test.runner.*;
import android.widget.*;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
import org.isoron.uhabits.*;
import org.isoron.uhabits.core.models.*;
import org.junit.*;
@@ -42,7 +44,7 @@ public class StreakWidgetTest extends BaseViewTest
public void setUp()
{
super.setUp();
- setTheme(R.style.TransparentWidgetTheme);
+ setTheme(R.style.WidgetTheme);
habit = fixtures.createLongHabit();
StreakWidget widget = new StreakWidget(targetContext, 0, habit);
diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/views/CheckmarkWidgetViewTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/views/CheckmarkWidgetViewTest.java
index d117372fa..de54d565c 100644
--- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/views/CheckmarkWidgetViewTest.java
+++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/views/CheckmarkWidgetViewTest.java
@@ -19,8 +19,10 @@
package org.isoron.uhabits.widgets.views;
-import android.support.test.filters.*;
-import android.support.test.runner.*;
+import androidx.test.filters.*;
+import androidx.test.runner.*;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.isoron.uhabits.*;
import org.isoron.uhabits.core.models.*;
@@ -43,7 +45,7 @@ public class CheckmarkWidgetViewTest extends BaseViewTest
public void setUp()
{
super.setUp();
- setTheme(R.style.TransparentWidgetTheme);
+ setTheme(R.style.WidgetTheme);
Habit habit = fixtures.createShortHabit();
view = new CheckmarkWidgetView(targetContext);
@@ -51,6 +53,7 @@ public class CheckmarkWidgetViewTest extends BaseViewTest
float percentage = (float) score;
view.setActiveColor(PaletteUtils.getAndroidTestColor(0));
+ view.setCheckmarkState(habit.getCheckmarks().getTodayValue());
view.setCheckmarkValue(habit.getCheckmarks().getTodayValue());
view.setPercentage(percentage);
view.setName(habit.getName());
diff --git a/android/uhabits-android/src/main/AndroidManifest.xml b/android/uhabits-android/src/main/AndroidManifest.xml
index 2f371d686..f2dbda768 100644
--- a/android/uhabits-android/src/main/AndroidManifest.xml
+++ b/android/uhabits-android/src/main/AndroidManifest.xml
@@ -1,32 +1,10 @@
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+ android:value="AEdPqrEAAAAI6aeWncbnMNo8E5GWeZ44dlc5cQ7tCROwFhOtiw" />
+ android:launchMode="singleTop" />
-
-
+
+
-
+
@@ -64,108 +51,141 @@
android:label="@string/title_activity_show_habit">
+ android:value=".activities.habits.list.ListHabitsActivity" />
+
+ android:value=".activities.habits.list.ListHabitsActivity" />
+
+ android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
+
-
+
+
+ android:value=".activities.habits.list.ListHabitsActivity" />
+
+
+
+
+
+
+
-
+ android:theme="@android:style/Theme.Translucent.NoTitleBar" />
-
+
+ android:resource="@xml/widget_checkmark_info" />
-
+
+
+
-
+
+ android:resource="@xml/widget_history_info" />
+
-
+
+ android:resource="@xml/widget_score_info" />
+
-
+
+ android:resource="@xml/widget_streak_info" />
+
-
+
+ android:resource="@xml/widget_frequency_info" />
+
+
+
+
+
+
+
+
+
-
+
+
-
-
-
+
@@ -173,20 +193,29 @@
-
+
+ android:scheme="content" />
-
+
-
+
+ android:scheme="content" />
+
+
+
+
+
+
+
@@ -197,7 +226,7 @@
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name">
-
+
@@ -206,25 +235,25 @@
android:name=".automation.FireSettingReceiver"
android:exported="true">
-
+
+ android:resource="@xml/file_paths" />
-
+ android:exported="false" />
+
\ No newline at end of file
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/HabitLogger.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/HabitLogger.kt
deleted file mode 100644
index a248e54c1..000000000
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/HabitLogger.kt
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2016 Álinson Santos Xavier
- *
- * This file is part of Loop Habit Tracker.
- *
- * Loop Habit Tracker is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by the
- * Free Software Foundation, either version 3 of the License, or (at your
- * option) any later version.
- *
- * Loop Habit Tracker is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see .
- */
-
-package org.isoron.uhabits
-
-import android.util.*
-import org.isoron.uhabits.core.*
-import org.isoron.uhabits.core.models.*
-import org.isoron.uhabits.core.utils.*
-import java.util.*
-import javax.inject.*
-
-@AppScope
-class HabitLogger
-@Inject constructor() {
-
- fun logReminderScheduled(habit: Habit, reminderTime: Long) {
- val min = Math.min(3, habit.name.length)
- val name = habit.name.substring(0, min)
- val df = DateFormats.getBackupDateFormat()
- val time = df.format(Date(reminderTime))
- Log.i("ReminderHelper",
- String.format("Setting alarm (%s): %s", time, name))
- }
-}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/HabitsApplicationComponent.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/HabitsApplicationComponent.java
index 3fd635f22..8c110ab26 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/HabitsApplicationComponent.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/HabitsApplicationComponent.java
@@ -63,8 +63,6 @@ public interface HabitsApplicationComponent
HabitList getHabitList();
- HabitLogger getHabitsLogger();
-
IntentFactory getIntentFactory();
IntentParser getIntentParser();
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/HabitsDatabaseOpener.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/HabitsDatabaseOpener.kt
index ba3c5565d..6bc86eaaa 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/HabitsDatabaseOpener.kt
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/HabitsDatabaseOpener.kt
@@ -34,13 +34,20 @@ class HabitsDatabaseOpener(
) : SQLiteOpenHelper(context, databaseFilename, null, version) {
override fun onCreate(db: SQLiteDatabase) {
+ db.disableWriteAheadLogging()
db.version = 8
onUpgrade(db, -1, version)
}
+ override fun onOpen(db: SQLiteDatabase) {
+ super.onOpen(db)
+ db.disableWriteAheadLogging()
+ }
+
override fun onUpgrade(db: SQLiteDatabase,
oldVersion: Int,
newVersion: Int) {
+ db.disableWriteAheadLogging()
if (db.version < 8) throw UnsupportedDatabaseVersionException()
val helper = MigrationHelper(AndroidDatabase(db))
helper.migrateTo(newVersion)
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/HabitsModule.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/HabitsModule.kt
index adbb32a11..a1a813d51 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/HabitsModule.kt
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/HabitsModule.kt
@@ -48,9 +48,10 @@ class HabitsModule {
fun getReminderScheduler(
sys: IntentScheduler,
commandRunner: CommandRunner,
- habitList: HabitList
+ habitList: HabitList,
+ widgetPreferences: WidgetPreferences
): ReminderScheduler {
- return ReminderScheduler(commandRunner, habitList, sys)
+ return ReminderScheduler(commandRunner, habitList, sys, widgetPreferences)
}
@Provides
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/AndroidThemeSwitcher.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/AndroidThemeSwitcher.kt
index 9c8c8f6b3..c0d5bd786 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/AndroidThemeSwitcher.kt
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/AndroidThemeSwitcher.kt
@@ -19,6 +19,10 @@
package org.isoron.uhabits.activities
+import android.app.*
+import android.content.res.Configuration.*
+import android.os.Build.VERSION.*
+import androidx.core.content.*
import org.isoron.androidbase.activities.*
import org.isoron.uhabits.*
import org.isoron.uhabits.core.preferences.*
@@ -27,13 +31,25 @@ import javax.inject.*
@ActivityScope
class AndroidThemeSwitcher
-@Inject constructor(
- private val activity: BaseActivity,
+constructor(
+ private val activity: Activity,
preferences: Preferences
) : ThemeSwitcher(preferences) {
+ override fun getSystemTheme(): Int {
+ if(SDK_INT < 29) return THEME_LIGHT;
+ val uiMode = activity.resources.configuration.uiMode
+ return if ((uiMode and UI_MODE_NIGHT_MASK) == UI_MODE_NIGHT_YES) {
+ THEME_DARK;
+ } else {
+ THEME_LIGHT;
+ }
+ }
+
override fun applyDarkTheme() {
activity.setTheme(R.style.AppBaseThemeDark)
+ activity.window.navigationBarColor =
+ ContextCompat.getColor(activity, R.color.grey_900)
}
override fun applyLightTheme() {
@@ -42,5 +58,14 @@ class AndroidThemeSwitcher
override fun applyPureBlackTheme() {
activity.setTheme(R.style.AppBaseThemeDark_PureBlack)
+ activity.window.navigationBarColor =
+ ContextCompat.getColor(activity, R.color.black)
+ }
+
+ fun getDialogTheme(): Int {
+ return when {
+ isNightMode -> R.style.DarkDialogWithTitle
+ else -> R.style.DialogWithTitle
+ }
}
}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/HabitsActivityComponent.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/HabitsActivityComponent.kt
index ed6906b74..a135b02d4 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/HabitsActivityComponent.kt
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/HabitsActivityComponent.kt
@@ -34,15 +34,12 @@ import org.isoron.uhabits.core.ui.screens.habits.list.*
@Component(modules = arrayOf(
ActivityContextModule::class,
BaseActivityModule::class,
- AboutModule::class,
HabitsActivityModule::class,
ListHabitsModule::class,
ShowHabitModule::class,
HabitModule::class
), dependencies = arrayOf(HabitsApplicationComponent::class))
interface HabitsActivityComponent {
- val aboutRootView: AboutRootView
- val aboutScreen: AboutScreen
val colorPickerDialogFactory: ColorPickerDialogFactory
val habitCardListAdapter: HabitCardListAdapter
val listHabitsBehavior: ListHabitsBehavior
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/HabitsActivityModule.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/HabitsActivityModule.kt
index 77145afbc..e074c17c4 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/HabitsActivityModule.kt
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/HabitsActivityModule.kt
@@ -21,10 +21,17 @@ package org.isoron.uhabits.activities
import dagger.*
import org.isoron.androidbase.activities.*
+import org.isoron.uhabits.core.preferences.*
import org.isoron.uhabits.core.ui.*
@Module
-abstract class HabitsActivityModule {
- @Binds @ActivityScope
- internal abstract fun getThemeSwitcher(t: AndroidThemeSwitcher): ThemeSwitcher
+class HabitsActivityModule {
+
+ @Provides
+ @ActivityScope
+ fun getThemeSwitcher(activity: BaseActivity,
+ prefs: Preferences
+ ): ThemeSwitcher {
+ return AndroidThemeSwitcher(activity, prefs)
+ }
}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/about/AboutActivity.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/about/AboutActivity.java
index fc098b3c9..58cf49681 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/about/AboutActivity.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/about/AboutActivity.java
@@ -21,6 +21,7 @@ package org.isoron.uhabits.activities.about;
import android.os.*;
+import org.isoron.uhabits.*;
import org.isoron.uhabits.activities.*;
/**
@@ -33,8 +34,12 @@ public class AboutActivity extends HabitsActivity
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
- AboutScreen screen = getComponent().getAboutScreen();
- screen.setRootView(getComponent().getAboutRootView());
+ HabitsApplication app = (HabitsApplication) getApplication();
+ AboutScreen screen = new AboutScreen(this,
+ app.getComponent().getIntentFactory(),
+ app.getComponent().getPreferences());
+ AboutRootView rootView = new AboutRootView(this, screen);
+ screen.setRootView(rootView);
setScreen(screen);
}
}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/about/AboutRootView.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/about/AboutRootView.java
index 1a88668a1..68cb68551 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/about/AboutRootView.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/about/AboutRootView.java
@@ -20,14 +20,14 @@
package org.isoron.uhabits.activities.about;
import android.content.*;
-import android.support.annotation.*;
import android.widget.*;
+import androidx.annotation.*;
+
import org.isoron.androidbase.activities.*;
import org.isoron.androidbase.utils.*;
import org.isoron.uhabits.BuildConfig;
import org.isoron.uhabits.R;
-import org.isoron.uhabits.core.ui.screens.about.*;
import javax.inject.*;
@@ -39,14 +39,14 @@ public class AboutRootView extends BaseRootView
TextView tvVersion;
@NonNull
- private final AboutBehavior behavior;
+ private final AboutScreen screen;
@Inject
public AboutRootView(@NonNull @ActivityContext Context context,
- @NonNull AboutBehavior behavior)
+ @NonNull AboutScreen screen)
{
super(context);
- this.behavior = behavior;
+ this.screen = screen;
addView(inflate(getContext(), R.layout.about, null));
ButterKnife.bind(this);
@@ -70,31 +70,43 @@ public class AboutRootView extends BaseRootView
@OnClick(R.id.tvFeedback)
public void onClickFeedback()
{
- behavior.onSendFeedback();
+ screen.showSendFeedbackScreen();
}
@OnClick(R.id.tvVersion)
public void onClickIcon()
{
- behavior.onPressDeveloperCountdown();
+ screen.onPressDeveloperCountdown();
}
@OnClick(R.id.tvRate)
public void onClickRate()
{
- behavior.onRateApp();
+ screen.showRateAppWebsite();
}
@OnClick(R.id.tvSource)
public void onClickSource()
{
- behavior.onViewSourceCode();
+ screen.showSourceCodeWebsite();
}
@OnClick(R.id.tvTranslate)
public void onClickTranslate()
{
- behavior.onTranslateApp();
+ screen.showTranslationWebsite();
+ }
+
+ @OnClick(R.id.tvPrivacy)
+ public void onClickPrivacy()
+ {
+ screen.showPrivacyPolicyWebsite();
+ }
+
+ @OnClick(R.id.tvContributors)
+ public void onClickContributors()
+ {
+ screen.showCodeContributorsWebsite();
}
@Override
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/about/AboutScreen.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/about/AboutScreen.java
index c8c5808c4..c5b668ae8 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/about/AboutScreen.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/about/AboutScreen.java
@@ -19,59 +19,69 @@
package org.isoron.uhabits.activities.about;
-import android.support.annotation.*;
import android.widget.*;
+import androidx.annotation.*;
+
import org.isoron.androidbase.activities.*;
-import org.isoron.uhabits.core.ui.screens.about.*;
+import org.isoron.uhabits.core.preferences.*;
import org.isoron.uhabits.intents.*;
-import javax.inject.*;
+public class AboutScreen extends BaseScreen
+{
+ @NonNull
+ private final Preferences prefs;
-import static org.isoron.uhabits.core.ui.screens.about.AboutBehavior.Message.*;
+ private int developerCountdown = 5;
-public class AboutScreen extends BaseScreen implements AboutBehavior.Screen
-{
@NonNull
private final IntentFactory intents;
- @Inject
public AboutScreen(@NonNull BaseActivity activity,
- @NonNull IntentFactory intents)
+ @NonNull IntentFactory intents,
+ @NonNull Preferences prefs)
{
super(activity);
this.intents = intents;
+ this.prefs = prefs;
}
- @Override
- public void showMessage(AboutBehavior.Message message)
- {
- if (message == YOU_ARE_NOW_A_DEVELOPER) Toast
- .makeText(activity, "You are now a developer", Toast.LENGTH_LONG)
- .show();
- }
-
- @Override
public void showRateAppWebsite()
{
activity.startActivity(intents.rateApp(activity));
}
- @Override
public void showSendFeedbackScreen()
{
activity.startActivity(intents.sendFeedback(activity));
}
- @Override
public void showSourceCodeWebsite()
{
activity.startActivity(intents.viewSourceCode(activity));
}
- @Override
public void showTranslationWebsite()
{
activity.startActivity(intents.helpTranslate(activity));
}
+
+ public void showPrivacyPolicyWebsite()
+ {
+ activity.startActivity(intents.privacyPolicy(activity));
+ }
+
+ public void showCodeContributorsWebsite()
+ {
+ activity.startActivity(intents.codeContributors(activity));
+ }
+
+ public void onPressDeveloperCountdown()
+ {
+ developerCountdown--;
+ if (developerCountdown == 0) {
+ prefs.setDeveloper(true);
+ Toast.makeText(activity, "You are now a developer", Toast.LENGTH_LONG).show();
+ }
+ }
}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/ConfirmDeleteDialog.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/ConfirmDeleteDialog.java
index 445cfb8d0..25bbd2a6c 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/ConfirmDeleteDialog.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/ConfirmDeleteDialog.java
@@ -20,8 +20,9 @@
package org.isoron.uhabits.activities.common.dialogs;
import android.content.*;
-import android.support.annotation.*;
-import android.support.v7.app.*;
+
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.*;
import com.google.auto.factory.*;
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/FrequencyPickerDialog.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/FrequencyPickerDialog.kt
new file mode 100644
index 000000000..de40e86bd
--- /dev/null
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/FrequencyPickerDialog.kt
@@ -0,0 +1,172 @@
+/*
+ * Copyright (C) 2016 Álinson Santos Xavier
+ *
+ * This file is part of Loop Habit Tracker.
+ *
+ * Loop Habit Tracker is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Loop Habit Tracker is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see .
+ */
+
+package org.isoron.uhabits.activities.common.dialogs
+
+import android.app.*
+import android.os.*
+import android.util.*
+import android.view.*
+import android.widget.*
+import androidx.appcompat.app.*
+import androidx.appcompat.app.AlertDialog
+import kotlinx.android.synthetic.main.frequency_picker_dialog.view.*
+import org.isoron.uhabits.*
+
+
+class FrequencyPickerDialog(var freqNumerator: Int,
+ var freqDenominator: Int
+ ) : AppCompatDialogFragment() {
+
+ lateinit var contentView: View
+ var onFrequencyPicked: (num: Int, den: Int) -> Unit = {_,_ -> }
+
+ constructor() : this(1, 1)
+
+ override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
+ val inflater = LayoutInflater.from(activity!!)
+ contentView = inflater.inflate(R.layout.frequency_picker_dialog, null)
+
+ contentView.everyDayRadioButton.setOnClickListener {
+ check(contentView.everyDayRadioButton)
+ unfocusAll()
+ }
+
+ contentView.everyXDaysRadioButton.setOnClickListener {
+ check(contentView.everyXDaysRadioButton)
+ val everyXDaysTextView = contentView.everyXDaysTextView
+ focus(everyXDaysTextView)
+ }
+
+ contentView.everyXDaysTextView.setOnFocusChangeListener { v, hasFocus ->
+ if(hasFocus) check(contentView.everyXDaysRadioButton)
+ }
+
+ contentView.xTimesPerWeekRadioButton.setOnClickListener {
+ check(contentView.xTimesPerWeekRadioButton)
+ focus(contentView.xTimesPerWeekTextView)
+ }
+
+ contentView.xTimesPerWeekTextView.setOnFocusChangeListener { v, hasFocus ->
+ if(hasFocus) check(contentView.xTimesPerWeekRadioButton)
+ }
+
+ contentView.xTimesPerMonthRadioButton.setOnClickListener {
+ check(contentView.xTimesPerMonthRadioButton)
+ focus(contentView.xTimesPerMonthTextView)
+ }
+
+ contentView.xTimesPerMonthTextView.setOnFocusChangeListener { v, hasFocus ->
+ if(hasFocus) check(contentView.xTimesPerMonthRadioButton)
+ }
+
+ return AlertDialog.Builder(activity!!)
+ .setView(contentView)
+ .setPositiveButton(R.string.save) { _, _ -> onSaveClicked() }
+ .create()
+ }
+
+ private fun onSaveClicked() {
+ var numerator = 1
+ var denominator = 1
+ when {
+ contentView.everyDayRadioButton.isChecked -> {
+ // NOP
+ }
+ contentView.everyXDaysRadioButton.isChecked -> {
+ if (contentView.everyXDaysTextView.text.isNotEmpty()) {
+ denominator = Integer.parseInt(contentView.everyXDaysTextView.text.toString())
+ }
+ }
+ contentView.xTimesPerWeekRadioButton.isChecked -> {
+ if (contentView.xTimesPerWeekTextView.text.isNotEmpty()) {
+ numerator = Integer.parseInt(contentView.xTimesPerWeekTextView.text.toString())
+ denominator = 7
+ }
+ }
+ else -> {
+ if (contentView.xTimesPerMonthTextView.text.isNotEmpty()) {
+ numerator = Integer.parseInt(contentView.xTimesPerMonthTextView.text.toString())
+ denominator = 30
+ }
+ }
+ }
+ if (numerator >= denominator || numerator < 1) {
+ numerator = 1
+ denominator = 1
+ }
+ onFrequencyPicked(numerator, denominator)
+ dismiss()
+ }
+
+ private fun check(view: RadioButton?) {
+ uncheckAll()
+ view?.isChecked = true
+ view?.requestFocus()
+ }
+
+ override fun onResume() {
+ super.onResume()
+ populateViews()
+ }
+
+ private fun populateViews() {
+ uncheckAll()
+ if (freqNumerator == 1) {
+ if(freqDenominator == 1) {
+ contentView.everyDayRadioButton.isChecked = true
+ } else {
+ contentView.everyXDaysRadioButton.isChecked = true
+ contentView.everyXDaysTextView.setText(freqDenominator.toString())
+ focus(contentView.everyXDaysTextView)
+ }
+ } else {
+ if(freqDenominator == 7) {
+ contentView.xTimesPerWeekRadioButton.isChecked = true
+ contentView.xTimesPerWeekTextView.setText(freqNumerator.toString())
+ focus(contentView.xTimesPerWeekTextView)
+ } else if (freqDenominator == 30 || freqDenominator == 31) {
+ contentView.xTimesPerMonthRadioButton.isChecked = true
+ contentView.xTimesPerMonthTextView.setText(freqNumerator.toString())
+ focus(contentView.xTimesPerMonthTextView)
+ } else {
+ Log.w("FrequencyPickerDialog", "Unknown frequency: $freqNumerator/$freqDenominator")
+ contentView.everyDayRadioButton.isChecked = true
+ }
+ }
+ }
+
+ private fun focus(view: EditText) {
+ view.requestFocus()
+ view.setSelection(view.text.length)
+ }
+
+ private fun uncheckAll() {
+ contentView.everyDayRadioButton.isChecked = false
+ contentView.everyXDaysRadioButton.isChecked = false
+ contentView.xTimesPerWeekRadioButton.isChecked = false
+ contentView.xTimesPerMonthRadioButton.isChecked = false
+ }
+
+ private fun unfocusAll() {
+ contentView.everyXDaysTextView.clearFocus()
+ contentView.xTimesPerWeekTextView.clearFocus()
+ contentView.xTimesPerMonthTextView.clearFocus()
+ }
+}
\ No newline at end of file
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/HistoryEditorDialog.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/HistoryEditorDialog.java
index 0a76b52fc..a3c232cc7 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/HistoryEditorDialog.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/HistoryEditorDialog.java
@@ -22,14 +22,17 @@ package org.isoron.uhabits.activities.common.dialogs;
import android.app.*;
import android.content.*;
import android.os.*;
-import android.support.annotation.*;
-import android.support.v7.app.AlertDialog;
-import android.support.v7.app.*;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AlertDialog;
+import androidx.appcompat.app.*;
import android.util.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.activities.common.views.*;
import org.isoron.uhabits.core.models.*;
+import org.isoron.uhabits.core.preferences.*;
import org.isoron.uhabits.core.tasks.*;
import org.isoron.uhabits.utils.*;
@@ -51,6 +54,8 @@ public class HistoryEditorDialog extends AppCompatDialogFragment
private TaskRunner taskRunner;
+ private Preferences prefs;
+
public HistoryEditorDialog()
{
this.controller = new Controller() {};
@@ -72,9 +77,11 @@ public class HistoryEditorDialog extends AppCompatDialogFragment
(HabitsApplication) getActivity().getApplicationContext();
habitList = app.getComponent().getHabitList();
taskRunner = app.getComponent().getTaskRunner();
+ prefs = app.getComponent().getPreferences();
historyChart = new HistoryChart(context);
historyChart.setController(controller);
+ historyChart.setFirstWeekday(prefs.getFirstWeekday());
if (savedInstanceState != null)
{
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberPickerFactory.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberPickerFactory.kt
index 61aa65b9e..37d695545 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberPickerFactory.kt
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/NumberPickerFactory.kt
@@ -20,7 +20,7 @@
package org.isoron.uhabits.activities.common.dialogs
import android.content.*
-import android.support.v7.app.*
+import androidx.appcompat.app.*
import android.text.*
import android.view.*
import android.view.inputmethod.*
@@ -69,15 +69,18 @@ class NumberPickerFactory
val v = picker.value + 0.05 * picker2.value
callback.onNumberPicked(v)
}
+ .setOnDismissListener{
+ callback.onNumberPickerDismissed()
+ }
.create()
dialog.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)
- InterfaceUtils.setupEditorAction(picker) { _, actionId, _ ->
+ InterfaceUtils.setupEditorAction(picker, TextView.OnEditorActionListener { _, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_DONE)
dialog.getButton(DialogInterface.BUTTON_POSITIVE).performClick()
false
- }
+ })
return dialog
}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/WeekdayPickerDialog.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/WeekdayPickerDialog.java
index 91f2012b9..6f5b0ee06 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/WeekdayPickerDialog.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/WeekdayPickerDialog.java
@@ -19,15 +19,19 @@
package org.isoron.uhabits.activities.common.dialogs;
-import android.app.*;
-import android.content.*;
-import android.os.*;
-import android.support.v7.app.AlertDialog;
-import android.support.v7.app.*;
+import android.app.Dialog;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AlertDialog;
+import androidx.appcompat.app.AppCompatDialogFragment;
-import org.isoron.uhabits.*;
-import org.isoron.uhabits.core.models.*;
-import org.isoron.uhabits.core.utils.*;
+import org.isoron.uhabits.R;
+import org.isoron.uhabits.core.models.WeekdayList;
+import org.isoron.uhabits.core.utils.DateUtils;
+
+import java.util.Calendar;
/**
* Dialog that allows the user to pick one or more days of the week.
@@ -36,6 +40,7 @@ public class WeekdayPickerDialog extends AppCompatDialogFragment implements
DialogInterface.OnMultiChoiceClickListener,
DialogInterface.OnClickListener
{
+ private static final String KEY_SELECTED_DAYS = "selectedDays";
private boolean[] selectedDays;
private OnWeekdaysPickedListener listener;
@@ -46,6 +51,21 @@ public class WeekdayPickerDialog extends AppCompatDialogFragment implements
selectedDays[which] = isChecked;
}
+ @Override
+ public void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ if(savedInstanceState != null){
+ selectedDays = savedInstanceState.getBooleanArray(KEY_SELECTED_DAYS);
+ }
+ }
+
+ @Override
+ public void onSaveInstanceState(@NonNull Bundle outState) {
+ super.onSaveInstanceState(outState);
+ outState.putBooleanArray(KEY_SELECTED_DAYS, selectedDays);
+ }
+
@Override
public void onClick(DialogInterface dialog, int which)
{
@@ -59,8 +79,9 @@ public class WeekdayPickerDialog extends AppCompatDialogFragment implements
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder
.setTitle(R.string.select_weekdays)
- .setMultiChoiceItems(DateUtils.getLongDayNames(), selectedDays,
- this)
+ .setMultiChoiceItems(DateUtils.getLongWeekdayNames(Calendar.SATURDAY),
+ selectedDays,
+ this)
.setPositiveButton(android.R.string.yes, this)
.setNegativeButton(android.R.string.cancel, (dialog, which) -> {
dismiss();
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/BarChart.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/BarChart.java
index 1ff047f6a..598246431 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/BarChart.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/BarChart.java
@@ -21,9 +21,11 @@ package org.isoron.uhabits.activities.common.views;
import android.content.*;
import android.graphics.*;
-import android.support.annotation.*;
import android.util.*;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
import org.isoron.androidbase.utils.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.activities.habits.list.views.*;
@@ -267,16 +269,22 @@ public class BarChart extends ScrollableChart
private void drawBar(Canvas canvas, RectF rect, double value)
{
float margin = baseSize * 0.225f;
+ float round = dpToPixels(getContext(), 2);
int color = textColor;
if (value / 1000 >= target) color = primaryColor;
rect.inset(-margin, 0);
setModeOrColor(pGraph, XFERMODE_CLEAR, backgroundColor);
- canvas.drawRect(rect, pGraph);
+ canvas.drawRoundRect(rect, round, round, pGraph);
rect.inset(margin, 0);
setModeOrColor(pGraph, XFERMODE_SRC, color);
+ canvas.drawRoundRect(rect, round, round, pGraph);
+ rect.set(rect.left,
+ rect.top + rect.height() / 2.0f,
+ rect.right,
+ rect.bottom);
canvas.drawRect(rect, pGraph);
if (isTransparencyEnabled) pGraph.setXfermode(XFERMODE_SRC);
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/BundleSavedState.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/BundleSavedState.java
index 6f9e1163d..39fe209fe 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/BundleSavedState.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/BundleSavedState.java
@@ -20,9 +20,10 @@
package org.isoron.uhabits.activities.common.views;
import android.os.*;
-import android.support.v4.os.*;
+import androidx.core.os.*;
+import androidx.customview.view.AbsSavedState;
-public class BundleSavedState extends android.support.v4.view.AbsSavedState
+public class BundleSavedState extends AbsSavedState
{
public static final Parcelable.Creator CREATOR =
ParcelableCompat.newCreator(
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/FrequencyChart.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/FrequencyChart.java
index 8b6437638..4d365a663 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/FrequencyChart.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/FrequencyChart.java
@@ -21,9 +21,10 @@ package org.isoron.uhabits.activities.common.views;
import android.content.*;
import android.graphics.*;
-import android.support.annotation.*;
import android.util.*;
+import androidx.annotation.NonNull;
+
import org.isoron.androidbase.utils.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.core.models.*;
@@ -69,8 +70,11 @@ public class FrequencyChart extends ScrollableChart
@NonNull
private HashMap frequency;
+
private int maxFreq;
+ private int firstWeekday = Calendar.SUNDAY;
+
public FrequencyChart(Context context)
{
super(context);
@@ -98,6 +102,12 @@ public class FrequencyChart extends ScrollableChart
postInvalidate();
}
+ public void setFirstWeekday(int firstWeekday)
+ {
+ this.firstWeekday = firstWeekday;
+ postInvalidate();
+ }
+
private int getMaxFreq(HashMap frequency)
{
int maxValue = 1;
@@ -144,7 +154,6 @@ public class FrequencyChart extends ScrollableChart
prevRect.setEmpty();
GregorianCalendar currentDate = DateUtils.getStartOfTodayCalendar();
-
currentDate.set(Calendar.DAY_OF_MONTH, 1);
currentDate.add(Calendar.MONTH, -nColumns + 2 - getDataOffset());
@@ -193,11 +202,11 @@ public class FrequencyChart extends ScrollableChart
private void drawColumn(Canvas canvas, RectF rect, GregorianCalendar date)
{
- Integer values[] = frequency.get(new Timestamp(date));
+ Integer[] values = frequency.get(new Timestamp(date));
float rowHeight = rect.height() / 8.0f;
prevRect.set(rect);
- Integer[] localeWeekdayList = DateUtils.getLocaleWeekdayList();
+ int[] localeWeekdayList = DateUtils.getWeekdaySequence(firstWeekday);
for (int j = 0; j < localeWeekdayList.length; j++)
{
rect.set(0, 0, baseSize, baseSize);
@@ -233,7 +242,7 @@ public class FrequencyChart extends ScrollableChart
pText.setColor(textColor);
pGrid.setColor(gridColor);
- for (String day : DateUtils.getLocaleDayNames(Calendar.SHORT))
+ for (String day : DateUtils.getShortWeekdayNames(firstWeekday))
{
canvas.drawText(day, rGrid.right - columnWidth,
rGrid.top + rowHeight / 2 + 0.25f * em, pText);
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/HistoryChart.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/HistoryChart.java
index f2f0f3414..93b488b78 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/HistoryChart.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/HistoryChart.java
@@ -22,10 +22,12 @@ package org.isoron.uhabits.activities.common.views;
import android.content.*;
import android.graphics.*;
import android.graphics.Paint.*;
-import android.support.annotation.*;
import android.util.*;
import android.view.*;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
import org.isoron.androidbase.utils.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.core.models.*;
@@ -93,6 +95,8 @@ public class HistoryChart extends ScrollableChart
private boolean isNumerical = false;
+ private int firstWeekday = Calendar.SUNDAY;
+
@NonNull
private Controller controller;
@@ -210,6 +214,12 @@ public class HistoryChart extends ScrollableChart
postInvalidate();
}
+ public void setFirstWeekday(int firstWeekday)
+ {
+ this.firstWeekday = firstWeekday;
+ postInvalidate();
+ }
+
protected void initPaints()
{
pTextHeader = new Paint();
@@ -293,7 +303,7 @@ public class HistoryChart extends ScrollableChart
{
float verticalOffset = pTextHeader.getFontSpacing() * 0.4f;
- for (String day : DateUtils.getLocaleDayNames(Calendar.SHORT))
+ for (String day : DateUtils.getShortWeekdayNames(firstWeekday))
{
location.offset(0, columnWidth);
canvas.drawText(day, location.left + headerTextOffset,
@@ -365,7 +375,8 @@ public class HistoryChart extends ScrollableChart
}
pSquareFg.setColor(reverseTextColor);
- canvas.drawRect(location, pSquareBg);
+ float round = dpToPixels(getContext(), 2);
+ canvas.drawRoundRect(location, round, round, pSquareBg);
String text = Integer.toString(date.get(Calendar.DAY_OF_MONTH));
canvas.drawText(text, location.centerX(),
location.centerY() + squareTextOffset, pSquareFg);
@@ -375,7 +386,7 @@ public class HistoryChart extends ScrollableChart
{
float width = 0;
- for (String w : DateUtils.getLocaleDayNames(Calendar.SHORT))
+ for (String w : DateUtils.getShortWeekdayNames(firstWeekday))
width = Math.max(width, pSquareFg.measureText(w));
return width;
@@ -473,7 +484,7 @@ public class HistoryChart extends ScrollableChart
int realWeekday =
DateUtils.getStartOfTodayCalendar().get(Calendar.DAY_OF_WEEK);
todayPositionInColumn =
- (7 + realWeekday - baseDate.getFirstDayOfWeek()) % 7;
+ (7 + realWeekday - firstWeekday) % 7;
baseDate.add(Calendar.DAY_OF_YEAR, -nDays);
baseDate.add(Calendar.DAY_OF_YEAR, -todayPositionInColumn);
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/RingView.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/RingView.java
index 8c70a42fc..1e2245eb1 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/RingView.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/RingView.java
@@ -21,11 +21,12 @@ package org.isoron.uhabits.activities.common.views;
import android.content.*;
import android.graphics.*;
-import android.support.annotation.*;
import android.text.*;
import android.util.*;
import android.view.*;
+import androidx.annotation.Nullable;
+
import org.isoron.androidbase.utils.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.utils.*;
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/ScoreChart.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/ScoreChart.java
index 8cc79e96c..74b8ad4b3 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/ScoreChart.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/ScoreChart.java
@@ -21,9 +21,11 @@ package org.isoron.uhabits.activities.common.views;
import android.content.*;
import android.graphics.*;
-import android.support.annotation.*;
import android.util.*;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
import org.isoron.androidbase.utils.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.core.models.*;
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/ScrollableChart.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/ScrollableChart.java
index ae880c264..fe0b68369 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/ScrollableChart.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/ScrollableChart.java
@@ -217,6 +217,13 @@ public abstract class ScrollableChart extends View
scrollController = new ScrollController() {};
}
+ public void reset()
+ {
+ scroller.setFinalX(0);
+ scroller.computeScrollOffset();
+ updateDataOffset();
+ }
+
private void updateDataOffset()
{
int newDataOffset = scroller.getCurrX() / scrollerBucketSize;
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/StreakChart.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/StreakChart.java
index 5020f85a4..705537ba4 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/StreakChart.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/StreakChart.java
@@ -34,7 +34,7 @@ import java.text.*;
import java.util.*;
import static android.view.View.MeasureSpec.*;
-import static org.isoron.androidbase.utils.InterfaceUtils.getDimension;
+import static org.isoron.androidbase.utils.InterfaceUtils.*;
public class StreakChart extends View
{
@@ -202,8 +202,14 @@ public class StreakChart extends View
paint.setColor(percentageToColor(percentage));
- canvas.drawRect(rect.left + gap, rect.top + paddingTopBottom,
- rect.right - gap, rect.bottom - paddingTopBottom, paint);
+ float round = dpToPixels(getContext(), 2);
+ canvas.drawRoundRect(rect.left + gap,
+ rect.top + paddingTopBottom,
+ rect.right - gap,
+ rect.bottom - paddingTopBottom,
+ round,
+ round,
+ paint);
float yOffset = rect.centerY() + 0.3f * em;
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/TargetChart.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/TargetChart.java
new file mode 100644
index 000000000..30ec17bd9
--- /dev/null
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/TargetChart.java
@@ -0,0 +1,226 @@
+/*
+ * Copyright (C) 2016 Álinson Santos Xavier
+ *
+ * This file is part of Loop Habit Tracker.
+ *
+ * Loop Habit Tracker is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Loop Habit Tracker is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see .
+ */
+
+package org.isoron.uhabits.activities.common.views;
+
+import android.content.*;
+import android.graphics.*;
+import android.util.*;
+import android.view.*;
+
+import org.isoron.androidbase.utils.*;
+import org.isoron.uhabits.*;
+import org.isoron.uhabits.activities.habits.list.views.*;
+
+import java.util.*;
+
+import static android.view.View.MeasureSpec.*;
+import static org.isoron.androidbase.utils.InterfaceUtils.*;
+
+public class TargetChart extends View
+{
+ private Paint paint;
+ private int baseSize;
+ private int primaryColor;
+ private int mediumContrastTextColor;
+ private int highContrastReverseTextColor;
+ private int lowContrastTextColor;
+ private RectF rect = new RectF();
+ private RectF barRect = new RectF();
+ private List values = Collections.emptyList();
+ private List labels = Collections.emptyList();
+ private List targets = Collections.emptyList();
+ private float maxLabelSize;
+ private float tinyTextSize;
+
+ public TargetChart(Context context)
+ {
+ super(context);
+ init();
+ }
+
+ public TargetChart(Context context, AttributeSet attrs)
+ {
+ super(context, attrs);
+ init();
+ }
+
+ public void populateWithRandomData()
+ {
+ labels = new ArrayList<>();
+ values = new ArrayList<>();
+ targets = new ArrayList<>();
+ for (int i = 0; i < 5; i++) {
+ double percentage = new Random().nextDouble();
+ targets.add(new Random().nextDouble() * 1000.0);
+ values.add(targets.get(i) * percentage * 1.2);
+ labels.add(String.format(Locale.US, "Label %d", i + 1));
+ }
+ }
+
+ public void setColor(int color)
+ {
+ this.primaryColor = color;
+ postInvalidate();
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas)
+ {
+ super.onDraw(canvas);
+ if (labels.size() == 0) return;
+
+ maxLabelSize = 0;
+ for (String label : labels) {
+ paint.setTextSize(tinyTextSize);
+ float len = paint.measureText(label);
+ maxLabelSize = Math.max(maxLabelSize, len);
+ }
+
+ float marginTop = (getHeight() - baseSize * labels.size()) / 2.0f;
+ rect.set(0, marginTop, getWidth(), marginTop + baseSize);
+ for (int i = 0; i < labels.size(); i++) {
+ drawRow(canvas, i, rect);
+ rect.offset(0, baseSize);
+ }
+ }
+
+ @Override
+ protected void onMeasure(int widthSpec, int heightSpec)
+ {
+ baseSize = getResources().getDimensionPixelSize(R.dimen.baseSize);
+
+ int width = getSize(widthSpec);
+ int height = labels.size() * baseSize;
+
+ ViewGroup.LayoutParams params = getLayoutParams();
+ if (params != null && params.height == ViewGroup.LayoutParams.MATCH_PARENT) {
+ height = getSize(heightSpec);
+ if (labels.size() > 0) baseSize = height / labels.size();
+ }
+
+ heightSpec = makeMeasureSpec(height, EXACTLY);
+ widthSpec = makeMeasureSpec(width, EXACTLY);
+ setMeasuredDimension(widthSpec, heightSpec);
+ }
+
+ private void drawRow(Canvas canvas, int row, RectF rect)
+ {
+ float padding = dpToPixels(getContext(), 4);
+ float round = dpToPixels(getContext(), 2);
+ float stop = maxLabelSize + padding * 2;
+
+ paint.setColor(mediumContrastTextColor);
+
+ // Draw label
+ paint.setTextSize(tinyTextSize);
+ paint.setTextAlign(Paint.Align.RIGHT);
+ float yTextAdjust = (paint.descent() + paint.ascent()) / 2.0f;
+ canvas.drawText(labels.get(row),
+ rect.left + stop - padding,
+ rect.centerY() - yTextAdjust,
+ paint);
+
+ // Draw background box
+ paint.setColor(lowContrastTextColor);
+ barRect.set(rect.left + stop + padding,
+ rect.top + baseSize * 0.05f,
+ rect.right - padding,
+ rect.bottom - baseSize * 0.05f);
+ canvas.drawRoundRect(barRect, round, round, paint);
+
+ float percentage = (float) (values.get(row) / targets.get(row));
+ percentage = Math.min(1.0f, percentage);
+
+ // Draw completed box
+ float completedWidth = percentage * barRect.width();
+ if (completedWidth > 0 && completedWidth < 2 * round) {
+ completedWidth = 2 * round;
+ }
+ float remainingWidth = barRect.width() - completedWidth;
+
+ paint.setColor(primaryColor);
+ barRect.set(barRect.left,
+ barRect.top,
+ barRect.left + completedWidth,
+ barRect.bottom);
+ canvas.drawRoundRect(barRect, round, round, paint);
+
+ // Draw values
+ paint.setColor(Color.WHITE);
+ paint.setTextSize(tinyTextSize);
+ paint.setTextAlign(Paint.Align.CENTER);
+ yTextAdjust = (paint.descent() + paint.ascent()) / 2.0f;
+
+ double remaining = targets.get(row) - values.get(row);
+ String completedText = NumberButtonViewKt.toShortString(values.get(row));
+ String remainingText = NumberButtonViewKt.toShortString(remaining);
+
+ if (completedWidth > paint.measureText(completedText) + 2 * padding) {
+ paint.setColor(highContrastReverseTextColor);
+ canvas.drawText(completedText,
+ barRect.centerX(),
+ barRect.centerY() - yTextAdjust,
+ paint);
+ }
+
+ if (remainingWidth > paint.measureText(remainingText) + 2 * padding) {
+ paint.setColor(mediumContrastTextColor);
+ barRect.set(rect.left + stop + padding + completedWidth,
+ barRect.top,
+ rect.right - padding,
+ barRect.bottom);
+ canvas.drawText(remainingText,
+ barRect.centerX(),
+ barRect.centerY() - yTextAdjust,
+ paint);
+ }
+ }
+
+ private void init()
+ {
+ paint = new Paint();
+ paint.setTextAlign(Paint.Align.CENTER);
+ paint.setAntiAlias(true);
+
+ StyledResources res = new StyledResources(getContext());
+ lowContrastTextColor = res.getColor(R.attr.lowContrastTextColor);
+ mediumContrastTextColor = res.getColor(R.attr.mediumContrastTextColor);
+ highContrastReverseTextColor = res.getColor(R.attr.highContrastReverseTextColor);
+ tinyTextSize = getDimension(getContext(), R.dimen.tinyTextSize);
+ }
+
+ public void setValues(List values)
+ {
+ this.values = values;
+ requestLayout();
+ }
+
+ public void setLabels(List labels)
+ {
+ this.labels = labels;
+ requestLayout();
+ }
+
+ public void setTargets(List targets)
+ {
+ this.targets = targets;
+ requestLayout();
+ }
+}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitActivity.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitActivity.kt
new file mode 100644
index 000000000..266939988
--- /dev/null
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitActivity.kt
@@ -0,0 +1,308 @@
+/*
+ * Copyright (C) 2016 Álinson Santos Xavier
+ *
+ * This file is part of Loop Habit Tracker.
+ *
+ * Loop Habit Tracker is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Loop Habit Tracker is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see .
+ */
+
+package org.isoron.uhabits.activities.habits.edit
+
+import android.content.res.*
+import android.graphics.*
+import android.os.*
+import android.text.format.*
+import android.view.*
+import android.widget.*
+import androidx.appcompat.app.*
+import androidx.fragment.app.*
+import com.android.datetimepicker.time.*
+import kotlinx.android.synthetic.main.activity_edit_habit.*
+import org.isoron.androidbase.utils.*
+import org.isoron.uhabits.*
+import org.isoron.uhabits.activities.*
+import org.isoron.uhabits.activities.common.dialogs.*
+import org.isoron.uhabits.core.commands.*
+import org.isoron.uhabits.core.models.*
+import org.isoron.uhabits.databinding.*
+import org.isoron.uhabits.utils.*
+import kotlin.math.*
+
+
+class EditHabitActivity : AppCompatActivity() {
+
+ private lateinit var themeSwitcher: AndroidThemeSwitcher
+ private lateinit var binding: ActivityEditHabitBinding
+ private lateinit var commandRunner: CommandRunner
+
+ var habitId = -1L
+ var habitType = -1
+ var unit = ""
+ var paletteColor = 11
+ var androidColor = 0
+ var freqNum = 1
+ var freqDen = 1
+ var reminderHour = -1
+ var reminderMin = -1
+ var reminderDays: WeekdayList = WeekdayList.EVERY_DAY
+
+ override fun onCreate(state: Bundle?) {
+ super.onCreate(state)
+
+ val component = (application as HabitsApplication).component
+ themeSwitcher = AndroidThemeSwitcher(this, component.preferences)
+ themeSwitcher.apply()
+
+ binding = ActivityEditHabitBinding.inflate(layoutInflater)
+ setContentView(binding.root)
+
+ if (intent.hasExtra("habitId")) {
+ binding.toolbar.title = getString(R.string.edit_habit)
+ habitId = intent.getLongExtra("habitId", -1)
+ val habit = component.habitList.getById(habitId)!!
+ habitType = habit.type
+ paletteColor = habit.color
+ freqNum = habit.frequency.numerator
+ freqDen = habit.frequency.denominator
+ if (habit.hasReminder()) {
+ reminderHour = habit.reminder.hour
+ reminderMin = habit.reminder.minute
+ reminderDays = habit.reminder.days
+ }
+ binding.nameInput.setText(habit.name)
+ binding.questionInput.setText(habit.question)
+ binding.notesInput.setText(habit.description)
+ binding.unitInput.setText(habit.unit)
+ binding.targetInput.setText(habit.targetValue.toString())
+ } else {
+ habitType = intent.getIntExtra("habitType", Habit.YES_NO_HABIT)
+ }
+
+ if (state != null) {
+ habitId = state.getLong("habitId")
+ habitType = state.getInt("habitType")
+ paletteColor = state.getInt("paletteColor")
+ freqNum = state.getInt("freqNum")
+ freqDen = state.getInt("freqDen")
+ reminderHour = state.getInt("reminderHour")
+ reminderMin = state.getInt("reminderMin")
+ reminderDays = WeekdayList(state.getInt("reminderDays"))
+ }
+
+ updateColors()
+
+ if (habitType == Habit.YES_NO_HABIT) {
+ binding.unitOuterBox.visibility = View.GONE
+ binding.targetOuterBox.visibility = View.GONE
+ } else {
+ binding.nameInput.hint = getString(R.string.measurable_short_example)
+ binding.questionInput.hint = getString(R.string.measurable_question_example)
+ binding.frequencyOuterBox.visibility = View.GONE
+ }
+
+ setSupportActionBar(binding.toolbar)
+ supportActionBar?.setDisplayHomeAsUpEnabled(true)
+ supportActionBar?.setDisplayShowHomeEnabled(true)
+ supportActionBar?.elevation = 10.0f
+
+ val colorPickerDialogFactory = ColorPickerDialogFactory(this)
+ binding.colorButton.setOnClickListener {
+ val dialog = colorPickerDialogFactory.create(paletteColor)
+ dialog.setListener { paletteColor ->
+ this.paletteColor = paletteColor
+ updateColors()
+ }
+ dialog.show(supportFragmentManager, "colorPicker")
+ }
+
+ populateFrequency()
+ binding.booleanFrequencyPicker.setOnClickListener {
+ val dialog = FrequencyPickerDialog(freqNum, freqDen)
+ dialog.onFrequencyPicked = { num, den ->
+ freqNum = num
+ freqDen = den
+ populateFrequency()
+ }
+ dialog.show(supportFragmentManager, "frequencyPicker")
+ }
+
+ binding.numericalFrequencyPicker.setOnClickListener {
+ val builder = AlertDialog.Builder(this)
+ val arrayAdapter = ArrayAdapter(this, android.R.layout.select_dialog_item)
+ arrayAdapter.add(getString(R.string.every_day))
+ arrayAdapter.add(getString(R.string.every_week))
+ arrayAdapter.add(getString(R.string.every_month))
+ builder.setAdapter(arrayAdapter) { dialog, which ->
+ freqDen = when(which) {
+ 1 -> 7
+ 2 -> 30
+ else -> 1
+ }
+ populateFrequency()
+ dialog.dismiss()
+ }
+ builder.show()
+ }
+
+ populateReminder()
+ binding.reminderTimePicker.setOnClickListener {
+ val currentHour = if (reminderHour >= 0) reminderHour else 8
+ val currentMin = if (reminderMin >= 0) reminderMin else 0
+ val is24HourMode = DateFormat.is24HourFormat(this)
+ val dialog = TimePickerDialog.newInstance(object : TimePickerDialog.OnTimeSetListener {
+ override fun onTimeSet(view: RadialPickerLayout?, hourOfDay: Int, minute: Int) {
+ reminderHour = hourOfDay
+ reminderMin = minute
+ populateReminder()
+ }
+ override fun onTimeCleared(view: RadialPickerLayout?) {
+ reminderHour = -1
+ reminderMin = -1
+ reminderDays = WeekdayList.EVERY_DAY
+ populateReminder()
+ }
+ }, currentHour, currentMin, is24HourMode, androidColor)
+ dialog.show(supportFragmentManager, "timePicker")
+ }
+
+ binding.reminderDatePicker.setOnClickListener {
+ val dialog = WeekdayPickerDialog()
+ dialog.setListener { days ->
+ reminderDays = days
+ if (reminderDays.isEmpty) reminderDays = WeekdayList.EVERY_DAY
+ populateReminder()
+ }
+ dialog.setSelectedDays(reminderDays)
+ dialog.show(supportFragmentManager, "dayPicker")
+ }
+
+ binding.buttonSave.setOnClickListener {
+ if(validate()) save()
+ }
+
+ for (fragment in supportFragmentManager.fragments) {
+ (fragment as DialogFragment).dismiss()
+ }
+ }
+
+ private fun save() {
+ val component = (application as HabitsApplication).component
+ val habit = component.modelFactory.buildHabit()
+
+ var original: Habit? = null
+ if (habitId >= 0) {
+ original = component.habitList.getById(habitId)!!
+ habit.copyFrom(original)
+ }
+
+ habit.name = nameInput.text.trim().toString()
+ habit.question = questionInput.text.trim().toString()
+ habit.description = notesInput.text.trim().toString()
+ habit.color = paletteColor
+ if (reminderHour >= 0) {
+ habit.setReminder(Reminder(reminderHour, reminderMin, reminderDays))
+ }
+ habit.frequency = Frequency(freqNum, freqDen)
+ if (habitType == Habit.NUMBER_HABIT) {
+ habit.targetValue = targetInput.text.toString().toDouble()
+ habit.targetType = Habit.AT_LEAST
+ habit.unit = unitInput.text.trim().toString()
+ }
+ habit.type = habitType
+
+ val command = if (habitId >= 0) {
+ component.editHabitCommandFactory.create(component.habitList, original, habit)
+ } else {
+ component.createHabitCommandFactory.create(component.habitList, habit)
+ }
+ component.commandRunner.execute(command, null)
+ finish()
+ }
+
+ private fun validate(): Boolean {
+ var isValid = true
+ if (nameInput.text.isEmpty()) {
+ nameInput.error = getString(R.string.validation_should_not_be_blank)
+ isValid = false
+ }
+ if (habitType == Habit.NUMBER_HABIT) {
+ if(unitInput.text.isEmpty()) {
+ unitInput.error = getString(R.string.validation_should_not_be_blank)
+ isValid = false
+ }
+ if(targetInput.text.isEmpty()) {
+ targetInput.error = getString(R.string.validation_should_not_be_blank)
+ isValid = false
+ }
+ }
+ return isValid
+ }
+
+ private fun populateReminder() {
+ if (reminderHour < 0) {
+ binding.reminderTimePicker.text = getString(R.string.reminder_off)
+ binding.reminderDatePicker.visibility = View.GONE
+ binding.reminderDivider.visibility = View.GONE
+ } else {
+ val time = AndroidDateUtils.formatTime(this, reminderHour, reminderMin)
+ val daysArray = reminderDays.toArray()
+ binding.reminderTimePicker.text = time
+ binding.reminderDatePicker.visibility = View.VISIBLE
+ binding.reminderDivider.visibility = View.VISIBLE
+ binding.reminderDatePicker.text = AndroidDateUtils.formatWeekdayList(this, daysArray)
+ }
+ }
+
+ private fun populateFrequency() {
+ binding.booleanFrequencyPicker.text = when {
+ freqNum == 1 && freqDen == 1 -> getString(R.string.every_day)
+ freqNum == 1 && freqDen == 7 -> getString(R.string.every_week)
+ freqNum == 1 && freqDen > 1 -> getString(R.string.every_x_days, freqDen)
+ freqDen == 7 -> getString(R.string.x_times_per_week, freqNum)
+ freqDen == 31 -> getString(R.string.x_times_per_month, freqNum)
+ else -> "Unknown"
+ }
+ binding.numericalFrequencyPicker.text = when(freqDen) {
+ 1 -> getString(R.string.every_day)
+ 7 -> getString(R.string.every_week)
+ 30 -> getString(R.string.every_month)
+ else -> "Unknown"
+ }
+ }
+
+ private fun updateColors() {
+ androidColor = PaletteUtils.getColor(this, paletteColor)
+ binding.colorButton.backgroundTintList = ColorStateList.valueOf(androidColor)
+ if (!themeSwitcher.isNightMode) {
+ val darkerAndroidColor = ColorUtils.mixColors(Color.BLACK, androidColor, 0.15f)
+ window.statusBarColor = darkerAndroidColor
+ binding.toolbar.setBackgroundColor(androidColor)
+ }
+ }
+
+ override fun onSaveInstanceState(state: Bundle) {
+ super.onSaveInstanceState(state)
+ with(state) {
+ putLong("habitId", habitId)
+ putInt("habitType", habitType)
+ putInt("paletteColor", paletteColor)
+ putInt("androidColor", androidColor)
+ putInt("freqNum", freqNum)
+ putInt("freqDen", freqDen)
+ putInt("reminderHour", reminderHour)
+ putInt("reminderMin", reminderMin)
+ putInt("reminderDays", reminderDays.toInteger())
+ }
+ }
+}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialog.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialog.java
deleted file mode 100644
index e9e5c5ee3..000000000
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialog.java
+++ /dev/null
@@ -1,281 +0,0 @@
-/*
- * Copyright (C) 2016 Álinson Santos Xavier
- *
- * This file is part of Loop Habit Tracker.
- *
- * Loop Habit Tracker is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by the
- * Free Software Foundation, either version 3 of the License, or (at your
- * option) any later version.
- *
- * Loop Habit Tracker is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see .
- */
-
-package org.isoron.uhabits.activities.habits.edit;
-
-import android.app.Dialog;
-import android.content.*;
-import android.os.*;
-import android.support.annotation.*;
-import android.support.v7.app.*;
-import android.text.format.*;
-import android.view.*;
-
-import com.android.datetimepicker.time.*;
-
-import org.isoron.uhabits.*;
-import org.isoron.uhabits.R;
-import org.isoron.uhabits.activities.*;
-import org.isoron.uhabits.activities.common.dialogs.*;
-import org.isoron.uhabits.activities.habits.edit.views.*;
-import org.isoron.uhabits.core.commands.*;
-import org.isoron.uhabits.core.models.*;
-import org.isoron.uhabits.core.preferences.*;
-
-import butterknife.*;
-
-import static android.view.View.GONE;
-import static org.isoron.uhabits.core.ui.ThemeSwitcher.THEME_LIGHT;
-
-public class EditHabitDialog extends AppCompatDialogFragment
-{
- public static final String BUNDLE_HABIT_ID = "habitId";
-
- public static final String BUNDLE_HABIT_TYPE = "habitType";
-
- protected Habit originalHabit;
-
- protected Preferences prefs;
-
- protected CommandRunner commandRunner;
-
- protected HabitList habitList;
-
- protected HabitsApplicationComponent component;
-
- protected ModelFactory modelFactory;
-
- @BindView(R.id.namePanel)
- NameDescriptionPanel namePanel;
-
- @BindView(R.id.reminderPanel)
- ReminderPanel reminderPanel;
-
- @BindView(R.id.frequencyPanel)
- FrequencyPanel frequencyPanel;
-
- @BindView(R.id.targetPanel)
- TargetPanel targetPanel;
-
- private ColorPickerDialogFactory colorPickerDialogFactory;
-
- @Override
- public int getTheme()
- {
- HabitsApplicationComponent component =
- ((HabitsApplication) getContext().getApplicationContext()).getComponent();
-
- if(component.getPreferences().getTheme() == THEME_LIGHT)
- return R.style.DialogWithTitle;
- else
- return R.style.DarkDialogWithTitle;
- }
-
- @Override
- public void onActivityCreated(Bundle savedInstanceState)
- {
- super.onActivityCreated(savedInstanceState);
-
- HabitsActivity activity = (HabitsActivity) getActivity();
- colorPickerDialogFactory =
- activity.getComponent().getColorPickerDialogFactory();
- }
-
- @Override
- public View onCreateView(LayoutInflater inflater,
- ViewGroup container,
- Bundle savedInstanceState)
- {
- View view;
- view = inflater.inflate(R.layout.edit_habit, container, false);
-
- initDependencies();
- ButterKnife.bind(this, view);
-
- originalHabit = parseHabitFromArguments();
- getDialog().setTitle(getTitle());
-
- populateForm();
- setupReminderController();
- setupNameController();
-
- return view;
- }
-
- @NonNull
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- final Dialog dialog = super.onCreateDialog(savedInstanceState);
- final Window window = dialog.getWindow();
- if (window != null) {
- window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
- }
- return dialog;
- }
-
- protected int getTitle()
- {
- if (originalHabit != null) return R.string.edit_habit;
- else return R.string.create_habit;
- }
-
- protected void saveHabit(@NonNull Habit habit)
- {
- if (originalHabit == null)
- {
- commandRunner.execute(component
- .getCreateHabitCommandFactory()
- .create(habitList, habit), null);
- }
- else
- {
- commandRunner.execute(component.getEditHabitCommandFactory().
- create(habitList, originalHabit, habit), originalHabit.getId());
- }
- }
-
- private int getTypeFromArguments()
- {
- return getArguments().getInt(BUNDLE_HABIT_TYPE);
- }
-
- private void initDependencies()
- {
- Context appContext = getContext().getApplicationContext();
- HabitsApplication app = (HabitsApplication) appContext;
-
- component = app.getComponent();
- prefs = component.getPreferences();
- habitList = component.getHabitList();
- commandRunner = component.getCommandRunner();
- modelFactory = component.getModelFactory();
- }
-
- @OnClick(R.id.buttonDiscard)
- void onButtonDiscardClick()
- {
- dismiss();
- }
-
- @OnClick(R.id.buttonSave)
- void onSaveButtonClick()
- {
- int type = getTypeFromArguments();
-
- if (!namePanel.validate()) return;
- if (type == Habit.YES_NO_HABIT && !frequencyPanel.validate()) return;
- if (type == Habit.NUMBER_HABIT && !targetPanel.validate()) return;
-
- Habit habit = modelFactory.buildHabit();
- if( originalHabit != null )
- habit.copyFrom(originalHabit);
- habit.setName(namePanel.getName());
- habit.setDescription(namePanel.getDescription());
- habit.setColor(namePanel.getColor());
- habit.setReminder(reminderPanel.getReminder());
- habit.setFrequency(frequencyPanel.getFrequency());
- habit.setUnit(targetPanel.getUnit());
- habit.setTargetValue(targetPanel.getTargetValue());
- habit.setType(type);
-
- saveHabit(habit);
- dismiss();
- }
-
- @Nullable
- private Habit parseHabitFromArguments()
- {
- Bundle arguments = getArguments();
- if (arguments == null) return null;
-
- Long id = (Long) arguments.get(BUNDLE_HABIT_ID);
- if (id == null) return null;
-
- Habit habit = habitList.getById(id);
- if (habit == null) throw new IllegalStateException();
-
- return habit;
- }
-
- private void populateForm()
- {
- Habit habit = modelFactory.buildHabit();
- habit.setFrequency(Frequency.DAILY);
- habit.setColor(prefs.getDefaultHabitColor(habit.getColor()));
- habit.setType(getTypeFromArguments());
-
- if (originalHabit != null) habit.copyFrom(originalHabit);
-
- if (habit.isNumerical()) frequencyPanel.setVisibility(GONE);
- else targetPanel.setVisibility(GONE);
-
- namePanel.populateFrom(habit);
- frequencyPanel.setFrequency(habit.getFrequency());
- targetPanel.setTargetValue(habit.getTargetValue());
- targetPanel.setUnit(habit.getUnit());
- if (habit.hasReminder()) reminderPanel.setReminder(habit.getReminder());
- }
-
- private void setupNameController()
- {
- namePanel.setController(new NameDescriptionPanel.Controller()
- {
- @Override
- public void onColorPickerClicked(int previousColor)
- {
- ColorPickerDialog picker =
- colorPickerDialogFactory.create(previousColor);
-
- picker.setListener(c ->
- {
- prefs.setDefaultHabitColor(c);
- namePanel.setColor(c);
- });
-
- picker.show(getFragmentManager(), "picker");
- }
- });
- }
-
- private void setupReminderController()
- {
- reminderPanel.setController(new ReminderPanel.Controller()
- {
- @Override
- public void onTimeClicked(int currentHour, int currentMin)
- {
- TimePickerDialog timePicker;
- boolean is24HourMode = DateFormat.is24HourFormat(getContext());
- timePicker =
- TimePickerDialog.newInstance(reminderPanel, currentHour,
- currentMin, is24HourMode);
- timePicker.show(getFragmentManager(), "timePicker");
- }
-
- @Override
- public void onWeekdayClicked(WeekdayList currentDays)
- {
- WeekdayPickerDialog dialog = new WeekdayPickerDialog();
- dialog.setListener(reminderPanel);
- dialog.setSelectedDays(currentDays);
- dialog.show(getFragmentManager(), "weekdayPicker");
- }
- });
- }
-}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialogFactory.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialogFactory.java
deleted file mode 100644
index a91c3b14a..000000000
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialogFactory.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2016 Álinson Santos Xavier
- *
- * This file is part of Loop Habit Tracker.
- *
- * Loop Habit Tracker is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by the
- * Free Software Foundation, either version 3 of the License, or (at your
- * option) any later version.
- *
- * Loop Habit Tracker is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see .
- */
-
-package org.isoron.uhabits.activities.habits.edit;
-
-import android.os.*;
-import android.support.annotation.*;
-
-import org.isoron.uhabits.core.models.*;
-
-import javax.inject.*;
-
-import static org.isoron.uhabits.activities.habits.edit.EditHabitDialog.*;
-
-public class EditHabitDialogFactory
-{
- @Inject
- public EditHabitDialogFactory()
- {
- }
-
- public EditHabitDialog createBoolean()
- {
- EditHabitDialog dialog = new EditHabitDialog();
- Bundle args = new Bundle();
- args.putInt(BUNDLE_HABIT_TYPE, Habit.YES_NO_HABIT);
- dialog.setArguments(args);
- return dialog;
- }
-
- public EditHabitDialog createNumerical()
- {
- EditHabitDialog dialog = new EditHabitDialog();
- Bundle args = new Bundle();
- args.putInt(BUNDLE_HABIT_TYPE, Habit.NUMBER_HABIT);
- dialog.setArguments(args);
- return dialog;
- }
-
- public EditHabitDialog edit(@NonNull Habit habit)
- {
- if (habit.getId() == null)
- throw new IllegalArgumentException("habit not saved");
-
- EditHabitDialog dialog = new EditHabitDialog();
- Bundle args = new Bundle();
- args.putLong(BUNDLE_HABIT_ID, habit.getId());
- args.putInt(BUNDLE_HABIT_TYPE, habit.getType());
- dialog.setArguments(args);
- return dialog;
- }
-}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/HabitTypeDialog.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/HabitTypeDialog.kt
new file mode 100644
index 000000000..39e8dfb4c
--- /dev/null
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/HabitTypeDialog.kt
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2016-2020 Álinson Santos Xavier
+ *
+ * This file is part of Loop Habit Tracker.
+ *
+ * Loop Habit Tracker is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Loop Habit Tracker is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see .
+ */
+
+package org.isoron.uhabits.activities.habits.edit
+
+import android.os.*
+import android.view.*
+import androidx.appcompat.app.*
+import org.isoron.uhabits.*
+import org.isoron.uhabits.core.models.*
+import org.isoron.uhabits.databinding.*
+import org.isoron.uhabits.intents.*
+
+class HabitTypeDialog : AppCompatDialogFragment() {
+ override fun getTheme() = R.style.Translucent
+
+ override fun onCreateView(inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?): View? {
+ val binding = SelectHabitTypeBinding.inflate(inflater, container, false)
+
+ binding.buttonYesNo.setOnClickListener {
+ val intent = IntentFactory().startEditActivity(activity!!, Habit.YES_NO_HABIT)
+ startActivity(intent)
+ dismiss()
+ }
+
+ binding.buttonMeasurable.setOnClickListener {
+ val intent = IntentFactory().startEditActivity(activity!!, Habit.NUMBER_HABIT)
+ startActivity(intent)
+ dismiss()
+ }
+
+ binding.background.setOnClickListener {
+ dismiss()
+ }
+
+ return binding.root
+ }
+}
\ No newline at end of file
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/views/ExampleEditText.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/views/ExampleEditText.java
deleted file mode 100644
index 1403a0b13..000000000
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/views/ExampleEditText.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright (C) 2016 Álinson Santos Xavier
- *
- * This file is part of Loop Habit Tracker.
- *
- * Loop Habit Tracker is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by the
- * Free Software Foundation, either version 3 of the License, or (at your
- * option) any later version.
- *
- * Loop Habit Tracker is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see .
- */
-
-package org.isoron.uhabits.activities.habits.edit.views;
-
-import android.content.*;
-import android.support.annotation.*;
-import android.text.*;
-import android.util.*;
-import android.view.*;
-import android.widget.*;
-
-import org.isoron.androidbase.utils.*;
-import org.isoron.uhabits.*;
-
-import static org.isoron.uhabits.utils.AttributeSetUtils.*;
-
-/**
- * An EditText that shows an example usage when there is no text
- * currently set. The example disappears when the widget gains focus.
- */
-public class ExampleEditText extends EditText
- implements View.OnFocusChangeListener
-{
-
- private String example;
-
- private String realText;
-
- private int color;
-
- private int exampleColor;
-
- private int inputType;
-
- public ExampleEditText(Context context, @Nullable AttributeSet attrs)
- {
- super(context, attrs);
-
- if (attrs != null)
- example = getAttribute(context, attrs, "example", "");
-
- inputType = getInputType();
- realText = getText().toString();
- color = getCurrentTextColor();
- init();
- }
-
- public String getRealText()
- {
- if(hasFocus()) return getText().toString();
- else return realText;
- }
-
- @Override
- public void onFocusChange(View v, boolean hasFocus)
- {
- if (!hasFocus) realText = getText().toString();
- updateText();
- }
-
- public void setExample(String example)
- {
- this.example = example;
- updateText();
- }
-
- public void setRealText(String realText)
- {
- this.realText = realText;
- updateText();
- }
-
- private void init()
- {
- StyledResources sr = new StyledResources(getContext());
- exampleColor = sr.getColor(R.attr.mediumContrastTextColor);
- setOnFocusChangeListener(this);
- updateText();
- }
-
- private void updateText()
- {
- if (realText.isEmpty() && !isFocused())
- {
- setTextColor(exampleColor);
- setText(example);
- setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
- }
- else
- {
- setText(realText);
- setTextColor(color);
- setInputType(inputType);
- }
-
- }
-}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/views/FrequencyPanel.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/views/FrequencyPanel.java
deleted file mode 100644
index aac5d47e7..000000000
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/views/FrequencyPanel.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright (C) 2016 Álinson Santos Xavier
- *
- * This file is part of Loop Habit Tracker.
- *
- * Loop Habit Tracker is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by the
- * Free Software Foundation, either version 3 of the License, or (at your
- * option) any later version.
- *
- * Loop Habit Tracker is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see .
- */
-
-package org.isoron.uhabits.activities.habits.edit.views;
-
-import android.annotation.*;
-import android.content.*;
-import android.content.res.*;
-import android.support.annotation.*;
-import android.util.*;
-import android.view.*;
-import android.widget.*;
-
-import org.isoron.uhabits.R;
-import org.isoron.uhabits.core.models.*;
-
-import butterknife.*;
-
-import static org.isoron.uhabits.R.id.*;
-
-
-public class FrequencyPanel extends FrameLayout
-{
- @BindView(numerator)
- TextView tvNumerator;
-
- @BindView(R.id.denominator)
- TextView tvDenominator;
-
- @BindView(R.id.spinner)
- Spinner spinner;
-
- @BindView(R.id.customFreqPanel)
- ViewGroup customFreqPanel;
-
- public FrequencyPanel(@NonNull Context context,
- @Nullable AttributeSet attrs)
- {
- super(context, attrs);
-
- View view = inflate(context, R.layout.edit_habit_frequency, null);
- ButterKnife.bind(this, view);
- addView(view);
- }
-
- @NonNull
- public Frequency getFrequency()
- {
- String freqNum = tvNumerator.getText().toString();
- String freqDen = tvDenominator.getText().toString();
-
- if (!freqNum.isEmpty() && !freqDen.isEmpty())
- {
- int numerator = Integer.parseInt(freqNum);
- int denominator = Integer.parseInt(freqDen);
- return new Frequency(numerator, denominator);
- }
-
- return Frequency.DAILY;
- }
-
- @SuppressLint("SetTextI18n")
- public void setFrequency(@NonNull Frequency freq)
- {
- int position = getQuickSelectPosition(freq);
-
- if (position >= 0) showSimplifiedFrequency(position);
- else showCustomFrequency();
-
- tvNumerator.setText(Integer.toString(freq.getNumerator()));
- tvDenominator.setText(Integer.toString(freq.getDenominator()));
- }
-
- @OnItemSelected(R.id.spinner)
- public void onFrequencySelected(int position)
- {
- if (position < 0 || position > 4) throw new IllegalArgumentException();
- int freqNums[] = { 1, 1, 2, 5, 3 };
- int freqDens[] = { 1, 7, 7, 7, 7 };
- setFrequency(new Frequency(freqNums[position], freqDens[position]));
- }
-
- public boolean validate()
- {
- boolean valid = true;
- Resources res = getResources();
-
- String freqNum = tvNumerator.getText().toString();
- String freqDen = tvDenominator.getText().toString();
-
- if (freqDen.isEmpty())
- {
- tvDenominator.setError(
- res.getString(R.string.validation_show_not_be_blank));
- valid = false;
- }
-
- if (freqNum.isEmpty())
- {
- tvNumerator.setError(
- res.getString(R.string.validation_show_not_be_blank));
- valid = false;
- }
-
- if (!valid) return false;
-
- int numerator = Integer.parseInt(freqNum);
- int denominator = Integer.parseInt(freqDen);
-
- if (numerator <= 0)
- {
- tvNumerator.setError(
- res.getString(R.string.validation_number_should_be_positive));
- valid = false;
- }
-
- if (numerator > denominator)
- {
- tvNumerator.setError(
- res.getString(R.string.validation_at_most_one_rep_per_day));
- valid = false;
- }
-
- return valid;
- }
-
- private int getQuickSelectPosition(@NonNull Frequency freq)
- {
- if (freq.equals(Frequency.DAILY)) return 0;
- if (freq.equals(Frequency.WEEKLY)) return 1;
- if (freq.equals(Frequency.TWO_TIMES_PER_WEEK)) return 2;
- if (freq.equals(Frequency.FIVE_TIMES_PER_WEEK)) return 3;
- return -1;
- }
-
- private void showCustomFrequency()
- {
- spinner.setVisibility(View.GONE);
- customFreqPanel.setVisibility(View.VISIBLE);
- }
-
- private void showSimplifiedFrequency(int quickSelectPosition)
- {
- spinner.setVisibility(View.VISIBLE);
- spinner.setSelection(quickSelectPosition);
- customFreqPanel.setVisibility(View.GONE);
- }
-}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/views/NameDescriptionPanel.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/views/NameDescriptionPanel.java
deleted file mode 100644
index ca7f45715..000000000
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/views/NameDescriptionPanel.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Copyright (C) 2016 Álinson Santos Xavier
- *
- * This file is part of Loop Habit Tracker.
- *
- * Loop Habit Tracker is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by the
- * Free Software Foundation, either version 3 of the License, or (at your
- * option) any later version.
- *
- * Loop Habit Tracker is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see .
- */
-
-package org.isoron.uhabits.activities.habits.edit.views;
-
-import android.content.*;
-import android.content.res.*;
-import android.os.*;
-import android.support.annotation.*;
-import android.util.*;
-import android.view.*;
-import android.widget.*;
-
-import org.isoron.uhabits.R;
-import org.isoron.uhabits.activities.common.views.*;
-import org.isoron.uhabits.core.models.*;
-import org.isoron.uhabits.utils.*;
-
-import butterknife.*;
-
-
-public class NameDescriptionPanel extends FrameLayout
-{
- @BindView(R.id.tvName)
- EditText tvName;
-
- @BindView(R.id.tvDescription)
- ExampleEditText tvDescription;
-
- private int color;
-
- @NonNull
- private Controller controller;
-
- public NameDescriptionPanel(@NonNull Context context,
- @Nullable AttributeSet attrs)
- {
- super(context, attrs);
-
- View view = inflate(context, R.layout.edit_habit_name, null);
- ButterKnife.bind(this, view);
- addView(view);
-
- controller = new Controller() {};
- }
-
- public int getColor()
- {
- return color;
- }
-
- public void setColor(int color)
- {
- this.color = color;
- tvName.setTextColor(PaletteUtils.getColor(getContext(), color));
- }
-
- @NonNull
- public String getDescription()
- {
- return tvDescription.getRealText().trim();
- }
-
- @NonNull
- public String getName()
- {
- return tvName.getText().toString().trim();
- }
-
- public void populateFrom(@NonNull Habit habit)
- {
- Resources res = getResources();
-
- if(habit.isNumerical())
- tvDescription.setExample(res.getString(R.string.example_question_numerical));
- else
- tvDescription.setExample(res.getString(R.string.example_question_boolean));
-
- setColor(habit.getColor());
- tvName.setText(habit.getName());
- tvDescription.setRealText(habit.getDescription());
- }
-
- public boolean validate()
- {
- Resources res = getResources();
-
- if (getName().isEmpty())
- {
- tvName.setError(
- res.getString(R.string.validation_name_should_not_be_blank));
- return false;
- }
-
- return true;
- }
-
- @Override
- protected void onRestoreInstanceState(Parcelable state)
- {
- BundleSavedState bss = (BundleSavedState) state;
- setColor(bss.bundle.getInt("color"));
- super.onRestoreInstanceState(bss.getSuperState());
- }
-
- @Override
- protected Parcelable onSaveInstanceState()
- {
- Parcelable superState = super.onSaveInstanceState();
- Bundle bundle = new Bundle();
- bundle.putInt("color", color);
- return new BundleSavedState(superState, bundle);
- }
-
- @OnClick(R.id.buttonPickColor)
- void showColorPicker()
- {
- controller.onColorPickerClicked(color);
- }
-
- public void setController(@NonNull Controller controller)
- {
- this.controller = controller;
- }
-
- public interface Controller
- {
- /**
- * Called when the user has clicked the widget to select a new
- * color for the habit.
- *
- * @param previousColor the color previously selected
- */
- default void onColorPickerClicked(int previousColor) {}
- }
-}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/views/ReminderPanel.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/views/ReminderPanel.java
deleted file mode 100644
index 6d2c399e7..000000000
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/views/ReminderPanel.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * Copyright (C) 2016 Álinson Santos Xavier
- *
- * This file is part of Loop Habit Tracker.
- *
- * Loop Habit Tracker is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by the
- * Free Software Foundation, either version 3 of the License, or (at your
- * option) any later version.
- *
- * Loop Habit Tracker is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see .
- */
-
-package org.isoron.uhabits.activities.habits.edit.views;
-
-import android.content.*;
-import android.os.*;
-import android.support.annotation.*;
-import android.util.*;
-import android.view.*;
-import android.widget.*;
-
-import com.android.datetimepicker.time.*;
-
-import org.isoron.uhabits.R;
-import org.isoron.uhabits.activities.common.dialogs.*;
-import org.isoron.uhabits.activities.common.views.*;
-import org.isoron.uhabits.core.models.*;
-import org.isoron.uhabits.utils.*;
-
-import butterknife.*;
-
-public class ReminderPanel extends FrameLayout
- implements TimePickerDialog.OnTimeSetListener,
- WeekdayPickerDialog.OnWeekdaysPickedListener
-{
- @BindView(R.id.tvReminderTime)
- TextView tvReminderTime;
-
- @BindView(R.id.llReminderDays)
- ViewGroup llReminderDays;
-
- @BindView(R.id.tvReminderDays)
- TextView tvReminderDays;
-
- @Nullable
- private Reminder reminder;
-
- @NonNull
- private Controller controller;
-
- public ReminderPanel(@NonNull Context context, @Nullable AttributeSet attrs)
- {
- super(context, attrs);
-
- View view = inflate(context, R.layout.edit_habit_reminder, null);
- ButterKnife.bind(this, view);
- addView(view);
-
- controller = new Controller() {};
- setReminder(null);
- }
-
- @Nullable
- public Reminder getReminder()
- {
- return reminder;
- }
-
- public void setReminder(@Nullable Reminder reminder)
- {
- this.reminder = reminder;
-
- if (reminder == null)
- {
- tvReminderTime.setText(R.string.reminder_off);
- llReminderDays.setVisibility(View.GONE);
- return;
- }
-
- Context ctx = getContext();
- String time = AndroidDateUtils.formatTime(ctx, reminder.getHour(), reminder.getMinute());
- tvReminderTime.setText(time);
- llReminderDays.setVisibility(View.VISIBLE);
-
- boolean weekdays[] = reminder.getDays().toArray();
- tvReminderDays.setText(AndroidDateUtils.formatWeekdayList(ctx, weekdays));
- }
-
- @Override
- public void onTimeCleared(RadialPickerLayout view)
- {
- setReminder(null);
- }
-
- @Override
- public void onTimeSet(RadialPickerLayout view, int hour, int minute)
- {
- WeekdayList days = WeekdayList.EVERY_DAY;
- if (reminder != null) days = reminder.getDays();
- setReminder(new Reminder(hour, minute, days));
- }
-
- @Override
- public void onWeekdaysSet(WeekdayList selectedDays)
- {
- if (reminder == null) return;
- if (selectedDays.isEmpty()) selectedDays = WeekdayList.EVERY_DAY;
-
- setReminder(new Reminder(reminder.getHour(), reminder.getMinute(),
- selectedDays));
- }
-
- public void setController(@NonNull Controller controller)
- {
- this.controller = controller;
- }
-
- @Override
- protected void onRestoreInstanceState(Parcelable state)
- {
- BundleSavedState bss = (BundleSavedState) state;
- if (!bss.bundle.isEmpty())
- {
- int days = bss.bundle.getInt("days");
- int hour = bss.bundle.getInt("hour");
- int minute = bss.bundle.getInt("minute");
- reminder = new Reminder(hour, minute, new WeekdayList(days));
- setReminder(reminder);
- }
- super.onRestoreInstanceState(bss.getSuperState());
- }
-
- @Override
- protected Parcelable onSaveInstanceState()
- {
- Parcelable superState = super.onSaveInstanceState();
- Bundle bundle = new Bundle();
- if (reminder != null)
- {
- bundle.putInt("days", reminder.getDays().toInteger());
- bundle.putInt("hour", reminder.getHour());
- bundle.putInt("minute", reminder.getMinute());
- }
- return new BundleSavedState(superState, bundle);
- }
-
- @OnClick(R.id.tvReminderTime)
- void onDateSpinnerClick()
- {
- int hour = 8;
- int min = 0;
-
- if (reminder != null)
- {
- hour = reminder.getHour();
- min = reminder.getMinute();
- }
-
- controller.onTimeClicked(hour, min);
- }
-
- @OnClick(R.id.tvReminderDays)
- void onWeekdayClicked()
- {
- if (reminder == null) return;
- controller.onWeekdayClicked(reminder.getDays());
- }
-
- public interface Controller
- {
- /**
- * Called when the user has clicked the widget to change the time of
- * the reminder.
- *
- * @param currentHour hour previously picked by the user
- * @param currentMin minute previously picked by the user
- */
- default void onTimeClicked(int currentHour, int currentMin) {}
-
- /**
- * Called when the used has clicked the widget to change the days
- * of the reminder.
- *
- * @param currentDays days previously selected by the user.
- */
- default void onWeekdayClicked(WeekdayList currentDays) {}
- }
-}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/views/TargetPanel.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/views/TargetPanel.java
deleted file mode 100644
index 8ef88f135..000000000
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/views/TargetPanel.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2016 Álinson Santos Xavier
- *
- * This file is part of Loop Habit Tracker.
- *
- * Loop Habit Tracker is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by the
- * Free Software Foundation, either version 3 of the License, or (at your
- * option) any later version.
- *
- * Loop Habit Tracker is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see .
- */
-
-package org.isoron.uhabits.activities.habits.edit.views;
-
-import android.content.*;
-import android.content.res.*;
-import android.support.annotation.*;
-import android.util.*;
-import android.view.*;
-import android.widget.*;
-
-import org.isoron.uhabits.R;
-
-import java.text.DecimalFormat;
-
-import butterknife.*;
-
-
-public class TargetPanel extends FrameLayout
-{
- private DecimalFormat valueFormatter = new DecimalFormat("#.##");
-
- @BindView(R.id.tvUnit)
- ExampleEditText tvUnit;
-
- @BindView(R.id.tvTargetCount)
- TextView tvTargetValue;
-
- public TargetPanel(@NonNull Context context, @Nullable AttributeSet attrs)
- {
- super(context, attrs);
-
- View view = inflate(context, R.layout.edit_habit_target, null);
- ButterKnife.bind(this, view);
- addView(view);
- }
-
- public double getTargetValue()
- {
- String sValue = tvTargetValue.getText().toString();
- return Double.parseDouble(sValue);
- }
-
- public void setTargetValue(double targetValue)
- {
- tvTargetValue.setText(valueFormatter.format(targetValue));
- }
-
- public String getUnit()
- {
- return tvUnit.getRealText();
- }
-
- public void setUnit(String unit)
- {
- tvUnit.setRealText(unit);
- }
-
- public boolean validate()
- {
- Resources res = getResources();
- String sValue = tvTargetValue.getText().toString();
- double value = Double.parseDouble(sValue);
-
- if (value <= 0)
- {
- tvTargetValue.setError(
- res.getString(R.string.validation_number_should_be_positive));
- return false;
- }
-
- return true;
- }
-}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.kt
index a72b62d5b..1b8a92822 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.kt
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.kt
@@ -20,6 +20,7 @@
package org.isoron.uhabits.activities.habits.list
import android.os.*
+import org.isoron.uhabits.*
import org.isoron.uhabits.activities.*
import org.isoron.uhabits.activities.habits.list.views.*
import org.isoron.uhabits.core.preferences.*
@@ -46,6 +47,7 @@ class ListHabitsActivity : HabitsActivity() {
setScreen(screen)
component.listHabitsBehavior.onStartup()
+ setTitle(R.string.main_activity_title)
}
override fun onPause() {
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.kt
index 47dfec5ee..74f2f0d89 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.kt
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.kt
@@ -39,9 +39,7 @@ class ListHabitsMenu @Inject constructor(
val nightModeItem = menu.findItem(R.id.actionToggleNightMode)
val hideArchivedItem = menu.findItem(R.id.actionHideArchived)
val hideCompletedItem = menu.findItem(R.id.actionHideCompleted)
- val addNumericalHabit = menu.findItem(R.id.actionCreateNumeralHabit)
- addNumericalHabit.isVisible = preferences.isDeveloper
nightModeItem.isChecked = themeSwitcher.isNightMode
hideArchivedItem.isChecked = !preferences.showArchived
hideCompletedItem.isChecked = !preferences.showCompleted
@@ -54,13 +52,8 @@ class ListHabitsMenu @Inject constructor(
return true
}
- R.id.actionCreateBooleanHabit -> {
- behavior.onCreateBooleanHabit()
- return true
- }
-
- R.id.actionCreateNumeralHabit -> {
- behavior.onCreateNumericalHabit()
+ R.id.actionCreateHabit -> {
+ behavior.onCreateHabit()
return true
}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsRootView.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsRootView.kt
index 25377db0c..268c1e06a 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsRootView.kt
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsRootView.kt
@@ -22,7 +22,7 @@ package org.isoron.uhabits.activities.habits.list
import android.content.*
import android.os.Build.VERSION.*
import android.os.Build.VERSION_CODES.*
-import android.support.v7.widget.Toolbar
+import androidx.appcompat.widget.Toolbar
import android.view.ViewGroup.LayoutParams.*
import android.widget.*
import org.isoron.androidbase.activities.*
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt
index 5ff44cacb..e4c3752a1 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.kt
@@ -21,7 +21,7 @@ package org.isoron.uhabits.activities.habits.list
import android.app.*
import android.content.*
-import android.support.annotation.*
+import androidx.annotation.*
import dagger.*
import org.isoron.androidbase.activities.*
import org.isoron.androidbase.utils.*
@@ -58,14 +58,12 @@ class ListHabitsScreen
private val commandRunner: CommandRunner,
private val intentFactory: IntentFactory,
private val themeSwitcher: ThemeSwitcher,
- private val preferences: Preferences,
private val adapter: HabitCardListAdapter,
private val taskRunner: TaskRunner,
private val exportDBFactory: ExportDBTaskFactory,
private val importTaskFactory: ImportDataTaskFactory,
private val confirmDeleteDialogFactory: ConfirmDeleteDialogFactory,
private val colorPickerFactory: ColorPickerDialogFactory,
- private val editHabitDialogFactory: EditHabitDialogFactory,
private val numberPickerFactory: NumberPickerFactory,
private val behavior: Lazy,
private val menu: Lazy,
@@ -106,10 +104,10 @@ class ListHabitsScreen
if (data == null) return
if (resultCode != Activity.RESULT_OK) return
try {
- val inStream = activity.contentResolver.openInputStream(data.data!!)
+ val inStream = activity.contentResolver.openInputStream(data.data!!)!!
val cacheDir = activity.externalCacheDir
val tempFile = File.createTempFile("import", "", cacheDir)
- FileUtils.copy(inStream, tempFile)
+ inStream.copyTo(tempFile)
onImportData(tempFile) { tempFile.delete() }
} catch (e: IOException) {
showMessage(R.string.could_not_import)
@@ -137,14 +135,9 @@ class ListHabitsScreen
activity.startActivity(intent)
}
- override fun showCreateBooleanHabitScreen() {
- val dialog = editHabitDialogFactory.createBoolean()
- activity.showDialog(dialog, "editHabit")
- }
-
- override fun showCreateNumericalHabitScreen() {
- val dialog = editHabitDialogFactory.createNumerical()
- activity.showDialog(dialog, "editHabit")
+ override fun showSelectHabitTypeDialog() {
+ val dialog = HabitTypeDialog()
+ activity.showDialog(dialog, "habitType")
}
override fun showDeleteConfirmationScreen(callback: OnConfirmedCallback) {
@@ -152,8 +145,8 @@ class ListHabitsScreen
}
override fun showEditHabitsScreen(habits: List) {
- val dialog = editHabitDialogFactory.edit(habits[0])
- activity.showDialog(dialog, "editNumericalHabit")
+ val intent = intentFactory.startEditActivity(activity!!, habits[0])
+ activity.startActivity(intent)
}
override fun showFAQScreen() {
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListAdapter.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListAdapter.java
index 6992391c1..ad4f8013e 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListAdapter.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListAdapter.java
@@ -19,10 +19,13 @@
package org.isoron.uhabits.activities.habits.list.views;
-import android.support.annotation.*;
-import android.support.v7.widget.*;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.appcompat.widget.*;
import android.view.*;
+import androidx.recyclerview.widget.RecyclerView;
+
import org.isoron.androidbase.activities.*;
import org.isoron.uhabits.activities.habits.list.*;
import org.isoron.uhabits.core.models.*;
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListView.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListView.kt
index 0989fb660..259d1f14a 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListView.kt
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListView.kt
@@ -21,9 +21,9 @@ package org.isoron.uhabits.activities.habits.list.views
import android.content.*
import android.os.*
-import android.support.v7.widget.*
-import android.support.v7.widget.helper.*
-import android.support.v7.widget.helper.ItemTouchHelper.*
+import androidx.appcompat.widget.*
+import androidx.recyclerview.widget.*
+import androidx.recyclerview.widget.ItemTouchHelper.*
import android.view.*
import com.google.auto.factory.*
import dagger.*
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardViewHolder.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardViewHolder.kt
index ca820109c..3f0b9d0ca 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardViewHolder.kt
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardViewHolder.kt
@@ -19,7 +19,8 @@
package org.isoron.uhabits.activities.habits.list.views
-import android.support.v7.widget.*
+import androidx.appcompat.widget.*
import android.view.*
+import androidx.recyclerview.widget.RecyclerView
class HabitCardViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.kt
index 53defd457..6c94366df 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.kt
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.kt
@@ -27,7 +27,7 @@ import android.view.View.*
import com.google.auto.factory.*
import org.isoron.androidbase.activities.*
import org.isoron.androidbase.utils.*
-import org.isoron.androidbase.utils.InterfaceUtils.*
+import org.isoron.androidbase.utils.InterfaceUtils.getDimension
import org.isoron.uhabits.*
import org.isoron.uhabits.core.preferences.*
import org.isoron.uhabits.utils.*
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitRootView.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitRootView.java
index 55966f0c3..e1a986294 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitRootView.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitRootView.java
@@ -21,8 +21,11 @@ package org.isoron.uhabits.activities.habits.show;
import android.content.*;
import android.os.*;
-import android.support.annotation.*;
-import android.support.v7.widget.*;
+import android.view.*;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.appcompat.widget.*;
import org.isoron.androidbase.activities.*;
import org.isoron.androidbase.utils.*;
@@ -51,6 +54,12 @@ public class ShowHabitRootView extends BaseRootView
@BindView(R.id.subtitleCard)
SubtitleCard subtitleCard;
+ @BindView(R.id.notesCard)
+ NotesCard notesCard;
+
+ @BindView(R.id.habitNotes)
+ TextView habitNotes;
+
@BindView(R.id.overviewCard)
OverviewCard overviewCard;
@@ -66,6 +75,9 @@ public class ShowHabitRootView extends BaseRootView
@BindView(R.id.toolbar)
Toolbar toolbar;
+ @BindView(R.id.targetCard)
+ TargetCard targetCard;
+
@NonNull
private Controller controller;
@@ -135,12 +147,20 @@ public class ShowHabitRootView extends BaseRootView
private void initCards()
{
subtitleCard.setHabit(habit);
+ notesCard.setHabit(habit);
overviewCard.setHabit(habit);
scoreCard.setHabit(habit);
historyCard.setHabit(habit);
streakCard.setHabit(habit);
frequencyCard.setHabit(habit);
barCard.setHabit(habit);
+ targetCard.setHabit(habit);
+
+ if(habit.isNumerical()) {
+ overviewCard.setVisibility(View.GONE);
+ } else {
+ targetCard.setVisibility(View.GONE);
+ }
}
public interface Controller extends HistoryCard.Controller
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitScreen.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitScreen.java
index c74b412da..d19eb7cb5 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitScreen.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitScreen.java
@@ -19,7 +19,9 @@
package org.isoron.uhabits.activities.habits.show;
-import android.support.annotation.*;
+import android.content.*;
+
+import androidx.annotation.NonNull;
import org.isoron.androidbase.activities.*;
import org.isoron.uhabits.*;
@@ -28,6 +30,7 @@ import org.isoron.uhabits.activities.habits.edit.*;
import org.isoron.uhabits.core.models.*;
import org.isoron.uhabits.core.ui.callbacks.*;
import org.isoron.uhabits.core.ui.screens.habits.show.*;
+import org.isoron.uhabits.intents.*;
import javax.inject.*;
@@ -43,30 +46,30 @@ public class ShowHabitScreen extends BaseScreen
@NonNull
private final Habit habit;
- @NonNull
- private final EditHabitDialogFactory editHabitDialogFactory;
-
@NonNull
private final ConfirmDeleteDialogFactory confirmDeleteDialogFactory;
private final Lazy behavior;
+ @NonNull
+ private final IntentFactory intentFactory;
+
@Inject
public ShowHabitScreen(@NonNull BaseActivity activity,
@NonNull Habit habit,
@NonNull ShowHabitRootView view,
@NonNull ShowHabitsMenu menu,
- @NonNull EditHabitDialogFactory editHabitDialogFactory,
@NonNull ConfirmDeleteDialogFactory confirmDeleteDialogFactory,
+ @NonNull IntentFactory intentFactory,
@NonNull Lazy behavior)
{
super(activity);
+ this.intentFactory = intentFactory;
setMenu(menu);
setRootView(view);
this.habit = habit;
this.behavior = behavior;
- this.editHabitDialogFactory = editHabitDialogFactory;
this.confirmDeleteDialogFactory = confirmDeleteDialogFactory;
view.setController(this);
}
@@ -102,7 +105,8 @@ public class ShowHabitScreen extends BaseScreen
@Override
public void showEditHabitScreen(@NonNull Habit habit)
{
- activity.showDialog(editHabitDialogFactory.edit(habit), "editHabit");
+ Intent intent = intentFactory.startEditActivity(activity, habit);
+ activity.startActivity(intent);
}
@Override
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitsMenu.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitsMenu.java
index b7560a5d3..39c14c198 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitsMenu.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitsMenu.java
@@ -19,9 +19,10 @@
package org.isoron.uhabits.activities.habits.show;
-import android.support.annotation.*;
import android.view.*;
+import androidx.annotation.NonNull;
+
import org.isoron.androidbase.activities.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.core.preferences.Preferences;
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/BarCard.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/BarCard.java
index 135dc0a23..6b5dfe394 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/BarCard.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/BarCard.java
@@ -20,14 +20,16 @@
package org.isoron.uhabits.activities.habits.show.views;
import android.content.*;
-import android.support.annotation.*;
import android.util.*;
import android.widget.*;
+import androidx.annotation.Nullable;
+
import org.isoron.uhabits.*;
import org.isoron.uhabits.R;
import org.isoron.uhabits.activities.common.views.*;
import org.isoron.uhabits.core.models.*;
+import org.isoron.uhabits.core.preferences.*;
import org.isoron.uhabits.core.tasks.*;
import org.isoron.uhabits.utils.*;
@@ -54,11 +56,11 @@ public class BarCard extends HabitCard
@BindView(R.id.title)
TextView title;
- @Nullable
- private TaskRunner taskRunner;
-
private int bucketSize;
+ @Nullable
+ private Preferences prefs;
+
public BarCard(Context context)
{
super(context);
@@ -85,29 +87,19 @@ public class BarCard extends HabitCard
refreshData();
}
- @Override
- protected void refreshData()
- {
- if (taskRunner == null) return;
- taskRunner.execute(new RefreshTask(getHabit()));
- }
-
private void init()
{
- inflate(getContext(), R.layout.show_habit_bar, this);
- ButterKnife.bind(this);
-
- boolSpinner.setSelection(1);
- numericalSpinner.setSelection(2);
- bucketSize = 7;
-
Context appContext = getContext().getApplicationContext();
if (appContext instanceof HabitsApplication)
{
HabitsApplication app = (HabitsApplication) appContext;
- taskRunner = app.getComponent().getTaskRunner();
+ prefs = app.getComponent().getPreferences();
}
-
+ inflate(getContext(), R.layout.show_habit_bar, this);
+ ButterKnife.bind(this);
+ boolSpinner.setSelection(1);
+ numericalSpinner.setSelection(2);
+ bucketSize = 7;
if (isInEditMode()) initEditMode();
}
@@ -119,11 +111,17 @@ public class BarCard extends HabitCard
chart.populateWithRandomData();
}
- private class RefreshTask implements Task
+ @Override
+ protected Task createRefreshTask()
+ {
+ return new RefreshTask(getHabit());
+ }
+
+ private class RefreshTask extends CancelableTask
{
private final Habit habit;
- public RefreshTask(Habit habit)
+ RefreshTask(Habit habit)
{
this.habit = habit;
}
@@ -131,9 +129,13 @@ public class BarCard extends HabitCard
@Override
public void doInBackground()
{
+ if (isCanceled()) return;
List checkmarks;
+ int firstWeekday = Calendar.SATURDAY;
+ if (prefs != null) firstWeekday = prefs.getFirstWeekday();
if (bucketSize == 1) checkmarks = habit.getCheckmarks().getAll();
- else checkmarks = habit.getCheckmarks().groupBy(getTruncateField(bucketSize));
+ else checkmarks = habit.getCheckmarks().groupBy(getTruncateField(bucketSize),
+ firstWeekday);
chart.setCheckmarks(checkmarks);
chart.setBucketSize(bucketSize);
}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/FrequencyCard.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/FrequencyCard.java
index ff24596c3..a87606252 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/FrequencyCard.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/FrequencyCard.java
@@ -20,14 +20,16 @@
package org.isoron.uhabits.activities.habits.show.views;
import android.content.*;
-import android.support.annotation.*;
import android.util.*;
import android.widget.*;
+import androidx.annotation.Nullable;
+
import org.isoron.uhabits.*;
import org.isoron.uhabits.R;
import org.isoron.uhabits.activities.common.views.*;
import org.isoron.uhabits.core.models.*;
+import org.isoron.uhabits.core.preferences.*;
import org.isoron.uhabits.core.tasks.*;
import org.isoron.uhabits.utils.*;
@@ -44,7 +46,7 @@ public class FrequencyCard extends HabitCard
FrequencyChart chart;
@Nullable
- private TaskRunner taskRunner;
+ private Preferences prefs;
public FrequencyCard(Context context)
{
@@ -59,24 +61,21 @@ public class FrequencyCard extends HabitCard
}
@Override
- protected void refreshData()
+ protected Task createRefreshTask()
{
- if(taskRunner == null) return;
- taskRunner.execute(new RefreshTask());
+ return new RefreshTask();
}
private void init()
{
- inflate(getContext(), R.layout.show_habit_frequency, this);
- ButterKnife.bind(this);
-
Context appContext = getContext().getApplicationContext();
- if(appContext instanceof HabitsApplication)
+ if (appContext instanceof HabitsApplication)
{
HabitsApplication app = (HabitsApplication) appContext;
- taskRunner = app.getComponent().getTaskRunner();
+ prefs = app.getComponent().getPreferences();
}
-
+ inflate(getContext(), R.layout.show_habit_frequency, this);
+ ButterKnife.bind(this);
if (isInEditMode()) initEditMode();
}
@@ -88,13 +87,15 @@ public class FrequencyCard extends HabitCard
chart.populateWithRandomData();
}
- private class RefreshTask implements Task
+ private class RefreshTask extends CancelableTask
{
@Override
public void doInBackground()
{
+ if (isCanceled()) return;
RepetitionList reps = getHabit().getRepetitions();
HashMap frequency = reps.getWeekdayFrequency();
+ if(prefs != null) chart.setFirstWeekday(prefs.getFirstWeekday());
chart.setFrequency(frequency);
}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/HabitCard.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/HabitCard.java
index 255b518e1..3e47830d9 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/HabitCard.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/HabitCard.java
@@ -20,12 +20,16 @@
package org.isoron.uhabits.activities.habits.show.views;
import android.content.*;
-import android.support.annotation.*;
import android.util.*;
import android.widget.*;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import org.isoron.uhabits.*;
import org.isoron.uhabits.core.models.*;
import org.isoron.uhabits.core.models.memory.*;
+import org.isoron.uhabits.core.tasks.*;
public abstract class HabitCard extends LinearLayout
implements ModelObservable.Listener
@@ -33,6 +37,12 @@ public abstract class HabitCard extends LinearLayout
@NonNull
private Habit habit;
+ @Nullable
+ private TaskRunner taskRunner;
+
+ @Nullable
+ private Task currentRefreshTask;
+
public HabitCard(Context context)
{
super(context);
@@ -82,7 +92,15 @@ public abstract class HabitCard extends LinearLayout
super.onDetachedFromWindow();
}
- protected abstract void refreshData();
+ protected void refreshData()
+ {
+ if(taskRunner == null) return;
+ if(currentRefreshTask != null) currentRefreshTask.cancel();
+ currentRefreshTask = createRefreshTask();
+ taskRunner.execute(currentRefreshTask);
+ }
+
+ protected abstract Task createRefreshTask();
private void attachTo(Habit habit)
{
@@ -99,5 +117,11 @@ public abstract class HabitCard extends LinearLayout
private void init()
{
if(!isInEditMode()) habit = new MemoryModelFactory().buildHabit();
+ Context appContext = getContext().getApplicationContext();
+ if(appContext instanceof HabitsApplication)
+ {
+ HabitsApplication app = (HabitsApplication) appContext;
+ taskRunner = app.getComponent().getTaskRunner();
+ }
}
}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/HistoryCard.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/HistoryCard.java
index e59aecf73..7e1f4948b 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/HistoryCard.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/HistoryCard.java
@@ -20,14 +20,16 @@
package org.isoron.uhabits.activities.habits.show.views;
import android.content.*;
-import android.support.annotation.*;
import android.util.*;
import android.widget.*;
+import androidx.annotation.Nullable;
+
import org.isoron.uhabits.*;
import org.isoron.uhabits.R;
import org.isoron.uhabits.activities.common.views.*;
import org.isoron.uhabits.core.models.*;
+import org.isoron.uhabits.core.preferences.*;
import org.isoron.uhabits.core.tasks.*;
import org.isoron.uhabits.utils.*;
@@ -41,11 +43,11 @@ public class HistoryCard extends HabitCard
@BindView(R.id.title)
TextView title;
- @NonNull
+ @Nullable
private Controller controller;
@Nullable
- private TaskRunner taskRunner;
+ private Preferences prefs;
public HistoryCard(Context context)
{
@@ -62,33 +64,25 @@ public class HistoryCard extends HabitCard
@OnClick(R.id.edit)
public void onClickEditButton()
{
- controller.onEditHistoryButtonClick();
+ if(controller != null) controller.onEditHistoryButtonClick();
}
- public void setController(@NonNull Controller controller)
+ public void setController(@Nullable Controller controller)
{
this.controller = controller;
}
- @Override
- protected void refreshData()
- {
- if(taskRunner == null) return;
- taskRunner.execute(new RefreshTask(getHabit()));
- }
-
private void init()
{
- inflate(getContext(), R.layout.show_habit_history, this);
- ButterKnife.bind(this);
-
Context appContext = getContext().getApplicationContext();
if (appContext instanceof HabitsApplication)
{
HabitsApplication app = (HabitsApplication) appContext;
- taskRunner = app.getComponent().getTaskRunner();
+ prefs = app.getComponent().getPreferences();
}
+ inflate(getContext(), R.layout.show_habit_history, this);
+ ButterKnife.bind(this);
controller = new Controller() {};
if (isInEditMode()) initEditMode();
}
@@ -101,21 +95,32 @@ public class HistoryCard extends HabitCard
chart.populateWithRandomData();
}
+ @Override
+ protected Task createRefreshTask()
+ {
+ return new RefreshTask(getHabit());
+ }
+
public interface Controller
{
default void onEditHistoryButtonClick() {}
}
- private class RefreshTask implements Task
+ private class RefreshTask extends CancelableTask
{
private final Habit habit;
- public RefreshTask(Habit habit) {this.habit = habit;}
+ private RefreshTask(Habit habit)
+ {
+ this.habit = habit;
+ }
@Override
public void doInBackground()
{
- int checkmarks[] = habit.getCheckmarks().getAllValues();
+ if (isCanceled()) return;
+ int[] checkmarks = habit.getCheckmarks().getAllValues();
+ if(prefs != null) chart.setFirstWeekday(prefs.getFirstWeekday());
chart.setCheckmarks(checkmarks);
}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/NotesCard.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/NotesCard.kt
new file mode 100644
index 000000000..5e9d6864b
--- /dev/null
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/NotesCard.kt
@@ -0,0 +1,26 @@
+package org.isoron.uhabits.activities.habits.show.views
+
+import android.content.Context
+import android.util.AttributeSet
+import android.view.View
+import android.widget.TextView
+import org.isoron.uhabits.R
+import org.isoron.uhabits.core.tasks.Task
+
+class NotesCard(context: Context?, attrs: AttributeSet?) : HabitCard(context, attrs) {
+
+ private val notesTextView: TextView
+
+ init {
+ View.inflate(getContext(), R.layout.show_habit_notes, this)
+ notesTextView = findViewById(R.id.habitNotes)
+ }
+
+ override fun refreshData() {
+ notesTextView.text = habit.description
+ visibility = if(habit.description.isEmpty()) View.GONE else View.VISIBLE
+ notesTextView.visibility = visibility
+ }
+
+ override fun createRefreshTask(): Task = error("refresh task should never be called.")
+}
\ No newline at end of file
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/OverviewCard.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/OverviewCard.java
index f1acb1cdd..14327643c 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/OverviewCard.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/OverviewCard.java
@@ -20,12 +20,12 @@
package org.isoron.uhabits.activities.habits.show.views;
import android.content.*;
-import android.support.annotation.*;
import android.util.*;
import android.widget.*;
+import androidx.annotation.NonNull;
+
import org.isoron.androidbase.utils.*;
-import org.isoron.uhabits.*;
import org.isoron.uhabits.R;
import org.isoron.uhabits.activities.common.views.*;
import org.isoron.uhabits.core.models.*;
@@ -60,9 +60,6 @@ public class OverviewCard extends HabitCard
private int color;
- @Nullable
- private TaskRunner taskRunner;
-
public OverviewCard(Context context)
{
super(context);
@@ -75,13 +72,6 @@ public class OverviewCard extends HabitCard
init();
}
- @Override
- protected void refreshData()
- {
- if(taskRunner == null) return;
- taskRunner.execute(new RefreshTask());
- }
-
private String formatPercentageDiff(float percentageDiff)
{
return String.format("%s%.0f%%", (percentageDiff >= 0 ? "+" : "\u2212"),
@@ -90,17 +80,9 @@ public class OverviewCard extends HabitCard
private void init()
{
- Context appContext = getContext().getApplicationContext();
- if (appContext instanceof HabitsApplication)
- {
- HabitsApplication app = (HabitsApplication) appContext;
- taskRunner = app.getComponent().getTaskRunner();
- }
-
inflate(getContext(), R.layout.show_habit_overview, this);
ButterKnife.bind(this);
cache = new Cache();
-
if (isInEditMode()) initEditMode();
}
@@ -146,20 +128,27 @@ public class OverviewCard extends HabitCard
private class Cache
{
- public float todayScore;
+ float todayScore;
- public float lastMonthScore;
+ float lastMonthScore;
- public float lastYearScore;
+ float lastYearScore;
- public long totalCount;
+ long totalCount;
+ }
+
+ @Override
+ protected Task createRefreshTask()
+ {
+ return new RefreshTask();
}
- private class RefreshTask implements Task
+ private class RefreshTask extends CancelableTask
{
@Override
public void doInBackground()
{
+ if (isCanceled()) return;
Habit habit = getHabit();
ScoreList scores = habit.getScores();
@@ -177,6 +166,7 @@ public class OverviewCard extends HabitCard
@Override
public void onPostExecute()
{
+ if (isCanceled()) return;
refreshScore();
}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/ScoreCard.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/ScoreCard.java
index eb81a954e..fc3bbf3c9 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/ScoreCard.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/ScoreCard.java
@@ -20,10 +20,12 @@
package org.isoron.uhabits.activities.habits.show.views;
import android.content.*;
-import android.support.annotation.*;
import android.util.*;
import android.widget.*;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
import org.isoron.uhabits.*;
import org.isoron.uhabits.R;
import org.isoron.uhabits.activities.common.views.*;
@@ -52,9 +54,6 @@ public class ScoreCard extends HabitCard
private int bucketSize;
- @Nullable
- private TaskRunner taskRunner;
-
@Nullable
private Preferences prefs;
@@ -94,13 +93,6 @@ public class ScoreCard extends HabitCard
refreshData();
}
- @Override
- protected void refreshData()
- {
- if(taskRunner == null) return;
- taskRunner.execute(new RefreshTask());
- }
-
private int getDefaultSpinnerPosition()
{
if(prefs == null) return 0;
@@ -113,7 +105,6 @@ public class ScoreCard extends HabitCard
if (appContext instanceof HabitsApplication)
{
HabitsApplication app = (HabitsApplication) appContext;
- taskRunner = app.getComponent().getTaskRunner();
prefs = app.getComponent().getPreferences();
}
@@ -140,18 +131,29 @@ public class ScoreCard extends HabitCard
bucketSize = BUCKET_SIZES[position];
}
- private class RefreshTask implements Task
+ @Override
+ protected Task createRefreshTask()
+ {
+ return new RefreshTask();
+ }
+
+ private class RefreshTask extends CancelableTask
{
@Override
public void doInBackground()
{
+ if (isCanceled()) return;
List scores;
ScoreList scoreList = getHabit().getScores();
+ int firstWeekday = Calendar.SATURDAY;
+ if (prefs != null) firstWeekday = prefs.getFirstWeekday();
+ Log.d("ScoreCard", "firstWeekday="+firstWeekday);
if (bucketSize == 1) scores = scoreList.toList();
- else scores = scoreList.groupBy(getTruncateField(bucketSize));
+ else scores = scoreList.groupBy(getTruncateField(bucketSize), firstWeekday);
chart.setScores(scores);
+ chart.reset();
chart.setBucketSize(bucketSize);
}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/StreakCard.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/StreakCard.java
index e4f07e6d5..699e21af3 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/StreakCard.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/StreakCard.java
@@ -20,11 +20,9 @@
package org.isoron.uhabits.activities.habits.show.views;
import android.content.*;
-import android.support.annotation.*;
import android.util.*;
import android.widget.*;
-import org.isoron.uhabits.*;
import org.isoron.uhabits.R;
import org.isoron.uhabits.activities.common.views.*;
import org.isoron.uhabits.core.models.*;
@@ -45,9 +43,6 @@ public class StreakCard extends HabitCard
@BindView(R.id.streakChart)
StreakChart streakChart;
- @Nullable
- private TaskRunner taskRunner;
-
public StreakCard(Context context)
{
super(context);
@@ -60,22 +55,8 @@ public class StreakCard extends HabitCard
init();
}
- @Override
- protected void refreshData()
- {
- if(taskRunner == null) return;
- taskRunner.execute(new RefreshTask());
- }
-
private void init()
{
- Context appContext = getContext().getApplicationContext();
- if (appContext instanceof HabitsApplication)
- {
- HabitsApplication app = (HabitsApplication) appContext;
- taskRunner = app.getComponent().getTaskRunner();
- }
-
inflate(getContext(), R.layout.show_habit_streak, this);
ButterKnife.bind(this);
setOrientation(VERTICAL);
@@ -90,13 +71,20 @@ public class StreakCard extends HabitCard
streakChart.populateWithRandomData();
}
- private class RefreshTask implements Task
+ @Override
+ protected Task createRefreshTask()
+ {
+ return new RefreshTask();
+ }
+
+ private class RefreshTask extends CancelableTask
{
- public List bestStreaks;
+ List bestStreaks;
@Override
public void doInBackground()
{
+ if (isCanceled()) return;
StreakList streaks = getHabit().getStreaks();
bestStreaks = streaks.getBest(NUM_STREAKS);
}
@@ -104,6 +92,7 @@ public class StreakCard extends HabitCard
@Override
public void onPostExecute()
{
+ if (isCanceled()) return;
streakChart.setStreaks(bestStreaks);
}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/SubtitleCard.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/SubtitleCard.java
deleted file mode 100644
index 74e6b131d..000000000
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/SubtitleCard.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright (C) 2016 Álinson Santos Xavier
- *
- * This file is part of Loop Habit Tracker.
- *
- * Loop Habit Tracker is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by the
- * Free Software Foundation, either version 3 of the License, or (at your
- * option) any later version.
- *
- * Loop Habit Tracker is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see .
- */
-
-package org.isoron.uhabits.activities.habits.show.views;
-
-import android.annotation.*;
-import android.content.*;
-import android.content.res.*;
-import android.util.*;
-import android.widget.*;
-
-import org.isoron.uhabits.R;
-import org.isoron.uhabits.core.models.*;
-import org.isoron.uhabits.utils.*;
-
-import butterknife.*;
-
-public class SubtitleCard extends HabitCard
-{
- @BindView(R.id.questionLabel)
- TextView questionLabel;
-
- @BindView(R.id.frequencyLabel)
- TextView frequencyLabel;
-
- @BindView(R.id.reminderLabel)
- TextView reminderLabel;
-
- public SubtitleCard(Context context, AttributeSet attrs)
- {
- super(context, attrs);
- init();
- }
-
- @Override
- protected void refreshData()
- {
- Habit habit = getHabit();
- int color = PaletteUtils.getColor(getContext(), habit.getColor());
-
- reminderLabel.setText(getResources().getString(R.string.reminder_off));
- questionLabel.setVisibility(VISIBLE);
-
- questionLabel.setTextColor(color);
- questionLabel.setText(habit.getDescription());
- frequencyLabel.setText(toText(habit.getFrequency()));
-
- if (habit.hasReminder()) updateReminderText(habit.getReminder());
-
- if (habit.getDescription().isEmpty()) questionLabel.setVisibility(GONE);
-
- invalidate();
- }
-
- private void init()
- {
- inflate(getContext(), R.layout.show_habit_subtitle, this);
- ButterKnife.bind(this);
-
- if (isInEditMode()) initEditMode();
- }
-
- @SuppressLint("SetTextI18n")
- private void initEditMode()
- {
- questionLabel.setTextColor(PaletteUtils.getAndroidTestColor(1));
- questionLabel.setText("Have you meditated today?");
- reminderLabel.setText("08:00");
- }
-
- private String toText(Frequency freq)
- {
- Resources resources = getResources();
- Integer num = freq.getNumerator();
- Integer den = freq.getDenominator();
-
- if (num.equals(den)) return resources.getString(R.string.every_day);
-
- if (num == 1)
- {
- if (den == 7) return resources.getString(R.string.every_week);
- if (den % 7 == 0)
- return resources.getString(R.string.every_x_weeks, den / 7);
- return resources.getString(R.string.every_x_days, den);
- }
-
- String times_every = resources.getString(R.string.times_every);
- return String.format("%d %s %d %s", num, times_every, den,
- resources.getString(R.string.days));
- }
-
- private void updateReminderText(Reminder reminder)
- {
- reminderLabel.setText(
- AndroidDateUtils.formatTime(getContext(), reminder.getHour(),
- reminder.getMinute()));
- }
-}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/SubtitleCard.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/SubtitleCard.kt
new file mode 100644
index 000000000..869b86fa9
--- /dev/null
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/SubtitleCard.kt
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2016 Álinson Santos Xavier
+ *
+ * This file is part of Loop Habit Tracker.
+ *
+ * Loop Habit Tracker is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Loop Habit Tracker is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see .
+ */
+package org.isoron.uhabits.activities.habits.show.views
+
+import android.annotation.*
+import android.content.*
+import android.util.*
+import android.view.*
+import org.isoron.androidbase.utils.*
+import org.isoron.uhabits.*
+import org.isoron.uhabits.activities.habits.list.views.*
+import org.isoron.uhabits.core.models.*
+import org.isoron.uhabits.core.tasks.*
+import org.isoron.uhabits.databinding.*
+import org.isoron.uhabits.utils.*
+import org.isoron.uhabits.utils.PaletteUtils.getAndroidTestColor
+import org.isoron.uhabits.utils.PaletteUtils.getColor
+import java.util.*
+
+class SubtitleCard(context: Context?, attrs: AttributeSet?) : HabitCard(context, attrs) {
+
+ init {
+ init()
+ }
+
+ private lateinit var binding: ShowHabitSubtitleBinding
+
+ public override fun refreshData() {
+ val habit = habit
+ val color = getColor(context, habit.color)
+ if (habit.isNumerical) {
+ binding.targetText.text = "${habit.targetValue.toShortString()} ${habit.unit}"
+ } else {
+ binding.targetIcon.visibility = View.GONE
+ binding.targetText.visibility = View.GONE
+ }
+ binding.reminderLabel.text = resources.getString(R.string.reminder_off)
+ binding.questionLabel.visibility = View.VISIBLE
+ binding.questionLabel.setTextColor(color)
+ binding.questionLabel.text = habit.question
+ binding.frequencyLabel.text = toText(habit.frequency)
+ if (habit.hasReminder()) updateReminderText(habit.reminder)
+ if (habit.question.isEmpty()) binding.questionLabel.visibility = View.GONE
+ invalidate()
+ }
+
+ private fun init() {
+ val fontAwesome = InterfaceUtils.getFontAwesome(context)
+ binding = ShowHabitSubtitleBinding.inflate(LayoutInflater.from(context), this)
+ binding.targetIcon.typeface = fontAwesome
+ binding.frequencyIcon.typeface = fontAwesome
+ binding.reminderIcon.typeface = fontAwesome
+ if (isInEditMode) initEditMode()
+ }
+
+ @SuppressLint("SetTextI18n")
+ private fun initEditMode() {
+ binding.questionLabel.setTextColor(getAndroidTestColor(1))
+ binding.questionLabel.text = "Have you meditated today?"
+ binding.reminderLabel.text = "08:00"
+ }
+
+ private fun toText(freq: Frequency): String {
+ val resources = resources
+ val num = freq.numerator
+ val den = freq.denominator
+ if (num == den) return resources.getString(R.string.every_day)
+ if (num == 1) {
+ if (den == 7) return resources.getString(R.string.every_week)
+ if (den % 7 == 0) return resources.getString(R.string.every_x_weeks, den / 7)
+ return if (den >= 30) resources.getString(R.string.every_month) else resources.getString(R.string.every_x_days, den)
+ }
+ val times_every = resources.getString(R.string.times_every)
+ return String.format(Locale.US, "%d %s %d %s", num, times_every, den,
+ resources.getString(R.string.days))
+ }
+
+ private fun updateReminderText(reminder: Reminder) {
+ binding.reminderLabel.text = AndroidDateUtils.formatTime(context, reminder.hour,
+ reminder.minute)
+ }
+
+ override fun createRefreshTask(): Task {
+ // Never called
+ throw IllegalStateException()
+ }
+
+}
\ No newline at end of file
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/TargetCard.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/TargetCard.java
new file mode 100644
index 000000000..464ca1955
--- /dev/null
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/TargetCard.java
@@ -0,0 +1,179 @@
+/*
+ * Copyright (C) 2016 Álinson Santos Xavier
+ *
+ * This file is part of Loop Habit Tracker.
+ *
+ * Loop Habit Tracker is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Loop Habit Tracker is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see .
+ */
+
+package org.isoron.uhabits.activities.habits.show.views;
+
+import android.content.*;
+import android.content.res.*;
+import android.util.*;
+import android.widget.*;
+
+import androidx.annotation.*;
+
+import org.isoron.uhabits.R;
+import org.isoron.uhabits.*;
+import org.isoron.uhabits.activities.common.views.*;
+import org.isoron.uhabits.core.models.*;
+import org.isoron.uhabits.core.preferences.*;
+import org.isoron.uhabits.core.tasks.*;
+import org.isoron.uhabits.core.utils.*;
+import org.isoron.uhabits.utils.*;
+
+import java.util.*;
+
+import butterknife.*;
+
+public class TargetCard extends HabitCard
+{
+ @BindView(R.id.title)
+ TextView title;
+
+ @BindView(R.id.targetChart)
+ TargetChart targetChart;
+
+ int firstWeekday = Calendar.SATURDAY;
+
+ public TargetCard(Context context)
+ {
+ super(context);
+ init();
+ }
+
+ public TargetCard(Context context, AttributeSet attrs)
+ {
+ super(context, attrs);
+ init();
+ }
+
+ private void init()
+ {
+ inflate(getContext(), R.layout.show_habit_target, this);
+ ButterKnife.bind(this);
+ setOrientation(VERTICAL);
+
+ Context app = getContext().getApplicationContext();
+ if (app instanceof HabitsApplication) {
+ HabitsApplication habitsApp = (HabitsApplication) app;
+ Preferences prefs = habitsApp.getComponent().getPreferences();
+ firstWeekday = prefs.getFirstWeekday();
+ }
+
+ if (isInEditMode()) initEditMode();
+ }
+
+ private void initEditMode()
+ {
+ int color = PaletteUtils.getAndroidTestColor(1);
+ title.setTextColor(color);
+ targetChart.setColor(color);
+ targetChart.populateWithRandomData();
+ }
+
+ @Override
+ protected Task createRefreshTask()
+ {
+ return new RefreshTask(getContext(), getHabit(), firstWeekday, targetChart, title);
+ }
+
+ public static class RefreshTask extends CancelableTask
+ {
+ double todayValue;
+ double thisWeekValue;
+ double thisMonthValue;
+ double thisQuarterValue;
+ double thisYearValue;
+
+ private Context context;
+ private Habit habit;
+ private int firstWeekday;
+ private TargetChart chart;
+ private TextView title;
+
+ public RefreshTask(@NonNull Context context,
+ @NonNull Habit habit,
+ int firstWeekday,
+ @NonNull TargetChart chart,
+ @Nullable TextView title)
+ {
+ this.context = context;
+ this.habit = habit;
+ this.firstWeekday = firstWeekday;
+ this.chart = chart;
+ this.title = title;
+ }
+
+ @Override
+ public void doInBackground()
+ {
+ if (isCanceled()) return;
+ CheckmarkList checkmarks = habit.getCheckmarks();
+ todayValue = checkmarks.getTodayValue() / 1e3;
+ thisWeekValue = checkmarks.getThisWeekValue(firstWeekday) / 1e3;
+ thisMonthValue = checkmarks.getThisMonthValue() / 1e3;
+ thisQuarterValue = checkmarks.getThisQuarterValue() / 1e3;
+ thisYearValue = checkmarks.getThisYearValue() / 1e3;
+ }
+
+ @Override
+ public void onPostExecute()
+ {
+ if (isCanceled()) return;
+ Calendar cal = DateUtils.getStartOfTodayCalendar();
+ int daysInMonth = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
+ int daysInQuarter = 91;
+ int daysInYear = cal.getActualMaximum(Calendar.DAY_OF_YEAR);
+
+ int den = habit.getFrequency().getDenominator();
+ double dailyTarget = habit.getTargetValue() / den;
+ Resources res = context.getResources();
+
+ ArrayList values = new ArrayList<>();
+ if (den <= 1) values.add(todayValue);
+ if (den <= 7) values.add(thisWeekValue);
+ values.add(thisMonthValue);
+ values.add(thisQuarterValue);
+ values.add(thisYearValue);
+ chart.setValues(values);
+
+ ArrayList targets = new ArrayList<>();
+ if (den <= 1) targets.add(dailyTarget);
+ if (den <= 7) targets.add(dailyTarget * 7);
+ targets.add(dailyTarget * daysInMonth);
+ targets.add(dailyTarget * daysInQuarter);
+ targets.add(dailyTarget * daysInYear);
+ chart.setTargets(targets);
+
+ ArrayList labels = new ArrayList<>();
+ if (den <= 1) labels.add(res.getString(R.string.today));
+ if (den <= 7) labels.add(res.getString(R.string.week));
+ labels.add(res.getString(R.string.month));
+ labels.add(res.getString(R.string.quarter));
+ labels.add(res.getString(R.string.year));
+ chart.setLabels(labels);
+ }
+
+ @Override
+ public void onPreExecute()
+ {
+ int color = PaletteUtils.getColor(context, habit.getColor());
+ if(title != null) title.setTextColor(color);
+ chart.setColor(color);
+ }
+ }
+}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsFragment.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsFragment.java
index 1ed257495..049f6e319 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsFragment.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsFragment.java
@@ -24,17 +24,26 @@ import android.content.*;
import android.net.*;
import android.os.*;
import android.provider.*;
-import android.support.annotation.*;
-import android.support.v7.preference.*;
+import android.util.*;
+
+import androidx.annotation.Nullable;
+import androidx.preference.ListPreference;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceFragmentCompat;
-import org.isoron.uhabits.*;
import org.isoron.uhabits.R;
+import org.isoron.uhabits.*;
import org.isoron.uhabits.core.preferences.*;
import org.isoron.uhabits.core.ui.*;
+import org.isoron.uhabits.core.utils.*;
import org.isoron.uhabits.notifications.*;
+import org.isoron.uhabits.widgets.*;
+
+import java.util.*;
import static android.media.RingtoneManager.*;
-import static android.os.Build.VERSION.SDK_INT;
+import static android.os.Build.VERSION.*;
import static org.isoron.uhabits.activities.habits.list.ListHabitsScreenKt.*;
public class SettingsFragment extends PreferenceFragmentCompat
@@ -49,6 +58,9 @@ public class SettingsFragment extends PreferenceFragmentCompat
@Nullable
private Preferences prefs;
+ @Nullable
+ private WidgetUpdater widgetUpdater;
+
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
@@ -73,6 +85,7 @@ public class SettingsFragment extends PreferenceFragmentCompat
{
HabitsApplication app = (HabitsApplication) appContext;
prefs = app.getComponent().getPreferences();
+ widgetUpdater = app.getComponent().getWidgetUpdater();
}
setResultOnPreferenceClick("importData", RESULT_IMPORT_DATA);
@@ -137,21 +150,38 @@ public class SettingsFragment extends PreferenceFragmentCompat
devCategory.setVisible(false);
}
- if (SDK_INT < Build.VERSION_CODES.O)
- findPreference("reminderCustomize").setVisible(false);
- else
- {
- findPreference("reminderSound").setVisible(false);
- findPreference("pref_snooze_interval").setVisible(false);
- }
+ updateWeekdayPreference();
+
+ // Temporarily disable this; we now always ask
+ findPreference("reminderSound").setVisible(false);
+ findPreference("pref_snooze_interval").setVisible(false);
updateSync();
}
+ private void updateWeekdayPreference()
+ {
+ if (prefs == null) return;
+ ListPreference weekdayPref = (ListPreference) findPreference("pref_first_weekday");
+ int currentFirstWeekday = prefs.getFirstWeekday();
+ String[] dayNames = DateUtils.getLongWeekdayNames(Calendar.SATURDAY);
+ String[] dayValues = {"7", "1", "2", "3", "4", "5", "6"};
+ weekdayPref.setEntries(dayNames);
+ weekdayPref.setEntryValues(dayValues);
+ weekdayPref.setDefaultValue(Integer.toString(currentFirstWeekday));
+ weekdayPref.setSummary(dayNames[currentFirstWeekday % 7]);
+ }
+
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
String key)
{
+ if (key.equals("pref_widget_opacity") && widgetUpdater != null)
+ {
+ Log.d("SettingsFragment", "updating widgets");
+ widgetUpdater.updateWidgets();
+ }
+ if (key.equals("pref_first_weekday")) updateWeekdayPreference();
BackupManager.dataChanged("org.isoron.uhabits");
updateSync();
}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/automation/EditSettingRootView.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/automation/EditSettingRootView.kt
index ac30043bc..83de784e1 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/automation/EditSettingRootView.kt
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/automation/EditSettingRootView.kt
@@ -21,8 +21,8 @@ package org.isoron.uhabits.automation
import android.R.layout.*
import android.content.*
-import android.support.v7.widget.*
-import android.support.v7.widget.Toolbar
+import androidx.appcompat.widget.*
+import androidx.appcompat.widget.Toolbar
import android.widget.*
import butterknife.*
import org.isoron.androidbase.activities.*
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentFactory.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentFactory.kt
index fd04ee1a4..2287a56d1 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentFactory.kt
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentFactory.kt
@@ -21,8 +21,10 @@ package org.isoron.uhabits.intents
import android.content.*
import android.net.*
+import org.isoron.androidbase.activities.*
import org.isoron.uhabits.*
import org.isoron.uhabits.activities.about.*
+import org.isoron.uhabits.activities.habits.edit.*
import org.isoron.uhabits.activities.habits.show.*
import org.isoron.uhabits.activities.intro.*
import org.isoron.uhabits.activities.settings.*
@@ -46,6 +48,9 @@ class IntentFactory
fun sendFeedback(context: Context) =
buildSendToIntent(context.getString(R.string.feedbackURL))
+ fun privacyPolicy(context: Context) =
+ buildViewIntent(context.getString(R.string.privacyPolicyURL))
+
fun startAboutActivity(context: Context) =
Intent(context, AboutActivity::class.java)
@@ -75,4 +80,24 @@ class IntentFactory
action = Intent.ACTION_VIEW
data = Uri.parse(url)
}
+
+ fun codeContributors(context: Context) =
+ buildViewIntent(context.getString(R.string.codeContributorsURL))
+
+ private fun startEditActivity(context: Context): Intent {
+ return Intent(context, EditHabitActivity::class.java)
+ }
+
+ fun startEditActivity(context: Context, habit: Habit): Intent {
+ val intent = startEditActivity(context)
+ intent.putExtra("habitId", habit.id)
+ intent.putExtra("habitType", habit.type)
+ return intent
+ }
+
+ fun startEditActivity(context: Context, habitType: Int): Intent {
+ val intent = startEditActivity(context)
+ intent.putExtra("habitType", habitType)
+ return intent
+ }
}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentParser.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentParser.kt
index 676e55a4f..ca2204c06 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentParser.kt
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentParser.kt
@@ -36,6 +36,11 @@ class IntentParser
return CheckmarkIntentData(parseHabit(uri), parseTimestamp(intent))
}
+ fun copyIntentData(source: Intent, destination: Intent) {
+ destination.data = source.data;
+ destination.putExtra("timestamp", source.getLongExtra("timestamp", DateUtils.getToday().unixTime))
+ }
+
private fun parseHabit(uri: Uri): Habit {
val habit = habits.getById(parseId(uri)) ?:
throw IllegalArgumentException("habit not found")
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentScheduler.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentScheduler.kt
index 689beb2ec..934942f15 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentScheduler.kt
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentScheduler.kt
@@ -25,25 +25,34 @@ import android.content.*
import android.content.Context.*
import android.os.Build.VERSION.*
import android.os.Build.VERSION_CODES.*
+import android.util.*
import org.isoron.androidbase.*
import org.isoron.uhabits.*
import org.isoron.uhabits.core.*
import org.isoron.uhabits.core.models.*
import org.isoron.uhabits.core.reminders.*
+import org.isoron.uhabits.core.utils.*
+import java.util.*
import javax.inject.*
@AppScope
class IntentScheduler
@Inject constructor(
@AppContext context: Context,
- private val pendingIntents: PendingIntentFactory,
- private val logger: HabitLogger
+ private val pendingIntents: PendingIntentFactory
) : ReminderScheduler.SystemScheduler {
private val manager =
context.getSystemService(ALARM_SERVICE) as AlarmManager
fun schedule(timestamp: Long, intent: PendingIntent) {
+ Log.d("IntentScheduler",
+ "timestamp=" + timestamp + " current=" + System.currentTimeMillis())
+ if (timestamp < System.currentTimeMillis()) {
+ Log.e("IntentScheduler",
+ "Ignoring attempt to schedule intent in the past.")
+ return;
+ }
if (SDK_INT >= M)
manager.setExactAndAllowWhileIdle(RTC_WAKEUP, timestamp, intent)
else
@@ -55,6 +64,19 @@ class IntentScheduler
timestamp: Long) {
val intent = pendingIntents.showReminder(habit, reminderTime, timestamp)
schedule(reminderTime, intent)
- logger.logReminderScheduled(habit, reminderTime)
+ logReminderScheduled(habit, reminderTime)
+ }
+
+ override fun log(componentName: String, msg: String) {
+ Log.d(componentName, msg)
+ }
+
+ private fun logReminderScheduled(habit: Habit, reminderTime: Long) {
+ val min = Math.min(5, habit.name.length)
+ val name = habit.name.substring(0, min)
+ val df = DateFormats.getBackupDateFormat()
+ val time = df.format(Date(reminderTime))
+ Log.i("ReminderHelper",
+ String.format("Setting alarm (%s): %s", time, name))
}
}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/intents/PendingIntentFactory.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/intents/PendingIntentFactory.kt
index 860e2f735..cb2f84532 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/intents/PendingIntentFactory.kt
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/intents/PendingIntentFactory.kt
@@ -64,7 +64,7 @@ class PendingIntentFactory
FLAG_UPDATE_CURRENT)
fun showHabit(habit: Habit): PendingIntent =
- android.support.v4.app.TaskStackBuilder
+ androidx.core.app.TaskStackBuilder
.create(context)
.addNextIntentWithParentStack(
intentFactory.startShowHabitActivity(
@@ -103,4 +103,19 @@ class PendingIntentFactory
if (timestamp != null) putExtra("timestamp", timestamp)
},
FLAG_UPDATE_CURRENT)
+
+ fun setNumericalValue(widgetContext: Context,
+ habit: Habit,
+ numericalValue: Int,
+ timestamp: Long?):
+ PendingIntent =
+ getBroadcast(
+ widgetContext, 2,
+ Intent(widgetContext, WidgetReceiver::class.java).apply {
+ data = Uri.parse(habit.uriString)
+ action = WidgetReceiver.ACTION_SET_NUMERICAL_VALUE
+ putExtra("numericalValue", numericalValue);
+ if (timestamp != null) putExtra("timestamp", timestamp)
+ },
+ FLAG_UPDATE_CURRENT)
}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/notifications/AndroidNotificationTray.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/notifications/AndroidNotificationTray.kt
index c588acddd..3fff2b615 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/notifications/AndroidNotificationTray.kt
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/notifications/AndroidNotificationTray.kt
@@ -25,9 +25,8 @@ import android.graphics.*
import android.graphics.BitmapFactory.*
import android.os.*
import android.os.Build.VERSION.*
-import android.support.annotation.*
-import android.support.v4.app.*
-import android.support.v4.app.NotificationCompat.*
+import androidx.core.app.*
+import androidx.core.app.NotificationCompat.*
import android.util.*
import org.isoron.androidbase.*
import org.isoron.uhabits.R
@@ -38,9 +37,6 @@ import org.isoron.uhabits.core.ui.*
import org.isoron.uhabits.intents.*
import javax.inject.*
-
-
-
@AppScope
class AndroidNotificationTray
@Inject constructor(
@@ -48,48 +44,49 @@ class AndroidNotificationTray
private val pendingIntents: PendingIntentFactory,
private val preferences: Preferences,
private val ringtoneManager: RingtoneManager
-) : NotificationTray.SystemTray {
-
+ ) : NotificationTray.SystemTray {
private var active = HashSet()
+ override fun log(msg: String) {
+ Log.d("AndroidNotificationTray", msg)
+ }
+
override fun removeNotification(id: Int) {
val manager = NotificationManagerCompat.from(context)
manager.cancel(id)
active.remove(id)
-
- // Clear the group summary notification
- if(active.isEmpty()) manager.cancelAll()
}
override fun showNotification(habit: Habit,
notificationId: Int,
timestamp: Timestamp,
- reminderTime: Long)
- {
+ reminderTime: Long) {
val notificationManager = NotificationManagerCompat.from(context)
- val summary = buildSummary(reminderTime)
- notificationManager.notify(Int.MAX_VALUE, summary)
+ //val summary = buildSummary(habit, reminderTime)
+ //notificationManager.notify(Int.MAX_VALUE, summary)
val notification = buildNotification(habit, reminderTime, timestamp)
createAndroidNotificationChannel(context)
try {
notificationManager.notify(notificationId, notification)
} catch (e: RuntimeException) {
// Some Xiaomi phones produce a RuntimeException if custom notification sounds are used.
- Log.i("AndroidNotificationTray", "Failed to show notification. Retrying without sound.")
- val n = buildNotification(habit, reminderTime, timestamp, disableSound = true)
+ Log.i("AndroidNotificationTray",
+ "Failed to show notification. Retrying without sound.")
+ val n = buildNotification(habit,
+ reminderTime,
+ timestamp,
+ disableSound = true)
notificationManager.notify(notificationId, n)
}
active.add(notificationId)
}
- @NonNull
- fun buildNotification(@NonNull habit: Habit,
- @NonNull reminderTime: Long,
- @NonNull timestamp: Timestamp,
- disableSound: Boolean = false) : Notification
- {
+ fun buildNotification(habit: Habit,
+ reminderTime: Long,
+ timestamp: Timestamp,
+ disableSound: Boolean = false): Notification {
val addRepetitionAction = Action(
R.drawable.ic_action_check,
@@ -111,10 +108,11 @@ class AndroidNotificationTray
.addAction(addRepetitionAction)
.addAction(removeRepetitionAction)
+ val defaultText = context.getString(R.string.default_reminder_question)
val builder = NotificationCompat.Builder(context, REMINDERS_CHANNEL_ID)
.setSmallIcon(R.drawable.ic_notification)
.setContentTitle(habit.name)
- .setContentText(habit.description)
+ .setContentText(if(habit.question.isBlank()) defaultText else habit.question)
.setContentIntent(pendingIntents.showHabit(habit))
.setDeleteIntent(pendingIntents.dismissNotification(habit))
.addAction(addRepetitionAction)
@@ -123,7 +121,7 @@ class AndroidNotificationTray
.setWhen(reminderTime)
.setShowWhen(true)
.setOngoing(preferences.shouldMakeNotificationsSticky())
- .setGroup("default")
+ .setGroup("group" + habit.getId())
if (!disableSound)
builder.setSound(ringtoneManager.getURI())
@@ -131,41 +129,37 @@ class AndroidNotificationTray
if (preferences.shouldMakeNotificationsLed())
builder.setLights(Color.RED, 1000, 1000)
- if(SDK_INT < Build.VERSION_CODES.O) {
- val snoozeAction = Action(R.drawable.ic_action_snooze,
- context.getString(R.string.snooze),
- pendingIntents.snoozeNotification(habit))
- wearableExtender.addAction(snoozeAction)
- builder.addAction(snoozeAction)
- }
+ val snoozeAction = Action(R.drawable.ic_action_snooze,
+ context.getString(R.string.snooze),
+ pendingIntents.snoozeNotification(habit))
+ wearableExtender.addAction(snoozeAction)
+ builder.addAction(snoozeAction)
builder.extend(wearableExtender)
- return builder.build()
+ return builder.build()
}
- @NonNull
- private fun buildSummary(@NonNull reminderTime: Long) : Notification
- {
+ 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("default")
+ .setGroup("group" + habit.getId())
.setGroupSummary(true)
.build()
}
companion object {
- private val REMINDERS_CHANNEL_ID = "REMINDERS"
+ private const val REMINDERS_CHANNEL_ID = "REMINDERS"
fun createAndroidNotificationChannel(context: Context) {
val notificationManager = context.getSystemService(Activity.NOTIFICATION_SERVICE)
as NotificationManager
- if (SDK_INT >= Build.VERSION_CODES.O)
- {
+ if (SDK_INT >= Build.VERSION_CODES.O) {
val channel = NotificationChannel(REMINDERS_CHANNEL_ID,
- context.resources.getString(R.string.reminder),
- NotificationManager.IMPORTANCE_DEFAULT)
+ context.resources.getString(R.string.reminder),
+ NotificationManager.IMPORTANCE_DEFAULT)
notificationManager.createNotificationChannel(channel)
}
}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/notifications/SnoozeDelayPickerActivity.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/notifications/SnoozeDelayPickerActivity.java
index 03d26a707..0beeb9ca2 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/notifications/SnoozeDelayPickerActivity.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/notifications/SnoozeDelayPickerActivity.java
@@ -2,13 +2,17 @@ package org.isoron.uhabits.notifications;
import android.app.*;
+import android.graphics.*;
import android.os.*;
-import android.support.annotation.*;
-import android.support.v4.app.*;
+
+import androidx.annotation.Nullable;
+import androidx.core.app.*;
import android.text.format.*;
import android.view.*;
import android.widget.*;
+import androidx.fragment.app.FragmentActivity;
+
import com.android.datetimepicker.time.TimePickerDialog;
import org.isoron.uhabits.*;
@@ -26,6 +30,9 @@ public class SnoozeDelayPickerActivity extends FragmentActivity
private ReminderController reminderController;
+ @Nullable
+ private AlertDialog dialog;
+
@Override
protected void onCreate(@Nullable Bundle bundle)
{
@@ -40,7 +47,7 @@ public class SnoozeDelayPickerActivity extends FragmentActivity
if (habit == null) finish();
int theme = R.style.Theme_AppCompat_Light_Dialog_Alert;
- AlertDialog dialog = new AlertDialog.Builder(new ContextThemeWrapper(this, theme))
+ dialog = new AlertDialog.Builder(new ContextThemeWrapper(this, theme))
.setTitle(R.string.select_snooze_delay)
.setItems(R.array.snooze_picker_names, null)
.create();
@@ -60,7 +67,8 @@ public class SnoozeDelayPickerActivity extends FragmentActivity
},
calendar.get(Calendar.HOUR_OF_DAY),
calendar.get(Calendar.MINUTE),
- DateFormat.is24HourFormat(this));
+ DateFormat.is24HourFormat(this),
+ Color.BLUE);
dialog.show(getSupportFragmentManager(), "timePicker");
}
@@ -82,4 +90,11 @@ public class SnoozeDelayPickerActivity extends FragmentActivity
super.finish();
overridePendingTransition(0, 0);
}
+
+ @Override
+ protected void onPause()
+ {
+ if (dialog != null) dialog.dismiss();
+ super.onPause();
+ }
}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/receivers/ReminderController.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/receivers/ReminderController.java
index c253064f1..046aee432 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/receivers/ReminderController.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/receivers/ReminderController.java
@@ -21,7 +21,8 @@ package org.isoron.uhabits.receivers;
import android.content.*;
import android.net.*;
-import android.support.annotation.*;
+
+import androidx.annotation.NonNull;
import org.isoron.uhabits.core.*;
import org.isoron.uhabits.core.models.*;
@@ -70,22 +71,18 @@ public class ReminderController
public void onSnoozePressed(@NonNull Habit habit, final Context context)
{
- long delay = preferences.getSnoozeInterval();
-
- if (delay < 0)
- showSnoozeDelayPicker(habit, context);
- else
- scheduleReminderMinutesFromNow(habit, delay);
+ showSnoozeDelayPicker(habit, context);
}
- public void onSnoozeDelayPicked(Habit habit, int delay)
+ public void onSnoozeDelayPicked(Habit habit, int delayInMinutes)
{
- scheduleReminderMinutesFromNow(habit, delay);
+ reminderScheduler.snoozeReminder(habit, delayInMinutes);
+ notificationTray.cancel(habit);
}
public void onSnoozeTimePicked(Habit habit, int hour, int minute)
{
- Long time = DateUtils.getUpcomingTimeInMillis(hour, minute);
+ long time = DateUtils.getUpcomingTimeInMillis(hour, minute);
reminderScheduler.scheduleAtTime(habit, time);
notificationTray.cancel(habit);
}
@@ -95,12 +92,6 @@ public class ReminderController
notificationTray.cancel(habit);
}
- private void scheduleReminderMinutesFromNow(Habit habit, long minutes)
- {
- reminderScheduler.scheduleMinutesFromNow(habit, minutes);
- notificationTray.cancel(habit);
- }
-
private void showSnoozeDelayPicker(@NonNull Habit habit, Context context)
{
context.sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/receivers/ReminderReceiver.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/receivers/ReminderReceiver.java
index dff612345..c6e29a63b 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/receivers/ReminderReceiver.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/receivers/ReminderReceiver.java
@@ -20,9 +20,10 @@
package org.isoron.uhabits.receivers;
import android.content.*;
-import android.support.annotation.*;
import android.util.*;
+import androidx.annotation.Nullable;
+
import org.isoron.uhabits.*;
import org.isoron.uhabits.core.models.*;
import org.isoron.uhabits.core.utils.*;
@@ -65,8 +66,8 @@ public class ReminderReceiver extends BroadcastReceiver
if (intent.getData() != null)
habit = habits.getById(parseId(intent.getData()));
- final Long timestamp = intent.getLongExtra("timestamp", today);
- final Long reminderTime = intent.getLongExtra("reminderTime", today);
+ final long timestamp = intent.getLongExtra("timestamp", today);
+ final long reminderTime = intent.getLongExtra("reminderTime", today);
try
{
@@ -74,21 +75,29 @@ public class ReminderReceiver extends BroadcastReceiver
{
case ACTION_SHOW_REMINDER:
if (habit == null) return;
+ Log.d("ReminderReceiver", String.format(
+ "onShowReminder habit=%d timestamp=%d reminderTime=%d",
+ habit.id,
+ timestamp,
+ reminderTime));
reminderController.onShowReminder(habit,
new Timestamp(timestamp), reminderTime);
break;
case ACTION_DISMISS_REMINDER:
if (habit == null) return;
+ Log.d("ReminderReceiver", String.format("onDismiss habit=%d", habit.id));
reminderController.onDismiss(habit);
break;
case ACTION_SNOOZE_REMINDER:
if (habit == null) return;
+ Log.d("ReminderReceiver", String.format("onSnoozePressed habit=%d", habit.id));
reminderController.onSnoozePressed(habit, context);
break;
case Intent.ACTION_BOOT_COMPLETED:
+ Log.d("ReminderReceiver", "onBootCompleted");
reminderController.onBootCompleted();
break;
}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.java
index 7074224e8..20e0f65a7 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.java
@@ -27,6 +27,7 @@ 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.activities.*;
import dagger.*;
@@ -38,33 +39,40 @@ import dagger.*;
public class WidgetReceiver extends BroadcastReceiver
{
public static final String ACTION_ADD_REPETITION =
- "org.isoron.uhabits.ACTION_ADD_REPETITION";
+ "org.isoron.uhabits.ACTION_ADD_REPETITION";
public static final String ACTION_DISMISS_REMINDER =
- "org.isoron.uhabits.ACTION_DISMISS_REMINDER";
+ "org.isoron.uhabits.ACTION_DISMISS_REMINDER";
public static final String ACTION_REMOVE_REPETITION =
- "org.isoron.uhabits.ACTION_REMOVE_REPETITION";
+ "org.isoron.uhabits.ACTION_REMOVE_REPETITION";
public static final String ACTION_TOGGLE_REPETITION =
- "org.isoron.uhabits.ACTION_TOGGLE_REPETITION";
+ "org.isoron.uhabits.ACTION_TOGGLE_REPETITION";
+
+ public static final String ACTION_SET_NUMERICAL_VALUE =
+ "org.isoron.uhabits.ACTION_SET_NUMERICAL_VALUE";
+
+ private static final String TAG = "WidgetReceiver";
@Override
public void onReceive(final Context context, Intent intent)
{
HabitsApplication app =
- (HabitsApplication) context.getApplicationContext();
+ (HabitsApplication) context.getApplicationContext();
WidgetComponent component = DaggerWidgetReceiver_WidgetComponent
- .builder()
- .habitsApplicationComponent(app.getComponent())
- .build();
+ .builder()
+ .habitsApplicationComponent(app.getComponent())
+ .build();
IntentParser parser = app.getComponent().getIntentParser();
WidgetBehavior controller = component.getWidgetController();
Preferences prefs = app.getComponent().getPreferences();
- if(prefs.isSyncEnabled())
+ Log.i(TAG, String.format("Received intent: %s", intent.toString()));
+
+ if (prefs.isSyncEnabled())
context.startService(new Intent(context, SyncService.class));
try
@@ -75,18 +83,38 @@ public class WidgetReceiver extends BroadcastReceiver
switch (intent.getAction())
{
case ACTION_ADD_REPETITION:
+ Log.d(TAG, String.format(
+ "onAddRepetition habit=%d timestamp=%d",
+ data.getHabit().getId(),
+ data.getTimestamp().getUnixTime()));
controller.onAddRepetition(data.getHabit(),
- data.getTimestamp());
+ data.getTimestamp());
break;
case ACTION_TOGGLE_REPETITION:
+ Log.d(TAG, String.format(
+ "onToggleRepetition habit=%d timestamp=%d",
+ data.getHabit().getId(),
+ data.getTimestamp().getUnixTime()));
controller.onToggleRepetition(data.getHabit(),
- data.getTimestamp());
+ data.getTimestamp());
break;
case ACTION_REMOVE_REPETITION:
+ Log.d(TAG, String.format(
+ "onRemoveRepetition habit=%d timestamp=%d",
+ data.getHabit().getId(),
+ data.getTimestamp().getUnixTime()));
controller.onRemoveRepetition(data.getHabit(),
- data.getTimestamp());
+ data.getTimestamp());
+ break;
+ case ACTION_SET_NUMERICAL_VALUE:
+ Intent numberSelectorIntent = new Intent(context, NumericalCheckmarkWidgetActivity.class);
+ numberSelectorIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ numberSelectorIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
+ numberSelectorIntent.setAction(NumericalCheckmarkWidgetActivity.ACTION_SHOW_NUMERICAL_VALUE_ACTIVITY);
+ parser.copyIntentData(intent,numberSelectorIntent);
+ context.startActivity(numberSelectorIntent);
break;
}
}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/sync/Event.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/sync/Event.java
index dba845cf6..3d15d0d3e 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/sync/Event.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/sync/Event.java
@@ -19,7 +19,8 @@
package org.isoron.uhabits.sync;
-import android.support.annotation.*;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import org.isoron.uhabits.core.database.*;
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/sync/SyncManager.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/sync/SyncManager.java
index 5d60009c8..88fecb6bf 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/sync/SyncManager.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/sync/SyncManager.java
@@ -19,9 +19,11 @@
package org.isoron.uhabits.sync;
-import android.support.annotation.*;
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.*;
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/sync/SyncService.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/sync/SyncService.java
index b844e33d8..12adf46f2 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/sync/SyncService.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/sync/SyncService.java
@@ -23,7 +23,7 @@ import android.app.*;
import android.content.*;
import android.net.*;
import android.os.*;
-import android.support.v4.app.*;
+import androidx.core.app.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.core.preferences.*;
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/tasks/AndroidTaskRunner.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/tasks/AndroidTaskRunner.java
index 7b60834ba..17df191c7 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/tasks/AndroidTaskRunner.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/tasks/AndroidTaskRunner.java
@@ -87,6 +87,7 @@ public class AndroidTaskRunner implements TaskRunner
private class CustomAsyncTask extends AsyncTask
{
private final Task task;
+ private boolean isCancelled = false;
public CustomAsyncTask(Task task)
{
@@ -106,6 +107,7 @@ public class AndroidTaskRunner implements TaskRunner
@Override
protected Void doInBackground(Void... params)
{
+ if(isCancelled) return null;
task.doInBackground();
return null;
}
@@ -113,6 +115,7 @@ public class AndroidTaskRunner implements TaskRunner
@Override
protected void onPostExecute(Void aVoid)
{
+ if(isCancelled) return;
task.onPostExecute();
activeTasks.remove(this);
taskToAsyncTask.remove(task);
@@ -122,6 +125,8 @@ public class AndroidTaskRunner implements TaskRunner
@Override
protected void onPreExecute()
{
+ isCancelled = task.isCanceled();
+ if(isCancelled) return;
for (Listener l : listeners) l.onTaskStarted(task);
activeTasks.add(this);
taskToAsyncTask.put(task, this);
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/tasks/ExportDBTask.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/tasks/ExportDBTask.java
index b74c33915..1bc67d195 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/tasks/ExportDBTask.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/tasks/ExportDBTask.java
@@ -20,7 +20,9 @@
package org.isoron.uhabits.tasks;
import android.content.*;
-import android.support.annotation.*;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import com.google.auto.factory.*;
@@ -66,7 +68,7 @@ public class ExportDBTask implements Task
}
catch (IOException e)
{
- e.printStackTrace();
+ throw new RuntimeException(e);
}
}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/tasks/ImportDataTask.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/tasks/ImportDataTask.java
index 52e536955..6740e2ab4 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/tasks/ImportDataTask.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/tasks/ImportDataTask.java
@@ -19,7 +19,7 @@
package org.isoron.uhabits.tasks;
-import android.support.annotation.*;
+import androidx.annotation.NonNull;
import com.google.auto.factory.*;
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/utils/AndroidDateFormats.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/utils/AndroidDateFormats.java
index 81e72b3b0..4580997aa 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/utils/AndroidDateFormats.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/utils/AndroidDateFormats.java
@@ -18,7 +18,7 @@
*/
package org.isoron.uhabits.utils;
-import android.support.annotation.*;
+import androidx.annotation.NonNull;
import org.isoron.uhabits.core.utils.*;
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/utils/AndroidDateUtils.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/utils/AndroidDateUtils.java
index e07f7b708..82d1e56e1 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/utils/AndroidDateUtils.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/utils/AndroidDateUtils.java
@@ -41,8 +41,8 @@ public class AndroidDateUtils
public static String formatWeekdayList(Context context, boolean weekday[])
{
- String shortDayNames[] = org.isoron.uhabits.core.utils.DateUtils.getShortDayNames();
- String longDayNames[] = org.isoron.uhabits.core.utils.DateUtils.getLongDayNames();
+ String shortDayNames[] = org.isoron.uhabits.core.utils.DateUtils.getShortWeekdayNames(Calendar.SATURDAY);
+ String longDayNames[] = org.isoron.uhabits.core.utils.DateUtils.getLongWeekdayNames(Calendar.SATURDAY);
StringBuilder buffer = new StringBuilder();
int count = 0;
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/utils/AttributeSetUtils.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/utils/AttributeSetUtils.java
index 67c9de531..35a6553ac 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/utils/AttributeSetUtils.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/utils/AttributeSetUtils.java
@@ -20,8 +20,9 @@
package org.isoron.uhabits.utils;
import android.content.*;
-import android.support.annotation.*;
-import android.support.annotation.Nullable;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import android.util.*;
import org.jetbrains.annotations.*;
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/utils/DatabaseUtils.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/utils/DatabaseUtils.java
index 8f99eb42d..1108ad3d2 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/utils/DatabaseUtils.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/utils/DatabaseUtils.java
@@ -21,7 +21,9 @@ package org.isoron.uhabits.utils;
import android.content.*;
import android.database.sqlite.*;
-import android.support.annotation.*;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import org.isoron.androidbase.utils.*;
import org.isoron.uhabits.*;
@@ -98,7 +100,7 @@ public abstract class DatabaseUtils
File db = getDatabaseFile(context);
File dbCopy = new File(filename);
- FileUtils.copy(db, dbCopy);
+ FileUtilsKt.copyTo(db, dbCopy);
return dbCopy.getAbsolutePath();
}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/utils/PaletteUtils.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/utils/PaletteUtils.kt
index 6e205a5a6..aa8fe20af 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/utils/PaletteUtils.kt
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/utils/PaletteUtils.kt
@@ -9,7 +9,7 @@ object PaletteUtils {
@JvmStatic
fun colorToPaletteIndex(context: Context, color: Int): Int {
- val palette = StyledResources(context).palette
+ val palette = StyledResources(context).getPalette()
return palette.indexOf(color)
}
@@ -43,7 +43,7 @@ object PaletteUtils {
@JvmStatic
fun getColor(context: Context, paletteColor: Int): Int {
- val palette = StyledResources(context).palette
+ val palette = StyledResources(context).getPalette()
return if (paletteColor in palette.indices) {
palette[paletteColor]
} else {
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/utils/ViewExtensions.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/utils/ViewExtensions.kt
index a613f884d..f2ff5e1f6 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/utils/ViewExtensions.kt
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/utils/ViewExtensions.kt
@@ -20,13 +20,13 @@
package org.isoron.uhabits.utils
import android.graphics.*
-import android.support.annotation.*
-import android.support.design.widget.*
-import android.support.v7.widget.Toolbar
+import androidx.annotation.*
+import androidx.appcompat.widget.Toolbar
import android.view.*
import android.view.ViewGroup.LayoutParams.*
import android.widget.*
import android.widget.RelativeLayout.*
+import com.google.android.material.snackbar.Snackbar
import org.isoron.androidbase.utils.*
import org.isoron.uhabits.*
@@ -74,7 +74,7 @@ fun ViewGroup.buildToolbar(): Toolbar {
fun View.showMessage(@StringRes stringId: Int) {
try {
val snackbar = Snackbar.make(this, stringId, Snackbar.LENGTH_SHORT)
- val tvId = android.support.design.R.id.snackbar_text
+ val tvId = R.id.snackbar_text
val tv = snackbar.view.findViewById(tvId)
tv?.setTextColor(Color.WHITE)
snackbar.show()
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/BaseWidget.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/BaseWidget.java
index af99d4a3a..043892101 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/BaseWidget.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/BaseWidget.java
@@ -22,10 +22,11 @@ package org.isoron.uhabits.widgets;
import android.app.*;
import android.content.*;
import android.graphics.*;
-import android.support.annotation.*;
import android.view.*;
import android.widget.*;
+import androidx.annotation.NonNull;
+
import org.isoron.uhabits.*;
import org.isoron.uhabits.core.preferences.*;
import org.isoron.uhabits.intents.*;
@@ -201,4 +202,8 @@ public abstract class BaseWidget
view.measure(specWidth, specHeight);
view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
}
+
+ protected int getPreferedBackgroundAlpha() {
+ return prefs.getWidgetOpacity();
+ }
}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/BaseWidgetProvider.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/BaseWidgetProvider.java
index edd2ce29f..98718da33 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/BaseWidgetProvider.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/BaseWidgetProvider.java
@@ -22,9 +22,11 @@ package org.isoron.uhabits.widgets;
import android.appwidget.*;
import android.content.*;
import android.os.*;
-import android.support.annotation.*;
import android.widget.*;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
import org.isoron.uhabits.*;
import org.isoron.uhabits.core.models.*;
import org.isoron.uhabits.core.preferences.*;
@@ -39,6 +41,7 @@ public abstract class BaseWidgetProvider extends AppWidgetProvider
private HabitList habits;
private Preferences preferences;
+
private WidgetPreferences widgetPrefs;
public static void updateAppWidget(@NonNull AppWidgetManager manager,
@@ -77,9 +80,8 @@ public abstract class BaseWidgetProvider extends AppWidgetProvider
if (context == null) throw new RuntimeException("context is null");
if (manager == null) throw new RuntimeException("manager is null");
if (options == null) throw new RuntimeException("options is null");
- context.setTheme(R.style.OpaqueWidgetTheme);
-
updateDependencies(context);
+ context.setTheme(R.style.WidgetTheme);
BaseWidget widget = getWidgetFromId(context, widgetId);
WidgetDimensions dims = getDimensionsFromOptions(context, options);
@@ -124,12 +126,7 @@ public abstract class BaseWidgetProvider extends AppWidgetProvider
if (manager == null) throw new RuntimeException("manager is null");
if (widgetIds == null) throw new RuntimeException("widgetIds is null");
updateDependencies(context);
-
- if(preferences.isWidgetStackEnabled()) {
- context.setTheme(R.style.OpaqueWidgetTheme);
- } else {
- context.setTheme(R.style.TransparentWidgetTheme);
- }
+ context.setTheme(R.style.WidgetTheme);
new Thread(() ->
{
@@ -183,7 +180,6 @@ public abstract class BaseWidgetProvider extends AppWidgetProvider
BaseWidget widget = getWidgetFromId(context, widgetId);
Bundle options = manager.getAppWidgetOptions(widgetId);
widget.setDimensions(getDimensionsFromOptions(context, options));
-
updateAppWidget(manager, widget);
}
catch (RuntimeException e)
@@ -201,4 +197,9 @@ public abstract class BaseWidgetProvider extends AppWidgetProvider
preferences = app.getComponent().getPreferences();
widgetPrefs = app.getComponent().getWidgetPreferences();
}
+
+ public Preferences getPreferences()
+ {
+ return preferences;
+ }
}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidget.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidget.kt
index 53316ad9c..588a7fa25 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidget.kt
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidget.kt
@@ -19,32 +19,58 @@
package org.isoron.uhabits.widgets
+import android.app.*
import android.content.*
import android.view.*
import org.isoron.uhabits.core.models.*
import org.isoron.uhabits.utils.*
import org.isoron.uhabits.widgets.views.*
-class CheckmarkWidget(
+open class CheckmarkWidget(
context: Context,
widgetId: Int,
- private val habit: Habit
+ protected val habit: Habit
) : BaseWidget(context, widgetId) {
- override fun getOnClickPendingIntent(context: Context) =
+ override fun getOnClickPendingIntent(context: Context): PendingIntent {
+ return if (habit.isNumerical) {
+ pendingIntentFactory.setNumericalValue(context, habit, 10, null)
+ } else {
pendingIntentFactory.toggleCheckmark(habit, null)
+ }
+ }
override fun refreshData(v: View) {
(v as CheckmarkWidgetView).apply {
- setPercentage(habit.scores.todayValue.toFloat())
+ setBackgroundAlpha(preferedBackgroundAlpha)
+
setActiveColor(PaletteUtils.getColor(context, habit.color))
setName(habit.name)
setCheckmarkValue(habit.checkmarks.todayValue)
+ if (habit.isNumerical) {
+ setNumerical(true)
+ setCheckmarkState(getNumericalCheckmarkState())
+ } else {
+ setCheckmarkState(habit.checkmarks.todayValue)
+ }
+ setPercentage(habit.scores.todayValue.toFloat())
refresh()
}
}
- override fun buildView() = CheckmarkWidgetView(context)
+ override fun buildView(): View {
+ return CheckmarkWidgetView(context)
+ }
+
override fun getDefaultHeight() = 125
override fun getDefaultWidth() = 125
+
+ private fun getNumericalCheckmarkState(): Int {
+ return if (habit.isCompletedToday) {
+ Checkmark.CHECKED_EXPLICITLY
+ } else {
+ Checkmark.UNCHECKED
+ }
+ }
+
}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/FrequencyWidget.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/FrequencyWidget.kt
index 5516f2bc9..bdc60a3f6 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/FrequencyWidget.kt
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/FrequencyWidget.kt
@@ -29,7 +29,8 @@ import org.isoron.uhabits.widgets.views.*
class FrequencyWidget(
context: Context,
widgetId: Int,
- private val habit: Habit
+ private val habit: Habit,
+ private val firstWeekday: Int
) : BaseWidget(context, widgetId) {
override fun getOnClickPendingIntent(context: Context) =
@@ -38,7 +39,9 @@ class FrequencyWidget(
override fun refreshData(v: View) {
val widgetView = v as GraphWidgetView
widgetView.setTitle(habit.name)
+ widgetView.setBackgroundAlpha(preferedBackgroundAlpha)
(widgetView.dataView as FrequencyChart).apply {
+ setFirstWeekday(firstWeekday)
setColor(PaletteUtils.getColor(context, habit.color))
setFrequency(habit.repetitions.weekdayFrequency)
}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/FrequencyWidgetProvider.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/FrequencyWidgetProvider.kt
index 8c724d17e..83aedc39c 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/FrequencyWidgetProvider.kt
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/FrequencyWidgetProvider.kt
@@ -24,7 +24,10 @@ import android.content.*
class FrequencyWidgetProvider : BaseWidgetProvider() {
override fun getWidgetFromId(context: Context, id: Int): BaseWidget {
val habits = getHabitsFromWidgetId(id)
- if (habits.size == 1) return FrequencyWidget(context, id, habits[0])
+ if (habits.size == 1) return FrequencyWidget(context,
+ id,
+ habits[0],
+ preferences.firstWeekday)
else return StackWidget(context, id, StackWidgetType.FREQUENCY, habits)
}
}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/HistoryWidget.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/HistoryWidget.kt
index b9f4df952..9860b3e15 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/HistoryWidget.kt
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/HistoryWidget.kt
@@ -30,7 +30,8 @@ import org.isoron.uhabits.widgets.views.*
class HistoryWidget(
context: Context,
id: Int,
- private val habit: Habit
+ private val habit: Habit,
+ private val firstWeekday: Int
) : BaseWidget(context, id) {
override fun getOnClickPendingIntent(context: Context): PendingIntent {
@@ -39,7 +40,9 @@ class HistoryWidget(
override fun refreshData(view: View) {
val widgetView = view as GraphWidgetView
+ widgetView.setBackgroundAlpha(preferedBackgroundAlpha)
(widgetView.dataView as HistoryChart).apply {
+ setFirstWeekday(firstWeekday)
setColor(PaletteUtils.getColor(context, habit.color))
setCheckmarks(habit.checkmarks.allValues)
}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/HistoryWidgetProvider.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/HistoryWidgetProvider.kt
index 0f4199b12..fe962ce51 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/HistoryWidgetProvider.kt
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/HistoryWidgetProvider.kt
@@ -23,7 +23,10 @@ import android.content.*
class HistoryWidgetProvider : BaseWidgetProvider() {
override fun getWidgetFromId(context: Context, id: Int): BaseWidget {
val habits = getHabitsFromWidgetId(id)
- if (habits.size == 1) return HistoryWidget(context, id, habits[0])
+ if (habits.size == 1) return HistoryWidget(context,
+ id,
+ habits[0],
+ preferences.firstWeekday)
else return StackWidget(context, id, StackWidgetType.HISTORY, habits)
}
}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/ScoreWidget.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/ScoreWidget.kt
index 54ddabaa1..93dbf6792 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/ScoreWidget.kt
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/ScoreWidget.kt
@@ -40,10 +40,12 @@ class ScoreWidget(
val size = ScoreCard.BUCKET_SIZES[prefs.defaultScoreSpinnerPosition]
val scores = when(size) {
1 -> habit.scores.toList()
- else -> habit.scores.groupBy(ScoreCard.getTruncateField(size))
+ else -> habit.scores.groupBy(ScoreCard.getTruncateField(size),
+ prefs.firstWeekday)
}
val widgetView = view as GraphWidgetView
+ widgetView.setBackgroundAlpha(preferedBackgroundAlpha)
(widgetView.dataView as ScoreChart).apply {
setIsTransparencyEnabled(true)
setBucketSize(size)
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/StackWidgetService.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/StackWidgetService.java
index b753c2c2d..64b4be5a9 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/StackWidgetService.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/StackWidgetService.java
@@ -3,12 +3,14 @@ package org.isoron.uhabits.widgets;
import android.appwidget.*;
import android.content.*;
import android.os.*;
-import android.support.annotation.*;
import android.util.Log;
import android.widget.*;
+import androidx.annotation.NonNull;
+
import org.isoron.uhabits.*;
import org.isoron.uhabits.core.models.*;
+import org.isoron.uhabits.core.preferences.*;
import org.isoron.uhabits.core.utils.*;
import java.util.*;
@@ -87,18 +89,19 @@ class StackRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory
}
@NonNull
- private BaseWidget constructWidget(@NonNull Habit habit)
+ private BaseWidget constructWidget(@NonNull Habit habit,
+ @NonNull Preferences prefs)
{
switch (widgetType)
{
case CHECKMARK:
return new CheckmarkWidget(context, widgetId, habit);
case FREQUENCY:
- return new FrequencyWidget(context, widgetId, habit);
+ return new FrequencyWidget(context, widgetId, habit, prefs.getFirstWeekday());
case SCORE:
return new ScoreWidget(context, widgetId, habit);
case HISTORY:
- return new HistoryWidget(context, widgetId, habit);
+ return new HistoryWidget(context, widgetId, habit, prefs.getFirstWeekday());
case STREAKS:
return new StreakWidget(context, widgetId, habit);
}
@@ -136,6 +139,7 @@ class StackRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory
Log.i("StackRemoteViewsFactory", "onDataSetChanged started");
HabitsApplication app = (HabitsApplication) context.getApplicationContext();
+ Preferences prefs = app.getComponent().getPreferences();
HabitList habitList = app.getComponent().getHabitList();
Bundle options = AppWidgetManager.getInstance(context).getAppWidgetOptions(widgetId);
ArrayList newRemoteViews = new ArrayList<>();
@@ -147,7 +151,7 @@ class StackRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory
Habit h = habitList.getById(id);
if (h == null) throw new HabitNotFoundException();
- BaseWidget widget = constructWidget(h);
+ BaseWidget widget = constructWidget(h, prefs);
widget.setDimensions(getDimensionsFromOptions(context, options));
RemoteViews landscapeViews = widget.getLandscapeRemoteViews();
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/StackWidgetType.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/StackWidgetType.java
index a5aeebb82..7a014f394 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/StackWidgetType.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/StackWidgetType.java
@@ -12,7 +12,8 @@ public enum StackWidgetType {
FREQUENCY(1),
SCORE(2), // habit strength widget
HISTORY(3),
- STREAKS(4);
+ STREAKS(4),
+ TARGET(5);
private int value;
StackWidgetType(int value) {
@@ -34,6 +35,8 @@ public enum StackWidgetType {
return HISTORY;
} else if (STREAKS.getValue() == value) {
return STREAKS;
+ } else if (TARGET.getValue() == value) {
+ return TARGET;
}
return null;
}
@@ -50,6 +53,8 @@ public enum StackWidgetType {
return R.layout.history_stackview_widget;
case STREAKS:
return R.layout.streak_stackview_widget;
+ case TARGET:
+ return R.layout.target_stackview_widget;
}
return 0;
}
@@ -66,6 +71,8 @@ public enum StackWidgetType {
return R.id.historyStackWidgetView;
case STREAKS:
return R.id.streakStackWidgetView;
+ case TARGET:
+ return R.id.targetStackWidgetView;
}
return 0;
}
@@ -82,6 +89,8 @@ public enum StackWidgetType {
return R.id.historyStackWidgetEmptyView;
case STREAKS:
return R.id.streakStackWidgetEmptyView;
+ case TARGET:
+ return R.id.targetStackWidgetEmptyView;
}
return 0;
}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/StreakWidget.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/StreakWidget.kt
index f8795e297..73d823c31 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/StreakWidget.kt
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/StreakWidget.kt
@@ -39,6 +39,7 @@ class StreakWidget(
override fun refreshData(view: View) {
val widgetView = view as GraphWidgetView
+ widgetView.setBackgroundAlpha(preferedBackgroundAlpha)
(widgetView.dataView as StreakChart).apply {
setColor(PaletteUtils.getColor(context, habit.color))
setStreaks(habit.streaks.getBest(maxStreakCount))
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/TargetWidget.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/TargetWidget.kt
new file mode 100644
index 000000000..e38e25f9e
--- /dev/null
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/TargetWidget.kt
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2016 Álinson Santos Xavier
+ *
+ * This file is part of Loop Habit Tracker.
+ *
+ * Loop Habit Tracker is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Loop Habit Tracker is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see .
+ */
+
+package org.isoron.uhabits.widgets
+
+import android.content.*
+import android.view.*
+import android.view.ViewGroup.*
+import android.view.ViewGroup.LayoutParams.*
+import org.isoron.uhabits.activities.common.views.*
+import org.isoron.uhabits.activities.habits.show.views.*
+import org.isoron.uhabits.core.models.*
+import org.isoron.uhabits.widgets.views.*
+
+class TargetWidget(
+ context: Context,
+ id: Int,
+ private val habit: Habit
+) : BaseWidget(context, id) {
+
+ override fun getOnClickPendingIntent(context: Context) =
+ pendingIntentFactory.showHabit(habit)
+
+ override fun refreshData(view: View) {
+ val widgetView = view as GraphWidgetView
+ widgetView.setBackgroundAlpha(preferedBackgroundAlpha)
+ val chart = (widgetView.dataView as TargetChart)
+ with(TargetCard.RefreshTask(context, habit, prefs.firstWeekday, chart, null)) {
+ onPreExecute()
+ doInBackground()
+ onPostExecute()
+ }
+ }
+
+ override fun buildView(): View {
+ return GraphWidgetView(context, TargetChart(context)).apply {
+ setTitle(habit.name)
+ layoutParams = LayoutParams(MATCH_PARENT, MATCH_PARENT)
+ }
+ }
+
+ override fun getDefaultHeight() = 200
+ override fun getDefaultWidth() = 200
+}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/TargetWidgetProvider.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/TargetWidgetProvider.kt
new file mode 100644
index 000000000..90524c890
--- /dev/null
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/TargetWidgetProvider.kt
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2016 Álinson Santos Xavier
+ *
+ * This file is part of Loop Habit Tracker.
+ *
+ * Loop Habit Tracker is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Loop Habit Tracker is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see .
+ */
+package org.isoron.uhabits.widgets
+
+import android.content.*
+
+class TargetWidgetProvider : BaseWidgetProvider() {
+ override fun getWidgetFromId(context: Context, id: Int): BaseWidget {
+ val habits = getHabitsFromWidgetId(id)
+ if (habits.size == 1) return TargetWidget(context, id, habits[0])
+ else return StackWidget(context, id, StackWidgetType.TARGET, habits)
+ }
+}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/WidgetUpdater.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/WidgetUpdater.kt
index b8293582a..17d6d5d77 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/WidgetUpdater.kt
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/WidgetUpdater.kt
@@ -67,6 +67,7 @@ class WidgetUpdater
updateWidgets(modifiedHabitId, ScoreWidgetProvider::class.java)
updateWidgets(modifiedHabitId, StreakWidgetProvider::class.java)
updateWidgets(modifiedHabitId, FrequencyWidgetProvider::class.java)
+ updateWidgets(modifiedHabitId, TargetWidgetProvider::class.java)
}
}
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/activities/NumericalCheckmarkWidgetActivity.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/activities/NumericalCheckmarkWidgetActivity.kt
new file mode 100644
index 000000000..cc1b22421
--- /dev/null
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/activities/NumericalCheckmarkWidgetActivity.kt
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2016-2020 Álinson Santos Xavier
+ *
+ * This file is part of Loop Habit Tracker.
+ *
+ * Loop Habit Tracker is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * Loop Habit Tracker is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see .
+ */
+
+package org.isoron.uhabits.widgets.activities
+
+import android.app.*
+import android.content.*
+import android.os.*
+import android.view.*
+import android.widget.FrameLayout
+import org.isoron.uhabits.*
+import org.isoron.uhabits.activities.*
+import org.isoron.uhabits.activities.common.dialogs.*
+import org.isoron.uhabits.core.ui.screens.habits.list.*
+import org.isoron.uhabits.core.ui.widgets.*
+import org.isoron.uhabits.intents.*
+import org.isoron.uhabits.widgets.*
+
+class NumericalCheckmarkWidgetActivity : Activity(), ListHabitsBehavior.NumberPickerCallback {
+
+ private lateinit var behavior: WidgetBehavior
+ private lateinit var data: IntentParser.CheckmarkIntentData
+ private lateinit var widgetUpdater: WidgetUpdater
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ requestWindowFeature(Window.FEATURE_NO_TITLE)
+ setContentView(FrameLayout(this))
+ val app = this.applicationContext as HabitsApplication
+ val component = app.component
+ val parser = app.component.intentParser
+ data = parser.parseCheckmarkIntent(intent)
+ behavior = WidgetBehavior(component.habitList, component.commandRunner, component.notificationTray)
+ widgetUpdater = component.widgetUpdater
+ showNumberSelector(this)
+ }
+
+ override fun onNumberPicked(newValue: Double) {
+ behavior.setNumericValue(data.habit, data.timestamp, (newValue * 1000).toInt())
+ widgetUpdater.updateWidgets()
+ finish()
+ }
+
+ override fun onNumberPickerDismissed() {
+ finish()
+ }
+
+ private fun showNumberSelector(context: Context) {
+ val app = this.applicationContext as HabitsApplication
+ AndroidThemeSwitcher(this, app.component.preferences).apply()
+ val numberPickerFactory = NumberPickerFactory(context)
+ numberPickerFactory.create(data.habit.checkmarks.today!!.value.toDouble() / 1000,
+ data.habit.unit,
+ this).show()
+ }
+
+ companion object {
+ const val ACTION_SHOW_NUMERICAL_VALUE_ACTIVITY = "org.isoron.uhabits.ACTION_SHOW_NUMERICAL_VALUE_ACTIVITY"
+ }
+}
\ No newline at end of file
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/views/CheckmarkWidgetView.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/views/CheckmarkWidgetView.java
index a7dcdd82b..68971ca55 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/views/CheckmarkWidgetView.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/views/CheckmarkWidgetView.java
@@ -20,32 +20,38 @@
package org.isoron.uhabits.widgets.views;
import android.content.*;
-import android.support.annotation.*;
import android.util.*;
import android.widget.*;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
import org.isoron.androidbase.utils.*;
import org.isoron.uhabits.*;
+import org.isoron.uhabits.activities.habits.list.views.*;
import org.isoron.uhabits.core.models.*;
import org.isoron.uhabits.activities.common.views.*;
import org.isoron.uhabits.utils.*;
import static org.isoron.androidbase.utils.InterfaceUtils.getDimension;
-public class CheckmarkWidgetView extends HabitWidgetView
-{
- private int activeColor;
+public class CheckmarkWidgetView extends HabitWidgetView {
+ protected int activeColor;
- private float percentage;
+ protected float percentage;
@Nullable
- private String name;
+ protected String name;
+
+ protected RingView ring;
- private RingView ring;
+ protected TextView label;
- private TextView label;
+ protected int checkmarkValue;
- private int checkmarkValue;
+ protected int checkmarkState;
+
+ protected boolean isNumerical;
public CheckmarkWidgetView(Context context)
{
@@ -65,50 +71,32 @@ public class CheckmarkWidgetView extends HabitWidgetView
StyledResources res = new StyledResources(getContext());
- String text;
int bgColor;
int fgColor;
- switch (checkmarkValue)
- {
+ switch (checkmarkState) {
case Checkmark.CHECKED_EXPLICITLY:
- text = getResources().getString(R.string.fa_check);
bgColor = activeColor;
fgColor = res.getColor(R.attr.highContrastReverseTextColor);
-
setShadowAlpha(0x4f);
- rebuildBackground();
-
backgroundPaint.setColor(bgColor);
frame.setBackgroundDrawable(background);
break;
case Checkmark.CHECKED_IMPLICITLY:
- text = getResources().getString(R.string.fa_check);
- bgColor = res.getColor(R.attr.cardBgColor);
- fgColor = res.getColor(R.attr.mediumContrastTextColor);
-
- setShadowAlpha(0x00);
- rebuildBackground();
-
- break;
-
case Checkmark.UNCHECKED:
default:
- text = getResources().getString(R.string.fa_times);
+ getResources().getString(R.string.fa_times);
bgColor = res.getColor(R.attr.cardBgColor);
fgColor = res.getColor(R.attr.mediumContrastTextColor);
-
setShadowAlpha(0x00);
- rebuildBackground();
-
break;
}
ring.setPercentage(percentage);
ring.setColor(fgColor);
ring.setBackgroundColor(bgColor);
- ring.setText(text);
+ ring.setText(getText());
label.setText(name);
label.setTextColor(fgColor);
@@ -117,6 +105,25 @@ public class CheckmarkWidgetView extends HabitWidgetView
postInvalidate();
}
+ public void setCheckmarkState(int checkmarkState)
+ {
+ this.checkmarkState = checkmarkState;
+ }
+
+ protected String getText()
+ {
+ if (isNumerical) return NumberButtonViewKt.toShortString(checkmarkValue / 1000.0);
+ switch (checkmarkState) {
+ case Checkmark.CHECKED_EXPLICITLY:
+ case Checkmark.CHECKED_IMPLICITLY:
+ return getResources().getString(R.string.fa_check);
+
+ case Checkmark.UNCHECKED:
+ default:
+ return getResources().getString(R.string.fa_times);
+ }
+ }
+
public void setActiveColor(int activeColor)
{
this.activeColor = activeColor;
@@ -137,6 +144,11 @@ public class CheckmarkWidgetView extends HabitWidgetView
this.percentage = percentage;
}
+ public void setNumerical(boolean isNumerical)
+ {
+ this.isNumerical = isNumerical;
+ }
+
@Override
@NonNull
protected Integer getInnerLayoutId()
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/views/EmptyWidgetView.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/views/EmptyWidgetView.java
index 54b755f8e..ad66c872d 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/views/EmptyWidgetView.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/views/EmptyWidgetView.java
@@ -20,7 +20,7 @@
package org.isoron.uhabits.widgets.views;
import android.content.Context;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
import android.widget.TextView;
import org.isoron.uhabits.R;
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/views/GraphWidgetView.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/views/GraphWidgetView.java
index e11fda10f..a2e062930 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/views/GraphWidgetView.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/views/GraphWidgetView.java
@@ -20,10 +20,11 @@
package org.isoron.uhabits.widgets.views;
import android.content.*;
-import android.support.annotation.*;
import android.view.*;
import android.widget.*;
+import androidx.annotation.NonNull;
+
import org.isoron.uhabits.*;
public class GraphWidgetView extends HabitWidgetView
diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/views/HabitWidgetView.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/views/HabitWidgetView.java
index 034a469d0..f266a806f 100644
--- a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/views/HabitWidgetView.java
+++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/views/HabitWidgetView.java
@@ -23,11 +23,13 @@ import android.content.*;
import android.graphics.*;
import android.graphics.drawable.*;
import android.graphics.drawable.shapes.*;
-import android.support.annotation.*;
import android.util.*;
import android.view.*;
import android.widget.*;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
import org.isoron.androidbase.utils.*;
import org.isoron.uhabits.*;
@@ -49,6 +51,8 @@ public abstract class HabitWidgetView extends FrameLayout
private StyledResources res;
+ private int backgroundAlpha;
+
public HabitWidgetView(Context context)
{
super(context);
@@ -64,19 +68,23 @@ public abstract class HabitWidgetView extends FrameLayout
public void setShadowAlpha(int shadowAlpha)
{
this.shadowAlpha = shadowAlpha;
+ rebuildBackground();
+ }
+
+ public void setBackgroundAlpha(int backgroundAlpha)
+ {
+ this.backgroundAlpha = backgroundAlpha;
+ rebuildBackground();
}
protected abstract
@NonNull
Integer getInnerLayoutId();
- protected void rebuildBackground()
+ public void rebuildBackground()
{
Context context = getContext();
- int backgroundAlpha =
- (int) (255 * res.getFloat(R.attr.widgetBackgroundAlpha));
-
int shadowRadius = (int) dpToPixels(context, 2);
int shadowOffset = (int) dpToPixels(context, 1);
int shadowColor = Color.argb(shadowAlpha, 0, 0, 0);
diff --git a/android/uhabits-android/src/main/play/contact-email.txt b/android/uhabits-android/src/main/play/contact-email.txt
new file mode 100644
index 000000000..a53c5a7be
--- /dev/null
+++ b/android/uhabits-android/src/main/play/contact-email.txt
@@ -0,0 +1 @@
+dev@loophabits.org
diff --git a/android/uhabits-android/src/main/play/default-language.txt b/android/uhabits-android/src/main/play/default-language.txt
new file mode 100644
index 000000000..beb9970be
--- /dev/null
+++ b/android/uhabits-android/src/main/play/default-language.txt
@@ -0,0 +1 @@
+en-US
diff --git a/android/uhabits-android/src/main/play/listings/ar/full-description.txt b/android/uhabits-android/src/main/play/listings/ar/full-description.txt
new file mode 100644
index 000000000..b172e8d54
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/ar/full-description.txt
@@ -0,0 +1,22 @@
+لب يساعدك على خلق والحفاظ على العادات الجيدة، مما يسمح لك لتحقيق أهدافكة. الرسوم البيانية والإحصاءات التفصيلية تبين لكم كيف تحسن عاداتك مع مرور الوقت. هو تماما خالية من الاعلانات ومفتوحة المصدر.
+
+واجهة بسيطة، جميلة وحديثة
+لوب يحتوي على واجهة بسيطة وهي سهلة الاستخدام و تتابع نظام تصميم الماتريل دسيجن.
+
+نتيجة العادات
+بالإضافة إلى عرض التقدم الحالي، لوب ديه خوارزمية متقدمة لحساب قوة عاداتك. كل التكرار يجعل هذه العادة أقوى، وفي كل يوم غاب يجعلها أضعف. مع ذلك غيب أيام قليلة بعد تقدم طويلة ، لن تدمر تماما تقدمك .
+
+الرسوم البيانية والإحصاءات المفصلة
+نرى بوضوح كيف كنت قد تحسنت عاداتك بمرور الوقت مع الرسوم البيانية الجميله ومفصلة. انتقل إلى الوراء لنرى التاريخ الكامل لعاداتك.
+
+جداول مرنة
+تؤيد كل من العادات اليومية والعادات مع جداول أكثر تعقيدا، مثل 3 مرات كل أسبوع، مرة واحدة كل أسبوعين، أو مرة كل يومين.
+
+تذكير
+إنشاء تذكير لكل فرد من عاداتك، في ساعة اختيار من اليوم. تحقق بسهولة، رفض أو غفوة عادتك مباشرة من الإخطار، دون الحاجة إلى فتح التطبيق.
+
+خالية تماما من الإعلانات و المصدر المفتوح
+لا توجد على الاطلاق الإعلانات والشعارات المزعجة أو أذونات إضافية في هذا التطبيق، و سوف يكون هناك أبدا.
+
+الأمثل للساعات الذكية
+يمكن التحقق من رسائل التذكير، رفض أو غفوة عادتك مباشرة من ساعتك الاندرويد وير.
diff --git a/android/uhabits-android/src/main/play/listings/ar/short-description.txt b/android/uhabits-android/src/main/play/listings/ar/short-description.txt
new file mode 100644
index 000000000..1b0cb38f7
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/ar/short-description.txt
@@ -0,0 +1 @@
+خلق عادات جيدة وتتبع تقدمك على مر الزمن
diff --git a/android/uhabits-android/src/main/play/listings/ar/title.txt b/android/uhabits-android/src/main/play/listings/ar/title.txt
new file mode 100644
index 000000000..8c72c99f8
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/ar/title.txt
@@ -0,0 +1 @@
+لوب ملاحق العادة
diff --git a/android/uhabits-android/src/main/play/listings/ca/full-description.txt b/android/uhabits-android/src/main/play/listings/ca/full-description.txt
new file mode 100644
index 000000000..ca7eafd4e
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/ca/full-description.txt
@@ -0,0 +1,22 @@
+Loop t'ajuda a crear i mantenir bons hàbits, permetent-te aconseguir els teus objectius a llarg termini. Els gràfics i estadístiques detallades et mostren com han millorat els teus hàbits al llarg del temps. És completament de codi obert i lliure de publicitat.
+
+Senzilla, bonica i moderna interfície
+Loop té una interfície minimalista que és fàcil d'utilitzar i segueix les guies de "material design".
+
+Puntuació d'hàbit
+A més de mostrar la teva ratxa actual, Loop té un algoritme avançat per a calcular la fortalesa dels teus hàbits. Cada repetició fa el teu hàbit més fort, i cada dia que fallis el farà més dèbil. Tot i això uns quants dies que fallis després d'una llarga ratxa no malmetrà completament el teu progrès.
+
+Gràfics i estadístiques detallades
+Permet veure de forma clara com han millorat els teus hàbits al llarg del temps amb gràfics bonics i detallats. Pots anar enrera i veure també l'històric complet dels teus hàbits.
+
+Planificació flexible
+Suporta tant hàbits diaris com hàbits amb planificacions més complexes, com per exemple 3 vegades per setmana; un cop setmana si setmana no; o un dia si i altre no.
+
+Recordatoris
+Crea un recordatori individual per a cada hàbit, a l'hora escollida del dia. Revisa fàcilment, endarrereix o anul·la el teu hàbit directament des de la notificació, sense obrir l'app.
+
+Completament de codi obert i lliure de publicitat
+No hi ha cap tipus de publicitat, notificacions molestes o permisos intrusius en aquesta app, i mai n'hi haurà. El codi font complet està disponible sota la llicència GPLv3.
+
+Optimitzat per a rellotges intel·ligents
+Els recordatoris poden ser revisats, endarrerits o anul·lats directament des del teu rellotge Android Wear.
diff --git a/android/uhabits-android/src/main/play/listings/ca/short-description.txt b/android/uhabits-android/src/main/play/listings/ca/short-description.txt
new file mode 100644
index 000000000..be99d3d0d
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/ca/short-description.txt
@@ -0,0 +1 @@
+Crea bons hàbits i segueix el seu progrés al llarg del temps (sense publicitat)
diff --git a/android/uhabits-android/src/main/play/listings/ca/title.txt b/android/uhabits-android/src/main/play/listings/ca/title.txt
new file mode 100644
index 000000000..027232a12
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/ca/title.txt
@@ -0,0 +1 @@
+Loop Habit Tracker
diff --git a/android/uhabits-android/src/main/play/listings/cs-CZ/full-description.txt b/android/uhabits-android/src/main/play/listings/cs-CZ/full-description.txt
new file mode 100644
index 000000000..5c3c74172
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/cs-CZ/full-description.txt
@@ -0,0 +1,22 @@
+Aplikace ti pomůže vytvořit a udržovat si prospěšné návyky a dosáhnout tak tvých dlouhodobých cílů. Detailní grafy a statistiky ti ukáží, jak se tvoje zvyky postupem času zlepšují. Vše je kompletně bez reklam a open source.
+
+Jednoduché, krásné a moderní prostředí
+Aplikace má minimalistický design s jednoduchým použitím. Dodržuje pravidla material designu.
+
+Síla zvyku
+Pro zobrazení aktuální úspěšné serie aplikace využívá pokročilý algoritmus, aby vypočítala sílu tvých zvyků. Každé opakování dělá tvůj zvyk silnějším a každé nedodržení ho oslabuje. Ale pár vynechaných dní po dlouhé řadě kompletně nezničí celý tvůj postup.
+
+Detailní grafy a statistika
+Přehledně vidíš na krásných grafech, jak moc se tvoje zvyky zlepšují v průběhu času. Jeď zpět, abys viděl kompletní historii.
+
+Flexibilní časový plán
+Podpora jak denních návyků, tak návyků s komplexnějším rozvrhem. Jako jsou 3 krát týdně, jednou za dva týdny, nebo obden.
+
+Upomínky
+Vytvoř si individuální upomínku pro každý zvyk ve zvolený čas. Jednoduše potvrď, přeskoč nebo odlož notifikace bez nutnosti otevření aplikace.
+
+Kompletně bez reklam a open source
+Nejsou tu naprosto žádné reklamy, otravné notifikace nebo dotěrná povolení aplikace. A nikdy nebudou. Kompletní zdrojový kód je dostupný pod GPLv3.
+
+Optimalizované pro chytré hodinky
+Upomínky mohou být potvrzen, odloženy nebo smazány přímo z tvého zařízení s Android Wear.
diff --git a/android/uhabits-android/src/main/play/listings/cs-CZ/short-description.txt b/android/uhabits-android/src/main/play/listings/cs-CZ/short-description.txt
new file mode 100644
index 000000000..d504d3d96
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/cs-CZ/short-description.txt
@@ -0,0 +1 @@
+Vytvoř si prospěšné návyky a sleduj jejich vývoj v průběhu času (bez reklam)
diff --git a/android/uhabits-android/src/main/play/listings/cs-CZ/title.txt b/android/uhabits-android/src/main/play/listings/cs-CZ/title.txt
new file mode 100644
index 000000000..e4e2e5672
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/cs-CZ/title.txt
@@ -0,0 +1 @@
+Loop - Habit Tracker
diff --git a/android/uhabits-android/src/main/play/listings/de-DE/full-description.txt b/android/uhabits-android/src/main/play/listings/de-DE/full-description.txt
new file mode 100644
index 000000000..f838ff590
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/de-DE/full-description.txt
@@ -0,0 +1,22 @@
+Loop hilft dir gute Gewohnheiten anzunehmen und deine langfristigen Ziele zu erreichen. Detailierte Statistiken zeigen dir, wie du dich entwickelt hast. Es ist ohne Werbung und Open Source.
+
+Einfaches, schönes und modernes Oberfläche
+Loop hat eine minimale Oberfläche und ist deshalb einfach zu nutzen. Es folgt dem material Design.
+
+Habit Punkte
+Um dir deine Schwächen zu zeigen, hat Loop einen Algorithmus, um deine starken Angewohnheiten zu erkennen. Jede Wiederholung verstärkt diese und jedes Aussetzen schwächt sie. Aber ein paar Verfehlungen nach langem Durchhalten machen natürlich nicht gleich alles zu nichte.
+
+Statistiken
+Schau dir an, wie sich deine Angewohnheiten im Laufe der Zeit gemacht haben. Schau auf die schönen Diagramme und gehe zurück im gesamten Verlauf.
+
+Flexible Zeiten
+Unterstützt sowohl tägliche Vorgaben, als auch komplexere Pläne, woe etwa 3 mal pro Woche; ein mal in jeder anderen Woche; oder jeden anderen Tag.
+
+Erinnerungen
+Erstelle individuelle Erinnerungen und wann diese dich benachrichtigen sollen. Kontrolliere deine Vorhaben ganz einfach und lehne sie bei Bedarf direkt ab, ohne in die App zu wechseln.
+
+Komplett werbefrei und Open Source
+Es gibt absolut keine Werbung, nervende Einblendungen oder merkwürdige Berechtigungen in dieser App und das wird auch so bleiben. Der komplette Quellcode steht unter der GPLv3.
+
+Optimiert für Smartwatches
+Erinnerungen können direkt von der Android Wear watch kontrolliert, pausiert, oder verschoben werden.
diff --git a/android/uhabits-android/src/main/play/listings/de-DE/short-description.txt b/android/uhabits-android/src/main/play/listings/de-DE/short-description.txt
new file mode 100644
index 000000000..7190b438a
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/de-DE/short-description.txt
@@ -0,0 +1 @@
+Nimm gute Gewohnheiten an und verfolge deinen Fortschritt (ohne Werbung)
diff --git a/android/uhabits-android/src/main/play/listings/de-DE/title.txt b/android/uhabits-android/src/main/play/listings/de-DE/title.txt
new file mode 100644
index 000000000..027232a12
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/de-DE/title.txt
@@ -0,0 +1 @@
+Loop Habit Tracker
diff --git a/android/uhabits-android/src/main/play/listings/en-US/full-description.txt b/android/uhabits-android/src/main/play/listings/en-US/full-description.txt
new file mode 100644
index 000000000..603cc7ca5
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/en-US/full-description.txt
@@ -0,0 +1,29 @@
+Loop Habit Tracker helps you create and maintain long-term positive habits in your life. Detailed charts and statistics give you a clear picture of how your habits have improved over time. The app is completely ad-free, open source and it respects your privacy.
+
+Beautiful, minimalistic and lightweight interface
+Loop has an elegant and minimalistic interface that is very easy to use, even for first-time users. Highly optimized for speed, the app works well even on older phones.
+
+Habit score
+Loop has an advanced formula for calculating the strength of your habits. Every repetition makes your habit stronger and every missed day makes it weaker. A few missed days after a long streak, however, will not completely destroy your progress, unlike many other don't-break-the-chain apps.
+
+Flexible schedules
+In addition to daily habits, Loop supports habits with more complex schedules, such as 3 times per week or every other day.
+
+Reminders
+Schedule notifications to remind you of your habits. Each habit can have its own reminder, at a chosen time of the day. Easily check or dismiss your habit directly from the notification.
+
+Widgets
+Be reminded of your habits whenever you unlock your phone. Colorful widgets allow you to track your habits directly from your home screen, without even opening the app.
+
+Take control of your data
+If you want to further analyze your data, or move it to another service, Loop allows you to export it to spreadsheets (CSV) or to a database file (SQLite). For power users, checkmarks can be added through other apps, such as Tasker.
+
+No limitations
+Track as many habits as you wish. 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.
+
+Completely ad-free and open source
+There are no advertisements, annoying notifications or intrusive permissions in this app, and there will never be. The app is completely open-source (GPLv3).
+
+Works offline and respects your privacy
+Loop doesn't require an Internet connection or online account registration. Your confidential data is never sent to anyone. Neither the developers nor any third-parties have access to it.
+
diff --git a/android/uhabits-android/src/main/play/listings/en-US/graphics/feature-graphic/1.png b/android/uhabits-android/src/main/play/listings/en-US/graphics/feature-graphic/1.png
new file mode 100644
index 000000000..c25748549
Binary files /dev/null and b/android/uhabits-android/src/main/play/listings/en-US/graphics/feature-graphic/1.png differ
diff --git a/android/uhabits-android/src/main/play/listings/en-US/graphics/icon/1.png b/android/uhabits-android/src/main/play/listings/en-US/graphics/icon/1.png
new file mode 100644
index 000000000..0a94539ab
Binary files /dev/null and b/android/uhabits-android/src/main/play/listings/en-US/graphics/icon/1.png differ
diff --git a/android/uhabits-android/src/main/play/listings/en-US/graphics/phone-screenshots/1.png b/android/uhabits-android/src/main/play/listings/en-US/graphics/phone-screenshots/1.png
new file mode 100644
index 000000000..dc651abc0
Binary files /dev/null and b/android/uhabits-android/src/main/play/listings/en-US/graphics/phone-screenshots/1.png differ
diff --git a/android/uhabits-android/src/main/play/listings/en-US/graphics/phone-screenshots/2.png b/android/uhabits-android/src/main/play/listings/en-US/graphics/phone-screenshots/2.png
new file mode 100644
index 000000000..edabc5d20
Binary files /dev/null and b/android/uhabits-android/src/main/play/listings/en-US/graphics/phone-screenshots/2.png differ
diff --git a/android/uhabits-android/src/main/play/listings/en-US/graphics/phone-screenshots/3.png b/android/uhabits-android/src/main/play/listings/en-US/graphics/phone-screenshots/3.png
new file mode 100644
index 000000000..4c821d874
Binary files /dev/null and b/android/uhabits-android/src/main/play/listings/en-US/graphics/phone-screenshots/3.png differ
diff --git a/android/uhabits-android/src/main/play/listings/en-US/graphics/phone-screenshots/4.png b/android/uhabits-android/src/main/play/listings/en-US/graphics/phone-screenshots/4.png
new file mode 100644
index 000000000..5a9432921
Binary files /dev/null and b/android/uhabits-android/src/main/play/listings/en-US/graphics/phone-screenshots/4.png differ
diff --git a/android/uhabits-android/src/main/play/listings/en-US/graphics/phone-screenshots/5.png b/android/uhabits-android/src/main/play/listings/en-US/graphics/phone-screenshots/5.png
new file mode 100644
index 000000000..326ae0d55
Binary files /dev/null and b/android/uhabits-android/src/main/play/listings/en-US/graphics/phone-screenshots/5.png differ
diff --git a/android/uhabits-android/src/main/play/listings/en-US/graphics/phone-screenshots/6.png b/android/uhabits-android/src/main/play/listings/en-US/graphics/phone-screenshots/6.png
new file mode 100644
index 000000000..36579038a
Binary files /dev/null and b/android/uhabits-android/src/main/play/listings/en-US/graphics/phone-screenshots/6.png differ
diff --git a/android/uhabits-android/src/main/play/listings/en-US/short-description.txt b/android/uhabits-android/src/main/play/listings/en-US/short-description.txt
new file mode 100644
index 000000000..d19b7d128
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/en-US/short-description.txt
@@ -0,0 +1 @@
+Create good habits and track their progress over time (ad-free)
diff --git a/android/uhabits-android/src/main/play/listings/en-US/title.txt b/android/uhabits-android/src/main/play/listings/en-US/title.txt
new file mode 100644
index 000000000..027232a12
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/en-US/title.txt
@@ -0,0 +1 @@
+Loop Habit Tracker
diff --git a/android/uhabits-android/src/main/play/listings/es-ES/full-description.txt b/android/uhabits-android/src/main/play/listings/es-ES/full-description.txt
new file mode 100644
index 000000000..30d0f120d
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/es-ES/full-description.txt
@@ -0,0 +1,22 @@
+Loop te ayuda a crear y mantener buenos hábitos, permitiéndote alcanzar tus metas a largo plazo. Detallados gráficos y estadísticas muestran como tus hábitos mejoran con el tiempo. No existe ningún anuncio y es de código abierto.
+
+Una interfaz simple, bella y moderna
+Loop tiene una interfaz minimalista que es fácil de usar y sigue los principios del material design.
+
+Puntuación del hábito
+Además de mostrar tu racha actual, Loop tiene un algoritmo avanzado para calcular la fuerza de tus hábitos. Cada repetición hace tu hábito más fuerte y cada día fallido lo hace más débil. Sin embargo, unos pocos días después de una larga racha no destruirán completamente todo tu progreso.
+
+Detallados gráficos y estadísticas
+Observa claramente como tus hábitos han mejorado con el tiempo con bellos y detallados gráficos. Ve hacia atrás para ver el historial completo del hábito.
+
+Horarios flexibles
+Soporta hábitos diarios y hábitos con repeticiones más complejas, como 3 veces por semana; una vez cada varias semanas; o cada día.
+
+Recordatorios
+Crea recordatorios individuales para cada hábito a una hora determinada del día. Fácilmente marcables, descartables o posponibles directamente desde la notificación, sin abrir la app.
+
+Completamente sin anuncios y de código abierto
+No existe ningún tipo de publicidad, notificaciones molestas o permisos intrusivos, y nunca los habrá. Todo el código está disponible bajo GPLv3.
+
+Optimizado para smartwatches
+Los recordatorios se pueden marcar, posponer o descartar directamente desde tu reloj Android Wear.
diff --git a/android/uhabits-android/src/main/play/listings/es-ES/short-description.txt b/android/uhabits-android/src/main/play/listings/es-ES/short-description.txt
new file mode 100644
index 000000000..b8367a8a3
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/es-ES/short-description.txt
@@ -0,0 +1 @@
+Crea buenos hábitos y haz un seguimiento de su progreso a lo largo del tiempo
diff --git a/android/uhabits-android/src/main/play/listings/es-ES/title.txt b/android/uhabits-android/src/main/play/listings/es-ES/title.txt
new file mode 100644
index 000000000..55115936a
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/es-ES/title.txt
@@ -0,0 +1 @@
+Loop - Analizador de Hábitos
diff --git a/android/uhabits-android/src/main/play/listings/fr-FR/full-description.txt b/android/uhabits-android/src/main/play/listings/fr-FR/full-description.txt
new file mode 100644
index 000000000..8de1c3df6
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/fr-FR/full-description.txt
@@ -0,0 +1,22 @@
+Loop vous aide à créer et maintenir de bonnes habitudes, permettant de réussir vos objectifs à long terme. Des graphiques détaillés et des statistiques vous montrent comment vos habitudes s’améliorent au fil du temps. C'est totalement sans pub et open source.
+
+Simple, beau avec une interface moderne
+Loop a une interface minimaliste, facile à utiliser et qui suit les règles de material design.
+
+Score d'habitude
+En plus de montrer votre série en cours, Loop a un algorithme pour calculer la force de vos habitudes. Chaque jours réussis augmente la force de l'habitude chaque jours ratés le rend plus faible. Cependant, quelques jours ratés après une longue série ne détruiront pas entièrement votre progrès.
+
+Graphiques détaillés et statistiques
+Observez clairement comment vos habitudes s’améliorent au fil du temps avec de beaux graphiques détaillés. Défilez vers les jours passés pour voir l'historique complet de vos habitudes.
+
+Calendrier flexible
+Supporte les habitudes quotidiennes et celles avec un calendrier plus complexes, comme 3 fois par semaine, une fois par semaine ou un jour sur deux.
+
+Rappel
+Créez un rappel propre pour chaque habitude, à une heure choise de la journée. Cochez, supprimez ou réglez à plus tard votre habitude directement à partir de la notification, sans l'ouvrir l'application.
+
+Entièrement sans pub et open-source
+Il n'y a pas de publicités, de notifications embêtantes ou de permissions intrusives avec cette application, et il n'y en aura jamais. L'ensemble du code source est disponible sous GPLv3.
+
+Optimisée pour les montres android
+Les rappels peuvent être cochés, reportés ou supprimés directement à partir de votre montre Android
diff --git a/android/uhabits-android/src/main/play/listings/fr-FR/short-description.txt b/android/uhabits-android/src/main/play/listings/fr-FR/short-description.txt
new file mode 100644
index 000000000..fd674c71f
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/fr-FR/short-description.txt
@@ -0,0 +1 @@
+Créez des bonnes habitudes et suivez leurs avancées au fil du temps (sans pub)
diff --git a/android/uhabits-android/src/main/play/listings/fr-FR/title.txt b/android/uhabits-android/src/main/play/listings/fr-FR/title.txt
new file mode 100644
index 000000000..1979ccc4d
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/fr-FR/title.txt
@@ -0,0 +1 @@
+Loop - Suivi d'habitudes
diff --git a/android/uhabits-android/src/main/play/listings/hr/full-description.txt b/android/uhabits-android/src/main/play/listings/hr/full-description.txt
new file mode 100644
index 000000000..141410205
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/hr/full-description.txt
@@ -0,0 +1,21 @@
+Loop Vam pomaže stvoriti i održavati dobre navike kako biste ostvarili svoje dugoročne ciljeve. Detaljni grafikoni Vam pomažu kako biste bolje pratili kako napreduju Vaše navike. Loop je open source aplikacija i ne sadrži nikakav oblik reklama.
+
+Jednostavno, lijepo i moderno sučelje.
+Loop sadrži minimalistično sučelje jednostavno za korištenje koje prati smjernice Material Design-a.
+
+Rezultat navike
+Osim prikazivanja trenutnog niza, Loop ima napredni algoritam za računanje snage vaših navika. Svako ponavljanje jača vašu naviku, a svaki propušteni dan ju čini slabijom. Međutim, par propuštenih dana nakon dugačkog niza neće u potpunosti uništiti cjelokupni napredak.
+
+Detaljni grafovi i statistike
+Jasno vidite kako su se vaše navike poboljšale kroz vrijeme u prekrasnim i detaljnim grafovima. Kliznite natrag kako bi prikazali kompletnu povijest vaših navika.
+
+Fleksibilno planiranje
+Podržava i dnevne navike i navike sa složenijim planiranjem, kao npr. 3 puta svakog tjedna; jednom svaki drugi tjedan; ili svaki drugi dan.
+
+Podsjetnici
+Stvorite individualne podsjetnike za svaku naviku, u određenom satu u danu. Lako provjeravajte, odbacite i odgodite vašu naviku direktno iz obavijesti, bez otvaranja aplikacije.
+
+Optimizirano za pametne satove
+Podsjetnici se mogu provjeravati, odgoditi ili odbaciti direktno sa vašeg Android Wear sata.
+
+Potpuno bez oglasa i otvorenog izvora koda
diff --git a/android/uhabits-android/src/main/play/listings/hr/short-description.txt b/android/uhabits-android/src/main/play/listings/hr/short-description.txt
new file mode 100644
index 000000000..4eba451f4
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/hr/short-description.txt
@@ -0,0 +1 @@
+Stvorite dobre navike i pratite njihov napredak (bez reklama)
diff --git a/android/uhabits-android/src/main/play/listings/hr/title.txt b/android/uhabits-android/src/main/play/listings/hr/title.txt
new file mode 100644
index 000000000..027232a12
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/hr/title.txt
@@ -0,0 +1 @@
+Loop Habit Tracker
diff --git a/android/uhabits-android/src/main/play/listings/id/full-description.txt b/android/uhabits-android/src/main/play/listings/id/full-description.txt
new file mode 100644
index 000000000..821a8af9e
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/id/full-description.txt
@@ -0,0 +1,23 @@
+Loop membantu Anda untuk membuat dan mengelola Kebiasaan baik, memungkinkan Anda mencapai gol jangka panjang. Grafik detail dan statistik menampilkan perkembangan Kebiasaan Anda dari waktu ke waktu. Aplikasi ini bebas iklan dan open-source.
+
+Sederhana, minimalis dengan balutan antarmuka yang modern
+Loop memiliki tampilan minimalis yang mudah digunakan dan mengikuti panduan material design.
+
+Skor Kebiasaan
+Algoritma Loop akan menghitung kekuatan Kebiasaan Anda. Setiap kali Anda melakukan pengulangan maka skor Anda akan bertambah, sebaliknya jika Anda tidak mengerjakan Kebiasaan maka nilai akan dikurangi. Beberapa hari yang terlewat tidak akan menghapus seluruh perkembangan Kebiasaan Anda.
+
+Detail Grafik dan Statistik
+Lihat perkembangan Kebiasaan dari waktu ke waktu dengan tampilan yang menarik dan detail. Geser ke bawah untuk melihat seluruh catatan Kebiasaan Anda.
+
+Pengaturan jadwal fleksibel
+Mendukung kebiasaan harian dan kebiasaan dengan penjadwalan yang kompleks, seperti 3 kali dalam setiap minggu; 2 minggu sekali; hingga 2 hari sekali.
+
+Pengingat
+Anda dapat membuat pengingat untuk setiap Kebiasaan, dengan waktu yang telah Anda tentukan setiap harinya. Mudah untuk di-cek, batalkan ataupun tunda melalui panel notifikasi tanpa perlu membuka aplikasi.
+
+Bebas dari iklan dan open-source
+Tidak ada iklan, notifikasi menyebalkan dan juga hak akses yang tidak dibutuhkan.
+Kode aplikasi tersedia dengan lisensi GPLv3
+
+Mendukung Smartwatch
+Anda dapat dengan mudah mengecek, menunda ataupun membatalkan pengingat melalui smartwatch Anda.
diff --git a/android/uhabits-android/src/main/play/listings/id/short-description.txt b/android/uhabits-android/src/main/play/listings/id/short-description.txt
new file mode 100644
index 000000000..3fb70de63
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/id/short-description.txt
@@ -0,0 +1 @@
+Buat Kebiasaan baik dan catat perkembangannya setiap waktu (bebas iklan)
diff --git a/android/uhabits-android/src/main/play/listings/id/title.txt b/android/uhabits-android/src/main/play/listings/id/title.txt
new file mode 100644
index 000000000..027232a12
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/id/title.txt
@@ -0,0 +1 @@
+Loop Habit Tracker
diff --git a/android/uhabits-android/src/main/play/listings/it-IT/full-description.txt b/android/uhabits-android/src/main/play/listings/it-IT/full-description.txt
new file mode 100644
index 000000000..8b2b58f65
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/it-IT/full-description.txt
@@ -0,0 +1,18 @@
+Loop ti aiuta a creare e mantenere buone abitudini, permettendoti di raggiungere i tuoi obbiettivi a lungo termine. Grafici dettagliati e le statistiche ti mostrano come le tue abitudini sono migliorate durante il tempo. E' completamente senza pubblicità ed opensource.
+
+Interfaccia semplice e moderna Loop ha un'interfaccia minimale che è semplice da usare e segue le linee guida del Material Design
+
+Forza dell'abitudine
+In aggiunta al traguardo attuale, Loop ha un algoritmo avanzato per calcolare la forza delle tue abitudini. Ogni ripetizione la rafforza, mentre ogni giorno mancato la indebolisce. Pochi giorni mancati dopo una lunga serie però non vanificherà completamente il tuo progresso totale.
+
+Grafici dettagliati e statistiche Visualizza in modo semplice come le tue abitudini sono migliorate nel tempo con grafici dettagliati. Scorri indietro per vedere la cronologia completa delle tue abitudini.
+
+Programmi flessibili Supporto per abitudini sia giornaliere che con organizzazioni più complesse, come 3 volte alla settimana; una volta ogni 2 settimane; ogni due giorni...
+
+Promemoria
+Crea un promemoria per ogni abitudine, ad una specificata ora del giorno. Completa, ritarda o ignora il promemoria direttamente dalla notifica, senza aprire l'app.
+
+Completamente gratuito ed opensource
+Non ci sono pubblicità, notifiche invasive o permessi intrusivi e mai ce ne saranno. Il codice sorgente completo è disponibile sotto licenza GPLv3.
+
+Ottimizzata per gli smartwatch I promemoria possono essere completati, ritardati o ignorati direttamente dal tuo orologio Android Wear.
diff --git a/android/uhabits-android/src/main/play/listings/it-IT/short-description.txt b/android/uhabits-android/src/main/play/listings/it-IT/short-description.txt
new file mode 100644
index 000000000..63cc815b8
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/it-IT/short-description.txt
@@ -0,0 +1 @@
+Acquisisci nuove abitudini e traccia il tuo progresso (senza pubblicità)
diff --git a/android/uhabits-android/src/main/play/listings/it-IT/title.txt b/android/uhabits-android/src/main/play/listings/it-IT/title.txt
new file mode 100644
index 000000000..027232a12
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/it-IT/title.txt
@@ -0,0 +1 @@
+Loop Habit Tracker
diff --git a/android/uhabits-android/src/main/play/listings/ja-JP/full-description.txt b/android/uhabits-android/src/main/play/listings/ja-JP/full-description.txt
new file mode 100644
index 000000000..5d15de144
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/ja-JP/full-description.txt
@@ -0,0 +1,22 @@
+ループは、良い習慣を作って、維持するのに役立ちます。あなたの長期的な目標を達成することができます。詳細なグラフや統計情報が、時間をかけてあなたの習慣が改善された様子を示します。完全に広告フリーでオープンソースです。
+
+シンプルで、美しく、モダンなインターフェース
+ループは、使いやすく、マテリアルデザインのガイドラインに従った、最小限のインターフェースです。
+
+習慣のスコア
+ループは、現在の連続記録を示すことに加えて、習慣の強さを計算するための高度なアルゴリズムを持っています。繰り返しがあなたの習慣を強くし、忘れた日は弱くなります。長い連続記録の後に、少し忘れた日があっても、全体の進捗状況を完全に失うわけではありません。
+
+詳細なグラフと統計情報
+美しくて詳細なグラフで、あなたの習慣が時間をかけて改善された様子がはっきりわかります。スクロールで戻ると、あなたの習慣の完全な履歴を参照することができます。
+
+柔軟なスケジュール
+毎日の習慣と、毎週 3 回、隔週に 1 回、または一日おきなどの、より複雑なスケジュールの習慣の両方をサポートします。
+
+リマインダー
+1 日の選択した時間で、それぞれの習慣に個々のリマインダーを作成します。アプリを開かずに、通知から直接、簡単に習慣をチェック、解除、またはスヌーズすることができます。
+
+完全に広告フリーでオープンソース
+このアプリは、広告、迷惑な通知、押し付けがましいアクセス許可は全くありませんし、そうなることもありません。GPLv3 の下で全てのソースコードが利用可能です。
+
+スマートウォッチの最適化
+Android Wear 端末から直接、リマインダーをチェック、スヌーズ、解除することができます。
diff --git a/android/uhabits-android/src/main/play/listings/ja-JP/short-description.txt b/android/uhabits-android/src/main/play/listings/ja-JP/short-description.txt
new file mode 100644
index 000000000..fb9e77b54
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/ja-JP/short-description.txt
@@ -0,0 +1 @@
+良い習慣を作って、時間をかけてその進捗状況を追跡します (広告なし)
diff --git a/android/uhabits-android/src/main/play/listings/ja-JP/title.txt b/android/uhabits-android/src/main/play/listings/ja-JP/title.txt
new file mode 100644
index 000000000..1b2c6f734
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/ja-JP/title.txt
@@ -0,0 +1 @@
+ループ習慣トラッカー
diff --git a/android/uhabits-android/src/main/play/listings/ko-KR/full-description.txt b/android/uhabits-android/src/main/play/listings/ko-KR/full-description.txt
new file mode 100644
index 000000000..3fb7d24fb
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/ko-KR/full-description.txt
@@ -0,0 +1,20 @@
+Loop은 습관을 만들고 유지하도록 도와주어, 장기간 목표를 달성하도록 합니다. 그래프와 통계를 보고 습관이 만들어지는 과정을 보세요. 오프소스이고, 무광고입니다.
+
+아름답고 심플한 디자인
+Loop은 Material디자인을 따라 사용이 편합니다.
+
+습관 포인트
+얼마나 오랫동안 습관을 유지했는지 보여줌과 동시에, Loop은 특화된 알고리듬으로 습관의 견고함을 계산합니다. 반복할 수록 강해지고, 빠뜨린 날들이 많아질 수록 포인트는 낮아집니다. 하지만, 오랫동안 유지된 습관은 몇 일을 빠뜨렸다고 해서 포인트가 급강하하지는 않습니다.
+
+그래프와 통계
+습관이 어떤 과정을 거쳐서 완성되는지 그래프를 보면 알 수 있습니다.
+스크롤해서 장기간의 과정을 볼 수 있습니다.
+
+여러 종류의 스케줄 조정가능
+매일 습관, 혹은 일주일에 3번; 2주에 한번; 같은 여러 종류의 스케줄을 만들 수 있습니다.
+
+오픈소스, 무광고
+광고, 귀찮은 스팸, 비정상적인 정보요구는 없습니다, 앞으로 쭉. 모든 소스코드는 GPLv3로 라이센스되었습니다.
+
+스마트시계에 최적화
+안드로이드 시계에서 바로 알림을 확인, 미루기 혹은 무시할 수 있습니다.
diff --git a/android/uhabits-android/src/main/play/listings/ko-KR/short-description.txt b/android/uhabits-android/src/main/play/listings/ko-KR/short-description.txt
new file mode 100644
index 000000000..ee87e4f1b
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/ko-KR/short-description.txt
@@ -0,0 +1 @@
+좋은 습관을 만들고 관리하세요. (광고 없음)
diff --git a/android/uhabits-android/src/main/play/listings/ko-KR/title.txt b/android/uhabits-android/src/main/play/listings/ko-KR/title.txt
new file mode 100644
index 000000000..f672ecc29
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/ko-KR/title.txt
@@ -0,0 +1 @@
+Loop 습관제조기
diff --git a/android/uhabits-android/src/main/play/listings/pl-PL/full-description.txt b/android/uhabits-android/src/main/play/listings/pl-PL/full-description.txt
new file mode 100644
index 000000000..b8128e5b6
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/pl-PL/full-description.txt
@@ -0,0 +1,22 @@
+Loop pozwala Ci na tworzenie i utrzymywanie dobrych nawyków, pozwala na Ci na osiągnięcie Twoich długoterminowych celów. Szczegółowe grafiki i statystyki pozwalają na zobaczenie jak Twoje nawyki polepszyły się. Jest całkowicie wolna od reklam i open source.
+
+Prosty, piękny i nowoczesny interfejs
+Loop posiada minimalistyczny interfejs, który jest prosty do użycia i przestrzega zasad material design.
+
+Punkty nawyku
+Oprócz pokazywania Twojej aktualnej serii, Loop posiada zaawansowany algorytm obliczania siły Twoich nawyków. Każde powtórzenie nawyku czyni go silniejszymi a każdy opuszczony dzień słabszym. Jednakże kilka opuszczonych dni po dłuższej serii nie zrujnuje Twojego całego postępu.
+
+Szczegółowe grafiki i statystyki
+Zobacz jak Twoje nawyki ulepszają się poprzez piękne i szczegółowe wykresy. Przewiń do tyłu aby zobaczyć pełną historię Twoich nawyków.
+
+Elastyczne plany
+Wspiera zarówno codzienne nawyki jak i nawyki z bardziej złożonym planem, jakie jak 3 razy co tydzień; raz w ciągu innego tygodnia; lub każdego innego dnia.
+
+Przypomnienia
+Utwórz indywidualne przypomnienia dla każdego nawyku, w określonej godzinie dnia. Łatwo sprawdź, usuń i uśpij powiadomienia o nawyku bezpośrednio z powiadomienia, bez otwierania aplikacji.
+
+Całkowicie bez reklam i open source
+Absolutnie nie ma żadnych reklam, denerwujących powiadomień czy szpiegujących uprawnień w tej aplikacji i nigdy nie będzie. Cały kod źródłowy jest dostępny pod licencją GPLv3.
+
+Zoptymalizowana pod smartwatche
+Przypomnienia można sprawdzić, uśpić czy usunąć bezpośrednio z twojego zegarka Android Wear.
diff --git a/android/uhabits-android/src/main/play/listings/pl-PL/short-description.txt b/android/uhabits-android/src/main/play/listings/pl-PL/short-description.txt
new file mode 100644
index 000000000..9f1e2979a
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/pl-PL/short-description.txt
@@ -0,0 +1 @@
+Twórz dobre nawyki i śledź ich postęp (bez reklam)
diff --git a/android/uhabits-android/src/main/play/listings/pl-PL/title.txt b/android/uhabits-android/src/main/play/listings/pl-PL/title.txt
new file mode 100644
index 000000000..dc0f7be31
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/pl-PL/title.txt
@@ -0,0 +1 @@
+Śledzenie Nawyków Loop
diff --git a/android/uhabits-android/src/main/play/listings/pt-BR/full-description.txt b/android/uhabits-android/src/main/play/listings/pt-BR/full-description.txt
new file mode 100644
index 000000000..8c061b02d
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/pt-BR/full-description.txt
@@ -0,0 +1,19 @@
+Loop é um aplicativo que te ajuda a criar e manter bons hábitos, permitindo que você alcance os seus objetivos de longo prazo. Gráficos e estatísticas mostram em detalhe como os seus hábitos progrediram ao passar do tempo. Este aplicativo não tem nenhuma propaganda e é Open Source.
+
+Interface bonita, moderna e simples
+Loop tem uma interface minimalista bem simples de se usar, e segue o novo visual Material Design.
+
+Estabilidade dos hábitos
+Além de mostrar quantos dias seguidos você praticou cada rotina, Loop também conta com uma fórmula mais avançada para calcular a estabilidade dos seus hábitos. Cada repetição melhora a estabilidade do hábito, e cada dia de folga piora a estabilidade. Alguns dias de folga após um longo período perfeito, no entanto, não destruirá por completo o seu progresso.
+
+Gráficos e estatísticas detalhadas
+Veja claramente como os seus hábitos estão progredindo com o passar do tempo, através de bonitos e detalhados diagramas. O histórico completo de cada hábito fica arquivado para sempre.
+
+Rotina flexível
+Loop aceita tanto hábitos diários, quanto hábitos com rotinas mais complexas, como 3 vezes por semana; uma vez a cada duas semanas; ou uma vez a cada dois dias.
+
+Lembretes
+É possível criar lembretes individuais para cada hábito, na hora do dia em que você escolher. Marque como completado diretamente da barra de notificação, sem precisar abrir o aplicativo.
+
+Completamente sem propagandas e Open Source
+Não há nenhum anúncio neste aplicativo, nem notificações chatas ou permissões intrusivas; e será assim para sempre. O código fonte completo está disponível sob a licença livre GPLv3.
diff --git a/android/uhabits-android/src/main/play/listings/pt-BR/short-description.txt b/android/uhabits-android/src/main/play/listings/pt-BR/short-description.txt
new file mode 100644
index 000000000..836550f64
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/pt-BR/short-description.txt
@@ -0,0 +1 @@
+Forme bons hábitos e acompanhe seu progresso ao passar do tempo (sem anúncios)
diff --git a/android/uhabits-android/src/main/play/listings/pt-BR/title.txt b/android/uhabits-android/src/main/play/listings/pt-BR/title.txt
new file mode 100644
index 000000000..8fe4de662
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/pt-BR/title.txt
@@ -0,0 +1 @@
+Loop - Acompanhador de Hábitos
diff --git a/android/uhabits-android/src/main/play/listings/ru-RU/full-description.txt b/android/uhabits-android/src/main/play/listings/ru-RU/full-description.txt
new file mode 100644
index 000000000..7ac62ada0
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/ru-RU/full-description.txt
@@ -0,0 +1,22 @@
+"Трекер привычек Loop" поможет вам завести и поддерживать полезные привычки, позволяя достичь долгосрочных целей. Детализированные диаграммы и статистика покажут, как ваши привычки закрепились со временем. Приложение не содержит рекламы и является ПО с открытым исходным кодом.
+
+Простой, красивый и современный интерфейс
+У приложения минималистичный интерфейс, который лёгок в использовании и придерживается руководства по Material Design.
+
+Оценка привычек
+В дополнение к отображению текущего рекорда повторений, приложение имеет передовой алгоритм расчёта "силы" ваших привычек. Каждое повторение делает вашу привычку "сильнее", а каждый пропуск "слабее". Несколько пропущенных дней после долгих успешных повторений, однако, не загубят ваши успехи полностью.
+
+Детализированные диаграммы и статистика
+При помощи красивых и детализированных диаграмм вы с лёгкостью можете просмотреть, как ваши привычки закрепились со временем. Просмотрите полную историю ваших привычек, пролистав её.
+
+Гибкий график
+Поддерживаются как ежедневные привычки, так и привычки с более сложным графиком. Например: 3 раза в неделю; один раз каждую неделю; через день.
+
+Напоминания
+Создавайте отдельные для каждой привычки напоминания в выбранное время дня. С лёгкостью отмечайте, пропускайте или откладывайте выполнение привычки прямо из уведомления - без открытия приложения.
+
+Полное отсутствие рекламы и открытый исходный код
+В приложении совершенно нет рекламы, назойливых уведомлений или лишних разрешений. И их никогда не будет. Весь исходный код доступен под лицензией GPLv3.
+
+Оптимизировано для "умных" часов
+Напоминания могут быть отмечены, отложены или пропущены прямо с ваших часов Android Wear.
diff --git a/android/uhabits-android/src/main/play/listings/ru-RU/short-description.txt b/android/uhabits-android/src/main/play/listings/ru-RU/short-description.txt
new file mode 100644
index 000000000..dd97820b6
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/ru-RU/short-description.txt
@@ -0,0 +1 @@
+Заводите полезные привычки и отслеживайте свои успехи (без рекламы)
diff --git a/android/uhabits-android/src/main/play/listings/ru-RU/title.txt b/android/uhabits-android/src/main/play/listings/ru-RU/title.txt
new file mode 100644
index 000000000..fdd07fb61
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/ru-RU/title.txt
@@ -0,0 +1 @@
+Трекер привычек Loop
diff --git a/android/uhabits-android/src/main/play/listings/sl/full-description.txt b/android/uhabits-android/src/main/play/listings/sl/full-description.txt
new file mode 100644
index 000000000..14b5c5e20
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/sl/full-description.txt
@@ -0,0 +1,22 @@
+Loop vam pomaga ustvariti in vzdrževati dobre navade, kar vam omogoča, da bi dosegli svoje dolgoročne cilje. Podrobni grafi in statistike vam pokažejo kako so se vaše navade skozi čas izboljšale. Je popolnoma brez oglasov in odprtokodno.
+
+Enostaven, lep in sodoben vmesnik
+Loop ima minimalističen vmesnik, ki je preprost za uporabo in sledi smernicam Material design.
+
+Ocena navade
+Poleg tega, da vam prikazuje vaše trenutne serije, ima Loop napreden algoritem za izračun moči vaših navad. Vsaka ponovitev naredi vašo navado močnejšo in vsak zgrešen dan jo naredi šibkejšo. Nekaj zgrešenih dni po dolgi seriji, pa vendar ne bo popolnoma uničilo vašega celotnega napredka.
+
+Podrobni grafi in statistike
+Z lepimi in natančnimi grafi, jasno poglejte, kako so se skozi čas vaše navade izboljšale. Da boste videli celotno zgodovino svojih navad se pomaknite nazaj.
+
+Prilagodljivi urniki
+Podpira tako vsakdanje navade in navade z bolj zapletenimi urniki, kot so 3-krat na teden; enkrat vsak drugi teden; ali vsak drugi dan.
+
+Opomniki
+Ustvari individualni opomnik za vsako navado, pri izbrani uri dneva. Enostavno preverite, zavrzite ali dajte v dremež svoje navade neposredno iz obvestila, ne da bi odprli aplikacijo.
+
+Popolnoma brez oglasov in odprtokodno
+V tej aplikaciji ni absolutno nobene reklame, sitnih obvestil ali vsiljivih dovoljenj in jih tudi nikoli ne bo. Celotna izvorna koda je na razpolago pod GPLv3.
+
+Optimirano za pametne ure
+Opomnike lahko preverite, jih date v dremež ali pa zavrzite neposredno iz vaše Android Wear ure.
diff --git a/android/uhabits-android/src/main/play/listings/sl/short-description.txt b/android/uhabits-android/src/main/play/listings/sl/short-description.txt
new file mode 100644
index 000000000..848832a92
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/sl/short-description.txt
@@ -0,0 +1 @@
+Ustvarite dobre navade in spremljajte njihov napredek skozi čas (brez reklam)
diff --git a/android/uhabits-android/src/main/play/listings/sl/title.txt b/android/uhabits-android/src/main/play/listings/sl/title.txt
new file mode 100644
index 000000000..401c2940f
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/sl/title.txt
@@ -0,0 +1 @@
+Loop Sledilnik Navad
diff --git a/android/uhabits-android/src/main/play/listings/sr/full-description.txt b/android/uhabits-android/src/main/play/listings/sr/full-description.txt
new file mode 100644
index 000000000..5bef01163
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/sr/full-description.txt
@@ -0,0 +1,22 @@
+Loop вам помаже да створите и одржавате здраве навике, самим тим и да достигнете дугорочне циљеве. Детаљна статистика и графикони показују вам колико су се ваше навике временом побољшале. Апликација је отвореног кода и не садржи огласе.
+
+Једноставан, леп и модеран дизајн
+Loop има минималистички интерфејс који је једноставан за коришћење и прати смернице за материјални дизајн.
+
+Оцена навике
+Поред приказа тренутног низа, Loop поседује напредни алгоритам за израчунавање снаге ваших навика. Ваша навика са сваким понављањем постаје јача, а са сваким пропуштеним даном слабија. Неколико пропуштених дана након дугог низа, пак, неће у потпуности упропастити ваш резултат.
+
+Детаљни графикони и статистика
+Пратите свој напредак уз лепе и детаљне графиконе. Вратите се уназад да бисте видели целу историју навика.
+
+Флексибилни распоред
+Подржава како дневне навике, тако и оне са сложенијим понављањем (трипут недељно, једанпут сваке друге недеље, сваки други дан и сл.).
+
+Подсетници
+Направите појединачни подсетник за сваку навику у жељено доба дана. С лакоћом маркирајте, одложите или откажите навику директно из обавештења, без отварања апликације.
+
+У потпуности отвореног кода и без огласа
+Апликација не садржи никакве огласе, досадна обавештења или наметљиве дозволе; никада и неће. Изворни кôд је у целости доступан под лиценцом GPLv3.
+
+Оптимизовано за паметне сатове
+Навике можете маркирати, одложити или отказати директно помоћу Android Wear сата.
diff --git a/android/uhabits-android/src/main/play/listings/sr/short-description.txt b/android/uhabits-android/src/main/play/listings/sr/short-description.txt
new file mode 100644
index 000000000..ff0c42571
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/sr/short-description.txt
@@ -0,0 +1 @@
+Створите здраве навике и пратите напредак (без огласа).
diff --git a/android/uhabits-android/src/main/play/listings/sr/title.txt b/android/uhabits-android/src/main/play/listings/sr/title.txt
new file mode 100644
index 000000000..ee9265f55
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/sr/title.txt
@@ -0,0 +1 @@
+Loop – праћење навика
diff --git a/android/uhabits-android/src/main/play/listings/sv-SE/full-description.txt b/android/uhabits-android/src/main/play/listings/sv-SE/full-description.txt
new file mode 100644
index 000000000..66d7f3f00
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/sv-SE/full-description.txt
@@ -0,0 +1,22 @@
+Loop Hjälper dig att skapa och underhålla bra vanor, genom att tillåta dig arkivera dina långtidsvanor. Detaljerade grafer och statistik visar dig hur dina vanor har förbättrats över tid. Det är helt reklamfritt och öppen källkod.
+
+Enkelt, snyggt och modernt användargränssnitt
+Loop har minimalistiskt gränssnitt som är enkel att använda och följer material design riktlinjer.
+
+Vanepoäng
+Förutom att visa din nuvarande aktivitet har Loop en avancerad algoritm som räknar ut styrkan i dina vanor. Varje repetition gör din vana starkare och varje missad dag gör den svagare. Ett par missar efter en lång, oavbruten aktivitet kommer dock inte att helt förstöra dina framsteg.
+
+Detaljerade grafer och statistik
+Tydligt se hur dina vanor förbättras över tiden med fina och detaljerade grafer. Skrolla tillbaka för att din fullständiga historik av dina vanor.
+
+Flexibelt schema
+Stödjer både dagliga vanor och avancerade vanor, som till exempel tre gånger per vecka, en gång varje vecka eller varannan dag.
+
+Påminnelser
+Skapa en påminnelse för varje vana. Du kan enkelt bocka av, ta bort eller skjuta upp din vana direkt från notifikationsfältet.
+
+Helt reklamfri och öppen källkod
+Det är absolut ingen reklam, störande notifikationer eller onödiga behörighetskrav för den här appen, och det kommer aldrig att bli. Hela källkoden finns tillgänglig under GPLv3.
+
+Optimerad för smartklockor
+Påminnelser kan kollas upp, snoozade eller tas bort direkt från din Android Wear enhet.
diff --git a/android/uhabits-android/src/main/play/listings/sv-SE/short-description.txt b/android/uhabits-android/src/main/play/listings/sv-SE/short-description.txt
new file mode 100644
index 000000000..d6002183a
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/sv-SE/short-description.txt
@@ -0,0 +1 @@
+Skapa bra vanor och följ deras utveckling över tid. (reklamfri)
diff --git a/android/uhabits-android/src/main/play/listings/sv-SE/title.txt b/android/uhabits-android/src/main/play/listings/sv-SE/title.txt
new file mode 100644
index 000000000..027232a12
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/sv-SE/title.txt
@@ -0,0 +1 @@
+Loop Habit Tracker
diff --git a/android/uhabits-android/src/main/play/listings/tr-TR/full-description.txt b/android/uhabits-android/src/main/play/listings/tr-TR/full-description.txt
new file mode 100644
index 000000000..4dd875d5a
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/tr-TR/full-description.txt
@@ -0,0 +1,22 @@
+İyi alışkanlar kazanmanı ve sürdürmene yardımcı olur, uzun dönemli hedeflerini başarmanı sağlar. Ayrıntılı çizelge ve istatistikler, zaman içinde alışkanlıklarını nasıl geliştiğini gösterir. Tamamen reklamsız ve açık kaynak.
+
+Basit, güzel ve çağdaş arayüz
+Kullanımı kolay sade arayüze sahiptir ve material design kurallarını takip eder.
+
+Alışkanlık Puanı
+Alışkanlıklarının dayanımını hesaplamak için gelişmiş algoritmaya sahiptir. Her tekrar alışkanlığını güçlendirir ve her iptal zayıflatır. Uzun süre etkinlikten sonra birkaç gün devamsızlık, tüm gelişmenizi tamamen etkilemeyecek.
+
+Ayrıntılı çizelgeler ve istatistikler
+Güzel ve ayrıntılı çizelgeler ile alışkanlıklarının zaman içinde nasıl geliştiğini açıkça görebilirsin. Alışkanlıklarının geçmişini tamamen görmek için geriye sürükle.
+
+Esnek zamanlamalar
+Günlük alışkanlanlıklar ve haftada 3 kez, diğer haftalarda bir kez veya diğer hergün gibi daha gelişmiş zamanlamalı alışkanlıkları destekler.
+
+Hatırlatmalar
+Herbir alışkanlık için seçtiğin gün ve saatte ayrı hatırlatma oluştur. Kolayca uygulamayı açmadan, bildirimlerden alışkanlıklarını yapıldı, iptal et veya ertele olarak işaretle.
+
+Tamamen reklamsız ve açık kaynak
+Bu uygulama içinde kesinlikle hiç reklam yok, can sıkıcı bildirimler veya zorunlu izinler yok ve asla da olmayacak. Kaynak kodun tamamı GPLv3 özgür yazılım lisansı kapsamındadır.
+
+Akıllı saatler için uyarlandı
+Android Wear saatinden, hatırlatmaları yapıldı, ertele veya iptal edebilirsin.
diff --git a/android/uhabits-android/src/main/play/listings/tr-TR/short-description.txt b/android/uhabits-android/src/main/play/listings/tr-TR/short-description.txt
new file mode 100644
index 000000000..e9d4f6165
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/tr-TR/short-description.txt
@@ -0,0 +1 @@
+İyi alışkanlıklar kazan ve gelişmesini takip et (reklamsız)
diff --git a/android/uhabits-android/src/main/play/listings/tr-TR/title.txt b/android/uhabits-android/src/main/play/listings/tr-TR/title.txt
new file mode 100644
index 000000000..4ce793ee7
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/tr-TR/title.txt
@@ -0,0 +1 @@
+Loop Alışkanlık Takip
diff --git a/android/uhabits-android/src/main/play/listings/uk/full-description.txt b/android/uhabits-android/src/main/play/listings/uk/full-description.txt
new file mode 100644
index 000000000..74e989bcf
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/uk/full-description.txt
@@ -0,0 +1,22 @@
+Трекер звичок Loop допоможе вам розвивати та підтримувати хороші звички, що дозволить вам досягнути ваших довгострокових цілей. Докладні графіки та статистичні дані показують вам, як ваші звички покращилися з часом. Трекер не містить реклами і є програмою з відкритим вихідним кодом.
+
+Простий, красивий і сучасний інтерфейс
+Loop має легкий у використанні мінімалістичний інтерфейс, що відповідає принципам Material Design.
+
+Оцінка звичок
+На додаток до відображення поточної серії повторень, програма має передовий алгоритм розрахунку "сили" ваших звичок. Кожне повторення робить вашу звичку "сильніше", а кожний пропуск - "слабкіше". Проте, кілька пропущених днів після тривалої серії повторень не зведуть ваші успіхи повністю нанівець.
+
+Детальні діаграми і статистичні дані
+За допомогою красивих і деталізованих діаграм ви з легкістю можете переглянути, як ваші звички закріпилися з часом. Прокрутіть назад, щод переглянути повну історію ваших звичок.
+
+Гнучкий графік
+Підтримуються як щоденні звички, так і звички з більш складними графіками, наприклад: 3 рази на тиждень, один раз на два тижні, через день.
+
+Нагадування
+Створюйте окремі нагадування для кожної звички в певні години дня. З легкістю відмічайте, пропускайте або відкладайте виконання звички безпосередньо із повідомлення, не відкриваючи програму.
+
+Повна відсутність реклами та відкритий вихідний код
+У програмі абсолютно немає реклами, дратівливих повідомлень або нав'язливих дозволів,і ніколи не буде. Весь вихідний код доступний на умовах ліцензії GPLv3.
+
+Оптимізовано для "розумних" годинників
+Нагадування можуть бути відмічені, відкладені або пропущені безпосередньо з вашого годинника Android Wear.
diff --git a/android/uhabits-android/src/main/play/listings/uk/short-description.txt b/android/uhabits-android/src/main/play/listings/uk/short-description.txt
new file mode 100644
index 000000000..86c9dbbda
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/uk/short-description.txt
@@ -0,0 +1 @@
+Розвивайте корисні звички і відстежуйте свої успіхи (без реклами)
diff --git a/android/uhabits-android/src/main/play/listings/uk/title.txt b/android/uhabits-android/src/main/play/listings/uk/title.txt
new file mode 100644
index 000000000..95db6e1d8
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/uk/title.txt
@@ -0,0 +1 @@
+Трекер звичок Loop
diff --git a/android/uhabits-android/src/main/play/listings/zh-CN/full-description.txt b/android/uhabits-android/src/main/play/listings/zh-CN/full-description.txt
new file mode 100644
index 000000000..c115bba42
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/zh-CN/full-description.txt
@@ -0,0 +1,19 @@
+循环帮助你建立和维持好习惯,达到长期目标。详细的图片和数据显示你的进步。完全无广告和开源软件。
+
+简单,美观,现代的界面
+微型界面易于应用。
+
+ 习惯分数
+除了显示你目前的习惯连胜,循环习惯记录有高级的算法计算你的习惯强度。每重复一次习惯能使你的习惯强度加强,每次错过会使习惯强度减弱。然而,几次错过并不会完全破坏你整个的进步。
+
+ 详细的图片和数据分析
+详细的图片能清晰的显示随着时间你习惯的进步。往后滚动屏幕可以看完整的历史纪录。
+
+提醒
+在可以选择为每个习惯设置特定的个人提醒。不需要打开应用就可以记录,忽略,或者推迟的习惯。
+
+可以用在智能手表上
+提醒可以直接在安卓手表上 记录,忽略,或者推迟。
+
+完全无广告和开源软件
+完全无广告和烦人的提醒,并且永远也不会有。完整的代码在GPLv3。
diff --git a/android/uhabits-android/src/main/play/listings/zh-CN/short-description.txt b/android/uhabits-android/src/main/play/listings/zh-CN/short-description.txt
new file mode 100644
index 000000000..70ff5eff1
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/zh-CN/short-description.txt
@@ -0,0 +1 @@
+建立好习惯且随着时间记录你的进步(无广告)
diff --git a/android/uhabits-android/src/main/play/listings/zh-CN/title.txt b/android/uhabits-android/src/main/play/listings/zh-CN/title.txt
new file mode 100644
index 000000000..cb1a66e48
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/zh-CN/title.txt
@@ -0,0 +1 @@
+Loop 循环习惯记录
diff --git a/android/uhabits-android/src/main/play/listings/zh-TW/full-description.txt b/android/uhabits-android/src/main/play/listings/zh-TW/full-description.txt
new file mode 100644
index 000000000..c040c17f6
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/zh-TW/full-description.txt
@@ -0,0 +1,22 @@
+習以為常幫助你建立和維持好習慣,達到長期目標。詳細的圖片和數字顯示出你的進步。完成無廣告的開源軟體。
+
+簡單,美觀,時尚的界面
+輕量型界面易於使用。
+
+習慣分數
+除了顯示你目前的習慣連勝,循環記錄有高級的演算法計算你的習慣強度。每完成一次能使你的習慣強度增加,每次錯過則會減弱。然而,幾次錯過並不會影響你的習慣進步。
+
+詳細的圖片和資料分析
+詳細的圖片能顯示出你的進步。往後滑動可以查看完整的歷史記錄。
+
+靈活的時間表
+支援日常習慣或者是更複雜的時間間隔(例如每周3次,每周1次)
+
+提醒
+可以選擇為每個習慣加入提醒。不需要打開程式就可以 記錄、忽略或者是延遲習慣。
+
+完全無廣告和開源軟體
+永遠不會有廣告和煩人的提醒。完整的程式碼在GPLv3。
+
+可以用在智慧型手錶上
+提醒可以直接在android手錶上 記錄、忽略,或者延遲。
diff --git a/android/uhabits-android/src/main/play/listings/zh-TW/short-description.txt b/android/uhabits-android/src/main/play/listings/zh-TW/short-description.txt
new file mode 100644
index 000000000..5e98cea2f
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/zh-TW/short-description.txt
@@ -0,0 +1 @@
+建立好新習慣並隨著時間進步 (無廣告)
diff --git a/android/uhabits-android/src/main/play/listings/zh-TW/title.txt b/android/uhabits-android/src/main/play/listings/zh-TW/title.txt
new file mode 100644
index 000000000..36c3b6802
--- /dev/null
+++ b/android/uhabits-android/src/main/play/listings/zh-TW/title.txt
@@ -0,0 +1 @@
+Loop 習以為常
diff --git a/android/uhabits-android/src/main/play/release-notes/en-US/alpha.txt b/android/uhabits-android/src/main/play/release-notes/en-US/alpha.txt
new file mode 100644
index 000000000..6cb4c5aa1
--- /dev/null
+++ b/android/uhabits-android/src/main/play/release-notes/en-US/alpha.txt
@@ -0,0 +1,12 @@
+1.8.8
+* Small tweaks to the habit scheduling algorithm
+* Fix some crashes
+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)
+* Customize how transparent the widgets are
+* Customize the first day of the week
+* Yes/No buttons on notifications
+* Automatic dark theme (Android 10)
+* Smaller APK and backup files
diff --git a/android/uhabits-android/src/main/play/release-notes/en-US/beta.txt b/android/uhabits-android/src/main/play/release-notes/en-US/beta.txt
new file mode 100644
index 000000000..e5eea79b4
--- /dev/null
+++ b/android/uhabits-android/src/main/play/release-notes/en-US/beta.txt
@@ -0,0 +1,12 @@
+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
diff --git a/android/uhabits-android/src/main/play/release-notes/en-US/production.txt b/android/uhabits-android/src/main/play/release-notes/en-US/production.txt
new file mode 100644
index 000000000..32c331dbf
--- /dev/null
+++ b/android/uhabits-android/src/main/play/release-notes/en-US/production.txt
@@ -0,0 +1,5 @@
+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)
diff --git a/android/uhabits-android/src/main/res/anim/fade_in.xml b/android/uhabits-android/src/main/res/anim/fade_in.xml
new file mode 100644
index 000000000..c14857395
--- /dev/null
+++ b/android/uhabits-android/src/main/res/anim/fade_in.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
diff --git a/android/uhabits-android/src/main/res/anim/fade_out.xml b/android/uhabits-android/src/main/res/anim/fade_out.xml
new file mode 100644
index 000000000..33de649d7
--- /dev/null
+++ b/android/uhabits-android/src/main/res/anim/fade_out.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
diff --git a/android/uhabits-android/src/main/res/drawable-hdpi/ic_alarm_black.png b/android/uhabits-android/src/main/res/drawable-hdpi/ic_alarm_black.png
deleted file mode 100644
index 907491104..000000000
Binary files a/android/uhabits-android/src/main/res/drawable-hdpi/ic_alarm_black.png and /dev/null differ
diff --git a/android/uhabits-android/src/main/res/drawable-hdpi/ic_alarm_white.png b/android/uhabits-android/src/main/res/drawable-hdpi/ic_alarm_white.png
deleted file mode 100644
index 6dc94d2b5..000000000
Binary files a/android/uhabits-android/src/main/res/drawable-hdpi/ic_alarm_white.png and /dev/null differ
diff --git a/android/uhabits-android/src/main/res/drawable-hdpi/ic_repeat_black.png b/android/uhabits-android/src/main/res/drawable-hdpi/ic_repeat_black.png
deleted file mode 100644
index d8b42bbe4..000000000
Binary files a/android/uhabits-android/src/main/res/drawable-hdpi/ic_repeat_black.png and /dev/null differ
diff --git a/android/uhabits-android/src/main/res/drawable-hdpi/ic_repeat_white.png b/android/uhabits-android/src/main/res/drawable-hdpi/ic_repeat_white.png
deleted file mode 100644
index 81c5be793..000000000
Binary files a/android/uhabits-android/src/main/res/drawable-hdpi/ic_repeat_white.png and /dev/null differ
diff --git a/android/uhabits-android/src/main/res/drawable-mdpi/ic_alarm_black.png b/android/uhabits-android/src/main/res/drawable-mdpi/ic_alarm_black.png
deleted file mode 100644
index ed2f90aee..000000000
Binary files a/android/uhabits-android/src/main/res/drawable-mdpi/ic_alarm_black.png and /dev/null differ
diff --git a/android/uhabits-android/src/main/res/drawable-mdpi/ic_alarm_white.png b/android/uhabits-android/src/main/res/drawable-mdpi/ic_alarm_white.png
deleted file mode 100644
index ca4f94707..000000000
Binary files a/android/uhabits-android/src/main/res/drawable-mdpi/ic_alarm_white.png and /dev/null differ
diff --git a/android/uhabits-android/src/main/res/drawable-mdpi/ic_repeat_black.png b/android/uhabits-android/src/main/res/drawable-mdpi/ic_repeat_black.png
deleted file mode 100644
index c00a24ebf..000000000
Binary files a/android/uhabits-android/src/main/res/drawable-mdpi/ic_repeat_black.png and /dev/null differ
diff --git a/android/uhabits-android/src/main/res/drawable-mdpi/ic_repeat_white.png b/android/uhabits-android/src/main/res/drawable-mdpi/ic_repeat_white.png
deleted file mode 100644
index b1c2e04ab..000000000
Binary files a/android/uhabits-android/src/main/res/drawable-mdpi/ic_repeat_white.png and /dev/null differ
diff --git a/android/uhabits-android/src/main/res/drawable-xhdpi/ic_alarm_black.png b/android/uhabits-android/src/main/res/drawable-xhdpi/ic_alarm_black.png
deleted file mode 100644
index e37eab0e4..000000000
Binary files a/android/uhabits-android/src/main/res/drawable-xhdpi/ic_alarm_black.png and /dev/null differ
diff --git a/android/uhabits-android/src/main/res/drawable-xhdpi/ic_alarm_white.png b/android/uhabits-android/src/main/res/drawable-xhdpi/ic_alarm_white.png
deleted file mode 100644
index 280e09df3..000000000
Binary files a/android/uhabits-android/src/main/res/drawable-xhdpi/ic_alarm_white.png and /dev/null differ
diff --git a/android/uhabits-android/src/main/res/drawable-xhdpi/ic_repeat_black.png b/android/uhabits-android/src/main/res/drawable-xhdpi/ic_repeat_black.png
deleted file mode 100644
index 75ecb0462..000000000
Binary files a/android/uhabits-android/src/main/res/drawable-xhdpi/ic_repeat_black.png and /dev/null differ
diff --git a/android/uhabits-android/src/main/res/drawable-xhdpi/ic_repeat_white.png b/android/uhabits-android/src/main/res/drawable-xhdpi/ic_repeat_white.png
deleted file mode 100644
index ad8b8c0df..000000000
Binary files a/android/uhabits-android/src/main/res/drawable-xhdpi/ic_repeat_white.png and /dev/null differ
diff --git a/android/uhabits-android/src/main/res/drawable-xxhdpi/ic_alarm_black.png b/android/uhabits-android/src/main/res/drawable-xxhdpi/ic_alarm_black.png
deleted file mode 100644
index eb1d08d7a..000000000
Binary files a/android/uhabits-android/src/main/res/drawable-xxhdpi/ic_alarm_black.png and /dev/null differ
diff --git a/android/uhabits-android/src/main/res/drawable-xxhdpi/ic_alarm_white.png b/android/uhabits-android/src/main/res/drawable-xxhdpi/ic_alarm_white.png
deleted file mode 100644
index 75e5a46ee..000000000
Binary files a/android/uhabits-android/src/main/res/drawable-xxhdpi/ic_alarm_white.png and /dev/null differ
diff --git a/android/uhabits-android/src/main/res/drawable-xxhdpi/ic_repeat_black.png b/android/uhabits-android/src/main/res/drawable-xxhdpi/ic_repeat_black.png
deleted file mode 100644
index 965a319ff..000000000
Binary files a/android/uhabits-android/src/main/res/drawable-xxhdpi/ic_repeat_black.png and /dev/null differ
diff --git a/android/uhabits-android/src/main/res/drawable-xxhdpi/ic_repeat_white.png b/android/uhabits-android/src/main/res/drawable-xxhdpi/ic_repeat_white.png
deleted file mode 100644
index 5de7a2951..000000000
Binary files a/android/uhabits-android/src/main/res/drawable-xxhdpi/ic_repeat_white.png and /dev/null differ
diff --git a/android/uhabits-android/src/main/res/drawable-xxxhdpi/ic_alarm_black.png b/android/uhabits-android/src/main/res/drawable-xxxhdpi/ic_alarm_black.png
deleted file mode 100644
index 04b6c71d7..000000000
Binary files a/android/uhabits-android/src/main/res/drawable-xxxhdpi/ic_alarm_black.png and /dev/null differ
diff --git a/android/uhabits-android/src/main/res/drawable-xxxhdpi/ic_alarm_white.png b/android/uhabits-android/src/main/res/drawable-xxxhdpi/ic_alarm_white.png
deleted file mode 100644
index aa8102fd2..000000000
Binary files a/android/uhabits-android/src/main/res/drawable-xxxhdpi/ic_alarm_white.png and /dev/null differ
diff --git a/android/uhabits-android/src/main/res/drawable-xxxhdpi/ic_repeat_black.png b/android/uhabits-android/src/main/res/drawable-xxxhdpi/ic_repeat_black.png
deleted file mode 100644
index fd4d0c028..000000000
Binary files a/android/uhabits-android/src/main/res/drawable-xxxhdpi/ic_repeat_black.png and /dev/null differ
diff --git a/android/uhabits-android/src/main/res/drawable-xxxhdpi/ic_repeat_white.png b/android/uhabits-android/src/main/res/drawable-xxxhdpi/ic_repeat_white.png
deleted file mode 100644
index c7f3072ee..000000000
Binary files a/android/uhabits-android/src/main/res/drawable-xxxhdpi/ic_repeat_white.png and /dev/null differ
diff --git a/android/uhabits-android/src/main/res/drawable/bg_input_box.xml b/android/uhabits-android/src/main/res/drawable/bg_input_box.xml
new file mode 100644
index 000000000..8f83bd772
--- /dev/null
+++ b/android/uhabits-android/src/main/res/drawable/bg_input_box.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/uhabits-android/src/main/res/drawable/bg_input_group.xml b/android/uhabits-android/src/main/res/drawable/bg_input_group.xml
new file mode 100644
index 000000000..ed5de9ef4
--- /dev/null
+++ b/android/uhabits-android/src/main/res/drawable/bg_input_group.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/uhabits-android/src/main/res/drawable/ic_arrow_drop_down_dark.xml b/android/uhabits-android/src/main/res/drawable/ic_arrow_drop_down_dark.xml
new file mode 100644
index 000000000..8b5305ed8
--- /dev/null
+++ b/android/uhabits-android/src/main/res/drawable/ic_arrow_drop_down_dark.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/android/uhabits-android/src/main/res/drawable/round_ripple.xml b/android/uhabits-android/src/main/res/drawable/round_ripple.xml
new file mode 100644
index 000000000..7807b8b24
--- /dev/null
+++ b/android/uhabits-android/src/main/res/drawable/round_ripple.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/uhabits-android/src/main/res/layout/about.xml b/android/uhabits-android/src/main/res/layout/about.xml
index 523c965f6..f36bd68d2 100644
--- a/android/uhabits-android/src/main/res/layout/about.xml
+++ b/android/uhabits-android/src/main/res/layout/about.xml
@@ -25,7 +25,7 @@
android:background="?windowBackgroundColor"
android:fillViewport="true">
-
@@ -97,6 +97,11 @@
style="@style/About.Item.Clickable"
android:text="@string/pref_view_source_code"/>
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
@@ -273,7 +271,7 @@
+ android:text="Álinson Santos Xavier (Português)"/>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/uhabits-android/src/main/res/layout/automation.xml b/android/uhabits-android/src/main/res/layout/automation.xml
index f127a9f2d..a34e55bbc 100644
--- a/android/uhabits-android/src/main/res/layout/automation.xml
+++ b/android/uhabits-android/src/main/res/layout/automation.xml
@@ -24,7 +24,7 @@
android:layout_height="match_parent"
android:orientation="vertical">
-
-
-
- ~
- ~ 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 .
- -->
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/android/uhabits-android/src/main/res/layout/edit_habit_frequency.xml b/android/uhabits-android/src/main/res/layout/edit_habit_frequency.xml
deleted file mode 100644
index e8655fdac..000000000
--- a/android/uhabits-android/src/main/res/layout/edit_habit_frequency.xml
+++ /dev/null
@@ -1,69 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/android/uhabits-android/src/main/res/layout/edit_habit_name.xml b/android/uhabits-android/src/main/res/layout/edit_habit_name.xml
deleted file mode 100644
index 70ad45cdc..000000000
--- a/android/uhabits-android/src/main/res/layout/edit_habit_name.xml
+++ /dev/null
@@ -1,70 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/android/uhabits-android/src/main/res/layout/edit_habit_reminder.xml b/android/uhabits-android/src/main/res/layout/edit_habit_reminder.xml
deleted file mode 100644
index d6dcdb10d..000000000
--- a/android/uhabits-android/src/main/res/layout/edit_habit_reminder.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/android/uhabits-android/src/main/res/layout/edit_habit_target.xml b/android/uhabits-android/src/main/res/layout/edit_habit_target.xml
deleted file mode 100644
index d332cc822..000000000
--- a/android/uhabits-android/src/main/res/layout/edit_habit_target.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/android/uhabits-android/src/main/res/layout/frequency_picker_dialog.xml b/android/uhabits-android/src/main/res/layout/frequency_picker_dialog.xml
new file mode 100644
index 000000000..609d591fe
--- /dev/null
+++ b/android/uhabits-android/src/main/res/layout/frequency_picker_dialog.xml
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/uhabits-android/src/main/res/layout/select_habit_type.xml b/android/uhabits-android/src/main/res/layout/select_habit_type.xml
new file mode 100644
index 000000000..2c33078c1
--- /dev/null
+++ b/android/uhabits-android/src/main/res/layout/select_habit_type.xml
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/uhabits-android/src/main/res/layout/settings_activity.xml b/android/uhabits-android/src/main/res/layout/settings_activity.xml
index 16d9003df..ae11d3ce5 100644
--- a/android/uhabits-android/src/main/res/layout/settings_activity.xml
+++ b/android/uhabits-android/src/main/res/layout/settings_activity.xml
@@ -26,7 +26,7 @@
tools:context=".activities.settings.SettingsActivity"
tools:ignore="MergeRootFrame">
-
diff --git a/android/uhabits-android/src/main/res/layout/show_habit.xml b/android/uhabits-android/src/main/res/layout/show_habit.xml
index 9defc60d1..533814bdf 100644
--- a/android/uhabits-android/src/main/res/layout/show_habit.xml
+++ b/android/uhabits-android/src/main/res/layout/show_habit.xml
@@ -25,7 +25,7 @@
android:layout_height="match_parent"
android:orientation="vertical">
-
-
-
-
-
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/uhabits-android/src/main/res/layout/show_habit_preview.xml b/android/uhabits-android/src/main/res/layout/show_habit_preview.xml
index 84eaa4a51..a6c9317ed 100644
--- a/android/uhabits-android/src/main/res/layout/show_habit_preview.xml
+++ b/android/uhabits-android/src/main/res/layout/show_habit_preview.xml
@@ -23,9 +23,8 @@
android:layout_height="match_parent"
android:orientation="vertical">
-
+ android:gravity="center"/>
\ No newline at end of file
diff --git a/android/uhabits-android/src/main/res/layout/show_habit_score.xml b/android/uhabits-android/src/main/res/layout/show_habit_score.xml
index 34b946b82..ba1b82a77 100644
--- a/android/uhabits-android/src/main/res/layout/show_habit_score.xml
+++ b/android/uhabits-android/src/main/res/layout/show_habit_score.xml
@@ -23,7 +23,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
- .
-->
-
+
+
+ android:orientation="horizontal"
+ tools:visibility="visible">
-
+
+
+
+
+ android:layout_marginStart="4dp"
+ android:layout_marginEnd="16dp"
+ android:textSize="@dimen/smallTextSize" />
-
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/fa_bell_o"
+ android:textColor="?mediumContrastTextColor"
+ android:textSize="@dimen/smallTextSize" />
+ android:text="8:00 AM"
+ android:layout_marginStart="4dp"
+ android:textSize="@dimen/smallTextSize" />
\ No newline at end of file
diff --git a/android/uhabits-android/src/main/res/layout/show_habit_target.xml b/android/uhabits-android/src/main/res/layout/show_habit_target.xml
new file mode 100644
index 000000000..82d14cd8c
--- /dev/null
+++ b/android/uhabits-android/src/main/res/layout/show_habit_target.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/uhabits-android/src/main/res/layout/target_stackview_widget.xml b/android/uhabits-android/src/main/res/layout/target_stackview_widget.xml
new file mode 100644
index 000000000..99ab7eefa
--- /dev/null
+++ b/android/uhabits-android/src/main/res/layout/target_stackview_widget.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/android/uhabits-android/src/main/res/layout/toolbar.xml b/android/uhabits-android/src/main/res/layout/toolbar.xml
index 8d263e906..eda5fc20e 100644
--- a/android/uhabits-android/src/main/res/layout/toolbar.xml
+++ b/android/uhabits-android/src/main/res/layout/toolbar.xml
@@ -18,7 +18,7 @@
~ with this program. If not, see .
-->
-
-
-
diff --git a/android/uhabits-android/src/main/res/values-af-rZA/strings.xml b/android/uhabits-android/src/main/res/values-af-rZA/strings.xml
new file mode 100644
index 000000000..2bcbebfcd
--- /dev/null
+++ b/android/uhabits-android/src/main/res/values-af-rZA/strings.xml
@@ -0,0 +1,53 @@
+
+
+
+
+ Loop - Gewoonte Boekhouer
+ Gewoontes
+ Instellings
+ Redigeer
+ Verwyder
+ Argiveer
+ Deargiveer
+ Voeg gewoonte by
+ Verander kleur
+ Gewoonte geskep
+ Gewoontes verwyder
+ Gewoontes herstel
+ Niks om terug te doen nie
+ Niks om oor te doen nie
+ Gewoonte verander
+ Gewoonte terug verander
+ Gewoontes geargiveer
+ Gewoontes gedeargiveer
+ Oorsig
+
+ Welkom
+ 15 minute
+ 30 minute
+ 1 uur
+ 2 ure
+ 4 ure
+ 8 ure
+ 24 ure
+ Instellings
+
+
+
diff --git a/android/uhabits-android/src/main/res/values-af/strings.xml b/android/uhabits-android/src/main/res/values-af/strings.xml
deleted file mode 100644
index b9cdf6e8d..000000000
--- a/android/uhabits-android/src/main/res/values-af/strings.xml
+++ /dev/null
@@ -1,178 +0,0 @@
-
-
-
-
- Trình theo dõi thói quen Loop
- Thói quen
- Cài đặt
- Chỉnh sửa
- Xoá
- Lưu trữ
- Hủy lưu trữ
- Thêm thói quen
- Thay đổi màu sắc
- Thói quen đã được tạo
- Thói quen đã bị xóa
- Thói quen đã được phục hồi
- Không có gì để hoàn tác
- Không có gì để khôi phục
- Thói quen đã được thay đổi
- Thói quen đã huỷ chỉnh sửa
- Thói quen đã được lưu trữ
- Thói quen đã bị huỷ lưu trữ
- Tổng quan
- Độ mạnh của thói quen
- Lịch sử
- Dọn sạch
- Câu hỏi (Bạn đã ... hôm nay?)
- Lặp lại
- times in
- ngày
- Nhắc nhở
- Loại bỏ
- Lưu
- Mức độ
- Bạn có không có thói quen nào đang hoạt động
- Nhấn giữ để đánh dấu hoặc bỏ đánh dấu
- Tắt
- Tên không thể để trống.
- Số phải là số dương.
- Bạn có thể có tối đa một lặp lại mỗi ngày
- Tạo thói quen
- Chỉnh sửa thói quen
- Kiểm tra
- Lúc khác
-
- Chào mừng
- Theo dõi thói quen Loop giúp bạn tạo ra và duy trì những thói quen tốt.
- Tạo một số thói quen mới
- Mỗi ngày, sau khi thực hiện các thói quen của bạn, hãy đánh dấu vào ứng dụng.
- Hãy duy trì thói quen
- Thói quen thực hiện một cách nhất quán trong một thời gian dài sẽ kiếm được trọn vẹn một ngôi sao.
- Theo dõi quá trình của bạn
- Đồ thị chi tiết cho bạn thấy các thói quen của bạn được cải thiện như thế nào theo thời gian.
- 15 phút
- 30 phút
- 1 giờ
- 2 giờ
- 4 giờ
- 8 giờ
- 24 giờ
- Bấm nhanh để chuyển trạng thái
- Chỉ cần chạm một lần để đánh dấu thay cho việc nhấn giữ. Tiện lợi hơn nhưng có thể đánh dấu sai.
- Khoảng thời gian báo lại lời nhắc
- Đánh giá ứng dụng trên Google Play
- Gửi phản hồi cho nhà phát triển
- Xem mã nguồn trên Github
- Xem giới thiệu ứng dụng
- Liên kết
- Hành vi
- Tên
- Cài đặt
- Khoảng thời gian tạm dừng
- Bạn đã biết?
- Để sắp xếp lại các mục, nhấn giữ tên thói quen, sau đó kéo tới vị trí chính xác.
- Bạn có thể xem thêm ngày bằng cách đặt điện thoại ở chế độ ngang.
- Xoá bỏ thói quen
- Thói quen sẽ bị xoá vĩnh viễn. Hành động này không thể khôi phục.
- Thói quen đã bị xoá hoặc không tìm thấy
- Cuối tuần
- Thứ 2 đến thứ 6
- Bất kỳ ngày nào trong tuần
- Chọn ngày
- Xuất dưới dạng CSV
- Xong
- Dọn sạch
- Chọn giờ
- Chọn phút
- Giới thiệu
- Dịch giả
- Nhà phát triển
- Phiên bản %s
- Tần suất
- Đánh dấu
- Độ mạnh
- Duy trì lâu nhất
- Số ngày duy trì hiện tại
- Số lần lặp
- Đã thực hiện được %d ngày
- Đã thực hiện được %d tuần
- Đã thực hiện được %d tháng
- Đã thực hiện được %d năm
- Toàn bộ thời gian
- Hàng ngày
- Hàng tuần
- 2 lần một tuần
- 5 lần một tuần
- Tuỳ chỉnh…
- Trợ giúp & Câu hỏi
- Xuất dữ liệu thất bại.
- Nhập dữ liệu thất bại.
- Không xác nhận được file.
- Thói quen được nhập thành công.
- Xuất bản sao lưu đầy đủ thành công.
- Nhập dữ liệu
- Xuất toàn bộ sao lưu
- Hồ trợ các bản sao lưu đầy đủ được xuất ra bởi ứng dụng, cũng như các file được tạo bởi Tickmate, HabitBull hoặc Rewire. Xem FAQ để biết thêm thông tin.
- Các file tạo ra có thể mở bằng các phần mềm bảng tĩnh như Microsoft Excel hoặc OpenOffice Calc. Nhưng file này không thể nhập lại.
- Tạo ra một tệp chứa tất cả dữ liệu của bạn. Tệp này có thể nhập lại.
- Tạo báo cáo về lỗi.
- Tạo báo cáo lỗi
- Xử lí sự cố
- Giúp dịch ứng dụng
- Chế độ ban đêm
- Sử dụng màu đen thuần trong chế độ ban đêm
- Thay thế nền màu xám bởi màu đen thuần trong chế độ ban đêm. Giảm thiểu việc sử dụng pin của điện thoại có màn hình AMOLED.
- Giao diện
- Đảo ngược thứ tự của ngày
- Hiển thị ngày ngược trên màn hình chính
- Ngày
- Tuần
- Tháng
- Quý
- Năm
- Tổng
-
- lần trong
- Mỗi %d ngày
- Mỗi %d tuần
- Mỗi %d tháng
- Điểm
- Âm báo
- Không có
- Lọc
- Ẩn mục đã hoàn thành
- Ẩn mục đã lưu trữ
- Gửi thông báo cố định
- Không cho các thông báo bị vuốt ngang mất.
- Sửa cơ sở dữ liệu
- Cơ sở dữ liệu đã được sửa.
- Bỏ đánh dấu
- Bật/tắt
- Hành động
- Thói quen
- Sắp xếp
- Thủ công
- Theo tên
- Theo màu sắc
- Theo điểm số
- Tải về
- Xuất dữ liệu ra
-
diff --git a/android/uhabits-android/src/main/res/values-ar-rSA/strings.xml b/android/uhabits-android/src/main/res/values-ar-rSA/strings.xml
new file mode 100644
index 000000000..3aca7cbe4
--- /dev/null
+++ b/android/uhabits-android/src/main/res/values-ar-rSA/strings.xml
@@ -0,0 +1,179 @@
+
+
+
+
+ Loop Habit Tracker
+ عادات
+ إعدادات
+ تعديل
+ حذف
+ أرشفة
+ إزالة من الأرشيف
+ إضافة عادة
+ تغيير اللون
+ تم إنشاء عادة
+ تم حذف العادات
+ تم إستعادة العادات
+ لا شيء للتراجع
+ لا شيء للإعادة
+ تم تغيير عادة
+ تمت إعادة العادة إلى أصلها
+ تم أرشفه العادات
+ تم الغاء ارشفه العادات
+ نظرة عامة
+ قوة العادة
+ السجل
+ إزالة
+ السؤال (هل قمت بـ ... اليوم؟)
+ تكرار
+ مرات في
+ أيام
+ تذكير
+ تجاهل
+ حفظ
+ الإنجازات
+ لا يوجد لديك عادات مفعله
+ إلمس و إستمر لتحقق أو ازل
+ إيقاف
+ لا يمكن أن يكون الإسم فارغ
+ يجب أن يكون الرقم إيجابي
+ يجب أن يكون التكرار مرة واحدة فقط كل يوم
+ انشاء العادة
+ تعديل العادة
+ حقق
+ لاحقاً
+
+ أهلا بك
+ Loop Habit Tracker يساعدك في بدء عادات جيدة والحفاظ عليها.
+ إنشاء بعض عادات جديدة
+ كل يوم، بعد أداء عادتك، ضع علامة عليها في التطبيق.
+ حافظ على القيام بذلك
+ العادات المنجزة باستمرار لمدة طويلة تحصل على نجمة.
+ تتبع تقدمك
+ رسوم بيانية مفصلة تُريك كيف تحسنت عاداتك مع مرور الوقت.
+ 15 دقيقة
+ 30 دقيقة
+ ساعة واحدة
+ ساعتان
+ أربع ساعات
+ 8 ساعات
+ ٢٤ ساعة
+ تبديل وضعية العادة بضغطة قصيرة
+ وضع علامات الاختيار الموجودة بنقرة واحدة بدلاً من الصحافة وعقد. أكثر ملاءمة، ولكن قد يتسبب في تبديل عرضي.
+ فترتي الغفوى على التذكير
+ تقييم هذا التطبيق على جوجل بلاي
+ أرسل الملاحظات إلى المطور
+ إفحص التعليمات البرمجية على GitHub
+ عرض المقدمه
+ روابط
+ سلوك
+ اسم
+ إعدادات
+ فترتي الغفوه
+ هل كنت تعلم؟
+ لإعادة ترتيب القوائم، أضغط اسم من هذه العادة، ثم اسحبه إلى المكان الصحيح.
+ يمكنك ان ترى المزيد أيام عن طريق وضع الهاتف في وضع أفقي.
+ حذف عادات
+ سيتم حذف عادات بشكل دائم. هذا العمل لا يمكن التراجع عنه.
+ العادة حذفت/لم يتم العثور عليها
+ عطلة نهاية الأسبوع
+ أيام الأسبوع
+ أي يوم
+ إختار أيام
+ تصدير البيانات (CSV)
+ منجز
+ نظف
+ تحديد ساعات
+ تحديد دقائق
+ معلومات حول
+ المترجمين
+ المطورين
+ الإصدار %s
+ تردد
+ علامة الاختيار
+ القوة
+ أكثر تقدم
+ تقدم الحالي
+ عدد من حالات التكرار
+ آخر %d أيام
+ آخر %d أسابيع
+ آخر %d أشهر
+ آخر %d سنين
+ كل الوقت
+ كل يوم
+ كل اسبوع
+ مرتين في الأسبوع
+ خمس مرات في الأسبوع
+ مخصص...
+ مساعدة والأسئلة المتداولة
+ فشل في تصدير البيانات.
+ فشل في استيراد البيانات.
+ لم يتم التعرف على الملف.
+ نجح إستيراد العادات.
+ نجح تصدير النسخ الاحتياطي الكامل.
+ استيراد بيانات.
+ صدر نسخة احتياطية كاملة.
+ تدعم النسخ الاحتياطي الكامل المصدرة من هذا التطبيق، فضلا عن الملفات التي تم إنشاؤها من Tickmate, HabitBull و Rewire. انظر التعليمات لمزيد من المعلومات.
+ صدر ملف التي يمكن فتحها ببرنامج جداول البيانات مثل إكسل أو وبينوفيس. لا يمكن إستيراد هذا الملف.
+ إنشاء ملف يحتوي على كافة البيانات. يمكن استيراد هذا الملف نفسه.
+ فشل في توليد تقرير الاعطال
+ توليد تقرير الاعطال
+ استكشاف الأخطاء وإصلاحها
+ المساعدة في ترجمة هذا البرنامج
+ الوضع الليلي
+ استخدام أسود نقي في الوضع الليلي
+ يستبدل خلفيات رمادية مع أسود نقي في الوضع الليلي. يقلل من استهلاك البطارية في الهواتف مع شاشة AMOLED.
+ السطح البيني
+ ترتيب عكسي أيام
+ عرض أيام في ترتيب عكسي على الشاشة الرئيسية
+ يوم
+ أسبوع
+ شهر
+ ربع سنه
+ عام
+ المجموع
+
+
+ مرات في
+ كل %d أيام
+ كل %d أسابيع
+ كل %d أشهر
+ النقاط
+ صوت تذكير
+ صامت
+ تصنيف
+ إخفاء المكتملة
+ إخفاء المؤرشفة
+ جعل الإشعارات ثابتة
+ منع الإشعارات من تمريرها بعيداً.
+ إصلاح قاعدة البيانات
+ تم إصلاح قاعدة البيانات.
+ إلغاء تحديد
+ تبديل
+ عمل
+ عادة
+ فرز
+ يدوياً
+ حسب الإسم
+ حسب اللون
+ حسب النقاط
+ تحميل
+ استخراج
+
diff --git a/android/uhabits-android/src/main/res/values-ar/strings.xml b/android/uhabits-android/src/main/res/values-ar/strings.xml
deleted file mode 100644
index b624961af..000000000
--- a/android/uhabits-android/src/main/res/values-ar/strings.xml
+++ /dev/null
@@ -1,178 +0,0 @@
-
-
-
-
- متعقب العادة لووب
- عادات
- إعدادات
- تعديل
- حذف
- أرشفة
- إزالة من الأرشيف
- إضافة عادة
- تغيير اللون
- تم إنشاء عادة
- تم حذف العادات
- تم إستعادة العادات
- لا شيء للألغاء
- لا شيء للإعادة
- تم تغيير عادة
- تم أرجاع العادة إلى أصلها
- تم أرشفه العادات
- تم الغاء ارشفه العادات
- نظرة عامة
- قوة العادة
- السجل
- إزالة
- السؤال (هل ... اليوم؟)
- كرره
- مرات كل
- أيام
- التذكرة
- تجاهل
- حفظ
- الانجازات
- لا يوجد لديك عادات مفعلة
- أضغط و إستمر لتحقق أو ازل
- إيقاف
- لا يمكن أن يكون الإسم فارغ
- يجب أن يكون الرقم موجب.
- يجب أن يكون التكرار مرة واحدة فقط كل يوم
- انشاء العادة
- تعديل العادة
- حقق
- لاحقاً
-
- أهلا بك
- لوب يساعدك في بدأ عادات جيدة والحفاظ عليها.
- إنشاء عادات جديدة
- كل يوم، بعد أداء عادتك، ضع علامة عليها في التطبيق.
- حافظ على القيام بذلك
- العادة المستمرة لفترة طويلة تكسب نجمة كامله.
- تتبع اداءك
- رسوم بيانية مفصلة تُريك كيف تحسنت عاداتك مع مرور الوقت.
- 15 دقيقة
- 30 دقيقة
- ساعة واحدة
- ساعتان
- ٤ ساعات
- 8 ساعات
- ٢٤ ساعة
- تبديل وضعية العادة بضغطة قصيرة
- أكثر سهولة، لكنه ممكن يسبب كبسات غير مقصوده
- فترتي الغفوى على التذكير
- تقييم هذا التطبيق على جوجل بلاي
- أرسل الملاحظات إلى المطور
- إفحص التعليمات البرمجية على GitHub
- عرض المقدمه
- روابط
- سلوك
- اسم
- إعدادات
- فترتي الغفوه
- هل كنت تعلم؟
- لإعادة ترتيب القوائم، أضغط اسم من هذه العادة، ثم اسحبه إلى المكان الصحيح.
- يمكنك ان ترى المزيد أيام عن طريق وضع الهاتف في وضع أفقي.
- حذف عادات
- سيتم حذف عادات بشكل دائم. هذا العمل لا يمكن التراجع عنه.
- العادة حذفت/لم يتم العثور عليها
- عطلة نهاية الأسبوع
- أيام الأسبوع
- أي يوم
- إختار أيام
- تصدير البيانات (CSV)
- منجز
- نظف
- تحديد ساعات
- تحديد دقائق
- معلومات حول
- المترجمين
- المطورين
- الإصدار %s
- تردد
- علامة الاختيار
- القوة
- أكثر تقدم
- تقدم الحالي
- عدد من حالات التكرار
- آخر %d أيام
- آخر %d أسابيع
- آخر %d أشهر
- آخر %d سنين
- كل الوقت
- كل يوم
- كل اسبوع
- مرتين في الأسبوع
- خمس مرات في الأسبوع
- مخصص...
- مساعدة والأسئلة المتداولة
- فشل في تصدير البيانات.
- فشل في استيراد البيانات.
- الملف غير المعترف.
- نجح إستيراد العادات.
- نجح تصدير النسخ الاحتياطي الكامل.
- استيراد بيانات.
- صدر نسخة احتياطية كاملة.
- تدعم النسخ الاحتياطي الكامل المصدرة من هذا التطبيق، فضلا عن الملفات التي تم إنشاؤها من Tickmate, HabitBull و Rewire. انظر التعليمات لمزيد من المعلومات.
- صدر ملف التي يمكن فتحها ببرنامج جداول البيانات مثل إكسل أو وبينوفيس. لا يمكن إستيراد هذا الملف.
- إنشاء ملف يحتوي على كافة البيانات. يمكن استيراد هذا الملف نفسه.
- فشل في توليد تقرير الاعطال
- توليد تقرير الاعطال
- استكشاف الأخطاء وإصلاحها
- المساعدة في ترجمة هذا البرنامج
- الوضع الليلي
- استخدام أسود نقي في الوضع الليلي
- يستبدل خلفيات رمادية مع أسود نقي في الوضع الليلي. يقلل من استهلاك البطارية في الهواتف مع شاشة AMOLED.
- السطح البيني
- ترتيب عكسي أيام
- عرض أيام في ترتيب عكسي على الشاشة الرئيسية
- يوم
- أسبوع
- شهر
- ربع سنه
- عام
- المجموع
-
- مرات في
- كل %d أيام
- كل %d أسابيع
- كل %d أشهر
- النقاط
- صوت تذكير
- صامت
- تصنيف
- إخفاء المكتملة
- إخفاء المؤرشفة
- جعل الإشعارات ثابتة
- منع الإشعارات من تمريرها بعيداً.
- إصلاح قاعدة البيانات
- تم إصلاح قاعدة البيانات.
- إلغاء تحديد
- تبديل
- عمل
- عادة
- فرز
- يدوياً
- حسب الإسم
- حسب اللون
- حسب النقاط
- تحميل
- استخراج
-
diff --git a/android/uhabits-android/src/main/res/values-bg-rBG/strings.xml b/android/uhabits-android/src/main/res/values-bg-rBG/strings.xml
new file mode 100644
index 000000000..72dfc1c08
--- /dev/null
+++ b/android/uhabits-android/src/main/res/values-bg-rBG/strings.xml
@@ -0,0 +1,179 @@
+
+
+
+
+ Loop Следене на навици
+ Навици
+ Настройки
+ Редактиране
+ Изтриване
+ Архивиране
+ Разархивиране
+ Добавяне на навик
+ Промяна на цвят
+ Навикът е създаден
+ Навиците са изтрити
+ Навиците са възстановени
+ Нищо за отмяна
+ Нищо за възстановяване
+ Навикът е променен
+ Промяната на навика е отменена.
+ Навиците са архивирани
+ Навиците са разархивирани
+ Обзор
+ Сила на навика
+ История
+ Изчистване
+ Въпрос (Днес, ... ли?)
+ Повтори
+ пъти в период от
+ дни
+ Напомняне
+ Отказ
+ Запазване
+ Поредици
+ Нямате активни навици
+ Натиснете и задръжте за да добавите или премахнете отметка
+ Изключено
+ Името не може да бъде празно.
+ Числото трябва да е положително.
+ Позволено е до едно повторение на ден.
+ Създаване на навик
+ Редактиране на навик
+ Поставяне на отметка
+ По-късно
+
+ Добре дошли
+ Loop Следене на навици ви помага да създавате и поддържате добри навици.
+ Създайте нови навици
+ Всеки ден, след изпълнението на навика, поставете отметка в приложението.
+ Продължавайте да го изпълнявате
+ Навици изпълнявани редовно за дълго време ще ви спечелят пълна звезда.
+ Следете напредъка си
+ Подробни диаграми ви показват как вашите навици са се подобрили с времето.
+ 15 минути
+ 30 минути
+ 1 час
+ 2 часа
+ 4 часа
+ 8 часа
+ 24 часа
+ Маркиране с кратко натискане
+ Поставяне на отметки с кратко натискане вместо с натискане и задържане. По-удобно, но може да доведе до неволно маркиране.
+ Интервал на напомняне след отлагане
+ Оценяване на това приложение в Google Play
+ Изпращане на отзиви към разработчика
+ Преглед на програмния код в GitHub
+ Преглед на въведение в приложението
+ Препратки
+ Поведение
+ Име
+ Настройки
+ Интервал на отлагане
+ Знаете ли че?
+ За да пренаредите записите, натиснете и задръжте върху името на навика и го придърпайте до правилното място.
+ Може да виждате повече дни като обърнете телефона си в хоризонтално положение.
+ Изтриване на навици
+ Навиците ще се изтрият перманентно. Това действие не може да бъде отменено.
+ Навикът е изтрит / не е намерен
+ Събота и неделя
+ От понеделник до петък
+ Всеки ден от седмицата
+ Избор на дни
+ Експортиране като CSV
+ Готово
+ Изчистване
+ Избиране на час
+ Избиране на минута
+ За приложението
+ Преводачи
+ Разработчици
+ Версия %s
+ Честота
+ Отметка
+ Сила
+ Най-добри поредици
+ Текуща поредица
+ Брой повторения
+ Последните %d дни
+ Последните %d седмици
+ Последните %d месеци
+ Последните %d години
+ От началото
+ Всеки ден
+ Всяка седмица
+ 2 пъти седмично
+ 5 пъти седмично
+ Друго ...
+ Помощ & ЧЗВ
+ Неуспешно експортиране на данни.
+ Неуспешно импортиране на данни.
+ Файлът не е разпознат.
+ Навиците са импортирани успешно.
+ Пълно резервно копие е експортирано успешно.
+ Импортиране на данни
+ Експортиране на пълно резервно копие
+ Поддържа пълни резервни копия експортирани чрез това приложение, както и файлове генерирани чрез Tickmate, HabitBull или Rewire. Вижте ЧЗВ за повече информация.
+ Генерира файлове, които могат да се отварят със софтуер за електронни таблици като Microsoft Excel или OpenOffice Calc. Този файл не може да се импортира обратно.
+ Генерира файл, който съдържа всичките ви данни. Този файл може да бъде импортиран обратно.
+ Неуспешно генериране на доклад за грешки.
+ Генериране на доклад за грешки
+ Отстраняване на проблеми
+ Помагане за превода на това приложение
+ Нощен режим
+ Използване на чисто черно при нощен режим
+ Заменя сивите фонове с чисто черни при нощен режим. Намаля разхода на батерията при телефони с AMOLED дисплеи.
+ Интерфейс
+ Обратен ред на дните
+ Показва дните на основния екран в обратен ред
+ Ден
+ Седмица
+ Месец
+ Тримесечие
+ Година
+ Общо
+
+
+ път в период от
+ На всеки %d дни
+ На всеки %d седмици
+ На всеки %d месеца
+ Сила
+ Звук за напомняне
+ Няма
+ Филтър
+ Скриване на завършените
+ Скриване на архивираните
+ Направи нотификациите постоянни
+ Предотвратява изчистването на нотификацията с плъзване настрани.
+ Поправка на базата данни
+ Базата данни е поправена.
+ Премахване на отметка
+ Смяна
+ Действие
+ Навик
+ Сортиране
+ Ръчно
+ По име
+ По цвят
+ По сила
+ Изтегляне
+ Експортиране
+
diff --git a/android/uhabits-android/src/main/res/values-bg/strings.xml b/android/uhabits-android/src/main/res/values-bg/strings.xml
deleted file mode 100644
index 85d70798d..000000000
--- a/android/uhabits-android/src/main/res/values-bg/strings.xml
+++ /dev/null
@@ -1,178 +0,0 @@
-
-
-
-
- Loop Следене на навици
- Навици
- Настройки
- Редактиране
- Изтриване
- Архивиране
- Разархивиране
- Добавяне на навик
- Промяна на цвят
- Навикът е създаден
- Навиците са изтрити
- Навиците са възстановени
- Нищо за отмяна
- Нищо за възстановяване
- Навикът е променен
- Промяната на навика е отменена.
- Навиците са архивирани
- Навиците са разархивирани
- Обзор
- Сила на навика
- История
- Изчистване
- Въпрос (Днес, ... ли?)
- Повтори
- пъти в период от
- дни
- Напомняне
- Отказ
- Запазване
- Поредици
- Нямате активни навици
- Натиснете и задръжте за да добавите или премахнете отметка
- Изключено
- Името не може да бъде празно.
- Числото трябва да е положително.
- Позволено е до едно повторение на ден.
- Създаване на навик
- Редактиране на навик
- Поставяне на отметка
- По-късно
-
- Добре дошли
- Loop Следене на навици ви помага да създавате и поддържате добри навици.
- Създайте нови навици
- Всеки ден, след изпълнението на навика, поставете отметка в приложението.
- Продължавайте да го изпълнявате
- Навици изпълнявани редовно за дълго време ще ви спечелят пълна звезда.
- Следете напредъка си
- Подробни диаграми ви показват как вашите навици са се подобрили с времето.
- 15 минути
- 30 минути
- 1 час
- 2 часа
- 4 часа
- 8 часа
- 24 часа
- Маркиране с кратко натискане
- Поставяне на отметки с кратко натискане вместо с натискане и задържане. По-удобно, но може да доведе до неволно маркиране.
- Интервал на напомняне след отлагане
- Оценяване на това приложение в Google Play
- Изпращане на отзиви към разработчика
- Преглед на програмния код в GitHub
- Преглед на въведение в приложението
- Препратки
- Поведение
- Име
- Настройки
- Интервал на отлагане
- Знаете ли че?
- За да пренаредите записите, натиснете и задръжте върху името на навика и го придърпайте до правилното място.
- Може да виждате повече дни като обърнете телефона си в хоризонтално положение.
- Изтриване на навици
- Навиците ще се изтрият перманентно. Това действие не може да бъде отменено.
- Навикът е изтрит / не е намерен
- Събота и неделя
- От понеделник до петък
- Всеки ден от седмицата
- Избор на дни
- Експортиране като CSV
- Готово
- Изчистване
- Избиране на час
- Избиране на минута
- За приложението
- Преводачи
- Разработчици
- Версия %s
- Честота
- Отметка
- Сила
- Най-добри поредици
- Текуща поредица
- Брой повторения
- Последните %d дни
- Последните %d седмици
- Последните %d месеци
- Последните %d години
- От началото
- Всеки ден
- Всяка седмица
- 2 пъти седмично
- 5 пъти седмично
- Друго ...
- Помощ & ЧЗВ
- Неуспешно експортиране на данни.
- Неуспешно импортиране на данни.
- Файлът не е разпознат.
- Навиците са импортирани успешно.
- Пълно резервно копие е експортирано успешно.
- Импортиране на данни
- Експортиране на пълно резервно копие
- Поддържа пълни резервни копия експортирани чрез това приложение, както и файлове генерирани чрез Tickmate, HabitBull или Rewire. Вижте ЧЗВ за повече информация.
- Генерира файлове, които могат да се отварят със софтуер за електронни таблици като Microsoft Excel или OpenOffice Calc. Този файл не може да се импортира обратно.
- Генерира файл, който съдържа всичките ви данни. Този файл може да бъде импортиран обратно.
- Неуспешно генериране на доклад за грешки.
- Генериране на доклад за грешки
- Отстраняване на проблеми
- Помагане за превода на това приложение
- Нощен режим
- Използване на чисто черно при нощен режим
- Заменя сивите фонове с чисто черни при нощен режим. Намаля разхода на батерията при телефони с AMOLED дисплеи.
- Интерфейс
- Обратен ред на дните
- Показва дните на основния екран в обратен ред
- Ден
- Седмица
- Месец
- Тримесечие
- Година
- Общо
-
- път в период от
- На всеки %d дни
- На всеки %d седмици
- На всеки %d месеца
- Сила
- Звук за напомняне
- Няма
- Филтър
- Скриване на завършените
- Скриване на архивираните
- Направи нотификациите постоянни
- Предотвратява изчистването на нотификацията с плъзване настрани.
- Поправка на базата данни
- Базата данни е поправена.
- Премахване на отметка
- Смяна
- Действие
- Навик
- Сортиране
- Ръчно
- По име
- По цвят
- По сила
- Изтегляне
- Експортиране
-
diff --git a/android/uhabits-android/src/main/res/values-ca-rES/strings.xml b/android/uhabits-android/src/main/res/values-ca-rES/strings.xml
new file mode 100644
index 000000000..8faeccb35
--- /dev/null
+++ b/android/uhabits-android/src/main/res/values-ca-rES/strings.xml
@@ -0,0 +1,179 @@
+
+
+
+
+ Loop - Hàbit Rastrejador
+ Hàbits
+ Configuració
+ Editar
+ Esborrar
+ Arxivar
+ Treure de l\'arxiu
+ Afegir hàbit
+ Canviar color
+ Hàbit creat.
+ Hàbits esborrats.
+ Hàbits restaurats.
+ Res a desfer.
+ Res a refer.
+ Hàbit modificat.
+ Hàbit restaurat.
+ Hàbits arxivats.
+ Hàbits trets de l\'arxiu.
+ Visió general
+ Fortalesa de l\'hàbit
+ Història
+ Netejar
+ Pregunta (Has ... avui?)
+ Repetir
+ vegades en
+ dies
+ Recordatori
+ Descartar
+ Desar
+ Ratxa
+ No tens hàbits actius
+ Prem i manté per a marcar o desmarcar
+ Desactivat
+ El nom no pot estar buit
+ El número ha de ser positiu
+ Pots tenir com a màxim una repetició per dia
+ Crear hàbit
+ Editar hàbit
+ Revisar
+ Més tard
+
+ Benvingut
+ Loop Habit Tracker t\'ajuda a crear i mantenir bons hàbits
+ Crear alguns hàbits nous
+ Cada dia, després de complir el teu hàbit, posa una marca amb l\'aplicació.
+ Continua fent-ho
+ Els hàbits que facis consistentment durant una llarga temporada obtindran una estrella
+ Segueix el teu progrès
+ Els gràfics detallats et mostren com han mirollat els teus hàbits al llarg del temps
+ 15 minuts
+ 30 minuts
+ 1 hora
+ 2 hores
+ 4 hores
+ 8 hores
+ 24 hores
+ Activar/desactivar repeticions prement curt
+ Més adequat, però pot causar activacions accidentals
+ Interval d\'endarreriment en recordatoris
+ Valora aquesta app a Google Play
+ Enviar resposta al desenvolupador
+ Veure codi font a Github
+ Veure introducció de l\'app
+ Enllaços
+ Comportament
+ Nom
+ Ajustaments
+ Interval d\'endarreriment
+ Ho sabies?
+ Per a ordenar les entrades, prem i mantè sobre el nom de l\'hàbit, després arrossega\'l al lloc correcte.
+ Pots veure més dies posant el teu telèfon en orientació apaisada.
+ Esborrar hàbits
+ Els hàbits seran esborrats permanentment. Aquesta acció no es pot desfer.
+ Hàbit suprimit / no trobat
+ Caps de setmana
+ Dilluns a divendres
+ Qualsevol dia de la setmana
+ Selecciona els dies
+ Exportar a CSV
+ Fet
+ Treure
+ Selecciona les hores
+ Selecciona els minuts
+ En quant a
+ Traductors
+ Desenvolupadors
+ Versió %s
+ Freqüència
+ Marca
+ Fortalesa
+ Millors ratxes
+ Ratxa actual
+ Nombre de repeticions
+ Últims %d dies
+ Últimes %d setmanes
+ Últims %d mesos
+ Últims %d anys
+ Tot el temps
+ Cada dia
+ Cada setmana
+ 2 cops per setmana
+ 5 cops per setmana
+ Personalitzar ...
+ Ajuda i Preguntes Freqüents
+ Error exportant dades.
+ Error important dades.
+ Fitxer no reconegut.
+ Hàbits importats correctament.
+ Còpia de seguretat sencera exportada satisfactòriament.
+ Importar dades
+ Exportar còpia de seguretat sencera
+ 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ó.
+ Genera fitxers que poden ser oberts per programari de fulles de càlcul, com ara Microsoft Excel o OpenOffice Calc. Aquest fitxer no pot tornar-se a importar.
+ Genera un fitxer que contè totes les teves dades. Aquest fitxer pot tornar-se a importar.
+ Ha fallat la generació de l\'informe d\'error.
+ Generar informe d\'error
+ Resolució de problemes
+ Ajuda a traduïr aquesta app
+ Mode nocturn
+ Utilitzar negre pur en el mode nocturn
+ Reemplaça fons grisos per negre pur en el mode nocturn. Redueix consum de bateria en telèfons amb pantalla AMOLED.
+ Interfície
+ Ordre invers de dies
+ Mostra els dies en ordre invers en la pantalla principal
+ Dia
+ Setmana
+ Mes
+ Quatrimestre
+ Any
+ Total
+
+
+ vegades en
+ Cada %d dies
+ Cada %d setmanes
+ Cada %d mesos
+ Puntuació
+ So de recordatori
+ Cap
+ Filtre
+ Amaga completat
+ Amaga arxivades
+ Fer les notificacions enganxós
+ Evita les notificacions de ser pispat lluny.
+ Base de dades de reparació
+ Reparar base de dades.
+ Desmarca
+ Canvia
+ Acció
+ Hàbit
+ Ordenar
+ Manualment
+ Per nom
+ Pel color
+ Per marcador
+ Descarrega
+ Exportar
+
diff --git a/android/uhabits-android/src/main/res/values-ca/strings.xml b/android/uhabits-android/src/main/res/values-ca/strings.xml
deleted file mode 100644
index 27c554cd2..000000000
--- a/android/uhabits-android/src/main/res/values-ca/strings.xml
+++ /dev/null
@@ -1,161 +0,0 @@
-
-
-
-
- Hàbits
- Ajustaments
- Editar
- Esborrar
- Arxivar
- Treure de l\'arxiu
- Afegir hàbit
- Canviar color
- Hàbit creat.
- Hàbits esborrats.
- Hàbits restaurats.
- Res a desfer.
- Res a refer.
- Hàbit modificat.
- Hàbit restaurat.
- Hàbits arxivats.
- Hàbits trets de l\'arxiu.
- Visió general
- Fortalesa de l\'hàbit
- Història
- Netejar
- Pregunta (Avui vas...?)
- Repetir
- vegades en
- dies
- Recordatori
- Descartar
- Desar
- Ratxa
- No tens hàbits actius
- Prem i manté per a marcar o desmarcar
- Desactivat
- El nom no pot estar buit
- El número ha de ser positiu
- Pots tenir com a màxim una repetició per dia
- Crear hàbit
- Editar hàbit
- Revisar
- Més tard
-
- Benvingut
- Loop Habit Tracker t\'ajuda a crear i mantenir bons hàbits
- Crear alguns hàbits nous
- Cada dia, després de complir el teu hàbit, posa una marca amb la app
- Continua fent-ho
- Els hàbits que facis consistentment durant una llarga temporada obtindran una estrella
- Segueix el teu progrès
- Els gràfics detallats et mostren com han mirollat els teus hàbits al llarg del temps
- 15 minuts
- 30 minuts
- 1 hora
- 2 hores
- 4 hores
- 8 hores
- 24 hores
- Activar/desactivar repeticions prement curt
- Més adequat, però pot causar activacions accidentals
- Interval d\'endarreriment en recordatoris
- Valora aquesta app a Google Play
- Enviar resposta al desenvolupador
- Veure codi font a Github
- Veure introducció de l\'app
- Enllaços
- Comportament
- Nom
- Ajustaments
- Interval d\'endarreriment
- Ho sabies?
- Per a ordenar les entrades, prem i mantè sobre el nom de l\'hàbit, després arrossega\'l al lloc correcte.
- Pots veure més dies posant el teu telèfon en orientació apaisada.
- Esborrar hàbits
- Els hàbits seran esborrats permanentment. Aquesta acció no es pot desfer.
- Caps de setmana
- Dilluns a divendres
- Qualsevol dia de la setmana
- Selecciona els dies
- Exportar a CSV
- Fet
- Treure
- Selecciona les hores
- Selecciona els minuts
- En quant a
- Traductors
- Desenvolupadors
- Versió %s
- Freqüència
- Marca
- Fortalesa
- Millors ratxes
- Ratxa actual
- Nombre de repeticions
- Últims %d dies
- Últimes %d setmanes
- Últims %d mesos
- Últims %d anys
- Tot el temps
- Cada dia
- Cada setmana
- 2 cops per setmana
- 5 cops per setmana
- Personalitzar ...
- Ajuda i Preguntes Freqüents
- Error exportant dades.
- Error important dades.
- Fitxer no reconegut.
- Hàbits importats correctament.
- Còpia de seguretat sencera exportada satisfactòriament.
- Importar dades
- Exportar còpia de seguretat sencera
- 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ó.
- Genera fitxers que poden ser oberts per programari de fulles de càlcul, com ara Microsoft Excel o OpenOffice Calc. Aquest fitxer no pot tornar-se a importar.
- Genera un fitxer que contè totes les teves dades. Aquest fitxer pot tornar-se a importar.
- Ha fallat la generació de l\'informe d\'error.
- Generar informe d\'error
- Resolució de problemes
- Ajuda a traduïr aquesta app
- Mode nocturn
- Utilitzar negre pur en el mode nocturn
- Reemplaça fons grisos per negre pur en el mode nocturn. Redueix consum de bateria en telèfons amb pantalla AMOLED.
- Interfície
- Ordre invers de dies
- Mostra els dies en ordre invers en la pantalla principal
- Dia
- Setmana
- Mes
- Quatrimestre
- Any
-
- vegades en
- Cada %d dies
- Cada %d setmanes
- Cada %d mesos
- Puntuació
- So de recordatori
- Cap
- Filtre
- Acció
- Hàbit
- Exportar
-
diff --git a/android/uhabits-android/src/main/res/values-cs-rCZ/strings.xml b/android/uhabits-android/src/main/res/values-cs-rCZ/strings.xml
new file mode 100644
index 000000000..61181aa26
--- /dev/null
+++ b/android/uhabits-android/src/main/res/values-cs-rCZ/strings.xml
@@ -0,0 +1,179 @@
+
+
+
+
+ Loop Habit Tracker
+ Zvyky
+ Nastavení
+ Upravit
+ Smazat
+ Archivovat
+ Obnovit
+ Přidat zvyk
+ Změnit barvu
+ Zvyk vytvořen.
+ Zvyky smazány.
+ Zvyky obnoveny.
+ Nelze jít zpět.
+ Nelze jít vpřed.
+ Zvyk změněn.
+ Zvyk změněn zpět.
+ Archivováno.
+ Zvyky obnoveny.
+ Přehled
+ Síla zvyku
+ Historie
+ Smazat
+ Otázka (Dělal jsi dnes...?)
+ Opakovat
+ krát za
+ dní
+ Připomenutí
+ Zrušit
+ Uložit
+ Série
+ Nemáte žádné nedokončené zvyky
+ Stiskni a drž pro označení
+ Vyp.
+ Musíte vyplnit jméno.
+ Číslo musí být kladné.
+ Můžete mít maximálně jedno označení denně.
+ Vytvořit zvyk
+ Upravit zvyk
+ Hotovo
+ Odložit
+
+ Vítejte
+ Sledování zvyků ti pomůže vytvořit a dosáhnout dobrých návyků.
+ Vytvoř si nové zvyky
+ Každý den po splnění zvyku, si ho v aplikaci zaškrtni.
+ Jen tak dál
+ Zvyky, které vykonáváš pravidelně delší dobu, se označí hvězdou.
+ Sleduj svůj postup
+ Detailní grafy ti ukážou, jak se tvé zvyky v průběhu času zlepšily.
+ 15 minut
+ 30 minut
+ Hodina
+ 2 hodiny
+ 4 hodiny
+ 8 hodin
+ 24 hodin
+ Označte opakování krátkým stisknutím
+ Praktičtější, ale může způsobit nechtěné označení.
+ Doba odložení upomínky
+ Ohodnoťte nás v Google Play
+ Zpětná vazba vývojáři
+ Zobrazit zdroj. kód na GitHub
+ Představení aplikace
+ Odkazy
+ Chování
+ Jméno
+ Nastavení
+ Interval odkladu
+ Věděli jste?
+ 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.
+ Můžeš vidět více dnů otočením telefonu na šířku.
+ Smazat zvyky
+ Označené zvyky budou navždy odstraněny. Toto nelze vzít zpět.
+ Zvyk smazán / nenalezen
+ Víkendy
+ Pondělí až pátek
+ Jakýkoliv den v týdnu
+ Vyber dny
+ Exportovat CSV
+ Hotovo
+ Smazat
+ Vyber hodiny
+ Vyber minuty
+ O nás
+ Překladatelé
+ Vývojáři
+ Verze %s
+ Frekvence
+ Zatržítko
+ Síla
+ Nejlepší serie
+ Aktuální serie
+ Počet opakování
+ Posledních %d dnů
+ Posledních %d týdnů
+ Posledních %d měsíců
+ Posledních %d roků
+ Bez omezení
+ Každý den
+ Každý týden
+ 2 krát týdně
+ 5 krát týdně
+ Vlastní...
+ Pomoc a FAQ
+ Export selhal.
+ Import selhal.
+ Soubor netozpoznán.
+ Zvyky úspěšně importovány.
+ Kompletní záloha úspěšně exportována.
+ Importovat
+ Kompletní export
+ 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.
+ Generuje soubory, které můžeš otevřít v tabulkových editorech, jako jsou Microsoft Excel nebo OpenOffice Calc. Tyto soubory nelze importovat zpět.
+ Generuje soubor, který obsahuje všechna tvoje data. Tento soubor můžeš importovat zpět.
+ Generace výpisu chyb selhala.
+ Generovat výpis chyb
+ Řešení problémů
+ Pomozte s překladem aplikace
+ Noční téma
+ Zobrazit čistě černou v nočním tématu
+ Nahradí šedé pozadí čistou černou v nočním tématu. Snižuje spotřebu baterie v telefonech s AMOLED displejem.
+ Rozhraní
+ Otočit pořadí dnů
+ Zobrazí dny na úvodní stránce v obráceném pořadí
+ Den
+ Týden
+ Měsíc
+ Čtvrtletí
+ Rok
+ Celkem
+
+
+ krát za
+ Každých %d dní
+ Každých %d týdnů
+ Každých %d měsíců
+ Skóre
+ Zvuk upomínky
+ Žádný
+ Filtr
+ Skrýt dokončené
+ Skrýt archivované
+ Připnout notifikaci
+ Zabraňuje notifikaci její odstranění odsunutím.
+ Opravit databázi
+ Databáze opravena.
+ Odznačit
+ Přepnout
+ Akce
+ Zvyk
+ Řadit
+ Ručně
+ Abecedně
+ Podle barvy
+ Podle skóre
+ Stáhnout
+ Export
+
diff --git a/android/uhabits-android/src/main/res/values-cs/strings.xml b/android/uhabits-android/src/main/res/values-cs/strings.xml
deleted file mode 100644
index 2b783e1d3..000000000
--- a/android/uhabits-android/src/main/res/values-cs/strings.xml
+++ /dev/null
@@ -1,178 +0,0 @@
-
-
-
-
- Loop Habit Tracker
- Zvyky
- Nastavení
- Upravit
- Smazat
- Archivovat
- Obnovit
- Přidat zvyk
- Změnit barvu
- Zvyk vytvořen.
- Zvyky smazány.
- Zvyky obnoveny.
- Nelze jít zpět.
- Nelze jít vpřed.
- Zvyk změněn.
- Zvyk změněn zpět.
- Archivováno.
- Zvyky obnoveny.
- Přehled
- Síla zvyku
- Historie
- Smazat
- Otázka (Dělal jsi dnes...?)
- Opakovat
- krát za
- dní
- Připomenutí
- Zrušit
- Uložit
- Serie
- Nemáte žádné nedokončené zvyky
- Stiskni a drž pro označení
- Vyp.
- Jméno musíte vyplnit.
- Číslo musí být kladné.
- Můžete mít maximálně jedno označení denně.
- Vytvořit zvyk
- Upravit zvyk
- Hotovo
- Odložit
-
- Vítejte
- Sledování zvyků ti pomůže vytvořit a dosáhnout dobrých návyků.
- Vytvoř si nové zvyky
- Každý den po splnění zvyku, si ho v aplikaci zaškrtni.
- Jen tak dál
- Zvyky, které vykonáváš pravidelně delší dobu, se označí hvězdou.
- Sleduj svůj postup
- Detailní grafy ti ukážou, jak se tvé zvyky v průběhu času zlepšily.
- 15 minut
- 30 minut
- Hodina
- 2 hodiny
- 4 hodiny
- 8 hodin
- 24 hodin
- Označte opakování krátkým stisknutím
- Praktičtější, ale může způsobit nechtěné označení.
- Doba odložení upomínky
- Ohodnoťte nás v Google Play
- Zpětná vazba vývojáři
- Zobrazit zdroj. kód na GitHub
- Představení aplikace
- Odkazy
- Chování
- Jméno
- Nastavení
- Interval odkladu
- Věděli jste?
- 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.
- Můžeš vidět více dnů otočením telefonu na šířku.
- Smazat zvyky
- Označené zvyky budou navždy odstraněny. Toto nelze vzít zpět.
- Zvyk smazán / nenalezen
- Víkendy
- Pondělí až pátek
- Jakýkoliv den v týdnu
- Vyber dny
- Exportovat CSV
- Hotovo
- Smazat
- Vyber hodiny
- Vyber minuty
- O nás
- Překladatelé
- Vývojáři
- Verze %s
- Frekvence
- Zatržítko
- Síla
- Nejlepší serie
- Aktuální serie
- Počet opakování
- Posledních %d dnů
- Posledních %d týdnů
- Posledních %d měsíců
- Posledních %d roků
- Bez omezení
- Každý den
- Každý týden
- 2 krát týdně
- 5 krát týdně
- Vlastní...
- Pomoc a FAQ
- Export selhal.
- Import selhal.
- Soubor netozpoznán.
- Zvyky úspěšně importovány.
- Kompletní záloha úspěšně exportována.
- Importovat
- Kompletní export
- 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.
- Generuje soubory, které můžeš otevřít v tabulkových editorech, jako jsou Microsoft Excel nebo OpenOffice Calc. Tyto soubory nelze importovat zpět.
- Generuje soubor, který obsahuje všechna tvoje data. Tento soubor můžeš importovat zpět.
- Generace výpisu chyb selhala.
- Generovat výpis chyb
- Řešení problémů
- Pomozte s překladem aplikace
- Noční téma
- Zobrazit čistě černou v nočním tématu
- Nahradí šedé pozadí čistou černou v nočním tématu. Snižuje spotřebu baterie v telefonech s AMOLED displejem.
- Rozhraní
- Otočit pořadí dnů
- Zobrazí dny na úvodní stránce v obráceném pořadí
- Den
- Týden
- Měsíc
- Čtvrtletí
- Rok
- Celkem
-
- krát za
- Každých %d dní
- Každých %d týdnů
- Každých %d měsíců
- Skóre
- Zvuk upomínky
- Žádný
- Filtr
- Skrýt dokončené
- Skrýt archivované
- Připnout notifikaci
- Zabraňuje notifikaci její odstranění odsunutím.
- Opravit databázi
- Databáze opravena.
- Odznačit
- Přepnout
- Akce
- Zvyk
- Řadit
- Ručně
- Abecedně
- Podle barvy
- Podle skóre
- Stáhnout
- Export
-
diff --git a/android/uhabits-android/src/main/res/values-da-rDK/strings.xml b/android/uhabits-android/src/main/res/values-da-rDK/strings.xml
new file mode 100644
index 000000000..fab055da2
--- /dev/null
+++ b/android/uhabits-android/src/main/res/values-da-rDK/strings.xml
@@ -0,0 +1,179 @@
+
+
+
+
+ Loop Vane Tracker
+ Vaner
+ Indstillinger
+ Rediger
+ Slet
+ Arkivér
+ Fjern fra arkiv
+ Tilføj vane
+ Skift farve
+ Vanen er skabt.
+ Vaner slettet
+ Vaner genskabt
+ Intet at fortryde
+ Intet at gøre om
+ Vanen er ændret
+ Vanen er ændret tilbage
+ Vanerne er arkiveret
+ Vanerne er fjernet fra arkivet
+ Overblik
+ Vanestyrke
+ Historie
+ Ryd
+ Spørgsmål (Fik du … i dag?)
+ Gentag
+ gange på
+ dage
+ Påmindelse
+ Kassér
+ Gem
+ Streaks
+ Du har ingen aktive vaner
+ Tryk og hold nede for at afkrydse
+ Fra
+ Navn må ikke være blankt.
+ Tallet skal være positivt.
+ Du kan højst have én gentagelse per dag
+ Opret vane
+ Rediger vane
+ Afkryds
+ Senere
+
+ Velkommen
+ Loop Habit Tracker hjælper dig med at holde gode vaner.
+ Skab nogle nye vaner
+ Hver dag, efter at have udført din vane, skal du sætte et flueben i app\'en.
+ Fortsæt
+ Vaner fulgt regelmæssigt gennem langtid modtager en stjerne.
+ Følg dine fremskridt
+ Detaljerede grafer viser dig hvordan dine vaner udvikler sig over tid.
+ 15 minutter
+ 30 minutter
+ 1 time
+ 2 timer
+ 4 timer
+ 8 timer
+ 24 timer
+ Tjek vaner med kort tryk
+ Sæt tjekmærker med et enkelt tryk i stedet for tryk-og-hold. Mere bekvemmeligt, men kan forårsage uhensigtede tryk.
+ Snooze interval på påmindelser
+ Bedøm denne app på Google Play
+ Send feedback til udvikleren
+ Se kildekoden på GitHub
+ Se app introduktion
+ Henvisninger
+ Opførelse
+ Navn
+ Indstillinger
+ Snooze interval
+ Vidste du?
+ For at omarrangere poster, tryk og hold på navnet på den vane, og træk den til det korrekte sted.
+ Du kan se flere dage ved at sætte telefonen i liggende tilstand.
+ Slet vaner
+ Vanerne vil blive slettet permanent. Denne handling kan ikke fortrydes.
+ Vane slettet / ikke fundet
+ Weekender
+ Mandag til Fredag
+ En hvilken som helst dag i ugen
+ Vælg dage
+ Eksporter som CSV
+ Færdig
+ Fjern
+ Vælg timer
+ Vælg minutter
+ Om
+ Oversættere
+ Udviklere
+ Version %s
+ Hyppighed
+ Afkrydsning
+ Styrke
+ Bedste striber
+ Aktuel stribe
+ Antal gentagelser
+ Sidste % dage
+ Sidste %d uger
+ Sidste %d måneder
+ Sidste %d år
+ Samlet tid
+ Hver dag
+ Hver uge
+ 2 gange om ugen
+ 5 gange om ugen
+ Brugerdefinerede
+ Hjælp & FAQ
+ Kunne ikke eksportere data
+ Kunne ikke importere data
+ Fil ikke genkendt.
+ Vaner importeret.
+ Fuld backup eksporteret.
+ Importer data
+ Eksporter fuld backup.
+ Understøtter fuld backup eksporteret af denne app, samt filer genereret af Tickmate, HabitBull eller Rewire. Se FAQ for mere information.
+ Opretter filer, der kan åbnes af regneark fra Microsoft Excel eller OpenOffice Calc. Denne fil kan ikke importeres tilbage.
+ Opretter en fil, der indeholder alle dine data. Denne fil kan importeres tilbage.
+ Kunne ikke generere fejlrapport.
+ Generer fejlrapport
+ Fejlfinding
+ Hjælpe med at oversætte denne app
+ Nat-tilstand
+ Brug ren sort i nat-tilstand
+ Erstatter grå baggrunde med ren sort i nat-tilstand. Reducerer batteriforbruget i telefoner med AMOLED skærm.
+ Grænseflade
+ Omvendt rækkefølge af dage
+ Vis dag i omvendt rækkefølge på hovedskærmen
+ Dag
+ Uge
+ Måned
+ Kvartal
+ År
+ I alt
+
+
+ Tid til
+ Hver %d dage
+ Hver %d uger
+ Hver %d måneder
+ Point
+ Påmindelse lyd
+ Ingen
+ Filtrer
+ Skjul fuldførte
+ Skjul arkiverede
+ Fastgør notifikationer
+ Forhindrer notifikationer i at blive swipet væk.
+ Reparer database
+ Database repareret.
+ Fjern afkrydsning
+ Skift mellem
+ Handling
+ Vane
+ Sortér
+ Manuelt
+ Efter navn
+ Efter farve
+ Efter score
+ Hent
+ Eksporter
+
diff --git a/android/uhabits-android/src/main/res/values-da/strings.xml b/android/uhabits-android/src/main/res/values-da/strings.xml
deleted file mode 100644
index f076c61a7..000000000
--- a/android/uhabits-android/src/main/res/values-da/strings.xml
+++ /dev/null
@@ -1,154 +0,0 @@
-
-
-
-
- Loop Vane Tracker
- Vaner
- Indstillinger
- Rediger
- Slet
- Arkiver
- Fjern fra arkiv
- Tilføj vane
- Skift farve
- Vanen er skabt.
- Vanen er slettet.
- Vanen er genskabt.
- Intet at fortryde.
- Intet at gengøre.
- Vanen er ændret
- Vanen er ændret tilbage.
- Vanerne er arkiveret.
- Vanerne er fjernet fra arkivet.
- Overblik
- Vanestyrke
- Historie
- Rens
- Spørgsmål (Fik du … i dag)
- Gentag
- gange på
- dage
- Påmindelse
- Forkast
- Gem
- i træk
- Du har ingen aktive vaner
- Tryk og hold nede for at afkrydse
- Slukket
- Navn skal udfyldes.
- Tallet skal være positivt.
- Du kan højst have én gentagelse per dag
- Skab en vane
- Rediger vane
- Tjek
- Senere
-
- Velkommen
- Loop Habit Tracker hjælper dig med at holde gode vaner.
- Skab nogle nye vaner
- Hver dag, efter at have udført din vane, skal du sætte et flueben i app\'en.
- Fortsæt
- Vaner fulgt regelmæssigt gennem langtid modtager en stjerne.
- Følg dine fremskridt
- Detaljerede grafer viser dig hvordan dine vaner udvikler sig over tid.
- 15 minutter
- 30 minutter
- 1 time
- 2 timer
- 4 timer
- 8 timer
- Vælg gentagelser med kort tryk
- Mere bekvemmeligt, men kan forårsage uhensigtede tryk.
- Snooze interval på påmindelserne
- Bedøm denne app på Google Play
- Send feedback til udvikleren
- Se kildekoden på GitHub
- Se app introduktion
- Henvisninger
- Opførelse
- Navn
- Indstillinger
- Vidste du?
- For at omarrangere poster, tryk og hold på navnet på den vane, og træk den til det korrekte sted.
- Du kan se flere dage ved at sætte telefonen i liggende tilstand.
- Slet vaner
- Vanerne vil blive slettet permanent. Denne handling kan ikke fortrydes.
- Weekender
- Mandag til Fredag
- En hvilken som helst dag i ugen
- Vælg dage
- Eksporter som CSV
- Færdig
- Fjern
- Vælg timer
- Vælg minutter
- Om
- Oversættere
- Udviklere
- Hyppighed
- Afkrydsning
- Styrke
- Bedste striber
- Aktuel stribe
- Antal gentagelser
- Sidste % dage
- Sidste %d uger
- Sidste %d måneder
- Sidste %d år
- Hver dag
- Hver uge
- 2 gange om ugen
- 5 gange om ugen
- Brugerdefinerede
- Hjælp & FAQ
- Kunne ikke eksportere data
- Kunne ikke importere data
- Fil ikke genkendt.
- Vaner importeret.
- Fuld backup eksporteret.
- Importer data
- Eksporter fuld backup.
- Understøtter fuld backup eksporteret af denne app, samt filer genereret af Tickmate, HabitBull eller Rewire. Se FAQ for mere information.
- Opretter filer, der kan åbnes af regneark fra Microsoft Excel eller OpenOffice Calc. Denne fil kan ikke importeres tilbage.
- Opretter en fil, der indeholder alle dine data. Denne fil kan importeres tilbage.
- Kunne ikke generere fejlrapport.
- Generer fejlrapport
- Fejlfinding
- Hjælpe med at oversætte denne app
- Nat-tilstand
- Brug ren sort i nat-tilstand
- Erstatter grå baggrunde med ren sort i nat-tilstand. Reducerer batteriforbruget i telefoner med AMOLED skærm.
- Grænseflade
- Omvendt rækkefølge af dage
- Vis dag i omvendt rækkefølge på hovedskærmen
- Dag
- Uge
- Måned
- Kvartal
- År
-
- Tid til
- Hver %d dage
- Hver %d uger
- Hver %d måneder
- Point
- Påmindelse lyd
- Ingen
-
diff --git a/android/uhabits-android/src/main/res/values-de-rDE/strings.xml b/android/uhabits-android/src/main/res/values-de-rDE/strings.xml
new file mode 100644
index 000000000..07a5b5f50
--- /dev/null
+++ b/android/uhabits-android/src/main/res/values-de-rDE/strings.xml
@@ -0,0 +1,184 @@
+
+
+
+
+ Loop - Gewohnheiten Tracking
+ Gewohnheiten
+ Einstellungen
+ Bearbeiten
+ Löschen
+ Archivieren
+ Dearchivieren
+ Gewohnheit hinzufügen
+ Farbe ändern
+ Gewohnheit erstellt
+ Gewohnheiten gelöscht
+ Gewohnheiten wiederhergestellt
+ Nichts zum Rückgängig machen
+ Nichts zum Wiederherstellen
+ Gewohnheit geändert
+ Gewohnheit zurückgeändert
+ Gewohnheiten archiviert
+ Gewohnheiten dearchiviert
+ Übersicht
+ Stärke
+ Verlauf
+ Löschen
+ Frage (Hast du heute ...?)
+ Wiederhole
+ Mal in
+ Tagen
+ Erinnerung
+ Verwerfen
+ Speichern
+ Serien
+ Du hast keine aktiven Gewohnheiten
+ Tippe und halte um aus- bzw. abzuwählen
+ Aus
+ Name darf nicht leer sein.
+ Zahl muss positiv sein.
+ Du kannst höchstens eine Wiederholung pro Tag haben
+ Gewohnheit erstellen
+ Gewohnheit bearbeiten
+ Abhaken
+ Später
+
+ Willkommen
+ Loop Habit Tracker hilft dir dabei, gute Gewohnheiten anzunehmen.
+ Erstelle neue Gewohnheiten
+ Hake die Gewohnheit jeden Tag in der App ab, nachdem du sie erledigt hast.
+ Bleib dran
+ Gewohnheiten, die über einen längeren Zeitraum absolviert werden, bekommen einen ganzen Stern.
+ Verfolge deinen Fortschritt
+ Detaillierte Diagramme zeigen dir an, wie sich deine Gewohnheiten entwickelt haben.
+ 15 Minuten
+ 30 Minuten
+ 1 Stunde
+ 2 Stunden
+ 4 Stunden
+ 8 Stunden
+ 24 Stunden
+ Immer fragen
+ Markierung durch kurzes Drücken ändern
+ Markierungen durch einfaches Tippen setzen anstatt durch Tippen und Halten. Bequemer, kann aber versehentlich eine Markierung ändern.
+ \"Später erinnern\"-Intervall bei Erinnerungen
+ Bewerte diese App auf Google Play
+ Sende dem Entwickler Feedback
+ Zeige den Quellcode auf GitHub
+ Zeige die App-Einführung
+ Links
+ Verhalten
+ Name
+ Einstellungen
+ \"Später erinnern\"-Intervall
+ Wusstest du?
+ Um Einträge umzusortieren, tippe, halte und ziehe sie an die richtige Stelle.
+ Du kannst mehr Tage sehen, wenn du dein Smartphone quer hältst.
+ Lösche Gewohnheiten
+ Die Gewohnheit wird für immer gelöscht. Dies kann nicht rückgängig gemacht werden.
+ Gewohnheit gelöscht / nicht gefunden
+ An Wochenenden
+ Montag bis Freitag
+ Jeden Tag
+ Wähle Tage aus
+ Exportiere als CSV
+ Fertig
+ Löschen
+ Wähle Stunden
+ Wähle Minuten
+ Über
+ Übersetzer
+ Entwickler
+ Version %s
+ Häufigkeit
+ Häkchen
+ Stärke
+ Beste Serien
+ Derzeitige Serie
+ Anzahl der Wiederholungen
+ Letzten %d Tage
+ Letzten %d Wochen
+ Letzten %d Monate
+ Letzten %d Jahre
+ Allzeit
+ Jeden Tag
+ Jede Woche
+ 2 Mal pro Woche
+ 5 Mal pro Woche
+ Benutzerdefiniert
+ Hilfe & FAQ
+ Fehler beim Exportieren der Daten.
+ Fehler beim Importieren der Daten.
+ Datei nicht erkannt.
+ Gewohnheiten erfolgreich importiert.
+ Vollständige Sicherung erfolgreich exportiert.
+ Importiere Daten
+ Exportiere vollständige Sicherung
+ Unterstützt vollständige Sicherungen dieser App sowie Sicherungen von Tickmate, HabitBull und Rewire. Siehe FAQ für weitere Informationen.
+ Erstellt Dateien, die von Tabellenkalkulationsprogrammen wie Microsoft Excel oder LibreOffice Calc geöffnet werden können. Diese Dateien können nicht wieder importiert werden.
+ Erstellt eine Datei, die alle deine Daten enthält. Diese Datei kann wieder importiert werden.
+ Fehler beim Erstellen eines Fehlerberichts.
+ Erstelle einen Fehlerbericht
+ Fehlerbehebung
+ Hilf mit, diese App zu übersetzen
+ Nachtmodus
+ Verwende reines Schwarz im Nachtmodus
+ Ersetzt im Nachtmodus das Grau im Hintergrund durch ein reines Schwarz. Reduziert den Stromverbrauch von Smartphones mit einem AMOLED Display.
+ Oberfläche
+ Kehre die Tagesreihenfolge um
+ Zeigt die Tage im Hauptfenster in umgekehrter Reihenfolge an
+ Tag
+ Woche
+ Monat
+ Quartal
+ Jahr
+ Gesamt
+
+ Ja / Nein
+
+ Mal in
+ Alle %d Tage
+ Alle %d Wochen
+ Alle %d Monate
+ Wertung
+ Erinnerungston
+ Keiner
+ Filter
+ Abgeschlossene verbergen
+ Archivierte verbergen
+ Fixiere Benachrichtigungen
+ Verhindert das Wegwischen von Benachrichtigungen.
+ Repariere Datenbank
+ Datenbank repariert.
+ Abwählen
+ Umschalten
+ Aktion
+ Gewohnheit
+ Sortiere
+ Manuell
+ Nach Name
+ Nach Farbe
+ Nach Wertung
+ Runterladen
+ Exportieren
+ Ja
+ Nein
+ Datenbank
+
diff --git a/android/uhabits-android/src/main/res/values-de/strings.xml b/android/uhabits-android/src/main/res/values-de/strings.xml
deleted file mode 100644
index 912aa2c41..000000000
--- a/android/uhabits-android/src/main/res/values-de/strings.xml
+++ /dev/null
@@ -1,178 +0,0 @@
-
-
-
-
- Loop \"Gewohnheiten Tracking\"
- Gewohnheiten
- Einstellungen
- Bearbeiten
- Löschen
- Archivieren
- Dearchivieren
- Gewohnheit hinzufügen
- Farbe ändern
- Gewohnheit erstellt
- Gewohnheiten gelöscht
- Gewohnheiten wiederhergestellt
- Nichts zum Rückgängig machen
- Nichts zum Wiederherstellen
- Gewohnheit geändert
- Gewohnheit zurückgeändert
- Gewohnheiten archiviert
- Gewohnheiten dearchiviert
- Übersicht
- Stärke
- Verlauf
- Löschen
- Frage (Hast du heute ...?)
- Wiederhole
- Mal in
- Tagen
- Erinnerung
- Verwerfen
- Speichern
- Serien
- Du hast keine aktiven Gewohnheiten
- Tippe und halte um aus- bzw. abzuwählen
- Aus
- Name darf nicht leer sein.
- Zahl muss positiv sein.
- Du kannst höchstens eine Wiederholung pro Tag haben
- Gewohnheit erstellen
- Gewohnheit bearbeiten
- Markieren
- Später
-
- Willkommen
- Loop Habit Tracker hilft dir dabei, gute Gewohnheiten anzunehmen.
- Erstelle neue Gewohnheiten
- Hake die Gewohnheit jeden Tag in der App ab, nachdem du sie erledigt hast.
- Bleib dran
- Gewohnheiten, die über einen längeren Zeitraum absolviert werden, bekommen einen ganzen Stern.
- Verfolge deinen Fortschritt
- Detaillierte Diagramme zeigen dir an, wie sich deine Gewohnheiten entwickelt haben.
- 15 Minuten
- 30 Minuten
- 1 Stunde
- 2 Stunden
- 4 Stunden
- 8 Stunden
- 24 Stunden
- Markierung durch kurzes Drücken ändern
- Markierungen durch einfaches Tippen setzen anstatt durch Tippen und Halten. Bequemer, kann aber versehentlich eine Markierung ändern.
- \"Später erinnern\"-Intervall bei Erinnerungen
- Bewerte diese App auf Google Play
- Sende dem Entwickler Feedback
- Zeige den Quellcode auf GitHub
- Zeige die App-Einführung
- Links
- Verhalten
- Name
- Einstellungen
- \"Später erinnern\"-Intervall
- Wusstest du?
- Um Einträge umzusortieren, tippe, halte und ziehe sie an die richtige Stelle.
- Du kannst mehr Tage sehen, wenn du dein Smartphone quer hältst.
- Lösche Gewohnheiten
- Die Gewohnheit wird für immer gelöscht. Dies kann nicht rückgängig gemacht werden.
- Gewohnheit gelöscht / nicht gefunden
- An Wochenenden
- Montag bis Freitag
- Jeden Tag
- Wähle Tage aus
- Exportiere als CSV
- Fertig
- Löschen
- Wähle Stunden
- Wähle Minuten
- Über
- Übersetzer
- Entwickler
- Version %s
- Häufigkeit
- Häkchen
- Stärke
- Beste Serien
- Derzeitige Serie
- Anzahl der Wiederholungen
- Letzten %d Tage
- Letzten %d Wochen
- Letzten %d Monate
- Letzten %d Jahre
- Allzeit
- Jeden Tag
- Jede Woche
- 2 Mal pro Woche
- 5 Mal pro Woche
- Benutzerdefiniert
- Hilfe & FAQ
- Fehler beim Exportieren der Daten.
- Fehler beim Importieren der Daten.
- Datei nicht erkannt.
- Gewohnheiten erfolgreich importiert.
- Vollständige Sicherung erfolgreich exportiert.
- Importiere Daten
- Exportiere vollständige Sicherung
- Unterstützt vollständige Sicherungen dieser App sowie Sicherungen von Tickmate, HabitBull und Rewire. Siehe FAQ für weitere Informationen.
- Erstellt Dateien, die von Tabellenkalkulationsprogrammen wie Microsoft Excel oder LibreOffice Calc geöffnet werden können. Diese Dateien können nicht wieder importiert werden.
- Erstellt eine Datei, die alle deine Daten enthält. Diese Datei kann wieder importiert werden.
- Fehler beim Erstellen eines Fehlerberichts.
- Erstelle einen Fehlerbericht
- Fehlerbehebung
- Hilf mit, diese App zu übersetzen
- Nachtmodus
- Verwende reines Schwarz im Nachtmodus
- Ersetzt im Nachtmodus das Grau im Hintergrund durch ein reines Schwarz. Reduziert den Stromverbrauch von Smartphones mit einem AMOLED Display.
- Oberfläche
- Kehre die Tagesreihenfolge um
- Zeigt die Tage im Hauptfenster in umgekehrter Reihenfolge an
- Tag
- Woche
- Monat
- Quartal
- Jahr
- Gesamt
-
- Mal in
- Alle %d Tage
- Alle %d Wochen
- Alle %d Monate
- Wertung
- Erinnerungston
- Keiner
- Filter
- Abgeschlossene verbergen
- Archivierte verbergen
- Fixiere Benachrichtigungen
- Verhindert das Wegwischen von Benachrichtigungen.
- Repariere Datenbank
- Datenbank repariert.
- Abwählen
- Umschalten
- Aktion
- Gewohnheit
- Sortiere
- Manuell
- Nach Name
- Nach Farbe
- Nach Wertung
- Runterladen
- Exportieren
-
diff --git a/android/uhabits-android/src/main/res/values-el-rGR/strings.xml b/android/uhabits-android/src/main/res/values-el-rGR/strings.xml
new file mode 100644
index 000000000..1d4f3f1a6
--- /dev/null
+++ b/android/uhabits-android/src/main/res/values-el-rGR/strings.xml
@@ -0,0 +1,179 @@
+
+
+
+
+ Loop - Καταγραφή Συνηθειών
+ Συνήθειες
+ Ρυθμίσεις
+ Επεξεργασία
+ Διαγραφή
+ Αρχειοθέτηση
+ Κατάργηση αρχειοθέτησης
+ Νέα συνήθεια
+ Αλλαγή χρώματος
+ Δημιουργήθηκε συνήθεια.
+ Συνήθεια διαγράφτηκε.
+ Η συνήθεια επαναφέρθηκε.
+ Τίποτα για αναίρεση
+ Τίποτα προς επανάληψη.
+ Η συνήθεια άλλαξε
+ Δεν έγινε αλλαγή.
+ Η συνήθεια αρχειοθετήθηκε.
+ Έγινε αφαίρεση αρχειοθέτησης.
+ Επισκόπηση
+ Δύναμη συνήθειας
+ Ιστορικό
+ Εκκαθάριση
+ Ερώτηση (Κάνατε...σήμερα;)
+ Επανέλαβε
+ φορές την
+ ημέρες
+ Υπενθύμιση
+ Απόρριψη
+ Αποθήκευση
+ Σερί
+ Δεν έχετε ενεργές συνήθειες
+ Πατήστε παρατεταμένα για επιλογή η αποεπιλογή
+ Χωρίς
+ Το όνομα δεν μπορεί να είναι κενό
+ Πρεπει να είναι θετικό
+ Μπορείτε να κάνετε μονάχα μία επανάληψη ανά ημέρα
+ Δημιουργία συνήθειας
+ Επεξεργασία συνήθειας
+ Επιλογή
+ Αργότερα
+
+ Καλώς ορίσατε
+ Το Loop - Καταγραφή Συνηθειών σας βοηθάει να δημιουργήσετε και να διατηρήσετε καλές συνήθειες.
+ Δημιουργήστε μερικές νέες συνήθειες
+ Κάθε μέρα, με το πέρας της συνήθειας, βάλτε ένα τικ στην εφαρμογή.
+ Συνεχίστε να το κάνετε
+ Συνήθειες που εκτελούνται με συνέπεια για πολύ καιρό
+ Κατέγραψε την πρόοδο σου
+ Λεπτομερή διαγράμματα σας δείχνουν την πρόοδο των συνηθειών.
+ 15 λεπτά
+ 30 λεπτά
+ 1 ώρα
+ 2 ώρες
+ 4 ώρες
+ 8 ώρες
+ 24 Ωρο
+ Κάντε εναλλαγή των επαναλήψεων με σύντομο πάτημα
+ Βολικότερο, αλλά ίσως προκαλέσει ακούσιες εναλλαγές.
+ Διάστημα αναβολής υπενθυμίσεων
+ Βαθμολογήστε αυτή την εφαρμογή στο Google Play
+ Στείλετε σχόλια
+ Δείτε τον πηγαίο κώδικα στο GitHub
+ Δείτε την εισαγωγή
+ Σύνδεσμοι
+ Συμπεριφορά
+ Όνομα
+ Ρυθμίσεις
+ Διάστημα αναβολής
+ Γνωρίζατε;
+ Αναδιατάξετε τις συνήθειες πατώντας παρατεταμένα στο όνομα και σύροντας στην σωστή θέση.
+ Μπορείτε να δείτε περισσότερες ημέρες στην οριζόντια προβολή.
+ Διαγραφή συνηθειών
+ Οι συνήθειες θα διαγραφτούν οριστικά. Αυτό δεν μπορεί να αναιρεθεί.
+ Η συνήθεια διαγράφηκε / δεν βρέθηκε
+ Σαββατοκύριακα
+ Δευτέρα μέχρι Παρασκευή
+ Οποιαδήποτε μέρα της εβδομάδας
+ Επιλογή ημερών
+ Εξαγωγή σαν CSV
+ Έγινε
+ Εκκαθάριση
+ Επιλογή ωρών
+ Επιλογή λεπτών
+ Σχετικά με
+ Μεταφραστές
+ Προγραμματιστές
+ Έκδοση %s
+ Συχνότητα
+ Σημάδι επιλογής
+ Δύναμη
+ Καλύτερα σερί
+ Τρέχον σερί
+ Αριθμός επαναλήψεων
+ Τελευταίες %d ημέρες
+ Τελευταίες %d εβδομάδες
+ Τελευταίους %d μήνες
+ Τελευταία %d χρόνια
+ Όλα
+ Κάθε μέρα
+ Κάθε εβδομάδα
+ 2 φορές την εβδομάδα
+ 5 φορές την εβδομάδα
+ Προσαρμογή
+ Βοήθεια & FAQ
+ Αποτυχία εξαγωγής.
+ Αποτυχία εισαγωγής.
+ Άγνωστο αρχείο.
+ Οι συνήθειες εισάχθηκαν επιτυχώς.
+ Το πλήρες αντίγραφο εξάχθηκε επιτυχώς.
+ Εισαγωγή δεδομένων
+ Εξαγωγή πλήρους αντιγ. ασφαλείας
+ Υποστηρίζει πλήρως αντίγραφα ασφαλείας που έχουν εξαχθεί από την ίδια την εφαρμογή καθώς και από τα Tickmate, HabitBull και Rewire. Δείτε τις FAQ για περισσότερες πληροφορίες.
+ Παράγει αρχεία τα οποία μπορούν να ανοιχτούν από προγράμματα υπολογιστικών φύλλων όπως το Microsoft Edge ή το OpenOffice Calc. Δεν γίνεται επανεισαγωγή του αρχείου.
+ Παράγει ένα αρχείο το οποίο περιέχει όλα τα δεδομένα σας. Είναι δυνατή η επανεισαγωγή του αρχείου.
+ Απέτυχε ή παραγωγή αναφοράς bug.
+ Παραγωγή αναφοράς bug.
+ Αντιμετ.Προβλημάτων
+ Βοηθήστε στην μετάφραση
+ Νυχτ.Λειτ.
+ Χρήση απόλυτου μαύρου στη νυχτ.λειτουργία
+ Αντικαθιστά τα γκρί υπόβαθρα με απόλυτα μαύρα σε νυχτ.λειτουργία. Μειώνει την κατανάλωση μπαταρίας σε συσκευές με οθόνη AMOLED.
+ Διεπιφάνεια
+ Αναστροφή σειράς των ημερών.
+ Προβολή των ημερών σε αντίστροφη σειρά στην κυρία οθόνη.
+ Ημέρα
+ Εβδομάδα
+ Μήνας
+ Τρίμηνο
+ Χρόνος
+ Σύνολο
+
+
+ φορά σε
+ Κάθε %d ημέρες
+ Κάθε %d εβδομάδες
+ Κάθε %d μήνες
+ Σκόρ
+ Ήχος υπενθύμισης
+ Σιωπηλό
+ Φίλτρο
+ Απόκρυψη ολοκληρωμένων
+ Απόκρυψη των αρχειοθετημένων
+ Κάντε τις ειδοποιήσεις κολλώδεις
+ Αποτρέπει την απομάκρυνση των ειδοποιήσεων.
+ Επισκευή βάσης δεδομένων
+ Η βάση δεδομένων επισκευάστηκε.
+ Ξεμαρκάρισμα
+ Εναλλαγή
+ Δράση
+ Συνήθειες
+ Ταξινόμηση
+ Χειροκίνητα
+ Κατά όνομα
+ Με χρώμα
+ Με σκορ
+ Λήψη
+ Εξαγωγή
+
diff --git a/android/uhabits-android/src/main/res/values-el/strings.xml b/android/uhabits-android/src/main/res/values-el/strings.xml
deleted file mode 100644
index 606025a55..000000000
--- a/android/uhabits-android/src/main/res/values-el/strings.xml
+++ /dev/null
@@ -1,157 +0,0 @@
-
-
-
-
- Loop - Καταγραφή Συνηθειών
- Συνήθειες
- Ρυθμίσεις
- Επεξεργασία
- Διαγραφή
- Αρχειοθέτηση
- Κατάργηση αρχειοθέτησης
- Νέα συνήθεια
- Αλλαγή χρώματος
- Δημιουργήθηκε συνήθεια.
- Συνήθεια διαγράφτηκε.
- Η συνήθεια επαναφέρθηκε.
- Τίποτα για αναίρεση
- Τίποτα προς επανάληψη.
- Η συνήθεια άλλαξε
- Δεν έγινε αλλαγή.
- Η συνήθεια αρχειοθετήθηκε.
- Έγινε αφαίρεση αρχειοθέτησης.
- Επισκόπηση
- Δύναμη συνήθειας
- Ιστορικό
- Εκκαθάριση
- Ερώτηση (Κάνατε...σήμερα;)
- Επανέλαβε
- φορές την
- ημέρες
- Υπενθύμιση
- Απόρριψη
- Αποθήκευση
- Σερί
- Δεν έχετε ενεργές συνήθειες
- Πατήστε παρατεταμένα για επιλογή η αποεπιλογή
- Χωρίς
- Το όνομα δεν μπορεί να είναι κενό
- Πρεπει να είναι θετικό
- Μπορείτε να κάνετε μονάχα μία επανάληψη ανά ημέρα
- Δημιουργία συνήθειας
- Επεξεργασία συνήθειας
- Επιλογή
- Αργότερα
-
- Καλώς ορίσατε
- Το Loop - Καταγραφή Συνηθειών σας βοηθάει να δημιουργήσετε και να διατηρήσετε καλές συνήθειες.
- Δημιουργήστε μερικές νέες συνήθειες
- Κάθε μέρα, με το πέρας της συνήθειας, βάλτε ένα τικ στην εφαρμογή.
- Συνεχίστε να το κάνετε
- Συνήθειες που εκτελούνται με συνέπεια για πολύ καιρό
- Κατέγραψε την πρόοδο σου
- Λεπτομερή διαγράμματα σας δείχνουν την πρόοδο των συνηθειών.
- 15 λεπτά
- 30 λεπτά
- 1 ώρα
- 2 ώρες
- 4 ώρες
- 8 ώρες
- Κάντε εναλλαγή των επαναλήψεων με σύντομο πάτημα
- Βολικότερο, αλλά ίσως προκαλέσει ακούσιες εναλλαγές.
- Διάστημα αναβολής υπενθυμίσεων
- Βαθμολογήστε αυτή την εφαρμογή στο Google Play
- Στείλετε σχόλια
- Δείτε τον πηγαίο κώδικα στο GitHub
- Δείτε την εισαγωγή
- Σύνδεσμοι
- Συμπεριφορά
- Όνομα
- Ρυθμίσεις
- Διάστημα αναβολής
- Γνωρίζατε;
- Αναδιατάξετε τις συνήθειες πατώντας παρατεταμένα στο όνομα και σύροντας στην σωστή θέση.
- Μπορείτε να δείτε περισσότερες ημέρες στην οριζόντια προβολή.
- Διαγραφή συνηθειών
- Οι συνήθειες θα διαγραφτούν οριστικά. Αυτό δεν μπορεί να αναιρεθεί.
- Σαββατοκύριακα
- Δευτέρα μέχρι Παρασκευή
- Οποιαδήποτε μέρα της εβδομάδας
- Επιλογή ημερών
- Εξαγωγή σαν CSV
- Έγινε
- Εκκαθάριση
- Επιλογή ωρών
- Επιλογή λεπτών
- Σχετικά με
- Μεταφραστές
- Προγραμματιστές
- Έκδοση %s
- Συχνότητα
- Σημάδι επιλογής
- Δύναμη
- Καλύτερα σερί
- Τρέχον σερί
- Αριθμός επαναλήψεων
- Τελευταίες %d ημέρες
- Τελευταίες %d εβδομάδες
- Τελευταίους %d μήνες
- Τελευταία %d χρόνια
- Όλα
- Κάθε μέρα
- Κάθε εβδομάδα
- 2 φορές την εβδομάδα
- 5 φορές την εβδομάδα
- Προσαρμογή
- Βοήθεια & FAQ
- Αποτυχία εξαγωγής.
- Αποτυχία εισαγωγής.
- Άγνωστο αρχείο.
- Οι συνήθειες εισάχθηκαν επιτυχώς.
- Το πλήρες αντίγραφο εξάχθηκε επιτυχώς.
- Εισαγωγή δεδομένων
- Εξαγωγή πλήρους αντιγ. ασφαλείας
- Υποστηρίζει πλήρως αντίγραφα ασφαλείας που έχουν εξαχθεί από την ίδια την εφαρμογή καθώς και από τα Tickmate, HabitBull και Rewire. Δείτε τις FAQ για περισσότερες πληροφορίες.
- Παράγει αρχεία τα οποία μπορούν να ανοιχτούν από προγράμματα υπολογιστικών φύλλων όπως το Microsoft Edge ή το OpenOffice Calc. Δεν γίνεται επανεισαγωγή του αρχείου.
- Παράγει ένα αρχείο το οποίο περιέχει όλα τα δεδομένα σας. Είναι δυνατή η επανεισαγωγή του αρχείου.
- Απέτυχε ή παραγωγή αναφοράς bug.
- Παραγωγή αναφοράς bug.
- Αντιμετ.Προβλημάτων
- Βοηθήστε στην μετάφραση
- Νυχτ.Λειτ.
- Χρήση απόλυτου μαύρου στη νυχτ.λειτουργία
- Αντικαθιστά τα γκρί υπόβαθρα με απόλυτα μαύρα σε νυχτ.λειτουργία. Μειώνει την κατανάλωση μπαταρίας σε συσκευές με οθόνη AMOLED.
- Διεπιφάνεια
- Αναστροφή σειράς των ημερών.
- Προβολή των ημερών σε αντίστροφη σειρά στην κυρία οθόνη.
- Ημέρα
- Εβδομάδα
- Μήνας
- Τρίμηνο
- Χρόνος
-
- φορά σε
- Κάθε %d ημέρες
- Κάθε %d εβδομάδες
- Κάθε %d μήνες
- Σκόρ
- Ήχος υπενθύμισης
- Σιωπηλό
-
diff --git a/android/uhabits-android/src/main/res/values-eo-rUY/strings.xml b/android/uhabits-android/src/main/res/values-eo-rUY/strings.xml
new file mode 100644
index 000000000..17065d496
--- /dev/null
+++ b/android/uhabits-android/src/main/res/values-eo-rUY/strings.xml
@@ -0,0 +1,96 @@
+
+
+
+
+ Loop Habit Tracker
+ Kutimoj
+ Agordoj
+ Redakti
+ Forigi
+ Arĥivo
+ Elarĥivigi
+ Aldonu kutimon
+ Ŝanĝi koloron
+ Kutimo ŝanĝita
+ Kutimo arĥivita
+ Kutimo forteco
+ tagoj
+ Memorigaĵoj
+ Nuligi
+ Konservi
+ Strioj
+ Neaktiva
+ Poste
+
+ Bonvenon
+ 15 minutoj
+ 30 minutoj
+ Agordoj
+ Forigi kutimojn
+ Semajnfinoj
+ Lundo al vendredo
+ Io semajntago
+ Elekti tagojn
+ Eksporti kiel CSV
+ Farite
+ Elekti horojn
+ Elekti minutojn
+ Pri programo
+ Tradukantoj
+ Evoluigantoj
+ Versio %s
+ Frekvenco
+ Forteco
+ Nombro de ripetoj
+ Lastaj %d tagoj
+ Lastaj %d semajnoj
+ Lastaj %d monatoj
+ Lastaj %d jaroj
+ Ĉiuj tempoj
+ Ĉiu tago
+ Ĉiu semajno
+ Dufoje en semajno
+ Kvinfoje en semajno
+ Helpo & Ofte Demandite
+ Dosiero ne rekonita.
+ Plena savkopio sukcese eksportita.
+ Problemserĉado
+ Nokta reĝimo
+ Tago
+ Semajno
+ Monato
+ Jarkvarono
+ Jaro
+
+
+ Nenio
+ Filtrilo
+ Kaŝi kompletajn
+ Kaŝi arĥivitajn
+ Ripari datumbazon
+ Datumbazon riparita.
+ Ago
+ Kutimo
+ Enkursigi
+ Laŭ nomo
+ Laŭ koloro
+ Elŝuti
+ Eksporti
+
diff --git a/android/uhabits-android/src/main/res/values-eo/strings.xml b/android/uhabits-android/src/main/res/values-eo/strings.xml
deleted file mode 100644
index 0f6282c5d..000000000
--- a/android/uhabits-android/src/main/res/values-eo/strings.xml
+++ /dev/null
@@ -1,178 +0,0 @@
-
-
-
-
- Loop Vaneoversikt
- Vaner
- Innstillinger
- Redigér
- Slett
- Arkivér
- Uarkivér
- Legg til vane
- Endr farge
- Vane laget
- Vaner slettet
- Vaner gjenopprettet
- Ingenting å angre
- Ingenting å ta tilbake
- Vane endret
- Vane tilbakeendret
- Vaner arkivert
- Vaner uarkivert
- Oversikt
- Vanestyrke
- Logg
- Fjern
- Spørsmål (Gjorde du … i dag?)
- Gjenta
- ganger på
- dager
- Påminnelse
- Forkast
- Lagr
- Gjentakelser
- Du har ingen aktive vaner
- Trykk og hold for å sjekke eller usjekke
- Av
- Navnet kan ikke stå tomt.
- Nummeret må være positivt.
- Du kan maks ha én repetisjon om dagen
- Lag vane
- Redigér vane
- Sjekk
- Senere
-
- Velkommen
- Loop Vaneoversikt hjelper deg med å lage og beholde gode vaner.
- Lag noen nye vaner
- Hver dag, etter du utfører vanen din, sett en hake på appen.
- Fortsett med å gjøre det
- Vaner utført konsekvent over lang tid vil få en hel stjerne.
- Hold oversikt over fremgangen din
- Detaljerte grafer viser deg hvordan vanene dine forbedrer seg over tid.
- 15 minutter
- 30 minutter
- 1 time
- 2 timer
- 4 timer
- 8 timer
- 1 døgn
- Veksl med enkelttrykk
- Sett på haker med et enkelttrykk i stedet for å tykke og holde. Mer praktisk, men kan forårsake utilsiktede vekslinger.
- Slumreintervall på påminnelser
- Vurdér denne appen på Google Play
- Send tilbakemelding til utviklerne
- Vis kildekode på GitHub
- Se på appintroduksjon
- Lenker
- Oppførsel
- Navn
- Innstillinger
- Slumreintervall
- Visste du at?
- For å sortere innleggene, trykk og hold på navnet til vanen, deretter dra den til det korrekte stedet.
- Du kan se flere dager ved å sette telefonen din i landskapsmodus.
- Slett vaner
- Vanene vil bli slettet permanent. Denne handlingen kan ikke angres.
- Vane slettet / ikke funnet
- Helger
- Hverdager
- Hvilken som helst dag i uken
- Velg dager
- Eksportér som CSV
- Ferdig
- Fjern
- Velg timer
- Velg minutter
- Om
- Translatører
- Utviklere
- Versjon %s
- Hyppighet
- Hake
- Styrke
- Beste gjentakelser
- Nåværende gjentakelse
- Repetisjonsantall
- Siste %d dager
- Siste %d uker
- Siste %d måneder
- Siste %d år
- Alltid
- Hver dag
- Hver uke
- 2 ganger i uken
- 5 ganger i uken
- Tilpasset …
- Hjelp og FAQ
- Mislyktes i å eksportere data.
- Mislyktes i å importere data.
- Fil ikke gjenkjent.
- Vaner suksessfullt importert.
- Hel sikkerhetskopi suksessfullt eksportert.
- Importér data
- Eksportér hel sikkerhetskopi
- Støtter hele sikkerhetskopier eksportert av denne appen, i tillegg til filer generert av Tickmate, HabitBull, og Rewire. Sjekk ut FAQ for mer informasjon.
- Genererer filer som kan bli åpnet av regnearkprogrammer som Microsoft Excel og OpenOffice Calc. Disse filene kan ikke importeres tilbake.
- Genererer en fil som inneholder all dataen din. Denne filen kan ikke importeres tilbake.
- Mislyktes i å generere feilrapport.
- Generér feilrapport
- Feilsøkning
- Hjelp med å oversette denne appen
- Nattmodus
- Bruk batterisparing i nattmodus
- Bytter ut grå bakgunner med helt svarte i nattmodus. Reduserer betteribruk hos telefoner med AMOLED-skjerm.
- Grensesnitt
- Omvendt dagsrekkefølge
- Vis dager i omvendt rekkefølge på hovedmenyen
- Dag
- Uke
- Måned
- Kvarter
- År
- Totalt
-
- gang på
- Hver %d. dag
- Hver %d. uke
- Hver %d. måned
- Poengsum
- Påminnelseslyd
- Ingen
- Filtrér
- Gjem fullførte
- Gjem arkiverte
- Gjør varslinger klebrige
- Forhindrer varslinger fra å bli sveipet vekk.
- Reparér database
- Database reparert.
- Usjekk
- Veksl
- Handling
- Vane
- Sortér
- Manuelt
- Etter navn
- Etter farge
- Etter poengsum
- Last ned
- Eksportér
-
diff --git a/android/uhabits-android/src/main/res/values-es-rES/strings.xml b/android/uhabits-android/src/main/res/values-es-rES/strings.xml
new file mode 100644
index 000000000..ab5fb4f40
--- /dev/null
+++ b/android/uhabits-android/src/main/res/values-es-rES/strings.xml
@@ -0,0 +1,204 @@
+
+
+
+
+ Loop Analizador de Hábitos
+ Hábitos
+ Configuración
+ Editar
+ Eliminar
+ Archivar
+ Desarchivar
+ Agregar hábito
+ Cambiar color
+ Hábito creado
+ Hábitos eliminados
+ Hábitos restaurados
+ Nada que deshacer
+ Nada que rehacer
+ Hábito cambiado
+ Cambio en hábito vuelto atrás
+ Hábitos archivados
+ Hábitos desarchivados
+ Resumen
+ Fuerza del hábito
+ Historial
+ Borrar
+ Pregunta (Has ... hoy?)
+ Repetir
+ veces cada
+ días
+ Recordatorio
+ Descartar
+ Guardar
+ Rachas
+ No tienes hábitos activos
+ Mantener apretado para marcar o desmarcar
+ Apagado
+ El nombre no puede quedar en blanco.
+ El número debe ser positivo.
+ Puedes tener como máximo una repetición por día
+ Crear hábito
+ Editar hábito
+ Marcar
+ Aplazar
+
+ Bienvenido
+ Loop Analizador de Hábitos te ayuda a crear y mantener buenos hábitos.
+ Crea algunos hábitos nuevos
+ Cada día, después de realizar tu hábito, pon una marca en la aplicación.
+ Sigue haciéndolo
+ Los hábitos realizados consistentemente por un largo tiempo ganarán una estrella completa.
+ Haz un seguimiento de tu progreso
+ Gráficos detallados muestran cómo mejoraron sus hábitos con el tiempo.
+ 15 minutos
+ 30 minutos
+ 1 hora
+ 2 horas
+ 4 horas
+ 8 horas
+ 24 horas
+ Preguntar siempre
+ Personalizar...
+ Marca las repeticiones con una pulsación corta
+ Más cómodo, pero puede causar marcas accidentales.
+ Tiempo de espera al aplazar recordatorios
+ Valora esta aplicación en Google Play
+ Enviar sugerencias al desarrollador
+ Ver código fuente en GitHub
+ Ver la introducción de la aplicación
+ Enlaces
+ Comportamiento
+ Nombre
+ Configuración
+ Intervalo de espera
+ ¿Sabías qué?
+ Para reordenar las entradas, mantén la pulsado sobre el nombre del hábito, después arrástralo a su posición correcta.
+ Puedes ver más días al poner tu teléfono en modo horizontal.
+ Eliminar Hábitos
+ Los hábitos serán eliminados permanentemente. Esta acción no se puede deshacer.
+ Hábito eliminado / no encontrado
+ Fines de semana
+ De lunes a viernes
+ Cada día
+ Seleccionar días
+ Exportar datos (CSV)
+ Hecho
+ Quitar
+ Seleccionar horas
+ Seleccionar minutos
+ Por favor seleccione al menos un hábito
+ Acerca de
+ Traductores
+ Desarrolladores
+ Versión %s
+ Frecuencia
+ Marca de verificación
+ Fuerza
+ Mejores rachas
+ Racha actual
+ Número de repeticiones
+ Últimos %d días
+ Últimas %d semanas
+ Últimos %d meses
+ Últimos %d años
+ Todo el tiempo
+ Diariamente
+ Semanalmente
+ 2 veces por semana
+ 5 veces por semana
+ Personalizado...
+ Ayuda & FAQ
+ Error al exportar datos.
+ Error al importar datos.
+ Archivo no reconocido.
+ Hábitos importados exitosamente.
+ Copia de seguridad exportada exitosamente.
+ Importar datos
+ Exportar copia de seguridad
+ Soporta exportar copias de seguridad completas, así como archivos generados por Tickmate, HabitBull o Rewire. Mira el FAQ para más información.
+ Genera archivos que pueden ser abiertos por programas de hojas de cálculo como Microsoft Excel o OpenOffice Calc. Este archivo no puede volver a importarse.
+ Genera un archivo que contiene todos tus datos. Este archivo puede volver a importarse.
+ Error al generar el reporte de error.
+ Generar reporte de errores
+ Solución de problemas
+ Ayuda a traducir esta app
+ Modo nocturno
+ Utilizar color negro en modo nocturno
+ Reemplaza fondos grises por color negro en modo nocturno. Reduce el consumo de batería en teléfonos con pantalla AMOLED.
+ Interfície
+ Orden inverso de días
+ Mostrar días en orden inverso en la pantalla principal
+ Día
+ Semana
+ Mes
+ Cuatrimestre
+ Año
+ Total
+
+ Sí / No
+ Número
+
+ veces en
+ Cada %d días
+ Cada %d semanas
+ Cada %d meses
+ Puntuación
+ Sonido de recordatorio
+ Ninguno
+ Filtrar
+ Ocultar completos
+ Ocultar archivados
+ Hacer notificaciones fijas
+ Evita que las notificaciones sean descartadas.
+ Luz de notificaciones
+ Muestra una luz intermitente para recordatorios. Solo disponible en teléfonos con luces de notificación LED.
+ Reparar base de datos
+ Base de datos reparada.
+ Desmarcar
+ Alternar
+ Acción
+ Hábito
+ Ordenar
+ Manualmente
+ Por nombre
+ Por color
+ Por puntuación
+ Descargar
+ Exportar
+ Mantenga presionado para cambiar el valor
+ Cambiar valor
+ Calendario
+ Unidad
+ Número
+ Este valor no debe quedar en blanco
+ ej. ¿Cuántos pasos has dado hoy?
+ ej. pasos
+ ej. ¿Has ejercitado hoy?
+ Pregunta
+ Objetivo
+ Si
+ No
+ Cambiar el sonido, la vibración, la luz y otras configuraciones de notificación
+ Personalizar las notificaciones
+ Ver política de privacidad
+ Ver todos los colaboradores…
+ Base de datos
+
diff --git a/android/uhabits-android/src/main/res/values-es/strings.xml b/android/uhabits-android/src/main/res/values-es/strings.xml
deleted file mode 100644
index ae68edf48..000000000
--- a/android/uhabits-android/src/main/res/values-es/strings.xml
+++ /dev/null
@@ -1,178 +0,0 @@
-
-
-
-
- Loop Analizador de Hábitos
- Hábitos
- Configuración
- Editar
- Eliminar
- Archivar
- Desarchivar
- Agregar hábito
- Cambiar color
- Hábito creado
- Hábitos eliminados
- Hábitos restaurados
- Nada que deshacer
- Nada que rehacer
- Hábito cambiado
- Cambio en hábito vuelto atrás
- Hábitos archivados
- Hábitos desarchivados
- Resumen
- Fuerza del hábito
- Historial
- Borrar
- Pregunta (Has ... hoy?)
- Repetir
- veces cada
- días
- Recordatorio
- Descartar
- Guardar
- Rachas
- No tienes hábitos activos
- Mantener apretado para marcar o desmarcar
- Apagado
- El nombre no puede quedar en blanco.
- El número debe ser positivo.
- Puedes tener como máximo una repetición por día
- Crear hábito
- Editar hábito
- Marcar
- Aplazar
-
- Bienvenido
- Loop Analizador de Hábitos te ayuda a crear y mantener buenos hábitos.
- Crea algunos hábitos nuevos
- Cada día, después de realizar tu hábito, pon una marca en la aplicación.
- Sigue haciéndolo
- Los hábitos realizados consistentemente por un largo tiempo ganarán una estrella completa.
- Haz un seguimiento de tu progreso
- Gráficos detallados muestran cómo mejoraron sus hábitos con el tiempo.
- 15 minutos
- 30 minutos
- 1 hora
- 2 horas
- 4 horas
- 8 horas
- 24 horas
- Marca las repeticiones con una pulsación corta
- Más cómodo, pero puede causar marcas accidentales.
- Tiempo de espera al aplazar recordatorios
- Valora esta aplicación en Google Play
- Enviar sugerencias al desarrollador
- Ver código fuente en GitHub
- Ver la introducción de la aplicación
- Enlaces
- Comportamiento
- Nombre
- Configuración
- Intervalo de espera
- ¿Sabías qué?
- Para reordenar las entradas, mantén la pulsado sobre el nombre del hábito, después arrástralo a su posición correcta.
- Puedes ver más días al poner tu teléfono en modo horizontal.
- Eliminar Hábitos
- Los hábitos serán eliminados permanentemente. Esta acción no se puede deshacer.
- Hábito eliminado / no encontrado
- Fines de semana
- De lunes a viernes
- Cada día
- Seleccionar días
- Exportar datos (CSV)
- Hecho
- Quitar
- Seleccionar horas
- Seleccionar minutos
- Acerca de
- Traductores
- Desarrolladores
- Versión %s
- Frecuencia
- Marca de verificación
- Fuerza
- Mejores rachas
- Racha actual
- Número de repeticiones
- Últimos %d días
- Últimas %d semanas
- Últimos %d meses
- Últimos %d años
- Todo el tiempo
- Diariamente
- Semanalmente
- 2 veces por semana
- 5 veces por semana
- Personalizado...
- Ayuda & FAQ
- Error al exportar datos.
- Error al importar datos.
- Archivo no reconocido.
- Hábitos importados exitosamente.
- Copia de seguridad exportada exitosamente.
- Importar datos
- Exportar copia de seguridad
- Soporta exportar copias de seguridad completas, así como archivos generados por Tickmate, HabitBull o Rewire. Mira el FAQ para más información.
- Genera archivos que pueden ser abiertos por programas de hojas de cálculo como Microsoft Excel o OpenOffice Calc. Este archivo no puede volver a importarse.
- Genera un archivo que contiene todos tus datos. Este archivo puede volver a importarse.
- Error al generar el reporte de error.
- Generar reporte de errores
- Solución de problemas
- Ayuda a traducir esta app
- Modo nocturno
- Utilizar color negro en modo nocturno
- Reemplaza fondos grises por color negro en modo nocturno. Reduce el consumo de batería en teléfonos con pantalla AMOLED.
- Interfície
- Orden inverso de días
- Mostrar días en orden inverso en la pantalla principal
- Día
- Semana
- Mes
- Cuatrimestre
- Año
- Total
-
- veces en
- Cada %d días
- Cada %d semanas
- Cada %d meses
- Puntuación
- Sonido de recordatorio
- Ninguno
- Filtrar
- Ocultar completos
- Ocultar archivados
- Hacer notificaciones fijas
- Evita que las notificaciones sean descartadas.
- Reparar base de datos
- Base de datos reparada.
- Desmarcar
- Alternar
- Acción
- Hábito
- Ordenar
- Manualmente
- Por nombre
- Por color
- Por puntuación
- Descargar
- Exportar
-
diff --git a/android/uhabits-android/src/main/res/values-eu-rES/strings.xml b/android/uhabits-android/src/main/res/values-eu-rES/strings.xml
new file mode 100644
index 000000000..c81d67195
--- /dev/null
+++ b/android/uhabits-android/src/main/res/values-eu-rES/strings.xml
@@ -0,0 +1,179 @@
+
+
+
+
+ Loop Habit Tracker
+ Ohiturak
+ Ezarpenak
+ Editatu
+ Ezabatu
+ Artxibatu
+ Desartxibatu
+ Gehitu ohitura
+ Kolorea aldatu
+ Ohitura sortu da
+ Ohiturak ezabatu dira
+ Ohiturak berrezarri dira
+ Ez dago ezer desegiteko
+ Ez dago ezer berregiteko
+ Ohitura aldatu egin da
+ Ohitura berrezarri da
+ Ohiturak artxibatu dira
+ Ohiturak desartxibatu dira
+ Ikuspegi orokorra
+ Ohituraren indarra
+ Historia
+ Garbitu
+ Galdera (... al duzu gaur?)
+ Errepikatu
+ aldiz
+ egunetan
+ Oroigarria
+ Baztertu
+ Gorde
+ Boladak
+ Ez duzu ohitura aktiborik
+ Sakatu eta mantendu markatu edo desmarkatzeko
+ Itzalita
+ Izena ezin da hutsik egon.
+ Zenbakia positiboa izan behar da.
+ Gehienez errepikapen bat eguneko izan dezakezu
+ Ohitura sortu
+ Ohitura editatu
+ Markatu
+ Geroago
+
+ Ongi etorri
+ Loop Habit Tracker-ek ohitura onak hartzen eta mantentzen laguntzen dizu.
+ Sor itzazu ohitura berri batzuk
+ Egunero, zure ohitura egin ostean, jarri ezazu egiaztatze marka bat aplikazioan.
+ Jarrai ezazu ohitura egiten
+ Denbora luzean zehar trinkotasunez egindako ohiturek izar oso bat irabaziko dute.
+ Jarrai ezazu zure aurrerapena
+ Grafiko zehatzen bitartez denboran zehar zure ohiturak nola hobetu diren ikus ditzakezu
+ 15 minutu
+ 30 minutu
+ Ordu 1
+ 2 ordu
+ 4 ordu
+ 8 ordu
+ 24 ordu
+ Ukitze laburrarekin markatu
+ Ukitze bakar batekin marka jartzen du ukitu eta mantendu egin beharrean. Erosoagoa, baina nahi gabeko markak ekar litzake.
+ Atzeratze tartea oroigarrietan
+ Aplikazio hau Google Playen puntuatu
+ Zure iritzia garatzaileari bidali
+ Iturburu kodea GitHuben ikusi
+ Aplikazioaren aurkezpena ikusi
+ Loturak
+ Portaera
+ Izena
+ Ezarpenak
+ Atzeratze tartea
+ Ba al zenekien?
+ Sarrerak berrantolatzeko, sakatu eta mantendu ohituraren izena, ondoren mugi ezazu leku aproposera.
+ Egun gehiago ikus ditzakezu zure gailua paisai moduan jarriz.
+ Ohiturak ezabatu
+ Ohiturak betirako ezabatuko dira. Ekintza hau ezin da desegin.
+ Ohitura ezabatua / ez aurkitua
+ Asteburuak
+ Astelehenetik ostiralera
+ Astearen edozen egun
+ Egunak hautatu
+ CSV bezala esportatu
+ Eginda
+ Garbitu
+ Orduak hautatu
+ Minutuak hautatu
+ Honi buruz
+ Itzultzaileak
+ Garatzaileak
+ %s bertsioa
+ Maiztasuna
+ Egiaztatze marka
+ Indarra
+ Bolada onenak
+ Uneko bolada
+ Errepikapenen kopurua
+ Azken %d egunak
+ Azken %d asteak
+ Azken %d hilabeteak
+ Azken %d urteak
+ Hasieratik
+ Egunero
+ Astero
+ Astean 2 aldiz
+ Astean 5 aldiz
+ Pertsonalizatua ...
+ Laguntza eta ohiko galderak
+ Huts datuak esportatzerakoan.
+ Huts datuak inportatzerakoan.
+ Fitxategi ezezaguna.
+ Ohiturak ondo inportatu dira.
+ Babes kopia osoa ondo esportatu da.
+ Datuak inportatu
+ Babes kopia osoa esportatu
+ Aplikazio honek esportatutako babes kopia osoak onartzen dira, baita Tickmate, HabitBull edo Rewirek sortutako fitxategiak ere. Ikusi ohito galderak informazio gehiago lortzeko.
+ Microsoft Excel edo OpenOffice Calc bezalako kalkulu orrietarako softwareak ireki dezaketen fitxategiak sortzen ditu. Fitxategi hau ezin da berriz inportatu.
+ Zure datu guztiak dituen fitxategi bat sortzen du. Fitxategi hau ezin da berriz inportatu.
+ Huts akats txostena sortzerakoan.
+ Akats txostena sortu
+ Arazoen konponketa
+ Lagundu aplikazio hau itzultzen
+ Gau modua
+ Benetazko beltza erabili gau moduan
+ Atzeko plano grisak beltz hutsez aldatzen ditu gau moduan. Bateriaren erabilera gutxitzen du AMOLED duten gailuetan.
+ Interfazea
+ Egunak atzekoz aurrera ordenatu
+ Pantaila nagusian egunak atzekoz aurrera ikusi
+ Eguna
+ Astea
+ Hilabetea
+ Hiruhilekoa
+ Urtea
+ Guztira
+
+
+ denbora
+ %d egunero
+ %d astero
+ %d hilabetero
+ Lorpena
+ Oroigarriaren soinua
+ Bat ere ez
+ Iragazkia
+ Ezkutatu lortutakoak
+ Ezkutatu artxibatutakoak
+ Jakinarazpenak itsaskorrak bihurtu
+ Jakinarazpenak keinu batez ezabatzea sahiesten du.
+ Datu basea konpondu
+ Datu basea konpondu da.
+ Desmarkatu
+ Aldatu
+ Ekintza
+ Ohitura
+ Ordenatu
+ Eskuz
+ Izenaren arabera
+ Kolorearen arabera
+ Puntuen arabera
+ Deskargatu
+ Esportatu
+
diff --git a/android/uhabits-android/src/main/res/values-eu/strings.xml b/android/uhabits-android/src/main/res/values-eu/strings.xml
deleted file mode 100644
index d9a4e0a74..000000000
--- a/android/uhabits-android/src/main/res/values-eu/strings.xml
+++ /dev/null
@@ -1,178 +0,0 @@
-
-
-
-
- Loop Habit Tracker
- Ohiturak
- Ezarpenak
- Editatu
- Ezabatu
- Artxibatu
- Desartxibatu
- Gehitu ohitura
- Kolorea aldatu
- Ohitura sortu da
- Ohiturak ezabatu dira
- Ohiturak berrezarri dira
- Ez dago ezer desegiteko
- Ez dago ezer berregiteko
- Ohitura aldatu egin da
- Ohitura berrezarri da
- Ohiturak artxibatu dira
- Ohiturak desartxibatu dira
- Ikuspegi orokorra
- Ohituraren indarra
- Historia
- Garbitu
- Galdera (... al duzu gaur?)
- Errepikatu
- aldiz
- egunetan
- Oroigarria
- Baztertu
- Gorde
- Boladak
- Ez duzu ohitura aktiborik
- Sakatu eta mantendu markatu edo desmarkatzeko
- Itzalita
- Izena ezin da hutsik egon.
- Zenbakia positiboa izan behar da.
- Gehienez errepikapen bat eguneko izan dezakezu
- Ohitura sortu
- Ohitura editatu
- Markatu
- Geroago
-
- Ongi etorri
- Loop Habit Tracker-ek ohitura onak hartzen eta mantentzen laguntzen dizu.
- Sor itzazu ohitura berri batzuk
- Egunero, zure ohitura egin ostean, jarri ezazu egiaztatze marka bat aplikazioan.
- Jarrai ezazu ohitura egiten
- Denbora luzean zehar trinkotasunez egindako ohiturek izar oso bat irabaziko dute.
- Jarrai ezazu zure aurrerapena
- Grafiko zehatzen bitartez denboran zehar zure ohiturak nola hobetu diren ikus ditzakezu
- 15 minutu
- 30 minutu
- Ordu 1
- 2 ordu
- 4 ordu
- 8 ordu
- 24 ordu
- Ukitze laburrarekin markatu
- Ukitze bakar batekin marka jartzen du ukitu eta mantendu egin beharrean. Erosoagoa, baina nahi gabeko markak ekar litzake.
- Atzeratze tartea oroigarrietan
- Aplikazio hau Google Playen puntuatu
- Zure iritzia garatzaileari bidali
- Iturburu kodea GitHuben ikusi
- Aplikazioaren aurkezpena ikusi
- Loturak
- Portaera
- Izena
- Ezarpenak
- Atzeratze tartea
- Ba al zenekien?
- Sarrerak berrantolatzeko, sakatu eta mantendu ohituraren izena, ondoren mugi ezazu leku aproposera.
- Egun gehiago ikus ditzakezu zure gailua paisai moduan jarriz.
- Ohiturak ezabatu
- Ohiturak betirako ezabatuko dira. Ekintza hau ezin da desegin.
- Ohitura ezabatua / ez aurkitua
- Asteburuak
- Astelehenetik ostiralera
- Astearen edozen egun
- Egunak hautatu
- CSV bezala esportatu
- Eginda
- Garbitu
- Orduak hautatu
- Minutuak hautatu
- Honi buruz
- Itzultzaileak
- Garatzaileak
- %s bertsioa
- Maiztasuna
- Egiaztatze marka
- Indarra
- Bolada onenak
- Uneko bolada
- Errepikapenen kopurua
- Azken %d egunak
- Azken %d asteak
- Azken %d hilabeteak
- Azken %d urteak
- Hasieratik
- Egunero
- Astero
- Astean 2 aldiz
- Astean 5 aldiz
- Pertsonalizatua ...
- Laguntza eta ohiko galderak
- Huts datuak esportatzerakoan.
- Huts datuak inportatzerakoan.
- Fitxategi ezezaguna.
- Ohiturak ondo inportatu dira.
- Babes kopia osoa ondo esportatu da.
- Datuak inportatu
- Babes kopia osoa esportatu
- Aplikazio honek esportatutako babes kopia osoak onartzen dira, baita Tickmate, HabitBull edo Rewirek sortutako fitxategiak ere. Ikusi ohito galderak informazio gehiago lortzeko.
- Microsoft Excel edo OpenOffice Calc bezalako kalkulu orrietarako softwareak ireki dezaketen fitxategiak sortzen ditu. Fitxategi hau ezin da berriz inportatu.
- Zure datu guztiak dituen fitxategi bat sortzen du. Fitxategi hau ezin da berriz inportatu.
- Huts akats txostena sortzerakoan.
- Akats txostena sortu
- Arazoen konponketa
- Lagundu aplikazio hau itzultzen
- Gau modua
- Benetazko beltza erabili gau moduan
- Atzeko plano grisak beltz hutsez aldatzen ditu gau moduan. Bateriaren erabilera gutxitzen du AMOLED duten gailuetan.
- Interfazea
- Egunak atzekoz aurrera ordenatu
- Pantaila nagusian egunak atzekoz aurrera ikusi
- Eguna
- Astea
- Hilabetea
- Hiruhilekoa
- Urtea
- Guztira
-
- denbora
- %d egunero
- %d astero
- %d hilabetero
- Puntuak
- Oroigarriaren soinua
- Bat ere ez
- Iragazkia
- Ezkutatu lortutakoak
- Artxibatutakoak ezkutatu
- Jakinarazpenak itsaskorrak bihurtu
- Jakinarazpenak keinu batez ezabatzea sahiesten du.
- Datu basea konpondu
- Datu basea konpondu da.
- Desmarkatu
- Aldatu
- Ekintza
- Ohitura
- Ordenatu
- Eskuz
- Izenaren arabera
- Kolorearen arabera
- Puntuen arabera
- Deskargatu
- Esportatu
-
diff --git a/android/uhabits-android/src/main/res/values-fa-rIR/strings.xml b/android/uhabits-android/src/main/res/values-fa-rIR/strings.xml
new file mode 100644
index 000000000..701ddb40f
--- /dev/null
+++ b/android/uhabits-android/src/main/res/values-fa-rIR/strings.xml
@@ -0,0 +1,179 @@
+
+
+
+
+ Loop Habit Tracker
+ عادتها
+ تنظیمات
+ ویرایش
+ حذف
+ بایگانی کن
+ خارج کردن از بایگانی
+ افزودن عادت
+ تغییر رنگ
+ عادت ایجاد شد
+ عادت حذف شد
+ عادت بازگردانده شد
+ چیزی برای بازگرداندن به حالت قبلی وجود ندارد
+ چیزی برای انجام مجدد وجود ندارد
+ عادت تغییر کرد.
+ عادت به حالت قبل برگشت
+ عادتها بایگانی شدند
+ عادتها از بایگانی خارج شدند
+ مرور
+ قدرت عادت
+ تاریخچه
+ بیخیال
+ سوال (آیا امروز شما…؟)
+ تکرار
+ بار در هر
+ روز
+ یادآور
+ بیخیال
+ ذخیره
+ روزهای پیوسته
+ شما هیچ عادت فعالی ندارید
+ برای تیک زدن یا برداشتن، ضربه بزنید و نگه دارید
+ خاموش
+ جای اسم نمیتواند خالی باشد.
+ عدد بایستی مثبت باشد.
+ شما در نهایت میتوانید یک تکرار در یک روز داشته باشید.
+ درج عادت جدید
+ ویرایش عادت
+ تیک زدن
+ بعداً
+
+ خوش آمدید
+ رهگیر عادت لوپ به شما کمک میکند تا برای خودتان عادتهای خوبی بسازید.
+ ساخت چند عادت جدید
+ هر روز، بعد از انجام عادت، آن را در برنامه تیک بزنید.
+ ادامه دهید
+ عادتهایی که به صورت پیوسته برای مدت طولانی انجام شدهاند یک ستارهی کامل دریافت میکنند.
+ پیشرفت خود را رهگیری کنید
+ نمودار جزئیات به شما نشان میدهد که چطور عادتهایتان با گذشت زمان بهبود پیدا کردهاند.
+ ۱۵ دقیقه
+ ۳۰ دقیقه
+ ۱ ساعت
+ ۲ ساعت
+ ۴ ساعت
+ ۸ ساعت
+ ۲۴ ساعت
+ با اشارهی کوتاهمدت وضعیت عادت را تغییر بده
+ تیک زدن با تکضربه در مقابل ضربهزدن و نگهداشتن راحتتر است ولی ممکن است باعث شود اشتباهی عادتی را تیک بزنید.
+ بازه به تعویق انداختن یادآورها
+ به این برنامه در گوگلپلی امتیاز بدهید
+ ارسال بازخورد به توسعهدهنده
+ دیدن منبع برنامه در گیتهاب
+ مشاهده معرفی برنامه
+ لینکها
+ رفتار
+ نام
+ تنظیمات
+ بازه به تعویق انداختن
+ آیا می دانستید؟
+ برای جابجایی عناوین، انگشتتان را روی نام عادت مورد نظر بگذارید و نگه دارید، سپس آن را به محل صحیح بکشید.
+ با قرار دادن گوشی در حالت افقی میتوانید روزهای بیشتری را ببینید.
+ حذف عادتها
+ عادتها برای همیشه حذف خواهد شد. این عمل قابل بازگشت نیست.
+ عادت حذف شده/ پیدا نشد
+ آخر هفتهها
+ دوشنبه تا جمعه
+ هر روز هفته
+ انتخاب روزها
+ صدور فایل CSV
+ انجام شد
+ بیخیال
+ انتخاب ساعت
+ انتخاب دقیقه
+ درباره
+ مترجمان
+ توسعهدهندگان
+ نسخه %s
+ تناوب
+ علامت
+ قدرت
+ بهترین استمرار
+ استمرار فعلی
+ تعداد تکرارها
+ %d روز اخیر
+ %d هفته اخیر
+ %d ماه اخیر
+ %d سال اخیر
+ همیشه
+ هر روز
+ هر هفته
+ ۲ بار در هفته
+ ۵ بار در هفته
+ سفارشیسازی ...
+ راهنما و سوالات متداول
+ خطا در صدور اطلاعات.
+ خطا در وارد کردن اطلاعات.
+ پرونده شناخته شده نیست.
+ عادتها با موفقیت وارد شدند.
+ پرونده پشتیبان کامل، با موفقیت صادر شد.
+ ورود اطلاعات
+ پشتیبان گیری کامل
+ علاوه بر پشتیبان کامل تهیه شده توسط این برنامه، از پروندههای تولید شده توسط Tickmate، HabitbBull و یا Rewire هم پشتیبانی میشود. برای اطلاعات بیشتر سوالات متداول را ببینید.
+ پروندهای تولید میکند که میتوان توسط برنامههای صفحه گسترده مانند Microsoft Excel و یا OpenOffice Calc بازشان کرد. این پرونده قابلیت وارد کردن مجدد به این برنامه را ندارد.
+ پروندهای تولید میکند که شامل تمام اطلاعات شما است. این پرونده قابل بازیابی توسط این برنامه میباشد.
+ خطایی در تولید گزارش مشکلات بوجود آمد.
+ ایجاد گزارش مشکلات
+ ایرادیابی
+ کمک برای ترجمه این برنامه
+ حالت شب
+ استفاده از رنگ سیاه خالص در حالت شبانه
+ جایگزینی پس زمینه خاکستری با سیاه خالص در حالت شب. استفاده از باتری در گوشیهای با صفحه نمایش AMOLED را کاهش میدهد.
+ رابط کاربری
+ معکوس کردن ترتیب روزها
+ روزها را در صفحه اصلی با ترتیب معکوس نمایش میدهد
+ روز
+ هفته
+ ماه
+ فصل
+ سال
+ مجموع
+
+
+ بار در هر
+ هر %d روز یکبار
+ هر %d هفته یکبار
+ هر %d ماه یکبار
+ امتیاز
+ صدای یادآور
+ هیچکدام
+ فیلتر
+ مخفی کردن کامل شدهها
+ مخفی کردن بایگانی شدهها
+ چسبناک کردن اعلانها
+ از رد کردن اعلان با کشیدن جلوگیری میکند.
+ تعمیر پایگاه داده
+ پایگاه داده تعمیر شد.
+ برداشتن تیک
+ تغییر وضعیت
+ اقدام
+ عادت
+ مرتبسازی
+ دستی
+ بر اساس نام
+ بر اساس رنگ
+ بر اساس امتیاز
+ بارگيری
+ صدور
+
diff --git a/android/uhabits-android/src/main/res/values-fa/strings.xml b/android/uhabits-android/src/main/res/values-fa/strings.xml
deleted file mode 100644
index 82a96ccd2..000000000
--- a/android/uhabits-android/src/main/res/values-fa/strings.xml
+++ /dev/null
@@ -1,178 +0,0 @@
-
-
-
-
- Loop Habit Tracker
- عادتها
- تنظیمات
- ویرایش
- حذف
- بایگانی کن
- خارج کردن از بایگانی
- افزودن عادت
- تغییر رنگ
- عادت ایجاد شد
- عادت حذف شد
- عادت بازگردانده شد
- چیزی برای بازگرداندن به حالت قبلی وجود ندارد
- چیزی برای انجام مجدد وجود ندارد
- عادت تغییر کرد.
- عادت به حالت قبل برگشت
- عادتها بایگانی شدند
- عادتها از بایگانی خارج شدند
- مرور
- قدرت عادت
- تاریخچه
- بیخیال
- سوال (آیا امروز شما…؟)
- تکرار
- بار در هر
- روز
- یادآور
- بیخیال
- ذخیره
- روزهای پیوسته
- شما هیچ عادت فعالی ندارید
- برای تیک زدن یا برداشتن، ضربه بزنید و نگه دارید
- خاموش
- جای اسم نمیتواند خالی باشد.
- عدد بایستی مثبت باشد.
- شما در نهایت میتوانید یک تکرار در یک روز داشته باشید.
- درج عادت جدید
- ویرایش عادت
- تیک زدن
- بعداً
-
- خوش آمدید
- رهگیر عادت لوپ به شما کمک میکند تا برای خودتان عادتهای خوبی بسازید.
- ساخت چند عادت جدید
- هر روز، بعد از انجام عادت، آن را در برنامه تیک بزنید.
- ادامه دهید
- عادتهایی که به صورت پیوسته برای مدت طولانی انجام شدهاند یک ستارهی کامل دریافت میکنند.
- پیشرفت خود را رهگیری کنید
- نمودار جزئیات به شما نشان میدهد که چطور عادتهایتان با گذشت زمان بهبود پیدا کردهاند.
- ۱۵ دقیقه
- ۳۰ دقیقه
- ۱ ساعت
- ۲ ساعت
- ۴ ساعت
- ۸ ساعت
- ۲۴ ساعت
- با اشارهی کوتاهمدت وضعیت عادت را تغییر بده
- تیک زدن با تکضربه در مقابل ضربهزدن و نگهداشتن راحتتر است ولی ممکن است باعث شود اشتباهی عادتی را تیک بزنید.
- بازه به تعویق انداختن یادآورها
- به این برنامه در گوگلپلی امتیاز بدهید
- ارسال بازخورد به توسعهدهنده
- دیدن منبع برنامه در گیتهاب
- مشاهده معرفی برنامه
- لینکها
- رفتار
- نام
- تنظیمات
- بازه به تعویق انداختن
- آیا می دانستید؟
- برای جابجایی عناوین، انگشتتان را روی نام عادت مورد نظر بگذارید و نگه دارید، سپس آن را به محل صحیح بکشید.
- با قرار دادن گوشی در حالت افقی میتوانید روزهای بیشتری را ببینید.
- حذف عادتها
- عادتها برای همیشه حذف خواهد شد. این عمل قابل بازگشت نیست.
- عادت حذف شده/ پیدا نشد
- آخر هفتهها
- دوشنبه تا جمعه
- هر روز هفته
- انتخاب روزها
- صدور فایل CSV
- انجام شد
- بیخیال
- انتخاب ساعت
- انتخاب دقیقه
- درباره
- مترجمان
- توسعهدهندگان
- نسخه %s
- تناوب
- علامت
- قدرت
- بهترین استمرار
- استمرار فعلی
- تعداد تکرارها
- %d روز اخیر
- %d هفته اخیر
- %d ماه اخیر
- %d سال اخیر
- همیشه
- هر روز
- هر هفته
- ۲ بار در هفته
- ۵ بار در هفته
- سفارشیسازی ...
- راهنما و سوالات متداول
- خطا در صدور اطلاعات.
- خطا در وارد کردن اطلاعات.
- پرونده شناخته شده نیست.
- عادتها با موفقیت وارد شدند.
- پرونده پشتیبان کامل، با موفقیت صادر شد.
- ورود اطلاعات
- پشتیبان گیری کامل
- علاوه بر پشتیبان کامل تهیه شده توسط این برنامه، از پروندههای تولید شده توسط Tickmate، HabitbBull و یا Rewire هم پشتیبانی میشود. برای اطلاعات بیشتر سوالات متداول را ببینید.
- پروندهای تولید میکند که میتوان توسط برنامههای صفحه گسترده مانند Microsoft Excel و یا OpenOffice Calc بازشان کرد. این پرونده قابلیت وارد کردن مجدد به این برنامه را ندارد.
- پروندهای تولید میکند که شامل تمام اطلاعات شما است. این پرونده قابل بازیابی توسط این برنامه میباشد.
- خطایی در تولید گزارش مشکلات بوجود آمد.
- ایجاد گزارش مشکلات
- ایرادیابی
- کمک برای ترجمه این برنامه
- حالت شب
- استفاده از رنگ سیاه خالص در حالت شبانه
- جایگزینی پس زمینه خاکستری با سیاه خالص در حالت شب. استفاده از باتری در گوشیهای با صفحه نمایش AMOLED را کاهش میدهد.
- رابط کاربری
- معکوس کردن ترتیب روزها
- روزها را در صفحه اصلی با ترتیب معکوس نمایش میدهد
- روز
- هفته
- ماه
- فصل
- سال
- مجموع
-
- بار در هر
- هر %d روز یکبار
- هر %d هفته یکبار
- هر %d ماه یکبار
- امتیاز
- صدای یادآور
- هیچکدام
- فیلتر
- مخفی کردن کامل شدهها
- مخفی کردن بایگانی شدهها
- چسبناک کردن اعلانها
- از رد کردن اعلان با کشیدن جلوگیری میکند.
- تعمیر پایگاه داده
- پایگاه داده تعمیر شد.
- برداشتن تیک
- تغییر وضعیت
- اقدام
- عادت
- مرتبسازی
- دستی
- بر اساس نام
- بر اساس رنگ
- بر اساس امتیاز
- بارگيری
- صدور
-
diff --git a/android/uhabits-android/src/main/res/values-fi-rFI/strings.xml b/android/uhabits-android/src/main/res/values-fi-rFI/strings.xml
new file mode 100644
index 000000000..b7c39d27b
--- /dev/null
+++ b/android/uhabits-android/src/main/res/values-fi-rFI/strings.xml
@@ -0,0 +1,106 @@
+
+
+
+
+ Loop Habit Tracker
+ Rutiinit
+ Asetukset
+ Muokkaa
+ Poista
+ Arkistoi
+ Lisää rutiini
+ Vaihda väriä
+ Rutiini luotu
+ Rutiinit poistettu
+ Rutiinit palautettu
+ Rutiini muutettu
+ Rutiini muutettu takaisin
+ Rutiinit arkistoitu
+ Rutiinit palautettu arkistosta
+ Yleiskatsaus
+ Rutiinin vahvuus
+ Historia
+ Tyhjennä
+ Kysymys (Teitkö... tänään?)
+ Toista
+ kertaa
+ päivässä
+ Muistutus
+ Hylkää
+ Tallenna
+ Pisimmät toistot
+ Ei aktiivisia rutiineja
+ Paina pitkään merkitäksesi suoritetuksi tai postaaksesi suorituksen
+ Pois päältä
+ Nimi ei voi olla tyhjä.
+ Luvun on oltava positiivinen.
+ Toistoja voi olla enintään yksi päivässä
+ Luo rutiini
+ Muokkaa rutiinia
+ Tehty
+ Lykkää
+
+ Tervetuloa
+ Loop Habit Tracker auttaa sinua luomaan ja ylläpitämään hyviä rutiineja.
+ Merkitse uusia rutiineja
+ Joka päivä, suoritettuasi rutiinin, merkitse se sovellukseen.
+ Jatka sen tekemistä
+ Rutiinit joita on toistettu säännöllisesti pitkän aikaa, saavat kokonaisen tähden.
+ Seuraa kehitystäsi
+ Yksityiskohtaiset kaaviot näyttävät, kuinka rutiinisi ovat kehittyneet ajan kuluessa.
+ 15 minuuttia
+ 30 minuuttia
+ 1 tunti
+ 2 tuntia
+ 4 tuntia
+ 8 tuntia
+ 24 tuntia
+ Vaihda merkintää lyhyellä painalluksella
+ Tee merkit yhdellä painalluksella pitkän painalluksen sijaan. Kätevämpi, mutta saattaa aiheuttaa vahingossa painamista.
+ Arvostele Google Playssä
+ Lähetä palautetta kehittäjälle
+ Katso lähdekoodi GitHubissa
+ Katso sovelluksen esittely
+ Linkit
+ Käyttäytyminen
+ Nimi
+ Asetukset
+ Tiesitkö?
+ Valmis
+ Tyhjennä
+ Kääntäjät
+ Kehittäjät
+ Versio %s
+ Joka päivä
+ Joka viikko
+ 2 kertaa viikossa
+ 5 kertaa viikossa
+ Mukautettu…
+ Yötila
+ Käytä puhdasta mustaa yötilassa
+ Päivä
+ Viikko
+ Kuukausi
+ Kvartaali
+ Vuosi
+ Yhteensä
+
+
+
diff --git a/android/uhabits-android/src/main/res/values-fi/strings.xml b/android/uhabits-android/src/main/res/values-fi/strings.xml
deleted file mode 100644
index f3d86dc67..000000000
--- a/android/uhabits-android/src/main/res/values-fi/strings.xml
+++ /dev/null
@@ -1,83 +0,0 @@
-
-
-
-
- Rutiini - Tracker
- Rutiinit
- Asetukset
- Muokkaa
- Poista
- Arkistoi
- Lisää rutiini
- Vaihda väriä
- Rutiini luotu
- Rutiinit poistettu
- Rutiinit palautettu
- Rutiini muutettu
- Rutiini muutettu takaisin
- Yleiskatsaus
- Historia
- Tyhjennä
- Kysymys (Teitkö... tänään?)
- Toista
- kertaa
- päivässä
- Muistutus
- Hylkää
- Tallenna
- Pisimmät toistot
- Ei aktiivisia rutiineja
- Paina pitkään merkitäksesi suoritetuksi tai postaaksesi suorituksen
- Pois päältä
- Nimi ei voi olla tyhjä.
- Luvun on oltava positiivinen.
- Luo rutiini
- Muokkaa rutiinia
- Tehty
- Lykkää
-
- Tervetuloa
- Merkitse uusia rutiineja
- Joka päivä, suoritettuasi rutiinin, merkitse se sovellukseen.
- Linkit
- Käyttäytyminen
- Nimi
- Asetukset
- Tiesitkö?
- Valmis
- Tyhjennä
- Kääntäjät
- Kehittäjät
- Versio %s
- Joka päivä
- Joka viikko
- 2 kertaa viikossa
- 5 kertaa viikossa
- Mukautettu…
- Yötila
- Käytä puhdasta mustaa yötilassa
- Päivä
- Viikko
- Kuukausi
- Kvartaali
- Vuosi
- Yhteensä
-
-
diff --git a/android/uhabits-android/src/main/res/values-fr-rFR/strings.xml b/android/uhabits-android/src/main/res/values-fr-rFR/strings.xml
new file mode 100644
index 000000000..9eb898521
--- /dev/null
+++ b/android/uhabits-android/src/main/res/values-fr-rFR/strings.xml
@@ -0,0 +1,198 @@
+
+
+
+
+ Loop - Suivi d\'habitudes
+ Habitudes
+ Paramètres
+ Modifier
+ Supprimer
+ Archiver
+ Désarchiver
+ Ajouter une habitude
+ Changer la couleur
+ Habitude créée
+ Habitudes supprimées
+ Habitudes rétablies
+ Rien à annuler
+ Rien à refaire
+ Habitude changée
+ Habitude restaurée
+ Habitudes archivées
+ Habitudes désarchivées
+ Vue d\'ensemble
+ Force de l\'habitude
+ Historique
+ Supprimer
+ Question (As-tu ... aujourd\'hui ?)
+ Répéter
+ fois en
+ jours
+ Rappel
+ Annuler
+ Sauvegarder
+ Séries
+ Vous n\'avez pas d\'habitudes actives
+ Appuyez longtemps pour cocher ou décocher
+ Aucun
+ Le nom ne peut être vide.
+ Le nombre doit être positif.
+ Vous pouvez avoir au plus une répétition par jour
+ Créer une habitude
+ Modifier l\'habitude
+ Cocher
+ Plus tard
+
+ Bienvenue
+ Loop - Suivi d\'habitudes vous aide à créer et maintenir de bonnes habitudes.
+ Créez de nouvelles habitudes
+ Chaque jour, après avoir réalisé votre habitude, cochez-la sur l\'application.
+ Continuez à le faire
+ Les habitudes régulières pendant une période de temps étendue gagneront une étoile complète.
+ Suivez votre progrès
+ Des graphiques détaillés vous montrent comment vos habitudes évoluent au fil du temps.
+ 15 minutes
+ 30 minutes
+ 1 heure
+ 2 heures
+ 4 heures
+ 8 heures
+ 24 heures
+ Toujours demander
+ Personnaliser...
+ Valider l\'habitude avec un appui court
+ Valide l\'habitude avec un appui court plutôt qu\'un appuie long. Plus pratique, mais peut causer des activations accidentelles.
+ Intervalle de report des rappels
+ Notez cette app sur le Google Play Store
+ Envoyez un avis au développeur
+ Voir le code source sur GitHub
+ Voir l\'introduction de l\'app
+ Liens
+ Comportement
+ Nom
+ Paramètres
+ Intervalle de report
+ Définir le délai de répétition
+ Le saviez-vous ?
+ Pour réordonner les habitudes, faites un appui long sur le nom de l\'habitude et placez-la à la bonne place.
+ Vous pouvez voir plus de jours en mettant votre téléphone en mode paysage.
+ Supprimer des habitudes
+ Les habitudes seront supprimées définitivement. Cette action est irréversible.
+ Habitude supprimée / introuvable
+ Weekends
+ Du lundi au vendredi
+ N\'importe quel jour
+ Sélectionner des jours
+ Exporter les données dans un fichier CSV
+ Fait
+ Supprimer
+ Sélectionner les heures
+ Sélectionner les minutes
+ À propos
+ Traducteurs
+ Développeurs
+ Version %s
+ Fréquence
+ Case à cocher
+ Force
+ Meilleures séries
+ Série actuelle
+ Nombre de répétitions
+ %d derniers jours
+ %d dernières semaines
+ %d derniers mois
+ %d dernières années
+ Depuis le début
+ Tous les jours
+ Toutes les semaines
+ 2 fois par semaine
+ 5 fois par semaine
+ Personnalisée ...
+ Aide & FAQ
+ Export des données échoué.
+ Import des données échoué.
+ Fichier non reconnu
+ Habitudes importées avec succès
+ Sauvegarde complète exportée avec succès
+ Importer des données
+ Exporter une sauvegarde complète
+ Supporte les sauvegardes complètes générées par cette application, ainsi que les fichiers Tickmate, HabitBull et Rewire. Voir la FAQ pour plus d\'informations.
+ Génère des fichiers pouvant être ouverts par des tableurs comme Microsoft Excel ou LibreOffice Calc. Ce fichier ne peut pas être réimporté.
+ Génère un fichier contenant toutes vos données. Ce fichier peut être réimporté.
+ La génération du rapport de bug a échouée.
+ Générer un rapport de bug.
+ Résolution de problèmes
+ Aider à traduire cette application
+ Mode Nuit
+ Utiliser un noir pur dans le mode nuit
+ Remplace le fond gris par un noir pur dans le mode nuit ; cela réduit l’usage de la batterie des appareils ayant un écran AMOLED.
+ Interface
+ Inverser l\'ordre des jours
+ Montrer les jours dans l\'ordre inversé sur l\'écran principal
+ Jour
+ Semaine
+ Mois
+ Trimestre
+ Année
+ Total
+
+ Oui ou Non
+ Nombre
+
+ fois tous les
+ Tous les %d jours
+ Toutes les %d semaines
+ Tous les %d mois
+ Score
+ Son de rappel
+ Aucun
+ Filtre
+ Cacher les habitudes complétées
+ Cacher les habitudes archivées
+ Rendre les notifications persistantes
+ Évite que les notifications ne soient enlevées.
+ Notification de lumière led
+ Réparer la base de données
+ Base de données réparée.
+ Décocher
+ Basculer
+ Action
+ Habitude
+ Trier
+ Manuellement
+ Par nom
+ Par couleur
+ Par score
+ Télécharger
+ Exporter
+ Modifier la valeur
+ Calendrier
+ Unité
+ Nombre
+ Question
+ Cible
+ Oui
+ Non
+ Modifier le son, les vibrations, la lumière et d\'autres paramètres de notification
+ Personnaliser les notifications
+ Voir la politique de confidentialité
+ Voir tous les contributeurs…
+ Base de données
+
diff --git a/android/uhabits-android/src/main/res/values-fr/strings.xml b/android/uhabits-android/src/main/res/values-fr/strings.xml
deleted file mode 100644
index eab302fe4..000000000
--- a/android/uhabits-android/src/main/res/values-fr/strings.xml
+++ /dev/null
@@ -1,178 +0,0 @@
-
-
-
-
- Loop - Suivi d\'habitudes
- Habitudes
- Paramètres
- Modifier
- Supprimer
- Archiver
- Désarchiver
- Ajouter une habitude
- Changer la couleur
- Habitude créée
- Habitudes supprimées
- Habitudes rétablies
- Rien à annuler
- Rien à refaire
- Habitude changée
- Habitude restaurée
- Habitudes archivées
- Habitudes désarchivées
- Vue d\'ensemble
- Force de l\'habitude
- Historique
- Supprimer
- Question (As-tu ... aujourd\'hui ?)
- Répéter
- fois en
- jours
- Rappel
- Annuler
- Sauvegarder
- Séries
- Vous n\'avez pas d\'habitudes actives
- Appuyez longtemps pour cocher ou décocher
- Aucun
- Le nom ne peut être vide.
- Le nombre doit être positif.
- Vous pouvez avoir au plus une répétition par jour
- Créer une habitude
- Modifier l\'habitude
- Cocher
- Plus tard
-
- Bienvenue
- Loop - Suivi d\'habitudes vous aide à créer et maintenir de bonnes habitudes.
- Créez de nouvelles habitudes
- Chaque jour, après avoir réalisé votre habitude, cochez-la sur l\'application.
- Continuez à le faire
- Les habitudes régulières pendant une période de temps étendue gagneront une étoile complète.
- Suivez votre progrès
- Des graphiques détaillés vous montrent comment vos habitudes évoluent au fil du temps.
- 15 minutes
- 30 minutes
- 1 heure
- 2 heures
- 4 heures
- 8 heures
- 24 heures
- Valider l\'habitude avec un appui court
- Valide l\'habitude avec un appui court plutôt qu\'un appuie long. Plus pratique, mais peut causer des activations accidentelles.
- Intervalle de report des rappels
- Notez cette app sur le Google Play Store
- Envoyez un avis au développeur
- Voir le code source sur GitHub
- Voir l\'introduction de l\'app
- Liens
- Comportement
- Nom
- Paramètres
- Intervalle de report
- Le saviez-vous ?
- Pour réordonner les habitudes, faites un appui long sur le nom de l\'habitude et placez-la à la bonne place.
- Vous pouvez voir plus de jours en mettant votre téléphone en mode paysage.
- Supprimer des habitudes
- Les habitudes seront supprimées définitivement. Cette action est irréversible.
- Habitude supprimée / introuvable
- Weekends
- Du lundi au vendredi
- N\'importe quel jour
- Sélectionner des jours
- Exporter les données dans un fichier CSV
- Fait
- Supprimer
- Sélectionner les heures
- Sélectionner les minutes
- À propos
- Traducteurs
- Développeurs
- Version %s
- Fréquence
- Case à cocher
- Force
- Meilleures séries
- Série actuelle
- Nombre de répétitions
- %d derniers jours
- %d dernières semaines
- %d derniers mois
- %d dernières années
- Depuis le début
- Tous les jours
- Toutes les semaines
- 2 fois par semaine
- 5 fois par semaine
- Personnalisée ...
- Aide & FAQ
- Export des données échoué.
- Import des données échoué.
- Fichier non reconnu
- Habitudes importées avec succès
- Sauvegarde complète exportée avec succès
- Importer des données
- Exporter une sauvegarde complète
- Supporte les sauvegardes complètes générées par cette application, ainsi que les fichiers Tickmate, HabitBull et Rewire. Voir la FAQ pour plus d\'informations.
- Génère des fichiers pouvant être ouverts par des tableurs comme Microsoft Excel ou LibreOffice Calc. Ce fichier ne peut pas être réimporté.
- Génère un fichier contenant toutes vos données. Ce fichier peut être réimporté.
- La génération du rapport de bug a échouée.
- Générer un rapport de bug.
- Résolution de problèmes
- Aider à traduire cette application
- Mode Nuit
- Utiliser un noir pur dans le mode nuit
- Remplacer le fond gris par un noir pur dans le mode nuit ; ça réduit l’usage de la batterie des appareils ayant un écran AMOLED.
- Interface
- Inverser l\'ordre des jours
- Montrer les jours dans l\'ordre inversé sur l\'écran principal
- Jour
- Semaine
- Mois
- Trimestre
- Année
- Total
-
- fois tous les
- Tous les %d jours
- Toutes les %d semaines
- Tous les %d mois
- Score
- Son de rappel
- Aucun
- Filtre
- Cacher les habitudes complétées
- Cacher les habitudes archivées
- Rendre les notifications persistantes
- Évite que les notifications ne soient enlevées.
- Réparer la base de données
- Base de données réparée.
- Décocher
- Basculer
- Action
- Habitude
- Trier
- Manuellement
- Par nom
- Par couleur
- Par score
- Télécharger
- Exporter
-
diff --git a/android/uhabits-android/src/main/res/values-hi-rIN/strings.xml b/android/uhabits-android/src/main/res/values-hi-rIN/strings.xml
new file mode 100644
index 000000000..770da5389
--- /dev/null
+++ b/android/uhabits-android/src/main/res/values-hi-rIN/strings.xml
@@ -0,0 +1,224 @@
+
+
+
+
+ Loop - आदत पर नजर
+ आदतें
+ सेटिंग्स
+ संपादित करें
+ हटाएँ
+ संग्रहीत करें
+ असंगृहीत करें
+ आदत जोड़ें
+ रंग बदलें
+ आदत बनायी गई
+ आदत हटाई गई
+ आदत पुनर्स्थापित
+ पूर्ववत करने के लिए कुछ नहीं
+ अद्यतन करने के लिए कुछ नहीं
+ आदत बहाल
+ आदत बहाल
+ आदत संग्रहीत
+ आदत असंग्रहीत
+ अवलोकन
+ आदत शक्ति
+ पूर्वलेख
+ साफ करें
+ सवाल (क्या आज आपने ... किया?)
+ दोहराएँ
+ बार
+ दिन
+ अनुस्मारक
+ रद्द करें
+ सहेजें
+ प्रवर्ति
+ \"आपकी कोई सक्रिय आदत नही है
+\"
+ चेक या अनचेक करने के लिए दबाएँ व दबाएँ रखें
+ बंद
+ नाम को खाली नही छोड़ सकते
+ नंबर सकारात्मक डालें
+ \"
+आप एक दिन मे अधिक से अधिक एक पुनरावृत्ति हो सकती है\"
+ आदत उत्पन्न करें
+ आदत संपादित करें
+ \"
+चेक\"
+ बाद में
+
+ \"
+स्वागत हे\"
+ लूप हैबिट ट्रैकर नई और अच्छी आदतों को बनाए रखने मे मदद करता है ।
+ कुछ नई अच्छी आदतें बनाएँ
+ हर दिन, अपनी आदत के प्रदर्शन के बाद, ऐप पर एक सही का निशान डालें
+ इसे करते रहें
+ \"
+एक लंबे समय के लिए लगातार प्रदर्शन की आदतों से पूर्ण स्टार अर्जित करेंगे।\"
+ \"
+अपनी प्रगति को ट्रैक करें\"
+ \"
+विस्तृत रेखांकन आपको बताएंगे कि कैसे अपनी आदतों में समय के साथ सुधार करें\"
+ 15 मिनिट
+ 30 मिनिट
+ 1 घंटा
+ 2 घंटा
+ 4 घंटा
+ 8 घंटा
+ 24 घंटे
+ टॉगल पुनरावृत्ति हल्का दबाने से
+ \"
+अधिक सुविधाजनक है, लेकिन आकस्मिक टॉगल हो सकता है ।\"
+ रिमाइंडर मे स्नूज़ अंतराल
+ \"
+गूगले प्ले पर इस ऐप्लिकेशन को रेट करें\"
+ डेवेलपर को प्रतिक्रिया भेजें
+ Github मे सोर्स कोड देखें
+ अप्प्प का परिचय देखें
+ लिंक
+ \"
+व्यवहार\"
+ नाम
+ सेटिंग्स
+ \"
+झपकी का अंतराल\"
+ क्या आप जानते .?
+ \"
+प्रविष्टियों को पुनर्व्यवस्थित करने के लिए, आदत के नाम पर प्रेस करें और सही जगह पर खींचें।\"
+ \"
+ अपने फोन को लांडसकपे मोड मे रख कर आप अधिक दिनों से देख सकते हैं\"
+ आदत हटाएँ
+ \"
+आदतों को स्थायी रूप से हटा दिया जाएगा। इस क्रिया को पूर्ववत नहीं किया जा सकता है।\"
+ आदत हटाई गई / नहीं मिली
+ \"
+सप्ताहांत\"
+ \"
+सोमवार से शुक्रवार\"
+ \"
+सप्ताह का कोई भी दिन\"
+ दिन चुनें
+ CSV में निर्यात करें
+ \"
+पूर्ण\"
+ \"
+साफ़\"
+ घंटे चुनें
+ मिनट चुनें
+ \"
+बारे में\"
+ \"
+अनुवादक\"
+ \"
+डिवेलपर\"
+ वर्ज़न %s
+ आवृत्ति
+ सही का चिह्न
+ \"
+ताक़त\"
+ बेस्ट स्ट्रीक्स
+ \"
+वर्तमान स्ट्रीक्स\"
+ \"
+repetitions की संख्या\"
+ अंतिम %d दिवस
+ पिछले %d सप्ताह
+ पिछले %d माह
+ \"
+पिछले %d साल\"
+ पूरा समय
+ \"
+हर दिन\"
+ \"
+प्रति सप्ताह\"
+ \"
+प्रति सप्ताह 2 बार\"
+ \"
+प्रति सप्ताह 5 बार\"
+ अन्य
+ \"
+मदद और बार-बार सवाल पूछने वाले सवाल\"
+ \"
+डेटा निर्यात करने में विफल\"
+ डेटा आयात करने में विफल रहा है
+ फाइल की पहचान नही
+ \"
+आदतों को सफलतापूर्वक आयात\"
+ \"
+पूर्ण बैकअप सफलतापूर्वक निर्यात किया।\"
+ \"
+डेटा आयात\"
+ \"
+निर्यात पूर्ण बैकअप\"
+ इस एप्लिकेशन के द्वारा निर्यात पूर्ण बैकअप को सपोर्ट करता है , साथ ही फाइलों टिक्कमते , हबिठबुल्ल या रिवाइयर द्वारा उत्पन्न फाइल्स को सपोर्ट करता है। अधिक जानकारी के लिए सामान्य प्रश्न देखें।
+ \"ऐसी फाइल्स उत्पन्न करता है जो स्प्रेडशीट सॉफ़्टवरेस जैसे Microsoft Excel, OpenOffice Calc मे खुल सकती है.
+ इस फ़ाइल में वापस आयात नहीं किया जा सकता है।\"
+ ऐसी फाइल्स उत्पन्न करता है जिसमे आपका सारा डेटा रहता है इस फ़ाइल को वापस आयात किया जा सकता है।
+ बग रिपोर्ट जनरेट करने मे असफल
+ बग रिपोर्ट जनरेट करें
+ \"
+समस्या निवारण\"
+ \"
+इस एप्लिकेशन का अनुवाद करने में मदद करें\"
+ नाइट मोड
+ नाइट मोड मे पूरा काला यूज़ करें
+ \"
+रात मोड में शुद्ध काले रंग के साथ ग्रे पृष्ठभूमि में बदलें. अमोलेड प्रदर्शन के साथ फोन में बैटरी उपयोग कम कर देता है ।\"
+ इंटरफेस
+ \"
+दिनों की रिवर्स आदेश\"
+ दिनों को रिवर्स क्रम में मुख्य स्क्रीन पर दिखाएँ
+ दिन
+ हफ्ते
+ माह
+ तिमाही
+ साल
+ कुल
+
+
+ समय में
+ \"
+हर %d दिन\"
+ \"
+हर %d हफ्ते\"
+ \"
+हर %d महीने\"
+ स्कोर
+ अनुस्मारक ध्वनि
+ \"
+कोई आवाज नहीं\"
+ फिल्टर
+ पूर्ण छुपाएं
+ संग्रहीत छुपाएं
+ सुचनाए स्थयी रखे
+ नोटिफिकेशन को स्वाइप करने से रोकता है!
+ डेटाबेस को रिपेयर करें
+ डेटाबेस रिपेयर सफल
+ निशान हटाएँ
+ बदल दें
+ कार्य
+ आदत
+ सॉर्ट करें
+ मैन्यूअली
+ नाम द्वारा
+ रंग द्वारा
+ स्कोर से
+ डाउनलोड
+ एक्सपोर्ट करे
+
diff --git a/android/uhabits-android/src/main/res/values-hi/strings.xml b/android/uhabits-android/src/main/res/values-hi/strings.xml
deleted file mode 100644
index 615a92bfa..000000000
--- a/android/uhabits-android/src/main/res/values-hi/strings.xml
+++ /dev/null
@@ -1,169 +0,0 @@
-
-
-
-
- Loop आदत पर नजर
- आदतें
- सेटिंग्स
- संपादन
- मिटा देना
- संग्रह
- असंगृहीत करें
- आदत जोड़े
- रंग बदलें
- आदत बनाए गए
- आदत हटाया गया
- आदत फिर से चालू किया गया
- कुछ भी नहीं पूर्ववत करने के लिए
- कुछ भी नही फिर से करने के लिए
- आदत मे बदलाव
- आदत बहाल
- आदत संग्रहीत
- आदत को संग्रह से निकाला गया
- अवलोकन
- आदत की ताक़त
- इतिहास
- साफ़
- सवाल (क्या आज .......किया?)
- दोहराए
- बार
- दिन
- अनुस्मारक
- हटाना
- सुरक्षित
- लहर
- आपकी कोई सक्रिय आदत नही है
- चेक या अनचेक करने के लिए दबाएँ व दबाएँ रखें
- बंद
- नाम को खाली नही छोड़ सकते
- नंबर सकारात्मक डालें
- आप एक दिन मे अधिक से अधिक एक पुनरावृत्ति हो सकती है
- आदत उत्पन्न करें
- आदत संपादित करें
- चेक
- बाद में
-
- स्वागत हे
- लूप हैबिट ट्रैकर नई और अच्छी आदतों को बनाए रखने मे लिए मदद करता है ।
- कुछ नई अच्छी आदतें बनाएँ
- हर दिन, अपनी आदत के प्रदर्शन के बाद , अप्प पर एक सही का निशान डालें
- इसे करते रहें
- एक लंबे समय के लिए लगातार प्रदर्शन की आदतों से पूर्ण स्टार अर्जित करेंगे।
- अपनी प्रगति को ट्रैक करें
- विस्तृत रेखांकन आपको बताएंगे कि कैसे अपनी आदतों में समय के साथ सुधार करें
- 15 मिनिट
- 30 मिनिट
- 1 घंटा
- 2 घंटा
- 4 घंटा
- 8 घंटा
- 24 घंटे
- टॉगल पुनरावृत्ति हल्का दबाने से
- अधिक सुविधाजनक है, लेकिन आकस्मिक टॉगल हो सकता है ।
- रिमाइंडर मे स्नूज़ अंतराल
- गूगले प्ले पर इस ऐप्लिकेशन को रेट करें
- डेवेलपर को प्रतिक्रिया भेजें
- Github मे सोर्स कोड देखें
- अप्प्प का परिचय देखें
- लिंक
- व्यवहार
- नाम
- सेटिंग्स
- झपकी का अंतराल
- क्या आप जानते .?
- प्रविष्टियों को पुनर्व्यवस्थित करने के लिए, आदत के नाम पर प्रेस करें और सही जगह पर खींचें।
- अपने फोन को लांडसकपे मोड मे रख कर आप अधिक दिनों से देख सकते हैं
- आदत हटाएँ
- आदतों को स्थायी रूप से हटा दिया जाएगा। इस क्रिया को पूर्ववत नहीं किया जा सकता है।
- सप्ताहांत
- सोमवार से शुक्रवार
- सप्ताह का कोई भी दिन
- दिन चुनें
- CSV में निर्यात करें
- पूर्ण
- साफ़
- घंटे चुनें
- मिनट चुनें
- बारे में
- अनुवादक
- डिवेलपर
- वर्ज़न %s
- आवृत्ति
- सही का चिह्न
- ताक़त
- बेस्ट स्ट्रीक्स
- वर्तमान स्ट्रीक्स
- repetitions की संख्या
- अंतिम %d दिवस
- पिछले %d सप्ताह
- पिछले %d माह
- पिछले %d साल
- पूरा समय
- हर दिन
- प्रति सप्ताह
- प्रति सप्ताह 2 बार
- प्रति सप्ताह 5 बार
- अन्य
- मदद और बार-बार सवाल पूछने वाले सवाल
- डेटा निर्यात करने में विफल
- डेटा आयात करने में विफल रहा है
- फाइल की पहचान नही
- आदतों को सफलतापूर्वक आयात
- पूर्ण बैकअप सफलतापूर्वक निर्यात किया।
- डेटा आयात
- निर्यात पूर्ण बैकअप
- इस एप्लिकेशन के द्वारा निर्यात पूर्ण बैकअप को सपोर्ट करता है , साथ ही फाइलों टिक्कमते , हबिठबुल्ल या रिवाइयर द्वारा उत्पन्न फाइल्स को सपोर्ट करता है। अधिक जानकारी के लिए सामान्य प्रश्न देखें।
- ऐसी फाइल्स उत्पन्न करता है जो स्प्रेडशीट सॉफ़्टवरेस जैसे Microsoft Excel, OpenOffice Calc मे खुल सकती है. इस फ़ाइल में वापस आयात नहीं किया जा सकता है।
- ऐसी फाइल्स उत्पन्न करता है जिसमे आपका सारा डेटा रहता है इस फ़ाइल को वापस आयात किया जा सकता है।
- बग रिपोर्ट जनरेट करने मे असफल
- बग रिपोर्ट जनरेट करें
- समस्या निवारण
- इस एप्लिकेशन का अनुवाद करने में मदद करें
- नाइट मोड
- नाइट मोड मे पूरा काला यूज़ करें
- रात मोड में शुद्ध काले रंग के साथ ग्रे पृष्ठभूमि में बदलें. अमोलेड प्रदर्शन के साथ फोन में बैटरी उपयोग कम कर देता है ।
- इंटरफेस
- दिनों की रिवर्स आदेश
- दिनों को रिवर्स क्रम में मुख्य स्क्रीन पर दिखाएँ
- दिन
- हफ्ते
- माह
- तिमाही
- साल
-
- समय में
- हर %d दिन
- हर %d हफ्ते
- हर %d महीने
- स्कोर
- अनुस्मारक ध्वनि
- कोई आवाज नहीं
- फिल्टर
- डेटाबेस को रिपेयर करें
- डेटाबेस रिपेयर सफल
- आदत
- सॉर्ट करें
- मैन्यूअली
- नाम द्वारा
- रंग द्वारा
- स्कोर से
- डाउनलोड
- एक्सपोर्ट करे
-
diff --git a/android/uhabits-android/src/main/res/values-hr-rHR/strings.xml b/android/uhabits-android/src/main/res/values-hr-rHR/strings.xml
new file mode 100644
index 000000000..30aaf7e56
--- /dev/null
+++ b/android/uhabits-android/src/main/res/values-hr-rHR/strings.xml
@@ -0,0 +1,179 @@
+
+
+
+
+ Loop Habit Tracker
+ Navike
+ Postavke
+ Uredi
+ Izbriši
+ Arhiviraj
+ Dearhiviraj
+ Dodaj naviku
+ Promijeni boju
+ Navika je stvorena
+ Navike su izbrisane
+ Navike su obnovljene
+ Nema ništa za poništavanje
+ Nema ništa za obnavljanje
+ Navika je promijenjena
+ Navika je vraćena u početno stanje
+ Navike su arhivirane
+ Navike su dearhivirane
+ Pregled
+ Snaga navike
+ Povijest
+ Očisti
+ Pitanje (Jesi li danas...?)
+ Ponovi
+ puta u
+ dani
+ Podsjetnik
+ Odbaci
+ Spremi
+ Niz
+ Nemate aktivnih navika
+ Pritisnite i držite za označavanje ili odznačavanje.
+ Isključen
+ Naziv ne može biti prazan.
+ Broj mora biti pozitivan.
+ Možete imati najviše jedno ponavljanje po danu
+ Stvori naviku
+ Uredi naviku
+ Potvrdi
+ Kasnije
+
+ Dobrodošli
+ Loop Habit Tracker vam pomaže stvoriti i održavati dobre navike.
+ Stvorite neke nove navike
+ Svaki dan, nakon izvođenja vaše navike, postavite \"kvačicu\" u aplikaciji.
+ Nastavite tako
+ Navikama koje konstantno izvodite kroz dugo vremena će te zaraditi punu zvjezdicu.
+ Pratite svoj napredak
+ Detaljni grafovi vam prikazuju kako se vaše navike poboljšavaju kroz vrijeme.
+ 15 minuta
+ 30 minuta
+ 1 sat
+ 2 sata
+ 4 sata
+ 8 sati
+ 24 sata
+ Označi ponavljanja sa kratkim pritisk.
+ Zgodnije je, no može uzrokovati slučajna označavanja.
+ Interval odgađanja na podsjetnicima
+ Ocijeni ovu aplikaciju na Google Playu
+ Pošalji povratne informacije raz. programeru
+ Pogledaj izvorni kod na GitHubu
+ Prikaži uvod u aplikaciju
+ Poveznice
+ Ponašanje
+ Naziv
+ Postavke
+ Interval odgađanja
+ Jeste li znali?
+ Za razmještanje unosa, pritisnite i držite naziv navike, pa ih premjestite na točno mjesto.
+ Možete vidjeti više dana prebacivanjem uređaja u vodoravnu orijentaciju.
+ Izbriši Navike
+ Navike će biti trajno izbrisane. Ova radnja se ne može poništiti.
+ Navika je izbrisana / nije pronađena
+ Vikendi
+ Ponedjeljak do Petak
+ Bilo koji dan u tjednu
+ Odaberi dane
+ Izvezi kao CSV
+ Dovršeno
+ Očisti
+ Odaberi sate
+ Odaberite minute
+ O aplikaciji
+ Prevoditelji
+ Razvojni programeri
+ Verzija %s
+ Učestalost
+ Kvačica
+ Snaga
+ Najbolji nizovi
+ Trenutni niz
+ Broj ponavljanja
+ Zadnjih %d dana
+ Zadnjih %d tjedana
+ Zadnjih %d mjeseca
+ Zadnjih %d godina
+ Čitavo vrijeme
+ Svaki dan
+ Svaki tjedan
+ 2 puta tjedno
+ 5 puta tjedno
+ Prilagođeno ...
+ Pomoć i pitanja
+ Izvoz podataka nije uspio.
+ Uvoz podataka nije uspio.
+ Datoteka nije prepoznata.
+ Navike su uspješno uvezene.
+ Sigurnosna kopija je uspješno izvezena.
+ Uvezi podatke
+ Izvezi sigurnosnu kopiju
+ Podržava sigurnosne kopije izvezene iz ove aplikacije, isto kao i datoteke generirane u Tickmate, HabitBull i Rewire. Pogledajte Pomoć i pitanja za više informacija.
+ Generira datoteke koje se mogu otvarati programima za tablice kao što su Microsoft Excel ili OpenOffice Calc. Ova datoteka se ne može uvoziti.
+ Generira datoteku koja sadrži sve vaše podatke. Ova datoteka se može uvoziti.
+ Generiranje izvješća o pogrešci nije uspjelo.
+ Generiraj izvješće o pogreški
+ Rješavanje problema
+ Pomozi prevesti ovu aplikaciju
+ Noćni način
+ Koristi crnu boju za noćni način
+ Zamjenjuje sivu pozadinu sa crnom u noćnom načinu. To smanjuje potrošnju bateriju na uređajima s AMOLED zaslonima.
+ Sučelje
+ Obrnuti poredak dana
+ Prikažite dane obrnutim redom na glavnom zaslonu
+ Dan
+ Tjedan
+ Mjesec
+ Četvrtina
+ Godina
+ Ukupno
+
+
+ put svakih
+ Svaka %d dana
+ Svaka %d tjedna
+ Svaka %d mjeseca
+ Rezultat
+ Zvuk podsjetnika
+ Nijedan
+ Filtar
+ Sakrij završeno
+ Sakrij arhivirano
+ Učini obavijesti trajnima
+ Spriječava da se obavijesti zanemare.
+ Popravi bazu podataka
+ Baza podataka je popravljena.
+ Odznači
+ Uključi/isključi
+ Radnja
+ Navika
+ Sortiraj
+ Ručno
+ Po nazivu
+ Po boji
+ Po rezultatu
+ Preuzmi
+ Izvezi
+
diff --git a/android/uhabits-android/src/main/res/values-hr/strings.xml b/android/uhabits-android/src/main/res/values-hr/strings.xml
deleted file mode 100644
index 9cafc723c..000000000
--- a/android/uhabits-android/src/main/res/values-hr/strings.xml
+++ /dev/null
@@ -1,178 +0,0 @@
-
-
-
-
- Loop Habit Tracker
- Navike
- Postavke
- Uredi
- Izbriši
- Arhiviraj
- Dearhiviraj
- Dodaj naviku
- Promijeni boju
- Navika je stvorena
- Navike su izbrisane
- Navike su obnovljene
- Nema ništa za poništavanje
- Nema ništa za obnavljanje
- Navika je promijenjena
- Navika je vraćena u početno stanje
- Navike su arhivirane
- Navike su dearhivirane
- Pregled
- Snaga navike
- Povijest
- Očisti
- Pitanje (Jesi li danas...?)
- Ponovi
- puta u
- dani
- Podsjetnik
- Odbaci
- Spremi
- Niz
- Nemate aktivnih navika
- Pritisnite i držite za označavanje ili odznačavanje.
- Isključen
- Naziv ne može biti prazan.
- Broj mora biti pozitivan.
- Možete imati najviše jedno ponavljanje po danu
- Stvori naviku
- Uredi naviku
- Potvrdi
- Kasnije
-
- Dobrodošli
- Loop Habit Tracker vam pomaže stvoriti i održavati dobre navike.
- Stvorite neke nove navike
- Svaki dan, nakon izvođenja vaše navike, postavite \"kvačicu\" u aplikaciji.
- Nastavite tako
- Navikama koje konstantno izvodite kroz dugo vremena će te zaraditi punu zvjezdicu.
- Pratite svoj napredak
- Detaljni grafovi vam prikazuju kako se vaše navike poboljšavaju kroz vrijeme.
- 15 minuta
- 30 minuta
- 1 sat
- 2 sata
- 4 sata
- 8 sati
- 24 sata
- Označi ponavljanja sa kratkim pritisk.
- Zgodnije je, no može uzrokovati slučajna označavanja.
- Interval odgađanja na podsjetnicima
- Ocijeni ovu aplikaciju na Google Playu
- Pošalji povratne informacije raz. programeru
- Pogledaj izvorni kod na GitHubu
- Prikaži uvod u aplikaciju
- Poveznice
- Ponašanje
- Naziv
- Postavke
- Interval odgađanja
- Jeste li znali?
- Za razmještanje unosa, pritisnite i držite naziv navike, pa ih premjestite na točno mjesto.
- Možete vidjeti više dana prebacivanjem uređaja u vodoravnu orijentaciju.
- Izbriši Navike
- Navike će biti trajno izbrisane. Ova radnja se ne može poništiti.
- Navika je izbrisana / nije pronađena
- Vikendi
- Ponedjeljak do Petak
- Bilo koji dan u tjednu
- Odaberi dane
- Izvezi kao CSV
- Dovršeno
- Očisti
- Odaberi sate
- Odaberite minute
- O aplikaciji
- Prevoditelji
- Razvojni programeri
- Verzija %s
- Učestalost
- Kvačica
- Snaga
- Najbolji nizovi
- Trenutni niz
- Broj ponavljanja
- Zadnjih %d dana
- Zadnjih %d tjedana
- Zadnjih %d mjeseca
- Zadnjih %d godina
- Čitavo vrijeme
- Svaki dan
- Svaki tjedan
- 2 puta tjedno
- 5 puta tjedno
- Prilagođeno ...
- Pomoć i pitanja
- Izvoz podataka nije uspio.
- Uvoz podataka nije uspio.
- Datoteka nije prepoznata.
- Navike su uspješno uvezene.
- Sigurnosna kopija je uspješno izvezena.
- Uvezi podatke
- Izvezi sigurnosnu kopiju
- Podržava sigurnosne kopije izvezene iz ove aplikacije, isto kao i datoteke generirane u Tickmate, HabitBull i Rewire. Pogledajte Pomoć i pitanja za više informacija.
- Generira datoteke koje se mogu otvarati programima za tablice kao što su Microsoft Excel ili OpenOffice Calc. Ova datoteka se ne može uvoziti.
- Generira datoteku koja sadrži sve vaše podatke. Ova datoteka se može uvoziti.
- Generiranje izvješća o pogrešci nije uspjelo.
- Generiraj izvješće o pogreški
- Rješavanje problema
- Pomozi prevesti ovu aplikaciju
- Noćni način
- Koristi crnu boju za noćni način
- Zamjenjuje sivu pozadinu sa crnom u noćnom načinu. To smanjuje potrošnju bateriju na uređajima s AMOLED zaslonima.
- Sučelje
- Obrnuti poredak dana
- Prikažite dane obrnutim redom na glavnom zaslonu
- Dan
- Tjedan
- Mjesec
- Četvrtina
- Godina
- Ukupno
-
- put svakih
- Svaka %d dana
- Svaka %d tjedna
- Svaka %d mjeseca
- Rezultat
- Zvuk podsjetnika
- Nijedan
- Filtar
- Sakrij završeno
- Sakrij arhivirano
- Učini obavijesti trajnima
- Spriječava da se obavijesti zanemare.
- Popravi bazu podataka
- Baza podataka je popravljena.
- Odznači
- Uključi/isključi
- Radnja
- Navika
- Sortiraj
- Ručno
- Po nazivu
- Po boji
- Po rezultatu
- Preuzmi
- Izvezi
-
diff --git a/android/uhabits-android/src/main/res/values-hu-rHU/strings.xml b/android/uhabits-android/src/main/res/values-hu-rHU/strings.xml
new file mode 100644
index 000000000..e303c991e
--- /dev/null
+++ b/android/uhabits-android/src/main/res/values-hu-rHU/strings.xml
@@ -0,0 +1,211 @@
+
+
+
+
+ Loop Szokásrögzítő
+ Szokások
+ Beállítások
+ Szerkesztés
+ Törlés
+ Archiválás
+ Újraaktiválás
+ Új szokás
+ Szín módosítása
+ Szokás létrehozva
+ Szokás törölve
+ Szokás visszaállítva
+ Nincs mit visszavonni
+ Nincs mit újraalkalmazni
+ Szokás módosítva
+ Szokás visszaállítva
+ Szokás archiválva
+ Szokás újraaktiválva
+ Áttekintés
+ Szokás erőssége
+ Napló
+ Törlés
+ Kérdés (Sikerült ma…?)
+ Ismétlődés
+ alk. /
+ nap
+ Emlékeztető
+ Elvetés
+ Mentés
+ Szériák
+ Nincs aktív szokásod
+ Tartsd lenyomva a bejelöléshez, vagy a jelölés törléséhez
+ Kikapcsolva
+ A megnevezés nem maradhat üresen.
+ A számnak pozitívnak kell lennie.
+ Maximum napi 1 ismétlés lehetséges
+ Szokás rögzítése
+ Szokás szerkesztése
+ Kipipálva
+ Később
+
+ Üdv!
+ A Loop Habit Tracker segít a jó szokások kialakításában és azok fenntartásában
+ Hozz létre néhány új szokást
+ Minden nap jelöld pipával az alkalmazásban, ahogy elvégeztél egy jó szokást.
+ Ne hagyd abba
+ A hosszú időn keresztül folyamatosan fenntartott jó szokásokért teljes csillag jár.
+ Kövesd a fejlődésed
+ A szokások fejlődésének időbeni alakulását részletes grafikonok mutatják.
+ 15 perc
+ 30 perc
+ 1 óra
+ 2 óra
+ 4 óra
+ 8 óra
+ 24 óra
+ Mindig rákérdez
+ Egyedi...
+ Bejelölés rövid koppintással
+ Bejelölés koppintással nyomva tartás helyett. Kényelmesebb, de véletlen bejelöléseket okozhat.
+ Szundi időtartama emlékeztetőnél
+ Értékeld az alkalmazást a Google Play-en
+ Visszajelzés küldése a fejlesztőnek
+ Forráskód megtekintése a GitHub-on
+ Bemutató megtekintése
+ Linkek
+ Szokás
+ Megnevezés
+ Beállítások
+ Szundi időtartama
+ Szundi beállítása
+ Tudtad?
+ Az elemek újrarendezéséhez a koppints a szokás nevére, majd húzd a megfelelő helyre.
+ Több nap válik láthatóvá, ha fekvő módba állítod a telefonod kijelzőjét.
+ Szokások törlése
+ A szokások véglegesen törölve lesznek. A műveletet nem lehet visszavonni.
+ Szokás törölve / nem található
+ Hétvégente
+ Hétfőtől péntekig
+ A hét bármely napján
+ Napok kiválasztása
+ Exportálás CSV-ként
+ Kész
+ Törlés
+ Óra kiválasztása
+ Perc kiválasztása
+ Kérjük, válasszon legalább egy szokást
+ Névjegy
+ Fordítók
+ Fejlesztők
+ Verzió %s
+ Gyakoriság
+ Pipa
+ StackView-widget minden szokáshoz
+ Pipa Stack Widget
+ Gyakoriság Stack-widget
+ Pontszám stack-widget
+ Előzmények stack-widget
+ Sorozat Stack Widget
+ Erősség
+ Legjobb széria
+ Jelenlegi széria
+ Ismétlődések száma
+ Utolsó %d nap
+ Utolsó %d hét
+ Utolsó %d hónap
+ Utolsó %d év
+ Mindig
+ Minden nap
+ Minden héten
+ Heti 2-szer
+ Hetente 5-ször
+ Egyéni…
+ Súgó és GYIK
+ Nem sikerült az adatok exportálása.
+ Nem sikerült az adatok importálása
+ A fájlt nem sikerült felismerni.
+ A szokások importálása sikerült.
+ A teljes mentés sikeresen exportálva lett.
+ Adat importálása
+ Teljes mentés exportálása
+ Támogatja a Loop Habit Tracker alkalmazás teljes mentéseit, illetve a Tickmate, HabitBull és Rewire alkalmazások formátumait is. További információt a GYIK-ben találsz.
+ Olyan fájlokat generál, amit táblázatkezelőkkel lehet megnyitni (pl. Microsoft Excel-lel vagy OpenOffice Calc-kal). Ezt a fájlt nem lehet visszaimportálni.
+ Olyan fájlt generál, amely tartalmazza minden adatodat. Ezt a fájlt vissza lehet importálni.
+ Nem sikerült a hibajelentés generálása
+ Hibabejelentés generálása
+ Hibaelhárítás
+ Segíts lefordítani ezt az alkalmazást
+ Éjszakai mód
+ Fekete használata éjszakai módban
+ A szürke hátteret tiszta feketére cseréli éjszakai módban. Csökkenti az energiafelhasználást AMOLED kijelzős telefonokon.
+ Kezelőfelület
+ Napok sorrendjének megfordítása
+ A főképernyőn fordított sorrendben mutatja a napokat
+ Nap
+ Hét
+ Hónap
+ Negyedév
+ Év
+ Összesen
+
+ Igen vagy Nem
+ Szám
+
+ alk. /
+ %d naponta
+ %d hetente
+ %d havonta
+ Pont
+ Emlékeztető dallama
+ Nem ismétlődik
+ Szűrő
+ Elvégzettek elrejtése
+ Archiváltak elrejtése
+ Az értesítések legyenek ragadósak
+ Megakadályozza az értesítések eltávolítását
+ Értesítési fény
+ Emlékeztetés villogó fénnyel. Csak olyan telefonon működik amelyen van értesítési LED.
+ Adatbázis javítása
+ Adatbázis javítása kész.
+ Pipa kivétele
+ Ki/bekapcsolás
+ Művelet
+ Szokás
+ Rendezés
+ Manuálisan
+ Megnevezés szerint
+ Színek szerint
+ Pont szerint
+ Letöltés
+ Exportálás
+ Az érték módosításához tartsa lenyomva
+ Érték módosítása
+ Naptár
+ Egység
+ Mennyiség
+ A mező nem lehet üres
+ pl. Hány lépést tettél ma?
+ pl. Lépések száma
+ pl. Edzettél ma?
+ Kérdés
+ Cél
+ Igen
+ Nem
+ Hang, rezgés, fény és egyéb értesítések beállítása
+ Értesítések beállítása
+ Adatvédelmi nyilatkozat
+ Az összes közreműködő megtekintése…
+ Adatbázis
+
diff --git a/android/uhabits-android/src/main/res/values-hu/strings.xml b/android/uhabits-android/src/main/res/values-hu/strings.xml
deleted file mode 100644
index 2526f3607..000000000
--- a/android/uhabits-android/src/main/res/values-hu/strings.xml
+++ /dev/null
@@ -1,178 +0,0 @@
-
-
-
-
- Loop Szokásrögzítő
- Szokások
- Beállítások
- Szerkesztés
- Törlés
- Archiválás
- Újraaktiválás
- Új szokás
- Szín módosítása
- Szokás létrehozva
- Szokás törölve
- Szokás visszaállítva
- Nincs mit visszavonni
- Nincs mit újraalkalmazni
- Szokás módosítva
- Szokás visszaállítva
- Szokás archiválva
- Szokás újraaktiválva
- Áttekintés
- Szokás erőssége
- Napló
- Törlés
- Kérdés (Sikerült ma…?)
- Ismétlődés
- alk. /
- nap
- Emlékeztető
- Elvetés
- Mentés
- Szériák
- Nincs aktív szokásod
- Tartsd lenyomva a bejelöléshez, vagy a jelölés törléséhez
- Kikapcsolva
- A megnevezés nem maradhat üresen.
- A számnak pozitívnak kell lennie.
- Maximum napi 1 ismétlés lehetséges
- Szokás rögzítése
- Szokás szerkesztése
- Kipipálva
- Később
-
- Üdv!
- A Loop Habit Tracker segít a jó szokások kialakításában és azok fenntartásában
- Hozz létre néhány új szokást
- Minden nap jelöld pipával az alkalmazásban, ahogy elvégeztél egy jó szokást.
- Ne hagyd abba
- A hosszú időn keresztül folyamatosan fenntartott jó szokásokért teljes csillag jár.
- Kövesd a fejlődésed
- A szokások fejlődésének időbeni alakulását részletes grafikonok mutatják.
- 15 perc
- 30 perc
- 1 óra
- 2 óra
- 4 óra
- 8 óra
- 24 óra
- Bejelölés rövid koppintással
- Bejelölés koppintással nyomva tartás helyett. Kényelmesebb, de véletlen bejelöléseket okozhat.
- Szundi időtartama emlékeztetőnél
- Értékeld az alkalmazást a Google Play-en
- Visszajelzés küldése a fejlesztőnek
- Forráskód megtekintése a GitHub-on
- Bemutató megtekintése
- Linkek
- Szokás
- Megnevezés
- Beállítások
- Szundi időtartama
- Tudtad?
- Az elemek újrarendezéséhez a koppints a szokás nevére, majd húzd a megfelelő helyre.
- Több nap válik láthatóvá, ha fekvő módba állítod a telefonod kijelzőjét.
- Szokások törlése
- A szokások véglegesen törölve lesznek. A műveletet nem lehet visszavonni.
- Szokás törölve / nem található
- Hétvégente
- Hétfőtől péntekig
- A hét bármely napján
- Napok kiválasztása
- Exportálás CSV-ként
- Kész
- Törlés
- Óra kiválasztása
- Perc kiválasztása
- Névjegy
- Fordítók
- Fejlesztők
- Verzió %s
- Gyakoriság
- Pipa
- Erősség
- Legjobb széria
- Jelenlegi széria
- Ismétlődések száma
- Utolsó %d nap
- Utolsó %d hét
- Utolsó %d hónap
- Utolsó %d év
- Mindig
- Minden nap
- Minden héten
- Heti 2-szer
- Hetente 5-ször
- Egyéni…
- Súgó és GYIK
- Nem sikerült az adatok exportálása.
- Nem sikerült az adatok importálása
- A fájlt nem sikerült felismerni.
- A szokások importálása sikerült.
- A teljes mentés sikeresen exportálva lett.
- Adat importálása
- Teljes mentés exportálása
- Támogatja a Loop Habit Tracker alkalmazás teljes mentéseit, illetve a Tickmate, HabitBull és Rewire alkalmazások formátumait is. További információt a GYIK-ben találsz.
- Olyan fájlokat generál, amit táblázatkezelőkkel lehet megnyitni (pl. Microsoft Excel-lel vagy OpenOffice Calc-kal). Ezt a fájlt nem lehet visszaimportálni.
- Olyan fájlt generál, amely tartalmazza minden adatodat. Ezt a fájlt vissza lehet importálni.
- Nem sikerült a hibajelentés generálása
- Hibabejelentés generálása
- Hibaelhárítás
- Segíts lefordítani ezt az alkalmazást
- Éjszakai mód
- Fekete használata éjszakai módban
- A szürke hátteret tiszta feketére cseréli éjszakai módban. Csökkenti az energiafelhasználást AMOLED kijelzős telefonokon.
- Kezelőfelület
- Napok sorrendjének megfordítása
- A főképernyőn fordított sorrendben mutatja a napokat
- Nap
- Hét
- Hónap
- Negyedév
- Év
- Összesen
-
- alk. /
- %d naponta
- %d hetente
- %d havonta
- Pont
- Emlékeztető dallama
- Nem ismétlődik
- Szűrő
- Elvégzettek elrejtése
- Archiváltak elrejtése
- Az értesítések legyenek ragadósak
- Megakadályozza az értesítések eltávolítását
- Adatbázis javítása
- Adatbázis javítása kész.
- Pipa kivétele
- Ki/bekapcsolás
- Művelet
- Szokás
- Rendezés
- Manuálisan
- Megnevezés szerint
- Színek szerint
- Pont szerint
- Letöltés
- Exportálás
-
diff --git a/android/uhabits-android/src/main/res/values-in-rID/strings.xml b/android/uhabits-android/src/main/res/values-in-rID/strings.xml
new file mode 100644
index 000000000..d826d9328
--- /dev/null
+++ b/android/uhabits-android/src/main/res/values-in-rID/strings.xml
@@ -0,0 +1,179 @@
+
+
+
+
+ Loop Habit Tracker
+ Kebiasaan
+ Pengaturan
+ Sunting
+ Hapus
+ Arsip
+ Keluarkan dari arsip
+ Tambah Kebiasaan
+ Ganti warna
+ Kebiasaan ditambahkan.
+ Kebiasaan dihapus.
+ Kebiasaan dipulihkan
+ Tidak ada aksi sebelumnya.
+ Tidak ada aksi sesudahnya.
+ Kebiasaan diubah.
+ Kebiasaan telah dikembalikan.
+ Kebiasaan diarsipkan.
+ Kebiasaan dikeluarkan dari arsip.
+ Ikhtisar
+ Kekuatan Kebiasaan
+ Riwayat
+ Bersihkan
+ Pertanyaan (Sudahkah Anda ... hari ini?)
+ Ulangi
+ kali dalam
+ hari
+ Pengingat
+ Batalkan
+ Simpan
+ Rentetan
+ Anda tidak memiliki Kebiasaan yang aktif
+ Tekan dan tahan untuk menambah atau menghapus centang
+ Mati
+ Nama tidak boleh kosong.
+ Angka harus positif.
+ Maksimal satu kali pengulangan dalam satu hari
+ Buat Kebiasaan
+ Sunting Kebiasaan
+ Tanda cek
+ Tunda
+
+ Selamat datang
+ Loop Habit Tracker membantu mencatat dan mengelola Kebiasaan baik Anda.
+ Buat beberapa Kebiasaan baru
+ Berikan tanda cek setiap kali Anda selesai melakukannya.
+ Terus lakukan
+ Kebiasaan yang dilakukan secara konsisten dalam jangka waktu panjang akan mendapatkan tanda bintang penuh.
+ Lacak perkembangan Anda
+ Grafik terperinci menampilkan perkembangan Kebiasaanmu dari waktu ke waktu.
+ 15 menit
+ 30 menit
+ 1 jam
+ 2 jam
+ 4 jam
+ 8 jam
+ 24 jam
+ Tandai dengan cepat.
+ Beri tanda cek dengan sekali ketuk bukan tekan-dan-tahan. Lebih nyaman namun memungkinkan kesalahan.
+ Durasi tunda sejenak pada pengingat
+ Berikan rating aplikasi ini di Google Play
+ Kirimkan umpan balik kepada Developer
+ Lihat kode aplikasi di GitHub
+ Tampilkan perkenalan aplikasi
+ Tautan
+ Perilaku
+ Nama
+ Pengaturan
+ Durasi tunda sejenak
+ Sudahkah Anda tahu?
+ Untuk mengatur urutan, tekan dan tahan judul Kebiasaan lalu tempatkan pada posisi yang Anda inginkan.
+ Lihat lebih banyak hari dengan merubah posisi menjadi mode landscape.
+ Hapus Kebiasaan
+ Kebiasaan ini akan dihapus secara permanen. Tindakan ini tidak dapat dibatalkan.
+ Kebiasaan telah dihapus / tidak ditemukan
+ Akhir pekan
+ Senin - Jumat
+ Seluruh hari dalam satu minggu
+ Pilih hari
+ Ekspor (CSV)
+ Selesai
+ Hapus
+ Pilih jam
+ Pilih menit
+ Tentang
+ Penerjemah
+ Developer
+ Versi %s
+ Frekuensi
+ Cek
+ Kekuatan
+ Rentetan terbaik
+ Rentetan saat ini
+ Jumlah pengulangan
+ %d hari terakhir
+ %d minggu terakhir
+ %d bulan terakhir
+ %d tahun terakhir
+ Seluruh waktu
+ Setiap hari
+ Setiap minggu
+ 2 kali per minggu
+ 5 kali per minggu
+ Sesuaikan …
+ Bantuan & FAQ
+ Gagal mengekspor data.
+ Gagal mengimpor data.
+ File tidak dikenali.
+ Impor data berhasil.
+ Seluruh data berhasil di-ekspor.
+ Impor data
+ Ekspor keseluruhan data
+ Mendukung ekspor data dan berkas dari aplikasi Tickmate, HabitBull atau Rewire. Lihat FAQ untuk informasi lebih lanjut.
+ Menghasilkan lembar kerja yang dapat dibuka menggunakan aplikasi seperti Microsoft Excel atau OpenOffice Calc. Berkas ini tidak dapat di-impor kembali.
+ Menghasilkan berkas yang berisikan seluruh data. Berkas ini dapat di-impor kembali.
+ Gagal membuat laporan masalah.
+ Membuat laporan masalah
+ Penyelesaian masalah
+ Bantu menerjemahkan aplikasi ini
+ Mode malam
+ Gunakan warna hitam pada mode malam
+ Ganti warna latar abu-abu dengan warna hitam pada mode malam. Mengurangi penggunaan baterai pada layar AMOLED.
+ Antar muka
+ Balik urutan hari
+ Tampilkan hari dalam urutan terbalik pada layar utama
+ Hari
+ Minggu
+ Bulan
+ Kuartal
+ Tahun
+ Total
+
+
+ kali dalam
+ Setiap %d hari
+ Setiap %d minggu
+ Setiap %d bulan
+ Skor
+ Suara pengingat
+ Hening
+ Saring
+ Sembunyikan yang selesai
+ Sembunyikan arsip
+ Jadikan notifikasi lengket
+ Cegah pemberitahuan dari sapuan.
+ Perbaiki Basis Data
+ Basis Data diperbaiki.
+ Hapus centang
+ Alih
+ Tindakan
+ Kebiasaan
+ Urutkan
+ Secara manual
+ Berdasarkan nama
+ Berdasarkan Warna
+ Berdasarkan Skor
+ Unduh
+ Ekspor
+
diff --git a/android/uhabits-android/src/main/res/values-in/strings.xml b/android/uhabits-android/src/main/res/values-in/strings.xml
deleted file mode 100644
index ba29194aa..000000000
--- a/android/uhabits-android/src/main/res/values-in/strings.xml
+++ /dev/null
@@ -1,178 +0,0 @@
-
-
-
-
- Loop Habit Tracker
- Kebiasaan
- Pengaturan
- Sunting
- Hapus
- Arsip
- Keluarkan dari arsip
- Tambah Kebiasaan
- Ganti warna
- Kebiasaan ditambahkan.
- Kebiasaan dihapus.
- Kebiasaan dipulihkan
- Tidak ada aksi sebelumnya.
- Tidak ada aksi sesudahnya.
- Kebiasaan diubah.
- Kebiasaan telah dikembalikan.
- Kebiasaan diarsipkan.
- Kebiasaan dikeluarkan dari arsip.
- Ikhtisar
- Kekuatan Kebiasaan
- Riwayat
- Bersihkan
- Pertanyaan (Sudahkah Anda ... hari ini?)
- Ulangi
- kali dalam
- hari
- Pengingat
- Batalkan
- Simpan
- Rentetan
- Anda tidak memiliki Kebiasaan yang aktif
- Tekan dan tahan untuk menambah atau menghapus centang
- Mati
- Nama tidak boleh kosong.
- Angka harus positif.
- Maksimal satu kali pengulangan dalam satu hari
- Buat Kebiasaan
- Sunting Kebiasaan
- Tanda cek
- Tunda
-
- Selamat datang
- Loop Habit Tracker membantu mencatat dan mengelola Kebiasaan baik Anda.
- Buat beberapa Kebiasaan baru
- Berikan tanda cek setiap kali Anda selesai melakukannya.
- Terus lakukan
- Kebiasaan yang dilakukan secara konsisten dalam jangka waktu panjang akan mendapatkan tanda bintang penuh.
- Lacak perkembangan Anda
- Grafik terperinci menampilkan perkembangan Kebiasaanmu dari waktu ke waktu.
- 15 menit
- 30 menit
- 1 jam
- 2 jam
- 4 jam
- 8 jam
- 24 jam
- Tandai dengan cepat.
- Beri tanda cek dengan sekali ketuk bukan tekan-dan-tahan. Lebih nyaman namun memungkinkan kesalahan.
- Durasi tunda sejenak pada pengingat
- Berikan rating aplikasi ini di Google Play
- Kirimkan umpan balik kepada Developer
- Lihat kode aplikasi di GitHub
- Tampilkan perkenalan aplikasi
- Tautan
- Kebiasaan
- Nama
- Pengaturan
- Durasi tunda sejenak
- Sudahkah Anda tahu?
- Untuk mengatur urutan, tekan dan tahan judul Kebiasaan lalu tempatkan pada posisi yang Anda inginkan.
- Anda dapat melihat tampilan hari dengan merubah posisi menjadi mode landscape.
- Hapus Kebiasaan
- Kebiasaan ini akan dihapus secara permanen. Tindakan ini tidak dapat dibatalkan.
- Kebiasaan telah dihapus / tidak ditemukan
- Akhir pekan
- Senin - Jumat
- Seluruh hari dalam satu minggu
- Pilih hari
- Ekspor (CSV)
- Selesai
- Hapus
- Pilih jam
- Pilih menit
- Tentang
- Penerjemah
- Developer
- Versi %s
- Frekuensi
- Cek
- Kekuatan
- Rentetan terbaik
- Rentetan saat ini
- Jumlah pengulangan
- %d hari terakhir
- %d minggu terakhir
- %d bulan terakhir
- %d tahun terakhir
- Seluruh waktu
- Setiap hari
- Setiap minggu
- 2 kali per minggu
- 5 kali per minggu
- Sesuaikan …
- Bantuan & FAQ
- Gagal mengekspor data.
- Gagal mengimpor data.
- File tidak dikenali.
- Impor data berhasil.
- Seluruh data berhasil di-ekpor.
- Impor data
- Ekspor keseluruhan data
- Mendukung ekspor data dan berkas dari aplikasi Tickmate, HabitBull atau Rewire. Lihat FAQ untuk informasi lebih lanjut.
- Menghasilkan lembar kerja yang dapat dibuka menggunakan aplikasi seperti Microsoft Excel atau OpenOffice Calc. Berkas ini tidak dapat di-impor kembali.
- Menghasilkan berkas yang berisikan seluruh data. Berkas ini dapat di-impor kembali.
- Gagal membuat laporan masalah.
- Membuat laporan masalah
- Penyelesaian masalah
- Bantu menerjemahkan aplikasi ini
- Mode malam
- Gunakan warna hitam pada mode malam
- Ganti warna latar abu-abu dengan warna hitam pada mode malam. Mengurangi penggunaan baterai pada layar AMOLED.
- Antar muka
- Ubah urutan hari
- Tampilkan hari dalam urutan terbalik pada layar utama
- Hari
- Minggu
- Bulan
- Kuartal
- Tahun
- Total
-
- kali dalam
- Setiap %d hari
- Setiap %d minggu
- Setiap %d bulan
- Skor
- Suara pengingat
- Hening
- Saring
- Sembunyikan yang selesai
- Sembunyikan arsip
- Jadikan notifikasi lengket
- Cegah pemberitahuan dari sapuan.
- Perbaiki Basis Data
- Basis Data diperbaiki.
- Hapus centang
- Alih
- Tindakan
- Kebiasaan
- Urutkan
- Secara manual
- Berdasarkan nama
- Berdasarkan Warna
- Berdasarkan Skor
- Unduh
- Ekspor
-
diff --git a/android/uhabits-android/src/main/res/values-it-rIT/strings.xml b/android/uhabits-android/src/main/res/values-it-rIT/strings.xml
new file mode 100644
index 000000000..7422e0dc5
--- /dev/null
+++ b/android/uhabits-android/src/main/res/values-it-rIT/strings.xml
@@ -0,0 +1,198 @@
+
+
+
+
+ Loop - Tracciatore di Abitudine
+ Abitudini
+ Impostazioni
+ Modifica
+ Elimina
+ Archivia
+ Ripristina
+ Aggiungi abitudine
+ Cambia colore
+ Abitudine creata
+ Abitudine rimossa
+ Abitudine ripristinata
+ Niente da annullare
+ Niente da ripetere
+ Abitudine modificata
+ Abitudine ripristinata
+ Abitudine archiviata
+ Abitudine ripristinata
+ Panoramica
+ Forza dell\'abitudine
+ Cronologia
+ Annulla
+ Domanda (Hai ... oggi?)
+ Ripetizione
+ volte in
+ giorni
+ Promemoria
+ Annulla
+ Salva
+ Serie
+ Non hai abitudini attive
+ Premi e mantieni premuto per completare o annullare
+ Disabilitato
+ Il nome non può essere vuoto.
+ I numeri devono essere positivi.
+ Puoi avere al massimo una ripetizione al giorno
+ Crea abitudine
+ Modifica abitudine
+ Completa
+ Più tardi
+
+ Benvenuto
+ Loop Habit Tracker ti aiuta a creare e mantenere delle buone abitudini.
+ Aggiungi qualche nuova abitudine
+ Ogni giorno, dopo aver portato a termine la tua abitudine, spuntala nell\'app.
+ Continua così
+ Le abitudini portate a termine regoalrmente per un lungo periodo riceveranno una stella piena.
+ Segui i tuoi progressi
+ Grafici dettagliati ti mostrano come le tue abitudini sono migliorate nel corso del tempo.
+ 15 minuti
+ 30 minuti
+ 1 ora
+ 2 ore
+ 4 ore
+ 8 ore
+ 24 ore
+ Chiedi sempre
+ Personalizza...
+ Spunta le ripetizioni velocemente
+ Metti le spunte con un tocco singolo invece che tenendo premuto. Più comodo, ma potrebbe causare delle spunte accidentali.
+ Intervallo di ritardo dei promemoria
+ Valuta quest\'app su Google Play
+ Manda un feedback allo sviluppatore
+ Vedi il codice sorgente su GitHub
+ Visualizza l\'introduzione dell\'app
+ Links
+ Comportamento
+ Nome
+ Impostazioni
+ Snooze
+ Lo sapevi?
+ Per riordinare le voci, tieni premuto sul nome dell\'abitudine, poi spostala nella posizione corretta.
+ Puoi vedere più giorni mettendo il tuo telefono orizzontale.
+ Elimina abitudine
+ L\'abitudine verrà cancellata definitivamente. Non sarà possibile annullare.
+ Abitudine cancellata / non trovata
+ Weekend
+ Giorni feriali
+ Ogni giorno della settimana
+ Giorni selezionati
+ Esporta i dati come CSV
+ Fatto
+ Annulla
+ Ore selezionate
+ Minuti selezionati
+ Su Loop
+ Traduttori
+ Sviluppatori
+ Versione %s
+ Frequenza
+ Spunta
+ Forza
+ Serie migliori
+ Serie corrente
+ Numero di ripetizioni
+ Ultimi %d giorni
+ Ultime %d settimane
+ Ultimi %d mesi
+ Ultimi %d anni
+ Sempre
+ Ogni giorno
+ Ogni settimana
+ 2 volte a settimana
+ 5 volte a settimana
+ Personalizzato ...
+ Aiuto & FAQ
+ Esportazione non riuscita.
+ Importazione non riuscita.
+ File non riconosciuto.
+ Abitudini importate con successo.
+ Backup completo esportato con successo.
+ Importa dati
+ Esporta il backup completo
+ Pieno supporto ai backup esportati da questa app, oltre a quelli generati da Tickmate, HabitBull o Rewire. Vedi le FAQ per maggiori informazioni.
+ Genera un file che potrà essere aperto da programmi come Microsoft Excel o OpenOffice Calc. Non potrà essere importato.
+ Genera un file contenente tutti i tuoi dati. Potrà essere importato successivamente.
+ Generazione del bug report fallita
+ Genera bug report
+ Risoluzione dei problemi
+ Aiuta a tradurre questa app
+ Modalità notte
+ Usa nero puro nella modalità notte
+ Sostituisce gli sfondi grigi con sfondi neri nella modalità notte. Riduce il consumo di batteria nei dispositivi con schermo AMOLED.
+ Interfaccia
+ Inverti ordine giorni
+ Mostra i giorni in ordine inverso nella schermata principale
+ Giorno
+ Settimana
+ Mese
+ Quadrimestre
+ Anno
+ Totale
+
+ Sì o No
+ Numero
+
+ volta in
+ Ogni %d giorni
+ Ogni %d settimane
+ Ogni %d mesi
+ Punteggio
+ Suono notifica
+ Nessuno
+ Filtra
+ Nascondi completati
+ Nascondi archiviati
+ Notifiche non rimuovibili
+ Impedisce di poter rimuovere le notifiche.
+ Luce di notifica
+ Ripara database
+ Database recuperato.
+ Deseleziona
+ Attiva/disattiva
+ Azione
+ Abitudine
+ Ordina
+ Manualmente
+ Per nome
+ Per colore
+ Per punteggio
+ Download
+ Esporta
+ Cambia valore
+ Calendario
+ Unità
+ Quantità
+ Questo valore non dovrebbe essere vuoto
+ Domanda
+ Obiettivo
+ Si
+ No
+ Cambia suono, vibrazione, luce e altre impostazioni di notifica
+ Personalizza notifiche
+ Visualizza informativa sulla privacy
+ Visualizza tutti i collaboratori…
+ Banca dati
+
diff --git a/android/uhabits-android/src/main/res/values-it/strings.xml b/android/uhabits-android/src/main/res/values-it/strings.xml
deleted file mode 100644
index 6e348f65e..000000000
--- a/android/uhabits-android/src/main/res/values-it/strings.xml
+++ /dev/null
@@ -1,178 +0,0 @@
-
-
-
-
- Loop
- Abitudini
- Impostazioni
- Modifica
- Elimina
- Archivia
- Ripristina
- Aggiungi abitudine
- Cambia colore
- Abitudine creata
- Abitudine rimossa
- Abitudine ripristinata
- Niente da annullare
- Niente da ripetere
- Abitudine modificata
- Abitudine ripristinata
- Abitudine archiviata
- Abitudine ripristinata
- Panoramica
- Forza dell\'abitudine
- Cronologia
- Annulla
- Domanda (Hai ... oggi?)
- Ripetizione
- volte in
- giorni
- Promemoria
- Annulla
- Salva
- Serie
- Non hai abitudini attive
- Premi e mantieni premuto per completare o annullare
- Disabilitato
- Il nome non può essere vuoto.
- I numeri devono essere positivi.
- Puoi avere al massimo una ripetizione al giorno
- Crea abitudine
- Modifica abitudine
- Completa
- Più tardi
-
- Benvenuto
- Loop Habit Tracker ti aiuta a creare e mantenere delle buone abitudini.
- Aggiungi qualche nuova abitudine
- Ogni giorno, dopo aver portato a termine la tua abitudine, spuntala nell\'app.
- Continua così
- Le abitudini portate a termine regoalrmente per un lungo periodo riceveranno una stella piena.
- Segui i tuoi progressi
- Grafici dettagliati ti mostrano come le tue abitudini sono migliorate nel corso del tempo.
- 15 minuti
- 30 minuti
- 1 ora
- 2 ore
- 4 ore
- 8 ore
- 24 ore
- Spunta le ripetizioni velocemente
- Metti le spunte con un tocco singolo invece che tenendo premuto. Più comodo, ma potrebbe causare delle spunte accidentali.
- Intervallo di ritardo dei promemoria
- Valuta quest\'app su Google Play
- Manda un feedback allo sviluppatore
- Vedi il codice sorgente su GitHub
- Visualizza l\'introduzione dell\'app
- Links
- Comportamento
- Nome
- Impostazioni
- Snooze
- Lo sapevi?
- Per riordinare le voci, tieni premuto sul nome dell\'abitudine, poi spostala nella posizione corretta.
- Puoi vedere più giorni mettendo il tuo telefono orizzontale.
- Elimina abitudine
- L\'abitudine verrà cancellata definitivamente. Non sarà possibile annullare.
- Abitudine cancellata / non trovata
- Weekend
- Giorni feriali
- Ogni giorno della settimana
- Giorni selezionati
- Esporta i dati come CSV
- Fatto
- Annulla
- Ore selezionate
- Minuti selezionati
- Su Loop
- Traduttori
- Sviluppatori
- Versione %s
- Frequenza
- Spunta
- Forza
- Serie migliori
- Serie corrente
- Numero di ripetizioni
- Ultimi %d giorni
- Ultime %d settimane
- Ultimi %d mesi
- Ultimi %d anni
- Sempre
- Ogni giorno
- Ogni settimana
- 2 volte a settimana
- 5 volte a settimana
- Personalizzato ...
- Aiuto & FAQ
- Esportazione non riuscita.
- Importazione non riuscita.
- File non riconosciuto.
- Abitudini importate con successo.
- Backup completo esportato con successo.
- Importa dati
- Esporta il backup completo
- Pieno supporto ai backup esportati da questa app, oltre a quelli generati da Tickmate, HabitBull o Rewire. Vedi le FAQ per maggiori informazioni.
- Genera un file che potrà essere aperto da programmi come Microsoft Excel o OpenOffice Calc. Non potrà essere importato.
- Genera un file contenente tutti i tuoi dati. Potrà essere importato successivamente.
- Generazione del bug report fallita
- Genera bug report
- Risoluzione dei problemi
- Aiuta a tradurre questa app
- Modalità notte
- Usa nero puro nella modalità notte
- Sostituisce gli sfondi grigi con sfondi neri nella modalità notte. Riduce il consumo di batteria nei dispositivi con schermo AMOLED.
- Interfaccia
- Inverti ordine giorni
- Mostra i giorni in ordine inverso nella schermata principale
- Giorno
- Settimana
- Mese
- Quadrimestre
- Anno
- Totale
-
- volta in
- Ogni %d giorni
- Ogni %d settimane
- Ogni %d mesi
- Punteggio
- Suono notifica
- Nessuno
- Filtra
- Nascondi completati
- Nascondi archiviati
- Notifiche non rimuovibili
- Impedisce di poter rimuovere le notifiche.
- Ripara database
- Database recuperato.
- Deseleziona
- Attiva/disattiva
- Azione
- Abitudine
- Ordina
- Manualmente
- Per nome
- Per colore
- Per punteggio
- Download
- Esporta
-
diff --git a/android/uhabits-android/src/main/res/values-iw-rIL/strings.xml b/android/uhabits-android/src/main/res/values-iw-rIL/strings.xml
new file mode 100644
index 000000000..7c10b6c6d
--- /dev/null
+++ b/android/uhabits-android/src/main/res/values-iw-rIL/strings.xml
@@ -0,0 +1,179 @@
+
+
+
+
+ Loop Habit Tracker
+ הרגלים
+ הגדרות
+ עריכה
+ מחיקה
+ ארכיון
+ הוצא מארכיון
+ הרגל חדש
+ שינוי צבע
+ הרגל נוצר
+ הרגלים נמחקו
+ הרגלים שוחזרו
+ אין מה לבטל
+ אין מה לבצע שוב
+ הרגל השתנה
+ הרגל השתנה בחזרה
+ הרגלים הועברו לארכיון
+ הרגלים הוצאו מארכיון
+ מבט על
+ חוזק ההרגל
+ היסטוריה
+ נקה
+ שאלה (האם ... היום?)
+ חזור
+ פעמים ב-
+ ימים
+ תזכורת
+ ביטול
+ שמירה
+ רצפים
+ אין לך הרגלים פעילים
+ לחץ והחזק לסימון או ביטול הסימון
+ כבוי
+ השם אינו יכול להישאר ריק.
+ מספר חייב להיות חיובי.
+ לא ניתן להגדיר יותר מחזרה אחת ביום
+ צור הרגל
+ ערוך הרגל
+ בוצע
+ מאוחר יותר
+
+ ברוכים הבאים
+ Loop Habit Tracker מסייע ליצור ולשמר הרגלים טובים.
+ צרו הרגלים חדשים
+ כל יום, אחרי ביצוע ההרגל סמנו זאת באפליקציה.
+ המשיכו לעשות זאת
+ הרגלים שיבוצעו בעקביות לאורך זמן רב יזכו בכוכב מלא.
+ מעקב התקדמות
+ גרפים מפורטים מציגים כיצד ההרגלים שלך משתפרים לאורך זמן.
+ 15 דקות
+ 30 דקות
+ 1 שעה
+ 2 שעות
+ 4 שעות
+ 8 שעות
+ 24 שעות
+ סימון הרגלים בלחיצה קצרה
+ סמנו יעדים בהקשה קצרה במקום לחיצה ממושכת. נוח יותר, אך יכול להוביל ללחיצות לא מכוונות.
+ מרווח נדנוד לתזכורות
+ דרג/י אותנו ב- Google Play
+ שליחת משוב למפתחים
+ צפייה בקוד המקור ב-GitHub
+ צפייה בפרטים אודות האפליקציה
+ קישורים
+ התנהגות
+ שם
+ הגדרות
+ זמן בין נדנודים
+ הידעת?
+ לשינוי סדר הההרגלים, לחצו לחיצה ארוכה על ההרגל וגררו אותו למקום הרצוי.
+ ניתן לראות ימים נוספים ע\"י סיבוב המסך לתצוגה רוחבית.
+ מחיקת הרגלים
+ ההרגלים יימחקו לצמיתות. פעולה זו אינה ניתנת לביטול.
+ הרגל נמחק / לא נמצא
+ סופי שבוע
+ ימי חול
+ כל יום בשבוע
+ בחירת ימים
+ ייצוא כקובץ CSV
+ בוצע
+ נקה
+ בחר שעות
+ בחר דקות
+ אודות
+ מתרגמים
+ מפתחים
+ גרסה %s
+ תדירות
+ סימון הרגל
+ חוזק
+ רצף שיא
+ רצף נוכחי
+ מספר חזרות
+ %d הימים האחרונים
+ %d השבועות האחרונים
+ %d החודשים האחרונים
+ %d השנים האחרונות
+ בכל הזמנים
+ כל יום
+ כל שבוע
+ פעמיים בשבוע
+ 5 פעמים בשבוע
+ מותאם אישית…
+ עזרה ושאלות נפוצות
+ ייצוא נתונים נכשל.
+ ייבוא נתונים נכשל.
+ קובץ לא מזוהה.
+ הרגלים יובאו בהצלחה.
+ גיבוי מלא יוצאה בהצלחה.
+ ייבוא נתונים
+ ייצוא גיבוי מלא
+ תומך בכל הגיבויים שיוצאו ע\"י האפליקציה. כמו גם קבצים שנוצרו ע\"י Tickmate, HabitBull או Rewire. לפרטים נוספים ראו שאלות נפוצות.
+ יוצר קבצים שניתן לפתוח על-ידי תוכנות גיליון אלקטרוני כגון Microsoft Excel או OpenOffice. אין אפשרות לייבא את הקובץ בחזרה.
+ יוצר קובץ המכיל את כל הנתונים שלך. קובץ זה ניתן לייבא בחזרה.
+ הפקת דוח שגיאות נכשלה.
+ הפקת דוח שגיאות
+ פתרון תקלות
+ עזרו לנו לתרגם את האפליקציה
+ מצב לילה
+ רקע שחור למצב לילה
+ החלפת הרקע האפור במצב לילה לשחור מוחלט. מפחית בזבוז סוללה במכשירים עם תצוגת AMOLED.
+ ממשק
+ הפיכת סדר הימים
+ מציג ימים בסדר הפוך במסך הראשי
+ יום
+ שבוע
+ חודש
+ רבעון
+ שנה
+ סה\"כ
+
+
+ פעמים ב-
+ כל %d ימים
+ כל %d שבועות
+ כל %d חודשים
+ ציון
+ צליל תזכורת
+ ללא
+ סינון
+ הסתר יעדים שהושלמו
+ הסתר ארכיון
+ צור תזכורות \"דביקות\"
+ מונע החלקת וביטול תזכורות.
+ תיקון מסד נתונים
+ מאגר נתונים תוקן.
+ ביטול סימון
+ הפעלה \ כיבוי
+ פעולה
+ הרגל
+ מיון
+ באופן ידני
+ לפי שם
+ לפי צבע
+ לפי ציון
+ הורדה
+ ייצוא
+
diff --git a/android/uhabits-android/src/main/res/values-iw/strings.xml b/android/uhabits-android/src/main/res/values-iw/strings.xml
deleted file mode 100644
index 80b7baf15..000000000
--- a/android/uhabits-android/src/main/res/values-iw/strings.xml
+++ /dev/null
@@ -1,178 +0,0 @@
-
-
-
-
- Loop Habit Tracker
- הרגלים
- הגדרות
- עריכה
- מחיקה
- ארכיון
- הוצא מארכיון
- הרגל חדש
- שינוי צבע
- הרגל נוצר
- הרגלים נמחקו
- הרגלים שוחזרו
- אין מה לבטל
- אין מה לבצע שוב
- הרגל השתנה
- הרגל השתנה בחזרה
- הרגלים הועברו לארכיון
- הרגלים הוצאו מארכיון
- מבט על
- חוזק ההרגל
- היסטוריה
- נקה
- שאלה (האם ... היום?)
- חזור
- פעמים ב-
- ימים
- תזכורת
- ביטול
- שמירה
- רצפים
- אין לך הרגלים פעילים
- לחץ והחזק לסימון או ביטול הסימון
- כבוי
- השם אינו יכול להישאר ריק.
- מספר חייב להיות חיובי.
- לא ניתן להגדיר יותר מחזרה אחת ביום
- צור הרגל
- ערוך הרגל
- בוצע
- מאוחר יותר
-
- ברוכים הבאים
- Loop Habit Tracker מסייע ליצור ולשמר הרגלים טובים.
- צרו הרגלים חדשים
- כל יום, אחרי ביצוע ההרגל סמנו זאת באפליקציה.
- המשיכו לעשות זאת
- הרגלים שיבוצעו בעקביות לאורך זמן רב יזכו בכוכב מלא.
- מעקב התקדמות
- גרפים מפורטים מציגים כיצד ההרגלים שלך משתפרים לאורך זמן.
- 15 דקות
- 30 דקות
- 1 שעה
- 2 שעות
- 4 שעות
- 8 שעות
- 24 שעות
- סימון הרגלים בלחיצה קצרה
- סמנו יעדים בהקשה קצרה במקום לחיצה ממושכת. נוח יותר, אך יכול להוביל ללחיצות לא מכוונות.
- מרווח נדנוד לתזכורות
- דרג/י אותנו ב- Google Play
- שליחת משוב למפתחים
- צפייה בקוד המקור ב-GitHub
- צפייה בפרטים אודות האפליקציה
- קישורים
- התנהגות
- שם
- הגדרות
- זמן בין נדנודים
- הידעת?
- לשינוי סדר הההרגלים, לחצו לחיצה ארוכה על ההרגל וגררו אותו למקום הרצוי.
- ניתן לראות ימים נוספים ע\"י סיבוב המסך לתצוגה רוחבית.
- מחיקת הרגלים
- ההרגלים יימחקו לצמיתות. פעולה זו אינה ניתנת לביטול.
- הרגל נמחק / לא נמצא
- סופי שבוע
- ימי חול
- כל יום בשבוע
- בחירת ימים
- ייצוא כקובץ CSV
- בוצע
- נקה
- בחר שעות
- בחר דקות
- אודות
- מתרגמים
- מפתחים
- גרסה %s
- תדירות
- סימון הרגל
- חוזק
- רצף שיא
- רצף נוכחי
- מספר חזרות
- %d הימים האחרונים
- %d השבועות האחרונים
- %d החודשים האחרונים
- %d השנים האחרונות
- בכל הזמנים
- כל יום
- כל שבוע
- פעמיים בשבוע
- 5 פעמים בשבוע
- מותאם אישית…
- עזרה ושאלות נפוצות
- ייצוא נתונים נכשל.
- ייבוא נתונים נכשל.
- קובץ לא מזוהה.
- הרגלים יובאו בהצלחה.
- גיבוי מלא יוצאה בהצלחה.
- ייבוא נתונים
- ייצוא גיבוי מלא
- תומך בכל הגיבויים שיוצאו ע\"י האפליקציה. כמו גם קבצים שנוצרו ע\"י Tickmate, HabitBull או Rewire. לפרטים נוספים ראו שאלות נפוצות.
- יוצר קבצים שניתן לפתוח על-ידי תוכנות גיליון אלקטרוני כגון Microsoft Excel או OpenOffice. אין אפשרות לייבא את הקובץ בחזרה.
- יוצר קובץ המכיל את כל הנתונים שלך. קובץ זה ניתן לייבא בחזרה.
- הפקת דוח שגיאות נכשלה.
- הפקת דוח שגיאות
- פתרון תקלות
- עזרו לנו לתרגם את האפליקציה
- מצב לילה
- רקע שחור למצב לילה
- החלפת הרקע האפור במצב לילה לשחור מוחלט. מפחית בזבוז סוללה במכשירים עם תצוגת AMOLED.
- ממשק
- הפיכת סדר הימים
- מציג ימים בסדר הפוך במסך הראשי
- יום
- שבוע
- חודש
- רבעון
- שנה
- סה\"כ
-
- פעמים ב-
- כל %d ימים
- כל %d שבועות
- כל %d חודשים
- ציון
- צליל תזכורת
- ללא
- סינון
- הסתר יעדים שהושלמו
- הסתר ארכיון
- צור תזכורות \"דביקות\"
- מונע החלקת וביטול תזכורות.
- תיקון מסד נתונים
- מאגר נתונים תוקן.
- ביטול סימון
- הפעלה כיבוי
- פעולה
- הרגל
- מיון
- באופן ידני
- לפי שם
- לפי צבע
- לפי ציון
- הורדה
- ייצוא
-
diff --git a/android/uhabits-android/src/main/res/values-ja-rJP/strings.xml b/android/uhabits-android/src/main/res/values-ja-rJP/strings.xml
new file mode 100644
index 000000000..436a79300
--- /dev/null
+++ b/android/uhabits-android/src/main/res/values-ja-rJP/strings.xml
@@ -0,0 +1,203 @@
+
+
+
+
+ ループ習慣トラッカー
+ 習慣
+ 設定
+ 編集
+ 削除
+ アーカイブ
+ 記録を戻す
+ 習慣を追加
+ 色の変更
+ 習慣を作成しました。
+ 習慣を削除しました。
+ 習慣を復元しました。
+ 元に戻すことはできません。
+ リピートはできません。
+ 習慣を変更しました。
+ 習慣を元に戻しました。
+ 習慣を記録しました。
+ 習慣の記録を戻しました。
+ 概要
+ 習慣の強さ
+ 履歴
+ クリア
+ 質問 (今日 … しましたか?)
+ リピート
+ 回
+ 日
+ リマインダー
+ 破棄
+ 保存
+ 連続記録
+ 習慣はありません
+ 長押しするとチェックを付けたり外したりできます
+ オフ
+ 名前は空にできません。
+ 値を正にする必要があります。
+ 多くて1 日 1 回にすることができます。
+ 習慣を作成
+ 習慣を編集
+ チェック
+ 後で
+
+ ようこそ
+ ループ習慣トラッカーは、良い習慣を作り、それを維持するのに役立ちます。
+ 新しい習慣を作成します
+ 毎日習慣を実際に行ったら、アプリでチェックマークを付けます。
+ これを続けます
+ 長い期間習慣を継続すると、スターをコンプリートできます。
+ 進捗状況を確認できます
+ 詳細グラフは、あなたの習慣が時間をかけて改善された様子を表します。
+ 15 分
+ 30 分
+ 1 時間
+ 2 時間
+ 4 時間
+ 8 時間
+ 24時間
+ 常に選択する
+ カスタム...
+ タップすると繰り返しを切り替えられます
+ この機能は便利ですが、間違って切り替えが起こる可能性があります。
+ リマインダーのスヌーズ間隔
+ Google Play でこのアプリを評価
+ 開発者にフィードバックを送信
+ GitHub でソースコードを参照
+ アプリの紹介を表示
+ リンク
+ 動作
+ タイトル
+ 設定
+ スヌーズ間隔
+ スヌーズ遅延を設定
+ ご存知ですか?
+ エントリーを並べ替えるには、習慣の名前を長押しして、正しい場所にドラッグしてください。
+ お使いの携帯電話を横置きモードにすることで、より多くの日数を見ることができます。
+ 習慣を削除
+ 習慣は完全に削除されます。これをするとやり直せなくなってしまいます。
+ 習慣が削除されているか、見つかりませんでした
+ 週末
+ 月曜日から金曜日
+ 週のある日
+ 日の選択
+ CSV としてエクスポート
+ 完了しました
+ クリア
+ 何時にするかを決めます
+ 何分するかを決めます
+ 少なくとも1つの習慣を選択してください
+ アプリについて
+ 翻訳者
+ 開発者
+ バージョン %s
+ 頻度
+ チェック
+ 強さ
+ 最高の連続記録
+ 現在の連続記録
+ 繰り返しをした数
+ 最近の %d 日
+ 最近の %d 週間
+ 最近の %d ヶ月
+ 最近の %d 年
+ 常時
+ 毎日
+ 毎週
+ 1 週間に 2 回
+ 1 週間に 5 回
+ 自分で選択
+ ヘルプ & FAQ
+ データの送信に失敗しました。
+ データの取り込みに失敗しました。
+ ファイルを認識できません。
+ 習慣を正常に取り込みました。
+ 全てのバックアップデータを正常に送信しました。
+ データの取り込み
+ 全てのバックアップデータの送信
+ このアプリで送信した全てのバックアップデータ以外にも、Tickmate、HabitBull、Rewire で作成したファイルも同様にサポートしています。詳細については FAQ を参照してください。
+ Microsoft Excel や OpenOffice Calc などの表計算ソフトで開くことができるファイルを作成します。このファイルは取り込んで戻すことはできません。
+ すべてのデータが含まれるファイルを作成します。このファイルは取り込んで戻すことができます。
+ バグ報告の作成に失敗しました。
+ バグ報告の作成
+ トラブルシューティング
+ このアプリの翻訳を行う
+ 夜間モード
+ 夜間モードで黒を使用する
+ 夜間モードをONにすると灰色から黒の背景に変わります。AMOLED ディスプレイによりバッテリー使用量を抑えます。
+ インターフェース
+ 日の順序を逆転する
+ メイン画面で習慣設定日を逆順に表示します
+ 日
+ 週
+ 月
+ 四半期
+ 年
+ 合計
+
+ はい / いいえ
+ 数
+
+ 回 /
+ %d 日ごと
+ %d 週ごと
+ %d ヶ月ごと
+ 得点
+ リマインダー音
+ なし
+ フィルター
+ 達成した習慣を非表示にする
+ アーカイブした習慣を非表示にする
+ 通知を固定する
+ 通知をスワイプして消せないようにする
+ 通知ランプ
+ データベースの修復
+ データベースが修復されました。
+ 未チェック
+ 反転
+ アクション
+ 習慣
+ 並び替え
+ 手動で並び替え
+ 名前で並び替え
+ 色で並び替え
+ 得点で並び替え
+ ダウンロード
+ エクスポート
+ 値を変更する
+ カレンダー
+ 単位
+ カウント
+ この値は空白にできません
+ 例:今日は何歩歩きましたか?
+ 例:ステップ
+ 例:今日は運動しましたか?
+ 質問
+ 目標
+ はい
+ いいえ
+ 音、振動、光、その他の通知設定を変更する
+ 通知をカスタマイズする
+ プライバシーポリシーを見る
+ すべての貢献者を表示…
+ データベース
+
diff --git a/android/uhabits-android/src/main/res/values-ja/strings.xml b/android/uhabits-android/src/main/res/values-ja/strings.xml
deleted file mode 100644
index 4bd91d80a..000000000
--- a/android/uhabits-android/src/main/res/values-ja/strings.xml
+++ /dev/null
@@ -1,162 +0,0 @@
-
-
-
-
- ループ習慣トラッカー
- 習慣
- 設定
- 編集
- 削除
- アーカイブ
- アーカイブを戻す
- 習慣を追加
- 色の変更
- 習慣を作成しました。
- 習慣を削除しました。
- 習慣を復元しました。
- 元に戻すことはできません。
- 繰り返しはできません。
- 習慣を変更しました。
- 習慣を元に戻しました。
- 習慣をアーカイブしました。
- 習慣のアーカイブを戻しました。
- 概要
- 習慣の強さ
- 履歴
- クリア
- 質問 (今日 … しましたか?)
- 繰り返し
- 回
- 日
- リマインダー
- 破棄
- 保存
- 連続記録
- アクティブな習慣はありません
- 長押しするとチェックを付けたり外したりします
- オフ
- 名前は空にできません。
- 正の数値にする必要があります。
- 多くとも 1 日 1 回にすることができます。
- 習慣を作成
- 習慣を編集
- チェック
- 後で
-
- ようこそ
- ループ習慣トラッカーは、良い習慣を作って、維持するのに役立ちます。
- 新しい習慣を作成します
- 毎日、習慣を実行した後、アプリでチェックマークを付けます。
- これを続けます
- 長い期間習慣を継続すると、スターを全て獲得できます。
- 進捗状況を追跡します
- 詳細グラフは、あなたの習慣が時間をかけて改善された様子を示します。
- 15 分
- 30 分
- 1 時間
- 2 時間
- 4 時間
- 8 時間
- 24時間
- クリックで繰り返しを切り替え
- 便利になりますが、間違って切り替えが起こる可能性があります。
- リマインダーのスヌーズ間隔
- Google Play でこのアプリを評価
- 開発者にフィードバックを送信
- GitHub でソースコードを参照
- アプリの紹介を表示
- リンク
- 動作
- 名前
- 設定
- スヌーズ間隔
- ご存知ですか?
- エントリーを並べ替えるには、習慣の名前を長押しして、正しい場所にドラッグしてください。
- お使いの携帯電話を横置きモードにすることで、参照する日数を多くすることができます。
- 習慣を削除
- 習慣は完全に削除されます。この操作を元に戻すことはできません。
- 週末
- 月曜日から金曜日
- 週の任意の日
- 日の選択
- CSV としてエクスポート
- 完了
- クリア
- 時間の選択
- 分の選択
- アプリについて
- 翻訳者
- 開発者
- バージョン %s
- 周波数
- チェック
- 強さ
- 最高の連続記録
- 現在の連続記録
- 繰り返し数
- 最近 %d 日
- 最近 %d 週間
- 最近 %d ヶ月
- 最近 %d 年
- いつも
- 毎日
- 毎週
- 1 週間に 2 回
- 1 週間に 5 回
- カスタム …
- ヘルプ & FAQ
- データのエクスポートに失敗しました。
- データのインポートに失敗しました。
- ファイルを認識できません。
- 習慣を正常にインポートしました。
- フルバックアップを正常にエクスポートしました。
- データのインポート
- フルバックアップのエクスポート
- このアプリでエクスポートしたフルバックアップだけではなく、Tickmate、HabitBull、Rewire で生成したファイルも同様にサポートしています。詳細については FAQ を参照してください。
- Microsoft Excel や OpenOffice Calc などの表計算ソフトで開くことができるファイルを生成します。このファイルはインポートで戻すことはできません。
- すべてのデータが含まれるファイルを生成します。このファイルはインポートして戻すことができます。
- バグ報告の生成に失敗しました。
- バグ報告の生成
- トラブルシューティング
- このアプリの翻訳を支援する
- 夜間モード
- 夜間モードで真黒を使用する
- 夜間モードで灰色の背景を黒で置き換えます。AMOLED ディスプレイの電話でバッテリー使用量を抑えます。
- インターフェース
- 日の順序を逆転する
- メイン画面で日を逆順に表示します
- 日
- 週
- 月
- 四半期
- 年
- 合計
-
- 回 /
- %d 日ごと
- %d 週ごと
- %d ヶ月ごと
- スコア
- リマインダー サウンド
- なし
- フィルター
- ダウンロード
- エクスポート
-
diff --git a/android/uhabits-android/src/main/res/values-ko-rKR/strings.xml b/android/uhabits-android/src/main/res/values-ko-rKR/strings.xml
new file mode 100644
index 000000000..fc2efeb59
--- /dev/null
+++ b/android/uhabits-android/src/main/res/values-ko-rKR/strings.xml
@@ -0,0 +1,179 @@
+
+
+
+
+ Loop 습관제조기
+ 습관
+ 설정
+ 수정
+ 삭제
+ 보관
+ 보관 해제
+ 습관 추가하기
+ 색상 변경
+ 습관이 생성되었습니다.
+ 습관이 삭제되었습니다.
+ 습관이 복원되었습니다.
+ 취소할 것이 없습니다.
+ 복원할 것이 없습니다.
+ 습관이 수정되었습니다.
+ 습관이 복원되었습니다.
+ 습관이 보관되었습니다.
+ 습관 보관이 해제되었습니다.
+ 개요
+ 습관 강도
+ 이력
+ 지우기
+ 질문 (오늘 ... 했나요?)
+ 반복
+ 번
+ 일 동안
+ 알림
+ 취소
+ 저장
+ 연속
+ 활성화된 습관이 없습니다.
+ 체크하거나 해제하려면 길게 누르세요.
+ 끔
+ 제목을 적어주세요.
+ 숫자는 0보다 커야합니다.
+ 하루에 한 번만 반복 가능합니다.
+ 습관 만들기
+ 습관 수정하기
+ 완료
+ 나중에
+
+ 환영합니다
+ Loop은 당신이 좋은 습관을 만들고 유지하도록 도와줍니다.
+ 새로운 습관을 만들어 보세요.
+ 매일 습관을 수행하고 앱에 기록하세요.
+ 계속 반복하세요
+ 오랫동안 지속적으로 유지한 습관은 별표를 얻습니다.
+ 습관을 관리하세요
+ 자세한 그래프로 시간에 따라 당신의 습관이 어떻게 향상되었는지 보여줍니다.
+ 15분
+ 30분
+ 1시간
+ 2시간
+ 4시간
+ 8시간
+ 24시간
+ 짧게 눌러서 전환하기
+ 길게 누르고 있는 대신에 짧은 탭 한 번으로 체크합니다. 더 편리하지만, 실수로 전환될 수도 있습니다.
+ 알림 스누즈 간격
+ Google Play에서 평가
+ 개발자에게 피드백 보내기
+ Github에서 소스보기
+ 앱 안내메시지 보기
+ 링크
+ 행동
+ 제목
+ 설정
+ 스누즈 간격
+ 아시나요?
+ 목록의 순서를 재배치하려면, 습관의 제목을 길게 누르고 다른 위치로 드래그하면 됩니다.
+ 가로 모드에서는 더 많은 날짜를 볼 수 있습니다.
+ 습관 삭제
+ 습관을 영구적으로 삭제합니다. 이 작업은 취소할 수 없습니다.
+ 습관 삭제 / 찾을 수 없음
+ 주말
+ 주중
+ 매일
+ 요일 선택
+ CSV로 내보내기
+ 완료
+ 지우기
+ 시간 선택
+ 분 선택
+ 정보
+ 번역자
+ 개발자
+ 버전 %s
+ 빈도
+ 체크
+ 강도
+ 최고 연속 기록
+ 현재 기록
+ 반복한 횟수
+ 이전 %d일 동안
+ 이전 %d주 동안
+ 이전 %d달 동안
+ 이전 %d년 동안
+ 모두
+ 매일
+ 매주
+ 일주일에 2번
+ 일주일에 5번
+ 직접 정하기
+ 도움 & FAQ
+ 데이터 내보내기에 실패했습니다.
+ 데이터 가져오기에 실패했습니다.
+ 파일을 인식할 수 없습니다.
+ 습관 가져오기에 성공했습니다.
+ 전체 백업 내보내기에 성공했습니다.
+ 데이터 가져오기
+ 백업 내보내기
+ Tickmate, HabitBull, Rewire에서 생성된 파일도 지원합니다. 더 자세한 설명은 FAQ에 있습니다.
+ Microsoft Excel나 OpenOffice Calc 같은 스프레드시트 소프트웨어로 열 수 있는 파일을 생성합니다. 이 파일은 다시 가져올 수 없습니다.
+ 모든 데이터를 포함한 파일을 생성합니다. 이 파일은 다시 가져올 수 있습니다.
+ 오류보고서 작성에 실패했습니다.
+ 오류보고서 작성하기
+ 문제 해결
+ 이 앱의 번역을 도와주세요
+ 야간 모드
+ 야간 모드에서 검정색 사용하기
+ 야간 모드의 회색 배경을 검정색으로 대체합니다. AMOLED 디스플레이를 사용하는 기기에서 배터리 사용량을 감소시킵니다.
+ 인터페이스
+ 날짜 순서 뒤집기
+ 메인 화면의 날짜를 역순으로 보여줍니다.
+ 일
+ 주
+ 월
+ 분기
+ 년
+ 전체
+
+
+ 번
+ %d일 마다
+ %d주 마다
+ %d개월 마다
+ 점수
+ 알림음
+ 무음
+ 필터
+ 완료된 항목 숨기기
+ 보관된 항목 숨기기
+ 알림 고정하기
+ 알림을 스와이프해서 제거하는 것을 방지합니다.
+ 데이터베이스 복구
+ 데이터베이스가 복구되었습니다.
+ 선택 해제
+ 전환
+ 동작
+ 습관
+ 정렬
+ 수동으로
+ 이름 순으로
+ 색상 순으로
+ 점수 순으로
+ 다운로드
+ 내보내기
+
diff --git a/android/uhabits-android/src/main/res/values-ko/strings.xml b/android/uhabits-android/src/main/res/values-ko/strings.xml
deleted file mode 100644
index 7eae85e59..000000000
--- a/android/uhabits-android/src/main/res/values-ko/strings.xml
+++ /dev/null
@@ -1,178 +0,0 @@
-
-
-
-
- Loop 습관제조기
- 습관
- 설정
- 수정
- 삭제
- 보관
- 보관 해제
- 습관 추가하기
- 색상 변경
- 습관이 생성되었습니다.
- 습관이 삭제되었습니다.
- 습관이 복원되었습니다.
- 취소할 것이 없습니다.
- 복원할 것이 없습니다.
- 습관이 수정되었습니다.
- 습관이 복원되었습니다.
- 습관이 보관되었습니다.
- 습관 보관이 해제되었습니다.
- 개요
- 습관 강도
- 이력
- 지우기
- 질문 (오늘 ... 했나요?)
- 반복
- 번
- 일 동안
- 알림
- 취소
- 저장
- 연속
- 활성화된 습관이 없습니다.
- 체크하거나 해제하려면 길게 누르세요.
- 끔
- 제목을 적어주세요.
- 숫자는 0보다 커야합니다.
- 하루에 한 번만 반복 가능합니다.
- 습관 만들기
- 습관 수정하기
- 완료
- 나중에
-
- 환영합니다
- Loop은 당신이 좋은 습관을 만들고 유지하도록 도와줍니다.
- 새로운 습관을 만들어 보세요.
- 매일 습관을 수행하고 앱에 기록하세요.
- 계속 반복하세요
- 오랫동안 지속적으로 유지한 습관은 별표를 얻습니다.
- 습관을 관리하세요
- 자세한 그래프로 시간에 따라 당신의 습관이 어떻게 향상되었는지 보여줍니다.
- 15분
- 30분
- 1시간
- 2시간
- 4시간
- 8시간
- 24시간
- 짧게 눌러서 전환하기
- 길게 누르고 있는 대신에 짧은 탭 한 번으로 체크합니다. 더 편리하지만, 실수로 전환될 수도 있습니다.
- 알림 스누즈 간격
- Google Play에서 평가
- 개발자에게 피드백 보내기
- Github에서 소스보기
- 앱 안내메시지 보기
- 링크
- 행동
- 제목
- 설정
- 스누즈 간격
- 아시나요?
- 목록의 순서를 재배치하려면, 습관의 제목을 길게 누르고 다른 위치로 드래그하면 됩니다.
- 가로 모드에서는 더 많은 날짜를 볼 수 있습니다.
- 습관 삭제
- 습관을 영구적으로 삭제합니다. 이 작업은 취소할 수 없습니다.
- 습관 삭제 / 찾을 수 없음
- 주말
- 주중
- 매일
- 요일 선택
- CSV로 내보내기
- 완료
- 지우기
- 시간 선택
- 분 선택
- 정보
- 번역자
- 개발자
- 버전 %s
- 빈도
- 체크
- 강도
- 최고 연속 기록
- 현재 기록
- 반복한 횟수
- 이전 %d일 동안
- 이전 %d주 동안
- 이전 %d달 동안
- 이전 %d년 동안
- 모두
- 매일
- 매주
- 일주일에 2번
- 일주일에 5번
- 직접 정하기
- 도움 & FAQ
- 데이터 내보내기에 실패했습니다.
- 데이터 가져오기에 실패했습니다.
- 파일을 인식할 수 없습니다.
- 습관 가져오기에 성공했습니다.
- 전체 백업 내보내기에 성공했습니다.
- 데이터 가져오기
- 백업 내보내기
- Tickmate, HabitBull, Rewire에서 생성된 파일도 지원합니다. 더 자세한 설명은 FAQ에 있습니다.
- Microsoft Excel나 OpenOffice Calc 같은 스프레드시트 소프트웨어로 열 수 있는 파일을 생성합니다. 이 파일은 다시 가져올 수 없습니다.
- 모든 데이터를 포함한 파일을 생성합니다. 이 파일은 다시 가져올 수 있습니다.
- 오류보고서 작성에 실패했습니다.
- 오류보고서 작성하기
- 문제 해결
- 이 앱의 번역을 도와주세요
- 야간 모드
- 야간 모드에서 검정색 사용하기
- 야간 모드의 회색 배경을 검정색으로 대체합니다. AMOLED 디스플레이를 사용하는 기기에서 배터리 사용량을 감소시킵니다.
- 인터페이스
- 날짜 순서 뒤집기
- 메인 화면의 날짜를 역순으로 보여줍니다.
- 일
- 주
- 월
- 분기
- 년
- 전체
-
- 번
- %d일 마다
- %d주 마다
- %d개월 마다
- 점수
- 알림음
- 무음
- 필터
- 완료된 항목 숨기기
- 보관된 항목 숨기기
- 알림 고정하기
- 알림을 스와이프해서 제거하는 것을 방지합니다.
- 데이터베이스 복구
- 데이터베이스가 복구되었습니다.
- 선택 해제
- 전환
- 동작
- 습관
- 정렬
- 수동으로
- 이름 순으로
- 색상 순으로
- 점수 순으로
- 다운로드
- 내보내기
-
diff --git a/android/uhabits-android/src/main/res/values-nl-rNL/strings.xml b/android/uhabits-android/src/main/res/values-nl-rNL/strings.xml
new file mode 100644
index 000000000..ed3ec80c3
--- /dev/null
+++ b/android/uhabits-android/src/main/res/values-nl-rNL/strings.xml
@@ -0,0 +1,179 @@
+
+
+
+
+ Loop Gewoonte tracker
+ Gewoontes
+ Instellingen
+ Wijzig
+ Verwijder
+ Archiveer
+ Dearchiveren
+ Nieuwe gewoonte
+ Verander kleur
+ Gewoonte aangemaakt.
+ Gewoontes verwijderd
+ Gewoontes hersteld
+ Niets om ongedaan te maken.
+ Niets om over te doen.
+ Gewoonte gewijzigd.
+ Wijziging gewoonte ongedaan gemaakt.
+ Gewoontes gearchiveerd
+ Gewoontes hersteld uit archief
+ Overzicht
+ Gewoonte-sterkte
+ Geschiedenis
+ Wis
+ Vraag (Heb je vandaag .... ?)
+ Herhaal
+ keer in
+ dagen
+ Herinnering
+ Verwijder
+ Opslaan
+ Reeksen
+ Je hebt geen actieve gewoontes
+ Houdt ingedrukt om te selecteren of deselecteren
+ Uit
+ Naam kan niet leeg zijn.
+ Nummer moet positief zijn.
+ Je kunt maximaal één repetitie per dag hebben
+ Maak gewoonte aan
+ Wijzig gewoonte
+ Voltooid
+ Later
+
+ Welkom
+ Loop Habit Tracker helpt je om goede gewoontes te creëren en te onderhouden.
+ Creëer enkele nieuwe gewoontes
+ Plaats iedere dag, na het uitvoeren van jouw gewoonte, een vinkje in de app.
+ Blijf het doen
+ Gewoontes die een langere tijd consistent worden uitgevoerd, zullen een volle ster verdienen.
+ Volg jouw voortgang
+ Gedetailleerde grafieken tonen je hoe jouw gewoontes met de tijd verbeteren.
+ 15 minuten
+ 30 minuten
+ 1 uur
+ 2 uur
+ 4 uur
+ 8 uur
+ 24 uur
+ Wijzig herhalingen door kort indrukken
+ Zet vinkjes met een enkel tikje in plaats van ingedrukt houden. Handiger, maar kan onbedoelde wijzigingen veroorzaken.
+ Snooze interval voor herinneringen
+ Beoordeel deze app in Google Play
+ Stuur feedback aan de ontwikkelaar
+ Bekijk de broncode op GitHub
+ Bekijk de app introductie
+ Links
+ Gedrag
+ Naam
+ Instellingen
+ Snooze interval
+ Wist je dat?
+ Om de rijen te ordenen, houdt de gewoonte ingedrukt en sleep het naar de gewenste plek.
+ Je kunt meer dagen zien door de telefoon in horizontale modus te zetten.
+ Verwijder gewoontes
+ De gewoontes zullen permanent verwijderd worden. Deze actie kan niet ongedaan gemaakt worden.
+ Gewoonte verwijderd / niet gevonden
+ Weekends
+ Maandag tot vrijdag
+ Elke dag van de week
+ Selecteer dagen
+ Exporteer als CSV
+ Voltooid
+ Wis
+ Selecteer uren
+ Selecteer minuten
+ Over
+ Vertalers
+ Ontwikkelaars
+ Versie %s
+ Frequentie
+ Vinkje
+ Kracht
+ Beste reeksen
+ Huidige reeks
+ Aantal herhalingen
+ Laatste %d dagen
+ Laatste %d weken
+ Laatste %d maanden
+ Laatste %d jaren
+ Altijd
+ Iedere dag
+ Iedere week
+ 2 keer per week
+ 5 keer per week
+ Aangepast …
+ Hulp en veelgestelde vragen
+ Het exporteren van de data is mislukt.
+ Importeren van data mislukt.
+ Bestand niet herkend.
+ Gewoontes succesvol geïmporteerd.
+ Volledige backup succesvol geëxporteerd.
+ Importeer gegevens
+ Exporteer volledige backup
+ Ondersteunt volledige back-ups geëxporteerd door deze app, evenals bestanden die worden gegenereerd door Tickmate, HabitBull of Rewire. Zie FAQ voor meer informatie.
+ Genereert bestanden die geopend kunnen worden door spreadsheet software zoals Microsoft Excel of OpenOffice Calc. Dit bestand kan niet opnieuw worden geïmporteerd.
+ Genereert een bestand met al uw gegevens. Dit bestand kan ook terug geïmporteerd worden.
+ Het genereren van het foutenrapport is mislukt.
+ Genereer foutenrapport
+ Probleemoplossing
+ Help deze app te vertalen
+ Nachtmodus
+ Gebruik puur zwart bij nachtmodus
+ Vervangt grijze achtergronden door puur zwart in nachtmodus. Vermindert batterijgebruik bij telefoons met AMOLED scherm.
+ Interface
+ Omgekeerde volgorde van dagen
+ Toon dagen in omgekeerde volgorde op het hoofdscherm
+ Dag
+ Week
+ Maand
+ Kwartaal
+ Jaar
+ Totaal
+
+
+ keer per
+ Iedere %d dagen
+ Iedere %d weken
+ Iedere %d maanden
+ Score
+ Herinneringsgeluid
+ Stil
+ Filteren
+ Verberg voltooide
+ Verberg gearchiveerde
+ Maak meldingen persistent
+ Voorkom dat meldingen weggehaald kunnen worden.
+ Database repareren
+ Database gerepareerd.
+ Deselecteren
+ Omkeren
+ Actie
+ Gewoonte
+ Sorteren
+ Handmatig
+ Op naam
+ Op kleur
+ Op score
+ Downloaden
+ Exporteren
+
diff --git a/android/uhabits-android/src/main/res/values-nl/strings.xml b/android/uhabits-android/src/main/res/values-nl/strings.xml
deleted file mode 100644
index e7929e66e..000000000
--- a/android/uhabits-android/src/main/res/values-nl/strings.xml
+++ /dev/null
@@ -1,178 +0,0 @@
-
-
-
-
- Loop Gewoonte tracker
- Gewoontes
- Instellingen
- Wijzig
- Verwijder
- Archiveer
- Dearchiveren
- Nieuwe gewoonte
- Verander kleur
- Gewoonte aangemaakt.
- Gewoontes verwijderd
- Gewoontes hersteld
- Niets om ongedaan te maken.
- Niets om over te doen.
- Gewoonte gewijzigd.
- Wijziging gewoonte ongedaan gemaakt.
- Gewoontes gearchiveerd
- Gewoontes hersteld uit archief
- Overzicht
- Gewoonte-sterkte
- Geschiedenis
- Wis
- Vraag (Heb je vandaag .... ?)
- Herhaal
- keer in
- dagen
- Herinnering
- Verwijder
- Opslaan
- Reeksen
- Je hebt geen actieve gewoontes
- Houdt ingedrukt om te selecteren of deselecteren
- Uit
- Naam kan niet leeg zijn.
- Nummer moet positief zijn.
- Je kunt maximaal een repetitie per dag hebben
- Maak gewoonte aan
- Wijzig gewoonte
- Voltooid
- Later
-
- Welkom
- Loop Habit Tracker helpt je om goede gewoontes te creëren en te onderhouden.
- Creëer enkele nieuwe gewoontes
- Plaats iedere dag, na het uitvoeren van jouw gewoonte, een vinkje in de app.
- Blijf het doen
- Gewoontes die een langere tijd consistent worden uitgevoerd, zullen een volle ster verdienen.
- Volg jouw voortgang
- Gedetailleerde grafieken tonen je hoe jouw gewoontes met de tijd verbeteren.
- 15 minuten
- 30 minuten
- 1 uur
- 2 uur
- 4 uur
- 8 uur
- 24 uur
- Wijzig herhalingen door kort indrukken
- Zet vinkjes met een enkel tikje in plaats van ingedrukt houden. Handiger, maar kan onbedoelde wijzigingen veroorzaken.
- Snooze interval voor herinneringen
- Beoordeel deze app in Google Play
- Stuur feedback aan de ontwikkelaar
- Bekijk de broncode op GitHub
- Bekijk de app introductie
- Links
- Gedrag
- Naam
- Instellingen
- Snooze interval
- Wist je dat?
- Om de rijen te ordenen, houdt de gewoonte ingedrukt en sleep het naar de gewenste plek.
- Je kunt meer dagen zien door de telefoon in horizontale modus te zetten.
- Verwijder gewoontes
- De gewoontes zullen permanent verwijderd worden. Deze actie kan niet ongedaan gemaakt worden.
- Gewoonte verwijderd / niet gevonden
- Weekends
- Maandag tot vrijdag
- Elke dag van de week
- Selecteer dagen
- Exporteer als CSV
- Voltooid
- Wis
- Selecteer uren
- Selecteer minuten
- Over
- Vertalers
- Ontwikkelaars
- Versie %s
- Frequentie
- Vinkje
- Kracht
- Beste reeksen
- Huidige reeks
- Aantal herhalingen
- Laatste %d dagen
- Laatste %d weken
- Laatste %d maanden
- Laatste %d jaren
- Altijd
- Iedere dag
- Iedere week
- 2 keer per week
- 5 keer per week
- Aangepast …
- Hulp en veelgestelde vragen
- Het exporteren van de data is mislukt.
- Importeren van data mislukt.
- Bestand niet herkend.
- Gewoontes succesvol geïmporteerd.
- Volledige backup succesvol geëxporteerd.
- Importeer gegevens
- Exporteer volledige backup
- Ondersteund volledige backups geexporteerd door deze app. Ondersteund ook bestanden gegenereerd door Tickmate, HabitBull of Rewire. Zie FAQ voor meer informatie
- Genereert bestanden die geopend kunnen worden door spreadsheet software zoals Microsoft Excel or OpenOffice Calc. Dit bestand kan niet terug geïmporteerd worden.
- Genereert een bestand met al uw gegevens. Dit bestand kan ook terug geïmporteerd worden.
- Het genereren van het foutenrapport is mislukt.
- Genereer foutenrapport
- Probleemoplossing
- Help deze app te vertalen
- Nachtmodus
- Gebruik puur zwart in nachtmodus
- Vervangt grijze achtergronden door puur zwart in nachtmodus. Vermindert batterijgebruik in telefoons met AMOLED scherm.
- Interface
- Omgekeerde volgorde van dagen
- Toon dagen in omgekeerde volgorde op het hoofdscherm
- Dag
- Week
- Maand
- Kwartaal
- Jaar
- Totaal
-
- keer per
- Iedere %d dagen
- Iedere %d weken
- Iedere %d maanden
- Score
- Herinneringsgeluid
- Stil
- Filteren
- Verberg voltooide
- Verberg gearchiveerde
- Maak meldingen persistent
- Voorkom dat meldingen weggehaald kunnen worden.
- Database repareren
- Database gerepareerd.
- Deselecteren
- Omkeren
- Actie
- Gewoonte
- Sorteren
- Handmatig
- Bij naam
- Bij kleur
- Bij score
- Downloaden
- Exporteren
-
diff --git a/android/uhabits-android/src/main/res/values-no-rNO/strings.xml b/android/uhabits-android/src/main/res/values-no-rNO/strings.xml
index 31c69a0e8..87fc329b1 100644
--- a/android/uhabits-android/src/main/res/values-no-rNO/strings.xml
+++ b/android/uhabits-android/src/main/res/values-no-rNO/strings.xml
@@ -19,76 +19,161 @@
~ with this program. If not, see .
-->
- Kutimoj
- Agordoj
- Redakti
- Forigi
- Arĥivo
- Elarĥivigi
- Aldonu kutimon
- Ŝanĝi koloron
- Kutimo ŝanĝita
- Kutimo arĥivita
- Kutimo forteco
- tagoj
- Memorigaĵoj
- Nuligi
- Konservi
- Strioj
- Neaktiva
- Poste
-
- Bonvenon
- 15 minutoj
- 30 minutoj
- Agordoj
- Forigi kutimojn
- Semajnfinoj
- Lundo al vendredo
- Io semajntago
- Elekti tagojn
- Eksporti kiel CSV
- Farite
- Elekti horojn
- Elekti minutojn
- Pri programo
- Tradukantoj
- Evoluigantoj
- Versio %s
- Frekvenco
- Forteco
- Nombro de ripetoj
- Lastaj %d tagoj
- Lastaj %d semajnoj
- Lastaj %d monatoj
- Lastaj %d jaroj
- Ĉiuj tempoj
- Ĉiu tago
- Ĉiu semajno
- Dufoje en semajno
- Kvinfoje en semajno
- Helpo & Ofte Demandite
- Dosiero ne rekonita.
- Plena savkopio sukcese eksportita.
- Problemserĉado
- Nokta reĝimo
- Tago
- Semajno
- Monato
- Jarkvarono
- Jaro
-
- Nenio
- Filtrilo
- Kaŝi kompletajn
- Kaŝi arĥivitajn
- Ripari datumbazon
- Datumbazon riparita.
- Ago
- Kutimo
- Enkursigi
- Laŭ nomo
- Laŭ koloro
- Elŝuti
- Eksporti
+ Loop Vaneoversikt
+ Vaner
+ Innstillinger
+ Redigér
+ Slett
+ Arkivér
+ Uarkivér
+ Legg til vane
+ Endr farge
+ Vane laget
+ Vaner slettet
+ Vaner gjenopprettet
+ Ingenting å angre
+ Ingenting å ta tilbake
+ Vane endret
+ Vane tilbakeendret
+ Vaner arkivert
+ Vaner uarkivert
+ Oversikt
+ Vanestyrke
+ Logg
+ Fjern
+ Spørsmål (Gjorde du … i dag?)
+ Gjenta
+ ganger på
+ dager
+ Påminnelse
+ Forkast
+ Lagr
+ Gjentakelser
+ Du har ingen aktive vaner
+ Trykk og hold for å sjekke eller usjekke
+ Av
+ Navnet kan ikke stå tomt.
+ Nummeret må være positivt.
+ Du kan maks ha én repetisjon om dagen
+ Lag vane
+ Redigér vane
+ Sjekk
+ Senere
+
+ Velkommen
+ Loop Vaneoversikt hjelper deg med å lage og beholde gode vaner.
+ Lag noen nye vaner
+ Hver dag, etter du utfører vanen din, sett en hake på appen.
+ Fortsett med å gjøre det
+ Vaner utført konsekvent over lang tid vil få en hel stjerne.
+ Hold oversikt over fremgangen din
+ Detaljerte grafer viser deg hvordan vanene dine forbedrer seg over tid.
+ 15 minutter
+ 30 minutter
+ 1 time
+ 2 timer
+ 4 timer
+ 8 timer
+ 1 døgn
+ Veksl med enkelttrykk
+ Sett på haker med et enkelttrykk i stedet for å tykke og holde. Mer praktisk, men kan forårsake utilsiktede vekslinger.
+ Slumreintervall på påminnelser
+ Vurdér denne appen på Google Play
+ Send tilbakemelding til utviklerne
+ Vis kildekode på GitHub
+ Se på appintroduksjon
+ Lenker
+ Oppførsel
+ Navn
+ Innstillinger
+ Slumreintervall
+ Visste du at?
+ For å sortere innleggene, trykk og hold på navnet til vanen, deretter dra den til det korrekte stedet.
+ Du kan se flere dager ved å sette telefonen din i landskapsmodus.
+ Slett vaner
+ Vanene vil bli slettet permanent. Denne handlingen kan ikke angres.
+ Vane slettet / ikke funnet
+ Helger
+ Hverdager
+ Hvilken som helst dag i uken
+ Velg dager
+ Eksportér som CSV
+ Ferdig
+ Fjern
+ Velg timer
+ Velg minutter
+ Om
+ Translatører
+ Utviklere
+ Versjon %s
+ Hyppighet
+ Hake
+ Styrke
+ Beste gjentakelser
+ Nåværende gjentakelse
+ Repetisjonsantall
+ Siste %d dager
+ Siste %d uker
+ Siste %d måneder
+ Siste %d år
+ Alltid
+ Hver dag
+ Hver uke
+ 2 ganger i uken
+ 5 ganger i uken
+ Tilpasset …
+ Hjelp og FAQ
+ Mislyktes i å eksportere data.
+ Mislyktes i å importere data.
+ Fil ikke gjenkjent.
+ Vaner suksessfullt importert.
+ Hel sikkerhetskopi suksessfullt eksportert.
+ Importér data
+ Eksportér hel sikkerhetskopi
+ Støtter hele sikkerhetskopier eksportert av denne appen, i tillegg til filer generert av Tickmate, HabitBull, og Rewire. Sjekk ut FAQ for mer informasjon.
+ Genererer filer som kan bli åpnet av regnearkprogrammer som Microsoft Excel og OpenOffice Calc. Disse filene kan ikke importeres tilbake.
+ Genererer en fil som inneholder all dataen din. Denne filen kan ikke importeres tilbake.
+ Mislyktes i å generere feilrapport.
+ Generér feilrapport
+ Feilsøkning
+ Hjelp med å oversette denne appen
+ Nattmodus
+ Bruk batterisparing i nattmodus
+ Bytter ut grå bakgunner med helt svarte i nattmodus. Reduserer betteribruk hos telefoner med AMOLED-skjerm.
+ Grensesnitt
+ Omvendt dagsrekkefølge
+ Vis dager i omvendt rekkefølge på hovedmenyen
+ Dag
+ Uke
+ Måned
+ Kvarter
+ År
+ Totalt
+
+
+ gang på
+ Hver %d. dag
+ Hver %d. uke
+ Hver %d. måned
+ Poengsum
+ Påminnelseslyd
+ Ingen
+ Filtrér
+ Gjem fullførte
+ Gjem arkiverte
+ Gjør varslinger klebrige
+ Forhindrer varslinger fra å bli sveipet vekk.
+ Reparér database
+ Database reparert.
+ Usjekk
+ Veksl
+ Handling
+ Vane
+ Sortér
+ Manuelt
+ Etter navn
+ Etter farge
+ Etter poengsum
+ Last ned
+ Eksportér
diff --git a/android/uhabits-android/src/main/res/values-pl-rPL/strings.xml b/android/uhabits-android/src/main/res/values-pl-rPL/strings.xml
new file mode 100644
index 000000000..0e0fc880f
--- /dev/null
+++ b/android/uhabits-android/src/main/res/values-pl-rPL/strings.xml
@@ -0,0 +1,179 @@
+
+
+
+
+ Śledzenie Nawyków Loop
+ Nawyki
+ Ustawienia
+ Edytuj
+ Usuń
+ Archiwizuj
+ Odarchiwizuj
+ Dodaj nawyk
+ Zmień kolor
+ Utworzono nawyk
+ Usunięto nawyki
+ Przywrócono nawyki
+ Nic do cofnięcia
+ Nic do powtórzenia
+ Zmieniono nawyk
+ Zmieniono nawyk z powrotem
+ Nawyki zarchiwizowane
+ Nawyki odarchiwizowane
+ Przegląd
+ Siła nawyku
+ Historia
+ Wyczyść
+ Pytanie (Czy zrobiłeś ... dzisiaj?)
+ Powtórz
+ razy w
+ dni
+ Przypomnienie
+ Odrzuć
+ Zapisz
+ Serie
+ Nie masz aktywnych nawyków
+ Naciśnij i przytrzymaj aby zaznaczyć lub odznaczyć
+ Wyłączone
+ Nazwa nie może być pusta.
+ Liczba musi być dodatnia.
+ Możesz mieć maksymalnie jedno powtórzenie dziennie.
+ Utwórz nawyk
+ Edytuj nawyk
+ Zaznacz
+ Później
+
+ Witaj
+ Śledzenie nawyków Loop pozwala Ci na utworzenie i prowadzenie dobrych nawyków.
+ Utwórz nowe nawyki
+ Codziennie, po wykonaniu swojego nawyku, postaw znaczek w aplikacji.
+ Kontynuuj swoje nawyki
+ Nawyki wykonywane przez dłuższy czas otrzymają pełną gwiazdkę.
+ Śledź swój postęp
+ Szczegółowe grafiki pokazują jak Twoje nawyki polepszyły się z biegiem czasu.
+ 15 minut
+ 30 minut
+ 1 godzina
+ 2 godziny
+ 4 godziny
+ 8 godzin
+ 24 godziny
+ Przełącz powtarzanie krótkim naciśnięciem
+ Wygodniejsze, ale może spowodować przypadkowe przełączenia.
+ Czas drzemki między przypomnieniami
+ Oceń tę aplikację w Google Play
+ Prześlij uwagi do programisty
+ Zobacz kod źródłowy na GitHub\'ie
+ Zobacz wprowadzenie do aplikacji
+ Linki
+ Zachowanie
+ Nazwa
+ Ustawienia
+ Czas drzemki
+ Czy wiesz że?
+ Aby zmienić kolejność naciśnij i przytrzymaj na nazwie nawyku i przesuń go na odpowiednie miejsce.
+ Możesz zobaczyć więcej dni trzymając telefon poziomo.
+ Usuń nawyki
+ Nawyki zostaną trwale usunięte. Tej operacji nie można cofnąć.
+ Nawyk usunięty/nie znaleziony
+ Weekendy
+ Dni robocze
+ Każdy dzień
+ Wybierz dni
+ Eksportuj dane (CSV)
+ Gotowe
+ Wyczyść
+ Wybierz godziny
+ Wybierz minuty
+ O aplikacji
+ Tłumacze
+ Programiści
+ Wersja %s
+ Częstotliwość
+ Znacznik
+ Siła
+ Najlepsze serie
+ Aktualna seria
+ Liczba powtórzeń
+ Ostatnie %d dni
+ Ostatnie %d tygodni
+ Ostatnie %d miesięcy
+ Ostatnie %d lat
+ Od początku
+ Codziennie
+ Co tydzień
+ 2 razy na tydzień
+ 5 razy na tydzień
+ Niestandardowo...
+ Pomoc & FAQ
+ Eksportowanie danych nie powiodło się.
+ Importowanie danych nie powiodło się.
+ Plik nierozpoznany.
+ Nawyki zaimportowane pomyślnie.
+ Pełna kopia zapasowa pomyślnie wyeksportowana.
+ Importuj dane
+ Eksportuj pełną kopię zapasową
+ Wspiera pełne kopie zapasowe wyeksportowane przez tą aplikację zarówno jak i pliki wygenerowane przez Tickmate, Habitbull oraz Rewire. Zobacz FAQ po więcej informacji.
+ Generuje pliki, które mogą być otwierane przez arkusze kalkulacyjne takie jak Microsoft Excel czy OpenOffice Calc. Taki plik nie może być importowany.
+ Generuje plik, który zawiera wszystkie Twoje dane. Taki plik może być importowany.
+ Nie udało się wygenerować raportu o błędach.
+ Wygeneruj raport o błędach
+ Rozwiązywanie problemów
+ Pomóż w tłumaczeniu tej aplikacji
+ Tryb nocny
+ Używaj pełnej czerni w trybie nocnym
+ Zamienia szare tła na pełną czerń w trybie nocnym. Zmniejsza zużycie baterii w telefonach z ekranem AMOLED.
+ Interfejs
+ Odwróć kolejność dni
+ Pokaż dni w odwrotnej kolejności na głównym ekranie
+ Dzień
+ Tydzień
+ Miesiąc
+ Kwartał
+ Rok
+ Łącznie
+
+
+ raz w
+ Co %d dni
+ Co %d tygodni
+ Co %d miesięcy
+ Wynik
+ Dźwięk przypomnienia
+ Brak
+ Filtruj
+ Ukryj zakończone
+ Ukryj archiwizowane
+ Przypinaj powiadomienia
+ Zapobiega usunięciu powiadomień.
+ Napraw bazę danych
+ Baza danych została naprawiona.
+ Odznacz
+ Przełącz
+ Akcja
+ Nawyk
+ Sortuj
+ Ręcznie
+ Według nazwy
+ Według koloru
+ Według wyniku
+ Pobierz
+ Eksportuj
+
diff --git a/android/uhabits-android/src/main/res/values-pl/strings.xml b/android/uhabits-android/src/main/res/values-pl/strings.xml
deleted file mode 100644
index 48ec343a7..000000000
--- a/android/uhabits-android/src/main/res/values-pl/strings.xml
+++ /dev/null
@@ -1,178 +0,0 @@
-
-
-
-
- Śledzenie Nawyków Loop
- Nawyki
- Ustawienia
- Edytuj
- Usuń
- Archiwizuj
- Odarchiwizuj
- Dodaj nawyk
- Zmień kolor
- Utworzono nawyk
- Usunięto nawyki
- Przywrócono nawyki
- Nic do cofnięcia
- Nic do powtórzenia
- Zmieniono nawyk
- Zmieniono nawyk z powrotem
- Nawyki zarchiwizowane
- Nawyki odarchiwizowane
- Przegląd
- Siła nawyku
- Historia
- Wyczyść
- Pytanie (Czy zrobiłeś ... dzisiaj?)
- Powtórz
- razy w
- dni
- Przypomnienie
- Odrzuć
- Zapisz
- Serie
- Nie masz aktywnych nawyków
- Naciśnij i przytrzymaj aby zaznaczyć lub odznaczyć
- Wyłączone
- Nazwa nie może być pusta.
- Liczba musi być dodatnia.
- Możesz mieć maksymalnie jedno powtórzenie dziennie.
- Utwórz nawyk
- Edytuj nawyk
- Zaznacz
- Później
-
- Witaj
- Śledzenie nawyków Loop pozwala Ci na utworzenie i prowadzenie dobrych nawyków.
- Utwórz nowe nawyki
- Codziennie, po wykonaniu swojego nawyku, postaw znaczek w aplikacji.
- Kontynuuj swoje nawyki
- Nawyki wykonywane przez dłuższy czas otrzymają pełną gwiazdkę.
- Śledź swój postęp
- Szczegółowe grafiki pokazują jak Twoje nawyki polepszyły się z biegiem czasu.
- 15 minut
- 30 minut
- 1 godzina
- 2 godziny
- 4 godziny
- 8 godzin
- 24 godziny
- Przełącz powtarzanie krótkim naciśnięciem
- Wygodniejsze, ale może spowodować przypadkowe przełączenia.
- Czas drzemki między przypomnieniami
- Oceń tę aplikację w Google Play
- Prześlij uwagi do programisty
- Zobacz kod źródłowy na GitHub\'ie
- Zobacz wprowadzenie do aplikacji
- Linki
- Zachowanie
- Nazwa
- Ustawienia
- Czas drzemki
- Czy wiesz że?
- Aby zmienić kolejność naciśnij i przytrzymaj na nazwie nawyku i przesuń go na odpowiednie miejsce.
- Możesz zobaczyć więcej dni trzymając telefon poziomo.
- Usuń nawyki
- Nawyki zostaną trwale usunięte. Tej operacji nie można cofnąć.
- Nawyk usunięty/nie znaleziony
- Weekendy
- Dni robocze
- Każdy dzień
- Wybierz dni
- Eksportuj dane (CSV)
- Gotowe
- Wyczyść
- Wybierz godziny
- Wybierz minuty
- O aplikacji
- Tłumacze
- Programiści
- Wersja %s
- Częstotliwość
- Znacznik
- Siła
- Najlepsze serie
- Aktualna seria
- Liczba powtórzeń
- Ostatnie %d dni
- Ostatnie %d tygodni
- Ostatnie %d miesięcy
- Ostatnie %d lat
- Od początku
- Codziennie
- Co tydzień
- 2 razy na tydzień
- 5 razy na tydzień
- Niestandardowo...
- Pomoc & FAQ
- Eksportowanie danych nie powiodło się.
- Importowanie danych nie powiodło się.
- Plik nierozpoznany.
- Nawyki zaimportowane pomyślnie.
- Pełna kopia zapasowa pomyślnie wyeksportowana.
- Importuj dane
- Eksportuj pełną kopię zapasową
- Wspiera pełne kopie zapasowe wyeksportowane przez tą aplikację zarówno jak i pliki wygenerowane przez Tickmate, Habitbull oraz Rewire. Zobacz FAQ po więcej informacji.
- Generuje pliki, które mogą być otwierane przez arkusze kalkulacyjne takie jak Microsoft Excel czy OpenOffice Calc. Taki plik nie może być importowany.
- Generuje plik, który zawiera wszystkie Twoje dane. Taki plik może być importowany.
- Nie udało się wygenerować raportu o błędach.
- Wygeneruj raport o błędach
- Rozwiązywanie problemów
- Pomóż w tłumaczeniu tej aplikacji
- Tryb nocny
- Używaj pełnej czerni w trybie nocnym
- Zamienia szare tła na pełną czerń w trybie nocnym. Zmniejsza zużycie baterii w telefonach z ekranem AMOLED.
- Interfejs
- Odwróć kolejność dni
- Pokaż dni w odwrotnej kolejności na głównym ekranie
- Dzień
- Tydzień
- Miesiąc
- Kwartał
- Rok
- Łącznie
-
- raz w
- Co %d dni
- Co %d tygodni
- Co %d miesięcy
- Wynik
- Dźwięk przypomnienia
- Brak
- Filtruj
- Ukryj zakończone
- Ukryj archiwizowane
- Przypinaj powiadomienia
- Zapobiega usunięciu powiadomień.
- Napraw bazę danych
- Baza danych została naprawiona.
- Odznacz
- Przełącz
- Akcja
- Nawyk
- Sortuj
- Ręcznie
- Według nazwy
- Według koloru
- Według wyniku
- Pobierz
- Eksportuj
-
diff --git a/android/uhabits-android/src/main/res/values-pt-rBR/strings.xml b/android/uhabits-android/src/main/res/values-pt-rBR/strings.xml
index dcc65bdc0..b152f02af 100644
--- a/android/uhabits-android/src/main/res/values-pt-rBR/strings.xml
+++ b/android/uhabits-android/src/main/res/values-pt-rBR/strings.xml
@@ -19,160 +19,187 @@
~ with this program. If not, see .
-->
- Loop - Acompanhador de Hábitos
- Hábitos
- Configurações
- Editar
- Deletar
- Arquivar
- Desarquivar
- Adicionar hábito
- Mudar cor
- Hábito criado.
- Hábito deletado.
- Hábitos restaurados.
- Nada para desfazer.
- Nada para refazer.
- Hábito modificado.
- Hábito restaurado.
- Hábitos arquivados.
- Hábitos restaurados.
- Visão geral
- Estabilidade
- Histórico
- Limpar
- Pergunta (por ex., \"você meditou hoje?\")
- Repetir
- vezes em
- dias
- Lembrete
- Cancelar
- Salvar
- Correntes
- Você não tem nenhum hábito ativo
- Sustente por um segundo para marcar ou desmarcar
- Desligado
- Nome não pode ficar em branco.
- Número precisa ser positivo.
- Você pode ter no máximo uma repetição por dia.
- Criar hábito
- Editar hábito
- Marcar
- Mais tarde
-
- Bem vindo
- Loop é um aplicativo que te ajuda a criar e manter bons hábitos.
- Adicione alguns hábitos
- Todo dia, depois de praticar o seu hábito, marque no aplicativo.
- Continue praticando
- Hábitos praticados regularmente por um longo período recebem uma estrela.
- Acompanhe o seu progresso
- Veja como seus hábitos estão progredindo através de diagramas.
- 15 minutos
- 30 minutos
- 1 hora
- 2 horas
- 4 horas
- 8 horas
- 24 horas
- Marcar repetições com um toque curto
- Mais conveniente, mas pode causar marcações acidentais
- Duração do \"mais tarde\" nos lembretes
- Avaliar esse app no Google Play
- Mandar sugestões para o desenvolvedor
- Ver código-fonte no GitHub
- Assistir introdução ao aplicativo
- Links
- Interação
- Nome
- Configurações
- Duração do \"mais tarde\"
- Dica
- Para mudar a ordem dos hábitos, aperte no nome do hábito, sustente e arraste.
- Para ver mais dias, coloque seu aparelho em modo paisagem.
- Deletar hábitos
- Os hábitos escolhidos serão deletados permanentemente. Esta ação não pode ser desfeita.
- Hábito deletado / não encontrado
- Fim de semana
- Segunda a sexta
- Qualquer dia da semana
- Selecionar dias
- Exportar em formato CSV
- Pronto
- Limpar
- Selecionar horas
- Selecionar minutos
- Sobre
- Tradutores
- Desenvolvedores
- Versão %s
- Frequência
- Marcações
- Estabilidade
- Correntes mais longas
- Corrente atual
- Número de repetições
- Últimos %d dias
- Últimas %d semanas
- Últimos %d meses
- Últimos %d anos
- Desde o início
- Todo dia
- Toda semana
- 2 vezes por semana
- 5 vezes por semana
- Personalizar ...
- Ajuda & FAQ
- Erro ao exportar dados.
- Erro ao importar dados.
- Arquivo não reconhecido.
- Hábitos importados com sucesso.
- Backup completo exportado com sucesso.
- Importar dados
- Exportar backup completo
- Aceita backups completos exportados por este app, além de arquivos gerados por Tickmate, HabitBull ou Rewire. Veja \"Ajuda\" para mais informações.
- Gera arquivos que podem ser abertos em editores de planilha, como Microsoft Excel ou Openoffice Calc. Estes arquivos não podem ser importados de volta.
- Gera um arquivo que contém todos os dados. Este arquivo pode ser importado de volta.
- Erro ao gerar relatório de erros.
- Gerar relatório de erros.
- Solução de problemas
- Ajude a traduzir este app
- Modo noturno
- Usar preto em modo noturno
- Substitui os tons de cinza por preto puro em modo noturno. Economiza bateria em telefones com tela AMOLED.
- Interface
- Inverter a ordem dos dias
- Mostra os dias em ordem inversa na tela principal
- Dia
- Semana
- Mês
- Trimestre
- Ano
- Total
-
- vez em
- A cada %d dias
- A cada %d semanas
- A cada %d meses
- Estabilidade
- Toque dos lembretes
- Nenhum
- Filtro
- Ocultar concluído
- Ocultar arquivado
- Tornar notificações persistentes
- Impede que as notificações sejam dispensadas.
- Reparar banco de dados
- Banco de dados reparado.
- Desmarcar
- Alternar
- Ação
- Hábito
- Ordenar
- Manualmente
- Por nome
- Por cor
- Por score
- Download
- Exportar
+ Loop - Acompanhador de Hábitos
+ Hábitos
+ Configurações
+ Editar
+ Deletar
+ Arquivar
+ Desarquivar
+ Adicionar hábito
+ Mudar cor
+ Hábito criado.
+ Hábito deletado.
+ Hábitos restaurados.
+ Nada para desfazer.
+ Nada para refazer.
+ Hábito modificado.
+ Hábito restaurado.
+ Hábitos arquivados.
+ Hábitos restaurados.
+ Visão geral
+ Estabilidade
+ Histórico
+ Limpar
+ Pergunta (por ex., \"você meditou hoje?\")
+ Repetir
+ vezes em
+ dias
+ Lembrete
+ Cancelar
+ Salvar
+ Correntes
+ Você não tem nenhum hábito ativo
+ Sustente por um segundo para marcar ou desmarcar
+ Desligado
+ Nome não pode ficar em branco.
+ Número precisa ser positivo.
+ Você pode ter no máximo uma repetição por dia.
+ Criar hábito
+ Editar hábito
+ Marcar
+ Mais tarde
+
+ Bem vindo
+ Loop é um aplicativo que te ajuda a criar e manter bons hábitos.
+ Adicione alguns hábitos
+ Todo dia, depois de praticar o seu hábito, marque no aplicativo.
+ Continue praticando
+ Hábitos praticados regularmente por um longo período recebem uma estrela.
+ Acompanhe o seu progresso
+ Veja como seus hábitos estão progredindo através de diagramas.
+ 15 minutos
+ 30 minutos
+ 1 hora
+ 2 horas
+ 4 horas
+ 8 horas
+ 24 horas
+ Perguntar sempre
+ Personalizar...
+ Marcar repetições com um toque curto
+ Mais conveniente, mas pode causar marcações acidentais
+ Duração do \"mais tarde\" nos lembretes
+ Avaliar esse app no Google Play
+ Mandar sugestões para o desenvolvedor
+ Ver código-fonte no GitHub
+ Assistir introdução ao aplicativo
+ Links
+ Interação
+ Nome
+ Configurações
+ Duração do \"mais tarde\"
+ Selecionar duração do \"mais tarde\"
+ Dica
+ Para mudar a ordem dos hábitos, aperte no nome do hábito, sustente e arraste.
+ Para ver mais dias, coloque seu aparelho em modo paisagem.
+ Deletar hábitos
+ Os hábitos escolhidos serão deletados permanentemente. Esta ação não pode ser desfeita.
+ Hábito deletado / não encontrado
+ Fim de semana
+ Segunda a sexta
+ Qualquer dia da semana
+ Selecionar dias
+ Exportar em formato CSV
+ Pronto
+ Limpar
+ Selecionar horas
+ Selecionar minutos
+ Por favor, selecione pelo menos um hábito
+ Sobre
+ Tradutores
+ Desenvolvedores
+ Versão %s
+ Frequência
+ Marcações
+ Estabilidade
+ Correntes mais longas
+ Corrente atual
+ Número de repetições
+ Últimos %d dias
+ Últimas %d semanas
+ Últimos %d meses
+ Últimos %d anos
+ Desde o início
+ Todo dia
+ Toda semana
+ 2 vezes por semana
+ 5 vezes por semana
+ Personalizar ...
+ Ajuda & FAQ
+ Erro ao exportar dados.
+ Erro ao importar dados.
+ Arquivo não reconhecido.
+ Hábitos importados com sucesso.
+ Backup completo exportado com sucesso.
+ Importar dados
+ Exportar backup completo
+ Aceita backups completos exportados por este app, além de arquivos gerados por Tickmate, HabitBull ou Rewire. Veja \"Ajuda\" para mais informações.
+ Gera arquivos que podem ser abertos em editores de planilha, como Microsoft Excel ou Openoffice Calc. Estes arquivos não podem ser importados de volta.
+ Gera um arquivo que contém todos os dados. Este arquivo pode ser importado de volta.
+ Erro ao gerar relatório de erros.
+ Gerar relatório de erros.
+ Solução de problemas
+ Ajude a traduzir este app
+ Modo noturno
+ Usar preto em modo noturno
+ Substitui os tons de cinza por preto puro em modo noturno. Economiza bateria em telefones com tela AMOLED.
+ Interface
+ Inverter a ordem dos dias
+ Mostra os dias em ordem inversa na tela principal
+ Dia
+ Semana
+ Mês
+ Trimestre
+ Ano
+ Total
+
+ Sim ou não
+ Número
+
+ vez em
+ A cada %d dias
+ A cada %d semanas
+ A cada %d meses
+ Estabilidade
+ Toque dos lembretes
+ Nenhum
+ Filtro
+ Ocultar concluído
+ Ocultar arquivado
+ Tornar notificações persistentes
+ Impede que as notificações sejam removidas.
+ Luz de notificação
+ Mostra uma luz piscando para lembretes. Disponível apenas em telefones com luzes de notificação LED.
+ Reparar banco de dados
+ Banco de dados reparado.
+ Desmarcar
+ Alternar
+ Ação
+ Hábito
+ Ordenar
+ Manualmente
+ Por nome
+ Por cor
+ Por score
+ Download
+ Exportar
+ Pressione e segure para alterar o valor
+ Alterar valor
+ Calendário
+ Unidade
+ Contagem
+ Este campo não deve ficar em branco
+ ex.: Quantos passos você deu hoje?
+ ex.: passos
+ ex.: Você se exercitou hoje?
+ Questão
+ Alvo
+ Sim
+ Não
+ Alterar som, vibração, luz e outras configurações de notificação
+ Personalizar notificações
+ Ver política de privacidade
+ Exibir todos os colaboradores…
+ Banco de dados
diff --git a/android/uhabits-android/src/main/res/values-pt-rPT/strings.xml b/android/uhabits-android/src/main/res/values-pt-rPT/strings.xml
index 3dd2b3541..cc6eeb31c 100644
--- a/android/uhabits-android/src/main/res/values-pt-rPT/strings.xml
+++ b/android/uhabits-android/src/main/res/values-pt-rPT/strings.xml
@@ -19,136 +19,186 @@
~ with this program. If not, see .
-->
- Hábitos
- Definições
- Editar
- Eliminar
- Arquivar
- Desarquivar
- Adicionar hábito
- Mudar cor
- Hábito criado.
- Hábito eliminado.
- Hábito restaurado.
- Nada a anular.
- Nada a refazer.
- Hábito modificado.
- Hábito restaurado.
- Hábito arquivado.
- Hábito desarquivado.
- Visão geral
- Pontuação
- Histórico
- Limpar
- Pergunta (e.g., já meditou hoje?)
- Repetir
- vezes em
- dias
- Lembrete
- Cancelar
- Guardar
- Séries
- Não tem hábitos ativos
- Mantenha pressionado para marcar ou desmarcar
- Desligado
- Nome não pode estar em branco.
- Número tem de ser positivo.
- Apenas pode ter no máximo uma repetição por dia
- Criar hábito
- Editar hábito
- Selecionar
- Mais tarde
-
- Bem-vindo
- Loop é uma aplicação que o ajuda a criar e manter bons hábitos.
- Adicione alguns hábitos
- Todos os dias, após concluir o seu hábito, marque uma cruz na app.
- Continue praticando
- Hábitos praticados regularmente durante algum tempo recebem uma estrela.
- Acompanhe o seu progresso
- Gráficos mostram-lhe como os seus hábitos melhoraram ao longo do tempo.
- 15 minutos
- 30 minutos
- 1 hora
- 2 horas
- 4 horas
- 8 horas
- Toque para alternar entre repetições
- Mais conveniente, mas pode causar toques acidentais
- Intervalo da opção \'Mais Tarde\' nos lembretes
- Avaliar a app no Google Play
- Enviar feedback ao programador
- Ver código-fonte no GitHub
- Ver introdução da aplicação
- Comportamento
- Nome
- Definições
- Intervalo da opção \'Mais Tarde\'
- Sabia que?
- Para reorganizar a lista, mantenha pressionado o nome do hábito e arraste-o para o lugar certo.
- Pode ver mais dias se utilizar o telemóvel em modo paisagem.
- Apagar hábitos
- Os hábitos serão permanentemente eliminados. Esta ação é irreversível.
- Fins de Semana
- Segunda a Sexta
- Qualquer dia da semana
- Selecionar dias
- Exportar como CSV
- Concluído
- Limpar
- Selecionar horas
- Selecionar minutos
- Sobre
- Tradutores
- Programadores
- Versão %s
- Frequência
- Cruz
- Pontuação
- Melhores séries
- Série atual
- Número de repetições
- Últimos %d dias
- Últimas %d semanas
- Últimos %d meses
- Últimos %d anos
- Desde sempre
- Todos os dias
- Todas as semanas
- 2 vezes por semana
- 5 vezes por semana
- Personalizar...
- Ajuda & FAQ
- Falha ao exportar dados.
- Falha ao importar dados.
- Ficheiro não reconhecido.
- Hábitos importados com sucesso.
- Cópia de segurança completa exportada com sucesso.
- Importar dados
- Exportar cópia de segurança completa
- Suporta cópias de segurança completas exportadas por esta app, bem como ficheiros gerados pelo Tickmate, HabitBull ou Rewire. Veja as FAQ para mais informações.
- Gera ficheiros que podem ser abertos por programas de folhas de cálculo, como o Microsoft Excel ou o OpenOffice Calc. Este ficheiro não pode ser importado novamente para a app.
- Gera um ficheiro que contém todos os dados dos seus hábitos. Este ficheiro pode ser novamente importado para a app.
- Falha a gerar relatório de erros.
- Gerar relatório de erros
- Resolução de problemas
- Ajude a traduzir esta aplicação
- Modo noturno
- Usar preto puro no modo noturno
- Substitui os fundos cinzentos por pretos puros no modo noturno. Reduz a utilização da bateria em telemóveis com ecrã AMOLED.
- Inverter a ordem dos dias
- Mostra os dias em ordem inversa na página principal
- Dia
- Semana
- Mês
- Trimestre
- Ano
-
- vez em
- A cada %d dias
- A cada %d semanas
- A cada %d meses
- Pontuação
- Som do lembrete
- Silencioso
+ Loop - Acompanhador de Hábitos
+ Hábitos
+ Definições
+ Editar
+ Eliminar
+ Arquivar
+ Desarquivar
+ Adicionar hábito
+ Mudar cor
+ Hábito criado.
+ Hábito eliminado.
+ Hábito restaurado.
+ Nada a anular.
+ Nada a refazer.
+ Hábito modificado.
+ Hábito restaurado.
+ Hábito arquivado.
+ Hábito desarquivado.
+ Visão geral
+ Pontuação
+ Histórico
+ Limpar
+ Pergunta (e.g., já meditou hoje?)
+ Repetir
+ vezes em
+ dias
+ Lembrete
+ Cancelar
+ Guardar
+ Séries
+ Não tem hábitos ativos
+ Mantenha pressionado para marcar ou desmarcar
+ Desligado
+ Nome não pode estar em branco.
+ Número tem de ser positivo.
+ Apenas pode ter no máximo uma repetição por dia
+ Criar hábito
+ Editar hábito
+ Selecionar
+ Mais tarde
+
+ Bem-vindo
+ Loop é uma aplicação que o ajuda a criar e manter bons hábitos.
+ Adicione alguns hábitos
+ Todos os dias, após concluir o seu hábito, marque uma cruz na app.
+ Continue praticando
+ Hábitos praticados regularmente durante algum tempo recebem uma estrela.
+ Acompanhe o seu progresso
+ Gráficos mostram-lhe como os seus hábitos melhoraram ao longo do tempo.
+ 15 minutos
+ 30 minutos
+ 1 hora
+ 2 horas
+ 4 horas
+ 8 horas
+ 24 horas
+ Perguntar sempre
+ Personalizar...
+ Toque para alternar entre repetições
+ Mais conveniente, mas pode causar toques acidentais
+ Intervalo da opção \'Mais Tarde\' nos lembretes
+ Avaliar a app no Google Play
+ Enviar feedback ao programador
+ Ver código-fonte no GitHub
+ Ver introdução da aplicação
+ Hiperligações
+ Comportamento
+ Nome
+ Definições
+ Intervalo da opção \'Mais Tarde\'
+ Sabia que?
+ Para reorganizar a lista, mantenha pressionado o nome do hábito e arraste-o para o lugar certo.
+ Pode ver mais dias se utilizar o telemóvel em modo paisagem.
+ Apagar hábitos
+ Os hábitos serão permanentemente eliminados. Esta ação é irreversível.
+ Habit deletado / não encontrado
+ Fins de Semana
+ Segunda a Sexta
+ Qualquer dia da semana
+ Selecionar dias
+ Exportar como CSV
+ Concluído
+ Limpar
+ Selecionar horas
+ Selecionar minutos
+ Por favor, selecione pelo menos um hábito
+ Sobre
+ Tradutores
+ Programadores
+ Versão %s
+ Frequência
+ Cruz
+ Pontuação
+ Melhores séries
+ Série atual
+ Número de repetições
+ Últimos %d dias
+ Últimas %d semanas
+ Últimos %d meses
+ Últimos %d anos
+ Desde sempre
+ Todos os dias
+ Todas as semanas
+ 2 vezes por semana
+ 5 vezes por semana
+ Personalizar...
+ Ajuda & FAQ
+ Falha ao exportar dados.
+ Falha ao importar dados.
+ Ficheiro não reconhecido.
+ Hábitos importados com sucesso.
+ Cópia de segurança completa exportada com sucesso.
+ Importar dados
+ Exportar cópia de segurança completa
+ Suporta cópias de segurança completas exportadas por esta app, bem como ficheiros gerados pelo Tickmate, HabitBull ou Rewire. Veja as FAQ para mais informações.
+ Gera ficheiros que podem ser abertos por programas de folhas de cálculo, como o Microsoft Excel ou o OpenOffice Calc. Este ficheiro não pode ser importado novamente para a app.
+ Gera um ficheiro que contém todos os dados dos seus hábitos. Este ficheiro pode ser novamente importado para a app.
+ Falha a gerar relatório de erros.
+ Gerar relatório de erros
+ Resolução de problemas
+ Ajude a traduzir esta aplicação
+ Modo noturno
+ Usar preto puro no modo noturno
+ Substitui os fundos cinzentos por pretos puros no modo noturno. Reduz a utilização da bateria em telemóveis com ecrã AMOLED.
+ Interface
+ Inverter a ordem dos dias
+ Mostra os dias em ordem inversa na página principal
+ Dia
+ Semana
+ Mês
+ Trimestre
+ Ano
+ Total
+
+ Sim / Não
+ Número
+
+ vez em
+ A cada %d dias
+ A cada %d semanas
+ A cada %d meses
+ Pontuação
+ Som do lembrete
+ Silencioso
+ Filtro
+ Ocultar concluídos
+ Ocultar arquivado
+ Tornar as notificações persistentes
+ Impede que as notificações sejam removidas.
+ Luz de notificação
+ Mostra uma luz piscando para lembretes. Disponível apenas em telefones com luzes de notificação LED.
+ Reparar base de dados
+ Banco de dados reparado.
+ Não verificar
+ Alternar
+ Acção
+ Hábit
+ Ordenar
+ Manualmente
+ Por nome
+ Por cor
+ Por pontuação
+ Transferir
+ Exportar
+ Pressione e segure para alterar o valor
+ Alterar o valor
+ Calendário
+ Unidade
+ Quantidade
+ Este campo não pode ficar em branco
+ ex.: Quantos passos você deu hoje?
+ ex.: passos
+ ex.: Você se exercitou hoje?
+ Pergunta
+ Alvo
+ Sim
+ Não
+ Alterar som, vibração, luz e outras configurações de notificação
+ Personalizar notificações
+ Ver política de privacidade
+ Ver todos os colaboradores…
+ Banco de dados
diff --git a/android/uhabits-android/src/main/res/values-ro-rRO/strings.xml b/android/uhabits-android/src/main/res/values-ro-rRO/strings.xml
new file mode 100644
index 000000000..c83b5f84d
--- /dev/null
+++ b/android/uhabits-android/src/main/res/values-ro-rRO/strings.xml
@@ -0,0 +1,179 @@
+
+
+
+
+ Loop Habit Tracker
+ Obiceiuri
+ Setări
+ Editează
+ Șterge
+ Arhivează
+ Dezarhivează
+ Adaugă un obicei
+ Schimbă culoarea
+ Obicei creat.
+ Obicei șters.
+ Obicei restabilit.
+ Nimic de anulat.
+ Nimic de refăcut.
+ Obicei schimbat.
+ Obicei restabilit.
+ Obicei arhivat.
+ Obicei dezarhivat.
+ Prezentare generală
+ Graficul obiceiurilor
+ Istoric
+ Golește
+ Întrebare (Ai făcut ... astăzi?)
+ Repetă
+ ori în
+ zile
+ Atenționare
+ Renunță
+ Salvează
+ Zile consecutive
+ Nu ai niciun obicei activ.
+ Apasă și ține pentru a bifa sau a debifa
+ Dezactivat
+ Numele nu poate fi necompletat.
+ Numărul trebuie să fie pozitiv.
+ Poți avea cel mult o repetiție pe zi
+ Creează obiceiul
+ Editează obiceiul
+ Bifează
+ Mai târziu
+
+ Bine ai venit
+ Loop Habit Tracker te ajută să creezi și să menții obiceiurile bune.
+ Creează noi obiceiuri
+ În fiecare zi, după ce îndeplinești obiceiul, bifează-l în aplicație.
+ Continuă să faci asta
+ Obiceiurile îndeplinite în mod constant pentru o lungă perioadă de timp vor primi o stea.
+ Urmărește progresul
+ Grafice detaliate ce prezintă cum obiceiurile tale s-au îmbunătățit în timp.
+ 15 minute
+ 30 de minute
+ 1 oră
+ 2 ore
+ 4 ore
+ 8 ore
+ 24 de ore
+ Comută repetițiile printr-o apăsare scurtă
+ Mai convenabil, dar poate cauza comutări accidentale.
+ Intervalul de amânare al atenționării
+ Evaluează aplicația pe Magazin Play
+ Trimite păreri dezvoltatorului
+ Vezi codul sursă pe GitHub
+ Vezi introducerea aplicației
+ Aplicație
+ Comportament
+ Nume
+ Setări
+ Intervalul de amânare
+ Știai?
+ Pentru a rearanja obiceiurile, apasă și ține numele obiceiului, apoi trage-l în locul corect.
+ Poți vedea mai multe zile în modul peisaj.
+ Șterge obiceiurile
+ Obiceiurile vor fi șterse permanent. Această acțiune nu este reversibilă.
+ Obicei șters / negăsit
+ Weekenduri
+ Zile de lucru
+ Orice zi
+ Selectează zilele
+ Exportă datele în format CSV
+ Terminat
+ Golește
+ Selectează orele
+ Selectează minutele
+ Despre
+ Traducători
+ Dezvoltatori
+ Versiunea %s
+ Frecvență
+ Bifă
+ Putere
+ Cele mai multe zile consecutive
+ Numărul curent de reușite succesive
+ Număr de repetiții
+ Ultimele %d zile
+ Ultimele %d săptămâni
+ Ultimele %d luni
+ Ultimii %d ani
+ Dintotdeauna
+ În fiecare zi
+ În fiecare săptămână
+ De 2 ori pe săptămână
+ De 5 ori pe săptămână
+ Personalizat …
+ Ajutor & Întrebări frecvente
+ Exportare nereușită.
+ Importare nereușită.
+ Fișier nerecunoscut.
+ Obiceiuri importate cu succes.
+ Backup exportat cu succes.
+ Importă date
+ Exportă backup
+ Acceptă backup-uri exportate de această aplicație precum și fișiere generate de Tickmate, HabitBull sau Rewire. Vezi „Întrebări frecvente” pentru mai multe informații.
+ Generează fișiere ce pot fi deschise de software de foi de calcul precum Microsoft Office sau OpenOffice Calc. Acest fișier nu poate fi importat înapoi.
+ Generează un fișier ce conține toate datele tale. Acest fișier poate fi importat înapoi.
+ Generare raport de erori nereușită.
+ Generează raport de erori
+ Depanare
+ Ajută la traducerea aplicației
+ Mod întunecat
+ Utilizează modul întunecat
+ Înlocuiește fundalurile gri cu negru pur în modul întunecat. Reduce utilizarea bateriei la telefoanele cu ecran AMOLED.
+ Interfață
+ Inversează ordinea zilelor
+ Arată zilele în ordine inversă pe ecranul principal
+ Zi
+ Săptămână
+ Lună
+ Trimestru
+ An
+ Total
+
+
+ dată la
+ La fiecare %d zile
+ La fiecare %d săptămâni
+ La fiecare %d luni
+ Scor
+ Sunetul atenționării
+ Niciunul
+ Filtru
+ Ascunde cele completate
+ Ascunde cele arhivate
+ Notificări lipicioase
+ Împiedică eliminarea notificărilor.
+ Repară baza de date
+ Baza de date reparată.
+ Debifează
+ Comută
+ Acțiuni
+ Obicei
+ Sortează
+ Manual
+ După nume
+ După culoare
+ După scor
+ Descarcă
+ Exportă
+
diff --git a/android/uhabits-android/src/main/res/values-ro/strings.xml b/android/uhabits-android/src/main/res/values-ro/strings.xml
deleted file mode 100644
index 00fe73a25..000000000
--- a/android/uhabits-android/src/main/res/values-ro/strings.xml
+++ /dev/null
@@ -1,157 +0,0 @@
-
-
-
-
- Obiceiuri
- Setări
- Editează
- Șterge
- Arhivează
- Dezarhivează
- Adaugă obicei
- Schimbă culoarea
- Obicei creat.
- Obicei șters.
- Obicei restabilit.
- Nimic de anulat.
- Nimic de refăcut.
- Obicei schimbat.
- Obicei restabilit.
- Obicei arhivat.
- Obicei dezarhivat.
- Imagine de ansamblu
- Puterea obiceiurilor
- Istoric
- Golește
- Întrebare (Ai facut ... astăzi?)
- Repetă de
- ori în
- zile
- Reamintire
- Renunță
- Salvează
- Zile consecutive
- Nu ai niciun obicei activ.
- Apasă și ține pentru a bifa sau a debifa
- Dezactivat
- Numele nu poate fi necompletat.
- Numărul trebuie să fie pozitiv.
- Poți avea maxim o repetiție pe zi.
- Adaugă obicei
- Editează obicei
- Bifează
- Mai tarziu
-
- Bun venit
- Loop Habit Tracker te ajută să creezi și să menții obiceiurile bune.
- Adaugă noi obiceiuri
- În fiecare zi, după ce îndeplinești obiceiul, bifează-l în aplicație.
- Continuă să faci asta
- Obiceiurile îndeplinite în mod constant pentru o lungă perioadă de timp vor primi o stea.
- Urmărește progresul
- Grafice detaliate ce prezintă cum obiceiurile tale s-au îmbunătățit în timp.
- 15 minute
- 30 de minute
- 1 oră
- 2 ore
- 4 ore
- 8 ore
- Comută repetițiile printr-o apăsare scurtă
- Mai convenabil, dar poate cauza comutări accidentale.
- Intervalul de amânare al reamintirilor.
- Evaluează aplicația pe Google Play
- Trimite feedback dezvoltatorului
- Vezi codul sursă pe GitHub
- Vezi introducerea aplicației
- Linkuri
- Comportament
- Nume
- Setări
- Interval de amânare
- Știai?
- Pentru a rearanja obiceiurile, apasă și ține numele obiceiului, apoi trage-l în locul corect.
- Poți vedea mai multe zile în modul peisaj.
- Șterge obiceiuri
- Obiceiurile vor fi șterse permanent. Această acțiune nu este reversibilă.
- Obicei şters / negăsit
- Weekenduri
- Zile de lucru
- Orice zi
- Selectează zilele
- Exportă datele în format CSV
- Terminat
- Golește
- Selectează orele
- Selectează minutele
- Despre
- Traducători
- Dezvoltatori
- Versiunea %s
- Frecvență
- Bifă
- Putere
- Cele mai multe zile consecutive
- Numărul curent de reușite succesive
- Număr de repetiții
- Ultimele %d zile
- Ultimele %d săptămâni
- Ultimele %d luni
- Ultimii %d ani
- Totdeauna
- În fiecare zi
- În fiecare săptămână
- De 2 ori pe săptămână
- De 5 ori pe săptămână
- Personalizare ...
- Ajutor & Întrebări frecvente
- Exportare nereușită.
- Importare nereușită.
- Fișier nerecunoscut.
- Obiceiuri importate cu succes.
- Backup exportat cu succes.
- Importă date
- Exportă backup
- Acceptă backup-uri exportate de această aplicație precum și fișiere generate de Tickmate, HabitBull sau Rewire. Vezi „Întrebări frecvente” pentru mai multe informații.
- Generează fișiere ce pot fi deschise de software de foi de calcul precum Microsoft Office sau OpenOffice Calc. Acest fișier nu poate fi importat înapoi.
- Generează un fișier ce conține toate datele tale. Acest fișier poate fi importat înapoi.
- Generare raport de erori nereușită.
- Generează raport de erori
- Depanare
- Inversează ordinea zilelor
- Zi
- Săptămână
- Lună
- Trimestru
- An
- Total
-
- dată la
- La fiecare %d zile
- La fiecare %d săptămâni
- La fiecare %d luni
- Ascunde cele completate
- Ascunde cele arhivate
- Debifează
- Obicei
- Sortează
- Manual
- După nume
- După culoare
-
diff --git a/android/uhabits-android/src/main/res/values-ru-rRU/strings.xml b/android/uhabits-android/src/main/res/values-ru-rRU/strings.xml
new file mode 100644
index 000000000..cf3268014
--- /dev/null
+++ b/android/uhabits-android/src/main/res/values-ru-rRU/strings.xml
@@ -0,0 +1,205 @@
+
+
+
+
+ Трекер привычек Loop
+ Привычки
+ Настройки
+ Редактировать
+ Удалить
+ Архивировать
+ Вернуть из архива
+ Добавить привычку
+ Изменить цвет
+ Привычка создана
+ Привычки удалены
+ Привычки восстановлены
+ Отменять нечего
+ Повторять нечего
+ Привычка изменена
+ Изменения привычки отменены
+ Привычки архивированы
+ Привычки возвращены из архива
+ Обзор
+ Сила привычки
+ История
+ Очистить
+ Вопрос (пример: \"Делали ли вы сегодня зарядку?\")
+ Повторять
+ раз в
+ дней
+ Напоминание
+ Отменить
+ Сохранить
+ Рекорды
+ У вас нет активных привычек
+ Нажмите и удерживайте, чтобы установить или снять галочку
+ Выкл
+ Название не может быть пустым.
+ Число должно быть положительным.
+ Может быть не более одного повторения в день
+ Добавить привычку
+ Изменить привычку
+ Отметить
+ Отложить
+
+ Добро пожаловать
+ Loop Habit Tracker помогает вам заводить и поддерживать полезные привычки.
+ Добавьте несколько привычек
+ Каждый день, после выполнения вашей привычки, поставьте галочку в приложении.
+ Продолжайте в том же духе
+ Стойко соблюдаемые привычки будут отмечены полной звёздочкой.
+ Отслеживайте свои успехи
+ Детализированные диаграммы демонстрируют, как ваши привычки улучшились со временем.
+ 15 минут
+ 30 минут
+ 1 час
+ 2 часа
+ 4 часа
+ 8 часов
+ 24 часа
+ Всегда спрашивать
+ Настроить...
+ Отмечать коротким нажатием
+ Ставить галочки коротким нажатием вместо удержания. Удобнее, но может стать причиной случайных отметок.
+ Интервал откладывания напоминаний
+ Оценить приложение в Google Play
+ Отправить сообщение разработчику
+ Посмотреть исходный код на GitHub
+ Посмотреть вступительные инструкции
+ Ссылки
+ Поведение
+ Название
+ Настройки
+ Интервал откладывания
+ Задержка повтора
+ А вы знали?
+ Чтобы поменять порядок записей, нажмите и удерживайте название записи, затем перетащите её на нужное место.
+ В горизонтальном режиме отображается больше дней.
+ Удалить привычки
+ Привычки будут удалены. Это действие невозможно отменить.
+ Привычка удалена / не найдена
+ По выходным
+ По будням
+ Каждый день
+ Выберите дни
+ Экспортировать как CSV
+ Готово
+ Очистить
+ Выберите часы
+ Выберите минуты
+ Пожалуйста, выберите хотя бы одну привычку
+ О приложении
+ Переводчики
+ Разработчики
+ Версия %s
+ Частота
+ Галочка
+ Сила
+ Лучшие серии
+ Текущая серия
+ Количество повторений
+ Последние %d дней
+ Последние %d недель
+ Последние %d месяцев
+ Последние %d лет
+ За всё время
+ Каждый день
+ Каждую неделю
+ 2 раза в неделю
+ 5 раз в неделю
+ Другое …
+ Помощь и FAQ
+ Ошибка экспорта данных.
+ Ошибка импорта данных.
+ Невозможно определить тип файла.
+ Привычки успешно импортированы.
+ Полная резервная копия успешно экспортирована.
+ Импортировать данные
+ Экспортировать полную резервную копию
+ Поддерживает полные резервные копии, экспортированные из этого приложения, а также файлы, сгенерированные приложениями Tickmate, HabitBull и Rewire. Подробнее смотрите в FAQ.
+ Генерирует файлы, которые можно открыть в ПО для работы с таблицами (таком как Microsoft Excel или OpenOffice Calc). Этот файл нельзя импортировать обратно.
+ Генерирует файл, который содержит все ваши данные. Этот файл можно импортировать обратно.
+ Ошибка генерации отчёта об ошибке.
+ Сгенерировать отчёт об ошибке
+ Устранение неполадок
+ Помогите перевести это приложение
+ Ночной режим
+ Использовать подлинный чёрный в ночном режиме
+ Заменяет серый фон на подлинный чёрный в ночном режиме. Сокращает расход батареи в телефонах с дисплеем AMOLED.
+ Интерфейс
+ Обратный порядок дней
+ Показывать дни в обратном порядке на главном экране
+ День
+ Неделя
+ Месяц
+ Квартал
+ Год
+ Всего
+
+ Да или Нет
+ Количество
+
+ раз за
+ Каждые %d дней
+ Каждые %d недель
+ Каждые %d месяцев
+ Результат
+ Звук напоминания
+ Без звука
+ Фильтр
+ Скрыть завершённые
+ Скрыть архивированные
+ Сделать уведомления \"липкими\"
+ Предотвращает смахивание уведомлений.
+ Световая индикация
+ Мигать индикатором для напоминаний. Доступно только в телефонах со светодиодным индикатором событий.
+ Исправить базу данных
+ База данных исправлена.
+ Снять отметку
+ Переключить
+ Действие
+ Привычка
+ Сортировка
+ Вручную
+ По названию
+ По цвету
+ По результату
+ Загрузить
+ Экспортировать
+ Нажмите и удерживайте, чтобы изменить значение
+ Изменить значение
+ Календарь
+ Ед. изм.
+ Количество
+ Это поле не должно быть пустым
+ напр.: Сколько шагов вы прошли сегодня?
+ напр.: шаг(ов)
+ напр.: Вы упражнялись сегодня?
+ Вопрос
+ Цель
+ Да
+ Нет
+ Настройка параметров уведомлений: звук, вибрация, свет и др.
+ Настройка уведомлений
+ Посмотреть политику конфиденциальности
+ Посмотреть всех участников…
+ База данных
+
diff --git a/android/uhabits-android/src/main/res/values-ru/strings.xml b/android/uhabits-android/src/main/res/values-ru/strings.xml
deleted file mode 100644
index 6f026fd2e..000000000
--- a/android/uhabits-android/src/main/res/values-ru/strings.xml
+++ /dev/null
@@ -1,178 +0,0 @@
-
-
-
-
- Трекер привычек Loop
- Привычки
- Настройки
- Редактировать
- Удалить
- Архивировать
- Вернуть из архива
- Добавить привычку
- Изменить цвет
- Привычка создана
- Привычки удалены
- Привычки восстановлены
- Отменять нечего
- Повторять нечего
- Привычка изменена
- Изменения привычки отменены
- Привычки архивированы
- Привычки возвращены из архива
- Обзор
- Сила привычки
- История
- Очистить
- Вопрос (пример: \"Делали ли вы сегодня зарядку?\")
- Повторять
- раз в
- дней
- Напоминание
- Отменить
- Сохранить
- Рекорды
- У вас нет активных привычек
- Нажмите и удерживайте, чтобы установить или снять галочку
- Выкл
- Название не может быть пустым.
- Число должно быть положительным.
- Может быть не более одного повторения в день
- Добавить привычку
- Изменить привычку
- Отметить
- Отложить
-
- Добро пожаловать
- Loop Habit Tracker помогает вам заводить и поддерживать полезные привычки.
- Добавьте несколько привычек
- Каждый день, после выполнения вашей привычки, поставьте галочку в приложении.
- Продолжайте в том же духе
- Стойко соблюдаемые привычки будут отмечены полной звёздочкой.
- Отслеживайте свои успехи
- Детализированные диаграммы демонстрируют, как ваши привычки улучшились со временем.
- 15 минут
- 30 минут
- 1 час
- 2 часа
- 4 часа
- 8 часов
- 24 часа
- Отмечать коротким нажатием
- Ставить галочки коротким нажатием вместо удержания. Удобнее, но может стать причиной случайных отметок.
- Интервал откладывания напоминаний
- Оценить приложение в Google Play
- Отправить сообщение разработчику
- Посмотреть исходный код на GitHub
- Посмотреть вступительные инструкции
- Ссылки
- Поведение
- Название
- Настройки
- Интервал откладывания
- А вы знали?
- Чтобы поменять порядок записей, нажмите и удерживайте название записи, затем перетащите её на нужное место.
- В горизонтальном режиме отображается больше дней.
- Удалить привычки
- Привычки будут удалены. Это действие невозможно отменить.
- Привычка удалена / не найдена
- По выходным
- По будням
- Каждый день
- Выберите дни
- Экспортировать как CSV
- Готово
- Очистить
- Выберите часы
- Выберите минуты
- О приложении
- Переводчики
- Разработчики
- Версия %s
- Частота
- Галочка
- Сила
- Рекорды
- Текущая серия
- Количество повторений
- Последние %d дней
- Последние %d недель
- Последние %d месяцев
- Последние %d лет
- За всё время
- Каждый день
- Каждую неделю
- 2 раза в неделю
- 5 раз в неделю
- Другое …
- Помощь и FAQ
- Ошибка экспорта данных.
- Ошибка импорта данных.
- Невозможно определить тип файла.
- Привычки успешно импортированы.
- Полная резервная копия успешно экспортирована.
- Импортировать данные
- Экспортировать полную резервную копию
- Поддерживает импорт полной резервной копии, экспортированной этим приложением, а также файлов, сгенерированных приложениями Tickmate, HabitBull и Rewire. Больше информации в FAQ.
- Генерирует файлы, которые можно открыть в ПО для работы с таблицами (таком как Microsoft Excel или OpenOffice Calc). Этот файл нельзя импортировать обратно.
- Генерирует файл, который содержит все ваши данные. Этот файл можно импортировать обратно.
- Ошибка генерации отчёта об ошибке.
- Сгенерировать отчёт об ошибке
- Устранение неполадок
- Помогите перевести это приложение
- Ночной режим
- Использовать подлинный чёрный в ночном режиме
- Заменяет серый фон на подлинный чёрный в ночном режиме. Уменьшает использование батареи в телефонах с дисплеем AMOLED.
- Интерфейс
- Обратный порядок дней
- Показывать дни в обратном порядке на главном экране
- День
- Неделя
- Месяц
- Квартал
- Год
- Всего
-
- раз за
- Каждые %d дней
- Каждые %d недель
- Каждые %d месяцев
- Счет
- Звук напоминания
- Без звука
- Фильтр
- Скрыть завершённые
- Скрыть архивированные
- Сделать уведомления \"липкими\"
- Предотвращает смахивание уведомлений.
- Исправить базу данных
- База данных исправлена.
- Снять отметку
- Переключить
- Действие
- Привычка
- Сортировка
- Вручную
- По названию
- По цвету
- По оценке
- Загрузить
- Экспортировать
-
diff --git a/android/uhabits-android/src/main/res/values-sk-rSK/strings.xml b/android/uhabits-android/src/main/res/values-sk-rSK/strings.xml
new file mode 100644
index 000000000..fb70f5146
--- /dev/null
+++ b/android/uhabits-android/src/main/res/values-sk-rSK/strings.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
diff --git a/android/uhabits-android/src/main/res/values-sl-rSI/strings.xml b/android/uhabits-android/src/main/res/values-sl-rSI/strings.xml
new file mode 100644
index 000000000..8577e52a0
--- /dev/null
+++ b/android/uhabits-android/src/main/res/values-sl-rSI/strings.xml
@@ -0,0 +1,179 @@
+
+
+
+
+ Loop Sledilnik Navad
+ Navade
+ Nastavitve
+ Uredi
+ Izbriši
+ Arhiviraj
+ Odarhiviraj
+ Dodaj navado
+ Spremeni barvo
+ Navada ustvarjena
+ Navada izbrisana
+ Navada obnovljena
+ Nič za razveljaviti.
+ Nič za ponovno opraviti.
+ Navada spremenjena.
+ Navada obnovljena.
+ Navada arhivirana.
+ Navada dearhivirana.
+ Pregled
+ Moč navade
+ Zgodovina
+ Počisti
+ Vprašanje (Ste ... danes?)
+ Ponovi
+ krat v
+ dni
+ Opomnik
+ Zavrzi
+ Shrani
+ Serije
+ Nimate aktivnih navad
+ Pritisnite-in-držite, da označite ali odznačite
+ Izključeno
+ Ime ne more biti prazno.
+ Številka mora biti pozitivna.
+ Na dan lahko imate kvečjemu eno ponovitev
+ Ustvari navado
+ Spremeni navado
+ Označi
+ Kasneje
+
+ Dobrodošli
+ Loop Sledilnik Navad vam pomaga ustvariti in vzdrževati dobre navade.
+ Ustvari nekaj novih navad
+ Vsak dan, potem ko opravite vašo navado, vnesite kljukico v aplikacijo.
+ Kar tako naprej
+ Dalj časa dosledno izvedene Navade si bodo zaslužile polno zvezdo.
+ Spremljaj svoj napredek
+ Podrobni grafi vam pokažejo kako so se skozi čas vaše navede izboljšale.
+ 15 minut
+ 30 minut
+ 1 ura
+ 2 uri
+ 4 ure
+ 8 ur
+ 24 ur
+ Preklopi ponovitve s kratkim pritiskom
+ Bolj priročno ampak lahko povzroči nenamerne preklapljanje.
+ Interval dremeža na opomnikih
+ Oceni to aplikacijo na Google Play
+ Pošlji povratne informacije razvijalcem
+ Poglej izvorno kodo na GitHub
+ Poglej uvod aplikacije
+ Povezave
+ Obnašanje
+ Ime
+ Nastavitve
+ Interval dremeža
+ Ali ste vedeli?
+ Če želite preurediti vnose, pritisnite-in-držite na ime navade, nato pa jo povlecite na željeno mestu.
+ Ogledate si lahko več dni, s tem da telefon postavite v ležeči načinu.
+ Izbriši Navade
+ Navade bodo trajno izbrisane. Te operacije ni možno razveljaviti.
+ Izbrisana navada / ni najdena
+ Vikendi
+ Ponedeljek do Petka
+ Vsak dan v tednu
+ Izberi dni
+ Izvozi v CSV
+ Končano
+ Počisti
+ Izberi ure
+ Izberi minute
+ O aplikaciji
+ Prevajalci
+ Razvijalci
+ Verzija %s
+ Pogostost
+ Kljukica
+ Moč
+ Najboljša serija
+ Trenutna serija
+ Število ponovitev
+ Zadnjih %d dni
+ Zadnjih %d tednov
+ Zadnjih %d mesecev
+ Zadnjih %d let
+ Ves čas
+ Vsak dan
+ Vsak teden
+ 2 krat na teden
+ 5 krat na teden
+ Po meri ...
+ Pomoč & Pogosta vprašanja
+ Neuspešen izvoz podatkov.
+ Neuspešen uvoz podatkov.
+ Datoteka ni bila prepoznana.
+ Navade uspešno uvožene.
+ Popolna varnostna kopija uspešno izvožena.
+ Uvozi podatke
+ Izvozi popolno varnostno kopijo
+ Podpira polne varnostne kopije izvožene iz te aplikacije, kakor tudi datoteke, ki jih ustvari Tickmate, HabitBull ali Rewire. Glej Pogosta vprašanja za več informacij.
+ Generirane datoteke, ki se lahko odprejo s programsko opremo za preglednice, kot je Microsoft Excel ali OpenOffice Calc. Te datoteke ni mogoče uvoziti nazaj.
+ Ustvari datoteko, ki vsebuje vse podatke. To datoteko lahko nato uvozite nazaj.
+ Neuspeh pri ustvarjanju poročila o napakah
+ Ustvari poročilo o napakah
+ Odpravljanje napak
+ Pomagajte prevesti to aplikacijo
+ Nočni način
+ Uporabite popolno črnino v nočnem načinu
+ Zamenja siva ozadja s popolno črnino v nočnem načinu. Zmanjša porabo baterije na telefonih z AMOLED zasloni.
+ Vmesnik
+ Zamenjaj vrstni red dni
+ Prikaži dni v obratnem vrstnem redu na glavnem zaslonu
+ Dan
+ Teden
+ Mesec
+ Četrtletje
+ Leto
+ Skupaj
+
+
+ enkrat na
+ Vsakih %d dni
+ Vsakih %d tednov
+ Vsakih %d mesecev
+ Ocena
+ Zvok opomnika
+ Noben
+ Filter
+ Skrij končane
+ Skrij arhivirane
+ Naaredi obvestila lepljiva
+ Preprečuje, da lahko obvestila povlečete stran.
+ Popravi podatkovno zbirko
+ Podatkovna zbirka popravljena.
+ Odznači
+ Preklopi
+ Dejanje
+ Navada
+ Razvrsti
+ Ročno
+ Po imenu
+ Po barvi
+ Po rezultatu
+ Prenesi
+ Izvozi
+
diff --git a/android/uhabits-android/src/main/res/values-sl/strings.xml b/android/uhabits-android/src/main/res/values-sl/strings.xml
deleted file mode 100644
index 4dce0f2b6..000000000
--- a/android/uhabits-android/src/main/res/values-sl/strings.xml
+++ /dev/null
@@ -1,178 +0,0 @@
-
-
-
-
- Loop Navade
- Navade
- Nastavitve
- Uredi
- Izbriši
- Arhiviraj
- Odarhiviraj
- Dodaj navado
- Spremeni barvo
- Navada ustvarjena
- Navada izbrisana
- Navada obnovljena
- Nič za razveljaviti.
- Nič za ponovno opraviti.
- Navada spremenjena.
- Navada obnovljena.
- Navada arhivirana.
- Navada dearhivirana.
- Pregled
- Moč navade
- Zgodovina
- Počisti
- Vprašanje (Ste ... danes?)
- Ponovi
- krat v
- dni
- Opomnik
- Zavrzi
- Shrani
- Serije
- Nimate aktivnih navad
- Pritisnite-in-držite, da označite ali odznačite
- Izključeno
- Ime ne more biti prazno.
- Številka mora biti pozitivna.
- Na dan lahko imate kvečjemu eno ponovitev
- Ustvari navado
- Spremeni navado
- Označi
- Kasneje
-
- Dobrodošli
- Loop Sledilnik Navad vam pomaga ustvariti in vzdrževati dobre navade.
- Ustvari nekaj novih navad
- Vsak dan, potem ko opravite vašo navado, vnesite kljukico v aplikacijo.
- Kar tako naprej
- Dalj časa dosledno izvedene Navade si bodo zaslužile polno zvezdo.
- Spremljaj svoj napredek
- Podrobni grafi vam pokažejo kako so se skozi čas vaše navede izboljšale.
- 15 minut
- 30 minut
- 1 ura
- 2 uri
- 4 ure
- 8 ur
- 24 ur
- Preklopi ponovitve s kratkim pritiskom
- Bolj priročno ampak lahko povzroči nenamerne preklapljanje.
- Interval dremeža na opomnikih
- Oceni to aplikacijo na Google Play
- Pošlji povratne informacije razvijalcem
- Poglej izvorno kodo na GitHub
- Poglej uvod aplikacije
- Povezave
- Obnašanje
- Ime
- Nastavitve
- Interval dremeža
- Ali ste vedeli?
- Če želite preurediti vnose, pritisnite-in-držite na ime navade, nato pa jo povlecite na željeno mestu.
- Ogledate si lahko več dni, s tem da telefon postavite v ležeči načinu.
- Izbriši Navade
- Navade bodo trajno izbrisane. Te operacije ni možno razveljaviti.
- Izbrisana navada / ni najdena
- Vikendi
- Ponedeljek do Petka
- Vsak dan v tednu
- Izberi dni
- Izvozi v CSV
- Končano
- Počisti
- Izberi ure
- Izberi minute
- O aplikaciji
- Prevajalci
- Razvijalci
- Verzija %s
- Pogostost
- Kljukica
- Moč
- Najboljša serija
- Trenutna serija
- Število ponovitev
- Zadnjih %d dni
- Zadnjih %d tednov
- Zadnjih %d mesecev
- Zadnjih %d let
- Ves čas
- Vsak dan
- Vsak teden
- 2 krat na teden
- 5 krat na teden
- Po meri ...
- Pomoč & Pogosta vprašanja
- Neuspešen izvoz podatkov.
- Neuspešen uvoz podatkov.
- Datoteka ni bila prepoznana.
- Navade uspešno uvožene.
- Popolna varnostna kopija uspešno izvožena.
- Uvozi podatke
- Izvozi popolno varnostno kopijo
- Podpira polne varnostne kopije izvožene iz te aplikacije, kakor tudi datoteke, ki jih ustvari Tickmate, HabitBull ali Rewire. Glej Pogosta vprašanja za več informacij.
- Generirane datoteke, ki se lahko odprejo s programsko opremo za preglednice, kot je Microsoft Excel ali OpenOffice Calc. Te datoteke ni mogoče uvoziti nazaj.
- Ustvari datoteko, ki vsebuje vse podatke. To datoteko lahko nato uvozite nazaj.
- Neuspeh pri ustvarjanju poročila o napakah
- Ustvari poročilo o napakah
- Odpravljanje napak
- Pomagajte prevesti to aplikacijo
- Nočni način
- Uporabite popolno črnino v nočnem načinu
- Zamenja siva ozadja s popolno črnino v nočnem načinu. Zmanjša porabo baterije na telefonih z AMOLED zasloni.
- Vmesnik
- Zamenjaj vrstni red dni
- Prikaži dni v obratnem vrstnem redu na glavnem zaslonu
- Dan
- Teden
- Mesec
- Četrtletje
- Leto
- Skupaj
-
- enkrat na
- Vsakih %d dni
- Vsakih %d tednov
- Vsakih %d mesecev
- Ocena
- Zvok opomnika
- Noben
- Filter
- Skrij končane
- Skrij arhivirane
- Naaredi obvestila lepljiva
- Preprečuje, da lahko obvestila povlečete stran.
- Popravi podatkovno zbirko
- Podatkovna zbirka popravljena.
- Odznači
- Preklopi
- Dejanje
- Navada
- Razvrsti
- Ročno
- Po imenu
- Po barvi
- Po rezultatu
- Prenesi
- Izvozi
-
diff --git a/android/uhabits-android/src/main/res/values-sr-rSP/strings.xml b/android/uhabits-android/src/main/res/values-sr-rSP/strings.xml
new file mode 100644
index 000000000..3378b3fba
--- /dev/null
+++ b/android/uhabits-android/src/main/res/values-sr-rSP/strings.xml
@@ -0,0 +1,158 @@
+
+
+
+
+ Loop – Pratilac navika
+ Navike
+ Podešavanja
+ Izmeni
+ Obriši
+ Arhiviraj
+ Otpakuj
+ Dodaj naviku
+ Promeni boju
+ Навика је створена.
+ Навике су обрисане.
+ Навике су враћене.
+ Нема шта да се опозове.
+ Нема шта да се понови.
+ Навика је промењена.
+ Навика је враћена.
+ Навике су архивиране.
+ Навике су враћене из архива.
+ Преглед
+ Снага навике
+ Историја
+ Очисти
+ Питање (нпр. „Да ли сте трчали данас?)
+ Понови
+ пута у
+ дана
+ Подсетник
+ Одбаци
+ Сачувај
+ Низови
+ Немате активних навика.
+ Притисните и држите да бисте маркирали или демаркирали.
+ искључен
+ Име не може бити празно.
+ Број мора бити позитиван.
+ Можете имати највише једно понављање на дан.
+ Стварање навике
+ Уређивање навике
+ Маркирај
+ Касније
+
+ Добро дошли
+ Loop вам помаже да створите и одржавате здраве навике.
+ Створите нове навике
+ Сваког дана, након што обавите навику, означите поље у апликацији.
+ Будите истрајни
+ Навике којих се доследно придржавате дужи период биће означене пуном звездом.
+ Пратите свој напредак
+ Детаљни графикони показују вам колико су се ваше навике временом побољшале.
+ 15 минута
+ 30 минута
+ 1 сат
+ 2 сата
+ 4 сата
+ 8 сати
+ Маркирај кратким додиром
+ Практичније, али може доћи до случајног маркирања.
+ Одлагање подсетника
+ Оцени апликацију
+ Повратне информације
+ Изворни кôд на GitHub-у
+ Увод апликације
+ Везе
+ Понашање
+ Име
+ Поставке
+ Време одлагања
+ Да ли сте знали?
+ Притисните и држите име навике да бисте је прераспоредили.
+ Положите уређај да бисте видели више дана.
+ Брисање навика
+ Навике ће бити трајно обрисане. Ова радња је неповратна.
+ викендом
+ понедељак–петак
+ сваког дана
+ Избор дана
+ Извези као CSV
+ Готово
+ Очисти
+ Избор часова
+ Избор минута
+ О апликацији
+ Преводиоци
+ Програмери
+ Верзија %s
+ Учесталост
+ Штрикла
+ Снага
+ Најбољи низови
+ Тренутни низ
+ Број понављања
+ посл. %d дана
+ посл. %d нед.
+ посл. %d мес.
+ посл. %d год.
+ одувек
+ сваког дана
+ сваке недеље
+ 2 пута недељно
+ 5 пута недељно
+ прилагоди…
+ Помоћ
+ Не могу да извезем податке.
+ Не могу да увезем податке.
+ Датотека није препозната.
+ Резервна копија је враћена.
+ Направљена је резервна копија.
+ Врати резервну копију
+ Направи резервну копију
+ Поред матичног формата, апликација подржава и увоз датотека које је направио Tickmate, HabitBull и Rewire. Детаљније у ЧПП.
+ Направите датотеку коју можете отворити у програму за рад са табелама (нпр. Microsoft Excel или OpenOffice Calc). Њу не можете да увезете назад у апликацију.
+ Направите датотеку са свим подацима апликације. Њу касније можете да увезете.
+ Не могу да направим извештај о грешци.
+ Направи извештај о грешци
+ Решавање проблема
+ Помоћ у преводу
+ Ноћни режим
+ Чиста црна у ноћном режиму
+ Замењује сиву позадину са чистом црном у ноћном режиму. Смањује потрошњу батерије код телефона са AMOLED екраном.
+ Интерфејс
+ Обрнути редослед дана
+ Прикажите дане у обрнутом редоследу на главном екрану.
+ дан
+ недеља
+ месец
+ тромесечје
+ година
+
+
+ пут у
+ Сваких %d дана
+ Сваких %d недеља
+ Сваких %d месеци
+ снага
+ Звук подсетника
+ Без звука
+
diff --git a/android/uhabits-android/src/main/res/values-sr/strings.xml b/android/uhabits-android/src/main/res/values-sr/strings.xml
deleted file mode 100644
index ccf4dcb0b..000000000
--- a/android/uhabits-android/src/main/res/values-sr/strings.xml
+++ /dev/null
@@ -1,157 +0,0 @@
-
-
-
-
- Loop – праћење навика
- Навике
- Поставке
- Уреди
- Обриши
- Архивирај
- Врати из архива
- Додај навику
- Промена боје
- Навика је створена.
- Навике су обрисане.
- Навике су враћене.
- Нема шта да се опозове.
- Нема шта да се понови.
- Навика је промењена.
- Навика је враћена.
- Навике су архивиране.
- Навике су враћене из архива.
- Преглед
- Снага навике
- Историја
- Очисти
- Питање (нпр. „Да ли сте трчали данас?)
- Понови
- пута у
- дана
- Подсетник
- Одбаци
- Сачувај
- Низови
- Немате активних навика.
- Притисните и држите да бисте маркирали или демаркирали.
- искључен
- Име не може бити празно.
- Број мора бити позитиван.
- Можете имати највише једно понављање на дан.
- Стварање навике
- Уређивање навике
- Маркирај
- Касније
-
- Добро дошли
- Loop вам помаже да створите и одржавате здраве навике.
- Створите нове навике
- Сваког дана, након што обавите навику, означите поље у апликацији.
- Будите истрајни
- Навике којих се доследно придржавате дужи период биће означене пуном звездом.
- Пратите свој напредак
- Детаљни графикони показују вам колико су се ваше навике временом побољшале.
- 15 минута
- 30 минута
- 1 сат
- 2 сата
- 4 сата
- 8 сати
- Маркирај кратким додиром
- Практичније, али може доћи до случајног маркирања.
- Одлагање подсетника
- Оцени апликацију
- Повратне информације
- Изворни кôд на GitHub-у
- Увод апликације
- Везе
- Понашање
- Име
- Поставке
- Време одлагања
- Да ли сте знали?
- Притисните и држите име навике да бисте је прераспоредили.
- Положите уређај да бисте видели више дана.
- Брисање навика
- Навике ће бити трајно обрисане. Ова радња је неповратна.
- викендом
- понедељак–петак
- сваког дана
- Избор дана
- Извези као CSV
- Готово
- Очисти
- Избор часова
- Избор минута
- О апликацији
- Преводиоци
- Програмери
- Верзија %s
- Учесталост
- Штрикла
- Снага
- Најбољи низови
- Тренутни низ
- Број понављања
- посл. %d дана
- посл. %d нед.
- посл. %d мес.
- посл. %d год.
- одувек
- сваког дана
- сваке недеље
- 2 пута недељно
- 5 пута недељно
- прилагоди…
- Помоћ
- Не могу да извезем податке.
- Не могу да увезем податке.
- Датотека није препозната.
- Резервна копија је враћена.
- Направљена је резервна копија.
- Врати резервну копију
- Направи резервну копију
- Поред матичног формата, апликација подржава и увоз датотека које је направио Tickmate, HabitBull и Rewire. Детаљније у ЧПП.
- Направите датотеку коју можете отворити у програму за рад са табелама (нпр. Microsoft Excel или OpenOffice Calc). Њу не можете да увезете назад у апликацију.
- Направите датотеку са свим подацима апликације. Њу касније можете да увезете.
- Не могу да направим извештај о грешци.
- Направи извештај о грешци
- Решавање проблема
- Помоћ у преводу
- Ноћни режим
- Чиста црна у ноћном режиму
- Замењује сиву позадину са чистом црном у ноћном режиму. Смањује потрошњу батерије код телефона са AMOLED екраном.
- Интерфејс
- Обрнути редослед дана
- Прикажите дане у обрнутом редоследу на главном екрану.
- дан
- недеља
- месец
- тромесечје
- година
-
- пут у
- Сваких %d дана
- Сваких %d недеља
- Сваких %d месеци
- снага
- Звук подсетника
- Без звука
-
diff --git a/android/uhabits-android/src/main/res/values-sv-rSE/strings.xml b/android/uhabits-android/src/main/res/values-sv-rSE/strings.xml
new file mode 100644
index 000000000..49f179933
--- /dev/null
+++ b/android/uhabits-android/src/main/res/values-sv-rSE/strings.xml
@@ -0,0 +1,183 @@
+
+
+
+
+ Loop Habit Tracker
+ Vanor
+ Inställningar
+ Redigera
+ Ta bort
+ Arkivera
+ Ångra arkivering
+ Lägg till vana
+ Byt färg
+ Vana skapad
+ Vanor borttagna
+ Vanor återställda
+ Inget att ångra
+ Inget att ångra
+ Vana ändrad
+ Vana ändrad
+ Vanor arkiverade
+ Vanor återställda
+ Översikt
+ Vanestyrka
+ Historik
+ Rensa
+ Fråga (Har du ... idag?)
+ Upprepa
+ gånger i
+ dagar
+ Påminnelse
+ Avbryt
+ Spara
+ Streaks
+ Du har inga aktiva vanor
+ Tryck-och-håll för att markera eller avmarkera
+ Av
+ Namn får inte vara tomt.
+ Talet måste vara positivt.
+ Du kan ha högst en repetition per dag
+ Skapa vana
+ Redigera vana
+ Markera
+ Senare
+
+ Välkommen
+ Loop Habit Tracker hjälper dig att skapa och bibehålla goda vanor.
+ Skapa några nya vanor
+ Efter varje dag när du utfört din vana så markerar du den i appen.
+ Fortsätt att göra det
+ Vanor som du utför konsekvent över en lång period ger dig en stjärna.
+ Följ dina framsteg
+ Detaljerade grafer visar dig hur dina vanor förbättras över tid.
+ 15 minuter
+ 30 minuter
+ 1 timme
+ 2 timmar
+ 4 timmar
+ 8 timmar
+ 24 timmar
+ Växla med snabb tryckning
+ Markera genom att trycka snabbt istället för att hålla ner. Mer bekvämt, men kan orsaka oavsiktliga aktiveringar.
+ Standard tid på snooze
+ Betygsätt oss på Google Play
+ Skicka feedback till utvecklarna
+ Visa källkod på GitHub
+ Visa introduktion till appen
+ Länkar
+ Beteende
+ Namn
+ Inställningar
+ Intervall snooze
+ Visste du att?
+ För att flytta på poster - tryck och håll nere på den vana du vill flytta, sedan flytta den till önskad plats.
+ Du kan se mer dagar genom att hålla telefonen i landskapsläge.
+ Ta bort vanor
+ Vanorna kommer att tas bort permanent. Du kan inte ångra detta.
+ Vana borttagen / hittades inte
+ Helger
+ Måndag till fredag
+ Vilken dag som helst
+ Välj dagar
+ Exportera data (CSV)
+ Klart
+ Rensa
+ Välj timmar
+ Välj minuter
+
+ @string/hint_drag
+ @string/hint_landscape
+
+ Om
+ Översättare
+ Utvecklare
+ Version %s
+ Frekvens
+ Kryssruta
+ Styrka
+ Bästa streak
+ Nuvarande streak
+ Antal repetitioner
+ Sista %d dagarna
+ Sista %d veckorna
+ Sista %d månaderna
+ Sista %d åren
+ Från början
+ Varje dag
+ Varje vecka
+ 2 gånger per vecka
+ 5 gånger per vecka
+ Anpassa ...
+ Hjälp och FAQ
+ Det gick inte att exportera.
+ Det gick inte att importera.
+ Kunde inte känna igen filen.
+ Import av dina vanor lyckades.
+ Fullständig backup har exporterats.
+ Importera data
+ Exportera backup
+ Appen har stöd att importera data från denna app, men även backuper från Tickmate, Habitbull eller Rewire. Läs FAQ om du vill meta mer.
+ Filerna genererade kan öppnas i Microsoft Excel eller OpenOffice Calc. Däremot kan denna fil inte importeras tillbaka till appen.
+ Generera en fil som innehåller all din data. Denna fil kan importas tillbaka till appen.
+ Det gick inte att generera felrapport.
+ Generera felrapport
+ Felsökning
+ Hjälp till att översätta appen
+ Nattläge
+ Använd svart färg i nattläge
+ Ersätter gråa bakgrunder med svart färg i nattläge. Reducerar batterianvändningen för telefoner med AMOLED-skärm.
+ Gränssnitt
+ Omvänd ordning på dagar
+ Visar dagar i omvänd ordning i appen
+ Dag
+ Vecka
+ Månad
+ Kvartal
+ År
+ Totalt
+
+
+ gånger var
+ Var %d:e dag
+ Var %d:e vecka
+ Var %d:e månad
+ Poäng
+ Påminnelseljud
+ Inget
+ Filtrera
+ Dölj slutförda
+ Dölj arkiverade
+ Gör notifikationer permanenta
+ Förhindrar att notifikationer stängs.
+ Reparera databas
+ Databasen reparerad.
+ Avmarkera
+ Växla
+ Åtgärd
+ Vana
+ Sortera
+ Manuellt
+ Efter namn
+ Efter färg
+ Efter poäng
+ Ladda ner
+ Exportera
+
diff --git a/android/uhabits-android/src/main/res/values-sv/strings.xml b/android/uhabits-android/src/main/res/values-sv/strings.xml
deleted file mode 100644
index d3428bf83..000000000
--- a/android/uhabits-android/src/main/res/values-sv/strings.xml
+++ /dev/null
@@ -1,178 +0,0 @@
-
-
-
-
- Loop Habit Tracker
- Vanor
- Inställningar
- Redigera
- Ta bort
- Arkivera
- Ångra arkivering
- Lägg till vana
- Byt färg
- Vana skapad
- Vanor borttagna
- Vanor återställda
- Inget att ångra
- Inget att ångra
- Vana ändrad
- Vana ändrad
- Vanor arkiverade
- Vanor återställda
- Översikt
- Vanestyrka
- Historik
- Rensa
- Fråga (Har du ... idag?)
- Upprepa
- gånger i
- dagar
- Påminnelse
- Avbryt
- Spara
- Streaks
- Du har inga aktiva vanor
- Tryck-och-håll för att markera eller avmarkera
- Av
- Namn får inte vara tomt.
- Talet måste vara positivt.
- Du kan ha högst en repetition per dag
- Skapa vana
- Redigera vana
- Markera
- Senare
-
- Välkommen
- Loop Habit Tracker hjälper dig att skapa och bibehålla goda vanor.
- Skapa några nya vanor
- Efter varje dag när du utfört din vana så markerar du den i appen.
- Fortsätt att göra det
- Vanor som du utför konsekvent över en lång period ger dig en stjärna.
- Följ dina framsteg
- Detaljerade grafer visar dig hur dina vanor förbättras över tid.
- 15 minuter
- 30 minuter
- 1 timme
- 2 timmar
- 4 timmar
- 8 timmar
- 24 timmar
- Växla med snabb tryckning
- Markera genom att trycka snabbt istället för att hålla ner. Mer bekvämt, men kan orsaka oavsiktliga aktiveringar.
- Standard tid på snooze
- Betygsätt oss på Google Play
- Skicka feedback till utvecklarna
- Visa källkod på GitHub
- Visa introduktion till appen
- Länkar
- Beteende
- Namn
- Inställningar
- Intervall snooze
- Visste du att?
- För att flytta på poster - tryck och håll nere på den vana du vill flytta, sedan flytta den till önskad plats.
- Du kan se mer dagar genom att hålla telefonen i landskapsläge.
- Ta bort vanor
- Vanorna kommer att tas bort permanent. Du kan inte ångra detta.
- Vana borttagen / hittades inte
- Helger
- Måndag till fredag
- Vilken dag som helst
- Välj dagar
- Exportera data (CSV)
- Klart
- Rensa
- Välj timmar
- Välj minuter
- Om
- Översättare
- Utvecklare
- Version %s
- Frekvens
- Kryssruta
- Styrka
- Bästa streak
- Nuvarande streak
- Antal repetitioner
- Sista %d dagarna
- Sista %d veckorna
- Sista %d månaderna
- Sista %d åren
- Från början
- Varje dag
- Varje vecka
- 2 gånger per vecka
- 5 gånger per vecka
- Anpassa ...
- Hjälp och FAQ
- Det gick inte att exportera.
- Det gick inte att importera.
- Kunde inte känna igen filen.
- Import av dina vanor lyckades.
- Fullständig backup har exporterats.
- Importera data
- Exportera backup
- Appen har stöd att importera data från denna app, men även backuper från Tickmate, Habitbull eller Rewire. Läs FAQ om du vill meta mer.
- Filerna genererade kan öppnas i Microsoft Excel eller OpenOffice Calc. Däremot kan denna fil inte importeras tillbaka till appen.
- Generera en fil som innehåller all din data. Denna fil kan importas tillbaka till appen.
- Det gick inte att generera felrapport.
- Generera felrapport
- Felsökning
- Hjälp till att översätta appen
- Nattläge
- Använd svart färg i nattläge
- Ersätter gråa bakgrunder med svart färg i nattläge. Reducerar batterianvändningen för telefoner med AMOLED-skärm.
- Gränssnitt
- Omvänd ordning på dagar
- Visar dagar i omvänd ordning i appen
- Dag
- Vecka
- Månad
- Kvartal
- År
- Totalt
-
- gånger var
- Var %d:e dag
- Var %d:e vecka
- Var %d:e månad
- Poäng
- Påminnelseljud
- Inget
- Filtrera
- Dölj slutförda
- Dölj arkiverade
- Gör notifikationer permanenta
- Förhindrar att notifikationer stängs.
- Reparera databas
- Databasen reparerad.
- Avmarkera
- Växla
- Åtgärd
- Vana
- Sortera
- Manuellt
- Efter namn
- Efter färg
- Efter poäng
- Ladda ner
- Exportera
-
diff --git a/android/uhabits-android/src/main/res/values-ta-rIN/strings.xml b/android/uhabits-android/src/main/res/values-ta-rIN/strings.xml
new file mode 100644
index 000000000..58cdd3f07
--- /dev/null
+++ b/android/uhabits-android/src/main/res/values-ta-rIN/strings.xml
@@ -0,0 +1,179 @@
+
+
+
+
+ Loop Habit Tracker
+ பழக்கங்கள்
+ அமைப்புகள்
+ திருத்துக
+ நீக்கு
+ காப்பகம்
+ உயிர்க்க
+ சேர்க்க
+ நிறம் மாற்ற
+ பழக்கம் உருவாக்கப்பட்டது
+ பழக்கம் நீக்கப்பட்டது
+ பழக்கம் மீட்கப்பட்டது
+ மீட்க ஒன்றும் இல்லை
+ திருத்த எதுவும் இல்லை
+ பழக்கம் மாற்றப்பட்டது
+ பழக்கம் திரும்ப பழைய நிலைக்கு மாற்றப்பட்டது
+ காப்பகப்படுத்தியப் பழக்கம்
+ பழக்கங்கள் ஆவண காப்பகத்தில் இருந்து நீக்கப் பட்டது
+ மேற்பார்வை
+ பழக்கத்தின் வலிமை
+ வரலாறு
+ அழி
+ கேள்வி (இன்று ... செய்தீர்களா?)
+ மீண்டும் செய்க
+ காலங்களில்
+ நாட்கள்
+ நினைவூட்டல்கள்
+ நிராகரி
+ சேமிக்கவும்
+ சாதனைகள்
+ நடப்பு பழக்கம் எதுவும் இல்லை
+ குறிக்க அல்லது குறிப்பை நீக்க அழுத்தி பிடிக்கவும்
+ வேண்டாம்
+ பெயர் காலியாக இருக்க கூடாது.
+ நேர்மறை எண்ணாக இருக்க வேண்டும் (பூஜியத்தை விட அதிகம்).
+ ஒரு நாளைக்கு அதிகப்பட்சம் ஒரு முறை மீள் நிகழ்வை பெற முடியும்
+ புதிய பழக்கம்
+ பழக்கத்தை திருத்த
+ சரிப்பார்ப்பு குறி
+ பிறகு
+
+ வருக
+ இந்த செயலி நல்ல பழக்க வழக்கங்களை துவங்க மற்றும் தொடர உதவுகிறது.
+ சில புது பழக்கங்களை துவங்கவும்!
+ தினமும் உங்கள் புதிய பழக்கத்தை முடித்தவுடன் இந்த செயலியில் அதை குறிக்கவும்.
+ மனம் தளராமல் தொடரவும்
+ தொடர்ச்சியாக செய்யும் பழக்கங்கள் ஒரு முழு நட்சத்திரத்தை பெற்று தரும்.
+ உங்கள் முன்னேற்றத்தை கண்காணிக்கவும்
+ நாளடைவில் நீங்கள் அடைந்த முன்னேற்றத்தை வரைபடத்தின் மூலம் அறியலாம்.
+ 15 நிமிடங்கள்
+ 30 நிமிடங்கள்
+ 1 மணி நேரம்
+ 2 மணி நேரம்
+ 4 மணி நேரம்
+ 8 மணி நேரம்
+ 24 மணி நேரம்
+ சிறிய அழுத்தலின் மூலம் தாவு
+ சரிப் பார்ப்பு குறி யை இட அழுத்தி பிடிப்பதற்கு பதில் ஒரு முறை தட்டலாம். இது முன்னதை விட எளிமையானது. ஆனால் இது தற்செயலான தாவல்களுக்கு வழி வகுக்கும்.
+ எச்சரிகையை தள்ளி வைக்க வேண்டிய நேரம்
+ Google Play-ல் இந்த செயலியை மதிப்பிட
+ இந்த செயலியை மேம்படுத்த உங்கள் கருத்துகளை பகிர
+ இந்த செயலியின் மூல நிரலை GitHub வலைதளத்தில் பார்க்கவும்
+ இந்த செயலியின் முன்னோட்டத்தை பார்க்க
+ இணைப்புகள்
+ செயல்பாடு
+ பெயர்
+ அமைப்புகள்
+ தாமத காலம்
+ உங்களுக்கு தெரியுமா?
+ பதிவுகளை மறுசீரைமக்க, தேவையான பழக்க பதிவின் மீது அழுத்தி பிடித்து பின் தேவையான இடத்திற்கு அதை இழுக்கவும்.
+ உங்கள் கைப்பேசியை அகலவாக்கில் வைக்கும்போது இன்னும் அதிக நாட்களை காண முடியும்.
+ பழக்கங்களை நீக்கவும்
+ பழக்கங்கள் நிரந்தரமாக நீக்கப்படும். இந்த செயலை மீட்டமைக்க இயலாது.
+ பழக்கம் நீக்கப்பட்டுவிட்டது / காணவில்லை
+ வார இறுதிகள்
+ திங்கள் முதல் வெள்ளி வரை
+ வாரத்தின் எந்த நாளிலும்
+ நாட்களை தேர்வு செய்யவும்
+ CSV நிரல் வகையில் ஏற்றுமதி செய்யவும்
+ முடிந்தது
+ அழி
+ மணி நேரங்களை தேர்வு செய்யவும்
+ நிமிடங்களை தேர்வு செய்யவும்
+ இதை பற்றி
+ மொழிப்பெயர்ப்பாளர்கள்
+ மென்பொருள் ஆசிரியர்கள்
+ மென்பொருள் பதிப்பு %s
+ கால இடைவெளி
+ சரிபார்ப்பு குறி
+ வலிமை
+ சிறந்த சாதனைகள்
+ நடப்பு சாதனை
+ மீள் நிகழ்வுகளின் எண்ணிக்கை
+ கடந்த %d நாட்கள்
+ கடந்த %d வாரங்கள்
+ கடந்த %d மாதங்கள்
+ கடந்த %d வருடங்கள்
+ எல்லா நேரமும்
+ எல்லா நாளும்
+ எல்லா வாரமும்
+ வாரத்திற்கு இரண்டு முறை
+ வாரத்துக்கு 5 முறை
+ விருப்பத்திற்கு ஏற்றபடி…
+ உதவி & அதிகம் கேட்கப்படும் கேள்விகள்
+ தரவுகளை ஏற்றுமதி செய்ய முடியவில்லை.
+ தரவை இறக்குமதி செய்ய முடியவில்லை.
+ இது எந்த வகையான ஆவணம் என்பதை உறுதி செய்ய முடியவில்லை.
+ பழக்கங்கள் வெற்றிகரமாக இறக்குமதி செய்யப்பட்டது.
+ முழு ஆவணக் காப்பு நகல் வெற்றிகரமாக ஏற்றுமதி செய்யப்பட்டது.
+ தரவு இறக்குமதி
+ ஆவணக் காப்பு நகல் முழுமையாக ஏற்றுமதி செய்
+ இந்த செயலி மூலம் ஆவண காப்பு நகல் முழுவதுமாக ஏற்றுமதி செய்யவும் மற்றும் Tickmate, HabitBull அல்லது Rewire செயலிகள் மூலம் உருவாக்கப்படும் ஆவணங்களும் இந்த செயலியில் பயண்படுத்தலாம் மேலும் தகவல்களுக்கு அதிகம் கேட்கப்படும் கேள்விகளை (FAQ) பார்க்கவும்.
+ உருவாக்கப்பட்ட ஆவணங்களை விரித்தாள் மென்பொருள்களான Microsoft Excel அல்லது OpenOffice Calc மூலம் திறக்கலாம். ஆனால் இவற்றை திரும்ப இறக்குமதி செய்ய முடியாது.
+ உங்களின் அனைத்து தரவுகளையும் கொண்ட ஒரு ஆவணம் உருவாக்கப்படும். இந்த ஆவணத்தை மீண்டும் இந்த செயலியில் இறக்குமதி செய்யலாம்.
+ செயலி பிழை அறிக்கை உருவாக்க முடியவில்லை.
+ பிழை அறிக்கை உருவாக்கு
+ பழுது இடமறிதல்
+ இந்த செயலியை மற்ற மொழிகளில் மொழிபெயர்க்க உதவி செய்யவும்
+ இருள் வண்ண பாங்கு
+ இருள் பாங்கில் முழு கருப்பு நிறத்தை பயண்படுத்து
+ இதன் மூலம் செயலியில் உள்ள பழுப்பு பின்புலங்கள் நீக்கப்பட்டு முழுவதும் கருப்பு நிற பின்புலங்களாக மாற்றப்படும். இது AMOLED திரை கொண்ட கைப்பேசிகளில் மின்கல பயன்பாட்டை குறைக்கும்.
+ இடைமுகம்
+ தலைகீழ் வரிசையில் நாட்கள்
+ பிரதான திரையில் நாட்களை தலை கீழ் வரிசையில் காட்டு
+ நாள்
+ வாரம்
+ மாதம்
+ காற் பங்கு
+ வருடம்
+ மொத்தம்
+
+
+ நேரம்
+ ஓவ்வொரு %d நாளும்
+ ஒவ்வொரு %d வாரங்களும்
+ ஒவ்வொரு %d மாதங்களும்
+ மதிப்பெண்கள்
+ நினைவூட்டல் சத்தம்
+ எதுவும் இல்லை
+ வடிகட்டவும்
+ மறைத்தல் முடிந்தது
+ ஆவணக் காப்பை மறைக்கவும்
+ நினைவூட்டல்களை நிலைத்து நிற்கவை
+ நினைவூட்டல்களை விரல்களால் தள்ளி விட முடியாத படி செய்கிறது.
+ தரவு தளத்தை பழுது பார்க்கவும்
+ தரவுதளம் பழுதடைந்து விட்டது.
+ சரிப்பார்க்காமல் அப்படியே விடு
+ தாவு
+ செயல்
+ பழக்கம்
+ வரிசைப்படுத்தவும்
+ கைமுறை
+ பெயரின் மூலம்
+ நிறத்தின் மூலம்
+ மதிப்பெண்களின் மூலம்
+ பதிவிறக்கம்
+ ஏற்றுமதி
+
diff --git a/android/uhabits-android/src/main/res/values-te-rIN/strings.xml b/android/uhabits-android/src/main/res/values-te-rIN/strings.xml
new file mode 100644
index 000000000..fb70f5146
--- /dev/null
+++ b/android/uhabits-android/src/main/res/values-te-rIN/strings.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
diff --git a/android/uhabits-android/src/main/res/values-tr-rTR/strings.xml b/android/uhabits-android/src/main/res/values-tr-rTR/strings.xml
new file mode 100644
index 000000000..33b19f890
--- /dev/null
+++ b/android/uhabits-android/src/main/res/values-tr-rTR/strings.xml
@@ -0,0 +1,179 @@
+
+
+
+
+ Loop Alışkanlık Takip
+ Alışkanlıklar
+ Ayarlar
+ Düzenle
+ Sil
+ Arşivle
+ Arşivden Çıkar
+ Alışkanlık ekle
+ Renk Değiştir
+ Alışkanlık oluşturuldu.
+ Alışkanlık silindi.
+ Alışkanlıklar geri getirildi
+ Geri alınacak bir şey yok
+ Tekrar yapılacak birşey yok.
+ Alışkanlık değiştirildi
+ Alışkanlık eski haline getirildi
+ Alışkanlık arşivlendi.
+ Alışkanlık arşivden çıkarıldı.
+ Genel Bakış
+ Alışkanlık gücü
+ Geçmiş
+ Temizle
+ Soru (Bugün ... yaptın mı?)
+ Tekrar
+ defa /
+ gün
+ Hatırlatma
+ Vazgeç
+ Kaydet
+ Seriler
+ Etkin alışkanlığın yok
+ İşaretlemek ya da işaret kaldırmak için basılı tut
+ Kapalı
+ Adı boş bırakamazsın.
+ Sayılar sıfırdan büyük olmalı.
+ Günde en fazla bir tekrar yapabilirsin.
+ Alışkanlık oluştur
+ Alışkanlık düzenle
+ Yaptım
+ Sonra
+
+ Hoşgeldin
+ Loop Alışkanlık Takibi, iyi alışkanlıklar edinmene ve sürdürmene yardımcı olur.
+ Yeni alışkanlıklar oluştur
+ Her gün, alışkanlığını gerçekleştirdikten sonra, uygulamada onay işareti koy.
+ Yapmaya devam et
+ Uzun süre düzenli sürdürdüğün alışkanlıkların için bir tam yıldız kazanacaksın.
+ Gelişimini izle
+ Detaylı grafiklerle, zaman içinde alışkanlıklarının nasıl geliştiğini gör.
+ 15 dakika
+ 30 dakika
+ 1 saat
+ 2 saat
+ 4 saat
+ 8 saat
+ 24 saat
+ Kısa dokunuşla işaretle
+ Alışkanlıklarını basılı tutmak yerine tek dokunuşla işaretlemeni sağlar. Kullanımı daha rahattır ama kaza eseri işaretleme yapabilirsin.
+ Hatırlatmalardaki erteleme süresi
+ Google Play\'de uygulamayı oyla
+ Geliştiriciye geri bildirim gönder
+ Github\'da kaynak kodunu gör
+ Uygulama tanıtımını göster
+ Bağlantılar
+ Davranış
+ Ad
+ Ayarlar
+ Erteleme süresi
+ Biliyor muydun?
+ Girdileri sıralamak için, alışkanlık adının üstüne basılı tut ve doğru yere sürükle.
+ Cihazını yatay tutarak daha fazla gün görebilirsin.
+ Alışkanlıkları Sil
+ Alışkanlıklar kalıcı olarak silinecek. Bu eylem geri alınamaz.
+ Alışkanlık silinmiş ya da bulunamadı
+ Hafta sonları
+ Pazartesi-Cuma
+ Haftanın herhangi bir günü
+ Günleri seç
+ CSV olarak dışa aktar
+ Tamam
+ Temizle
+ Saat seç
+ Dakika seç
+ Hakkında
+ Çevirmenler
+ Geliştiriciler
+ Sürüm %s
+ Sıklık
+ İşaret
+ Güç
+ En uzun seriler
+ Şimdiki seri
+ Tekrar sayısı
+ Son %d gün
+ Son %d hafta
+ Son %d ay
+ Son %d yıl
+ Tüm zamanlar
+ Her gün
+ Her hafta
+ Haftada 2 kez
+ Haftada 5 kez
+ Özel ...
+ Yardım & SSS
+ Dışarı veri aktarımı başarısız.
+ İçeri veri aktarımı başarısız.
+ Dosya tanınamadı.
+ Alışkanlıklar başarıyla içeri aktarıldı.
+ Tam yedek başarıyla dışarı aktarıldı.
+ İçeri veri aktar
+ Tüm yedeği dışarı aktar
+ Hem bu uygulama tarafından dışarı aktarılmış tam yedekleri, hem de Tickmate, HabitBull veya Rewire tarafından üretilmiş dosyaları destekler. Daha fazla bilgi için SSS\'a başvurun.
+ Üretilen dosyalar, Microsoft Excel veya OpenOffice Calc. gibi hesap taplosu uygulamaları ile açılabilir. Bu dosya yeniden içeri aktarılamaz.
+ Tüm verilerini içeren bir dosya üretir. Bu dosya yeniden içeri aktarılabilir.
+ Hata raporu oluşturulamadı.
+ Hata raporu üret
+ Sorun Giderme
+ Bu uygulamanın çevirisine yardım et
+ Gece kipi
+ Gece kipinde saf siyah kullan
+ Gece kipinde gri arkaplanını, saf siyah ile değiştir. AMOLED ekranlı cihazlarda pil kullanımını azaltabilir.
+ Arayüz
+ Günleri ters sırala
+ Ana ekranda günleri tersten göster
+ Gün
+ Hafta
+ Ay
+ 3 Ay
+ Yıl
+ Tümü
+
+
+ defa /
+ Her %d gün
+ Her %d hafta
+ Her %d ay
+ Puan
+ Hatırlatma sesi
+ Sessiz
+ Filtre
+ Tamamlananları gizle
+ Arşivlenenleri gizle
+ Bildirimleri kalıcı yap
+ Bildirimlerin kaydırılarak temizlenmesini engelle.
+ Veritabanını onar
+ Veritabanı onarıldı.
+ İşareti kaldır
+ Değiştir
+ Eylem
+ Alışkanlık
+ Sırala
+ Elle
+ Ada göre
+ Renge göre
+ Puana göre
+ İndir
+ Dışarı aktar
+
diff --git a/android/uhabits-android/src/main/res/values-tr/strings.xml b/android/uhabits-android/src/main/res/values-tr/strings.xml
deleted file mode 100644
index 24e40f75d..000000000
--- a/android/uhabits-android/src/main/res/values-tr/strings.xml
+++ /dev/null
@@ -1,178 +0,0 @@
-
-
-
-
- Loop Alışkanlık Takip
- Alışkanlıklar
- Ayarlar
- Düzenle
- Sil
- Arşivle
- Arşivden Çıkar
- Alışkanlık ekle
- Renk Değiştir
- Alışkanlık oluşturuldu.
- Alışkanlık silindi.
- Alışkanlıklar geri getirildi
- Geri alınacak bir şey yok
- Tekrar yapılacak birşey yok.
- Alışkanlık değiştirildi
- Alışkanlık eski haline getirildi
- Alışkanlık arşivlendi.
- Alışkanlık arşivden çıkarıldı.
- Genel Bakış
- Alışkanlık gücü
- Geçmiş
- Temizle
- Soru (Bugün ... yaptın mı?)
- Tekrar
- defa /
- gün
- Hatırlatma
- Vazgeç
- Kaydet
- Seriler
- Etkin alışkanlığın yok
- İşaretlemek ya da işaret kaldırmak için basılı tut
- Kapalı
- Adı boş bırakamazsın.
- Sayılar sıfırdan büyük olmalı.
- Günde en fazla bir tekrar yapabilirsin.
- Alışkanlık oluştur
- Alışkanlık düzenle
- Yaptım
- Sonra
-
- Hoşgeldin
- Loop Alışkanlık Takibi, iyi alışkanlıklar edinmene ve sürdürmene yardımcı olur.
- Yeni alışkanlıklar oluştur
- Her gün, alışkanlığını gerçekleştirdikten sonra, uygulamada onay işareti koy.
- Yapmaya devam et
- Uzun süre düzenli sürdürdüğün alışkanlıkların için bir tam yıldız kazanacaksın.
- Gelişimini izle
- Detaylı grafiklerle, zaman içinde alışkanlıklarının nasıl geliştiğini gör.
- 15 dakika
- 30 dakika
- 1 saat
- 2 saat
- 4 saat
- 8 saat
- 24 saat
- Kısa dokunuşla işaretle
- Alışkanlıklarını basılı tutmak yerine tek dokunuşla işaretlemeni sağlar. Kullanımı daha rahattır ama kaza eseri işaretleme yapabilirsin.
- Hatırlatmalardaki erteleme süresi
- Google Play\'de uygulamayı oyla
- Geliştiriciye geri bildirim gönder
- Github\'da kaynak kodunu gör
- Uygulama tanıtımını göster
- Bağlantılar
- Davranış
- Ad
- Ayarlar
- Erteleme süresi
- Biliyor muydun?
- Girdileri sıralamak için, alışkanlık adının üstüne basılı tut ve doğru yere sürükle.
- Cihazını yatay tutarak daha fazla gün görebilirsin.
- Alışkanlıkları Sil
- Alışkanlıklar kalıcı olarak silinecek. Bu eylem geri alınamaz.
- Alışkanlık silinmiş ya da bulunamadı
- Hafta sonları
- Pazartesi-Cuma
- Haftanın herhangi bir günü
- Günleri seç
- CSV olarak dışa aktar
- Tamam
- Temizle
- Saat seç
- Dakika seç
- Hakkında
- Çevirmenler
- Geliştiriciler
- Sürüm %s
- Sıklık
- İşaret
- Güç
- En uzun seriler
- Şimdiki seri
- Tekrar sayısı
- Son %d gün
- Son %d hafta
- Son %d ay
- Son %d yıl
- Tüm zamanlar
- Her gün
- Her hafta
- Haftada 2 kez
- Haftada 5 kez
- Özel ...
- Yardım & SSS
- Dışarı veri aktarımı başarısız.
- İçeri veri aktarımı başarısız.
- Dosya tanınamadı.
- Alışkanlıklar başarıyla içeri aktarıldı.
- Tam yedek başarıyla dışarı aktarıldı.
- İçeri veri aktar
- Tüm yedeği dışarı aktar
- Hem bu uygulama tarafından dışarı aktarılmış tam yedekleri, hem de Tickmate, HabitBull veya Rewire tarafından üretilmiş dosyaları destekler. Daha fazla bilgi için SSS\'a başvurun.
- Üretilen dosyalar, Microsoft Excel veya OpenOffice Calc. gibi hesap taplosu uygulamaları ile açılabilir. Bu dosya yeniden içeri aktarılamaz.
- Tüm verilerini içeren bir dosya üretir. Bu dosya yeniden içeri aktarılabilir.
- Hata raporu oluşturulamadı.
- Hata raporu üret
- Sorun Giderme
- Bu uygulamanın çevirisine yardım et
- Gece kipi
- Gece kipinde saf siyah kullan
- Gece kipinde gri arkaplanını, saf siyah ile değiştir. AMOLED ekranlı cihazlarda pil kullanımını azaltabilir.
- Arayüz
- Günleri ters sırala
- Ana ekranda günleri tersten göster
- Gün
- Hafta
- Ay
- 3 Ay
- Yıl
- Tümü
-
- defa /
- Her %d gün
- Her %d hafta
- Her %d ay
- Puan
- Hatırlatma sesi
- Sessiz
- Filtre
- Tamamlananları gizle
- Arşivlenenleri gizle
- Bildirimleri kalıcı yap
- Bildirimlerin kaydırılarak temizlenmesini engelle.
- Veritabanını onar
- Veritabanı onarıldı.
- İşareti kaldır
- Değiştir
- Eylem
- Alışkanlık
- Sırala
- Elle
- Ada göre
- Renge göre
- Puana göre
- İndir
- Dışarı aktar
-
diff --git a/android/uhabits-android/src/main/res/values-ug-rCN/strings.xml b/android/uhabits-android/src/main/res/values-ug-rCN/strings.xml
new file mode 100644
index 000000000..648494be0
--- /dev/null
+++ b/android/uhabits-android/src/main/res/values-ug-rCN/strings.xml
@@ -0,0 +1,38 @@
+
+
+
+
+ ئادەت
+ تەڭشەك
+ تەھرىرلەش
+ ئۆچۈرۈش
+ ئارخىپلاش
+ ئارخىپتىن چىقىرىش
+ ئادەت قېتىلدى
+ رەڭ ئۆزگەردى
+ ئادەت قۇرۇلدى
+ ئادەت ئۆچۈرۈلدى
+ ئادەتلەر قايتۇرۇلدى
+ ئادەت ئۆزگەرتىلدى
+
+ تەڭشەك
+
+
+
diff --git a/android/uhabits-android/src/main/res/values-uk-rUA/strings.xml b/android/uhabits-android/src/main/res/values-uk-rUA/strings.xml
new file mode 100644
index 000000000..3042177b2
--- /dev/null
+++ b/android/uhabits-android/src/main/res/values-uk-rUA/strings.xml
@@ -0,0 +1,198 @@
+
+
+
+
+ Трекер звичок Loop
+ Звички
+ Налаштування
+ Змінити
+ Вилучити
+ Архівувати
+ Розархівувати
+ Додати звичку
+ Змінити колір
+ Звичку створено
+ Звички вилучено
+ Звички відновлено
+ Скасовувати нічого
+ Повторювати нічого
+ Звичку змінено
+ Зміну звички скасовано
+ Звички архівовано
+ Звички повернуто з архіву
+ Огляд
+ Сила звички
+ Історія
+ Очистити
+ Питання (приклад: \"Чи робили ви ранкову зарядку сьогодні?\")
+ Повторювати
+ рази (-ів) за
+ дні(-в)
+ Нагадування
+ Скасувати
+ Зберегти
+ Серії
+ У вас немає активних звичок
+ Натисніть та утримуйте, щоб встановити або зняти пташку
+ Вимкнути
+ Назва не може бути порожньою.
+ Число має бути додатнім.
+ Можливо не більше одного повторення на день
+ Додати звичку
+ Змінити звичку
+ Відзначити
+ Відкласти
+
+ Ласкаво просимо
+ Трекер звичок Loop допомагає вам розвивати і підтримувати корисні звички.
+ Додайте нові звички
+ Щодня, після виконання вашої звички, ставте пташку в програмі.
+ Продовжуйте в тому ж дусі
+ Постійно дотримувані звички буде відзначено повною зірочкою.
+ Відстежуйте свої успіхи
+ Деталізовані хвилеписи демонструють, як ваші звички покращилися з часом.
+ 15 хвилин
+ 30 хвилин
+ 1 година
+ 2 години
+ 4 години
+ 8 годин
+ 24 години
+ Завжди запитувати
+ Налаштувати...
+ Відзначати коротким натисканням
+ Ставити пташки коротким натисканням, замість утримування. Дещо зручніше, але може стати причиною випадкових натискань.
+ Час відкладення нагадувань
+ Оцінити цю програму в Google Play
+ Надіслати відгук розробникові
+ Подивитися вихідний код на GitHub
+ Переглянути вступні інструкції
+ Посилання
+ Поведінка
+ Назва
+ Налаштування
+ Час відкладення
+ Чи знаєте ви?
+ Аби змінити порядок записів, натисніть і утримуйте назву запису, опісля перетягніть запис на потрібне місце.
+ У поземному режимі відображається більше днів.
+ Вилучити звички
+ Звички буде вилучено. Цю дію не можна скасувати.
+ Звичку вилучено / не знайдено
+ У вихідні
+ У будні
+ Щодня
+ Оберіть дні
+ Експортувати як CVS
+ Готово
+ Очистити
+ Оберіть години
+ Оберіть хвилини
+ Будь ласка, оберіть хоча б одну звичку
+ Про програму
+ Перекладачі
+ Розробники
+ Версія %s
+ Частота
+ Пташка
+ Сила
+ Найкращі серії
+ Поточна серія
+ Число повторень
+ Останні %d дні(-в)
+ Останні %d тижні (-в)
+ Останні %d місяці (-в)
+ Останні %d роки (-ів)
+ Від початку
+ Щодня
+ Щотижня
+ Двічі на тиждень
+ 5 разів на тиждень
+ Инше…
+ Допомога та ЧаПи
+ Помилка експортування даних.
+ Помилка імпортування даних.
+ Неможливо визначити тип файлу.
+ Звички успішно імпортовано.
+ Повна резервна копія успішно експортована.
+ Імпортувати дані
+ Експортувати повну резервну копію
+ Підтримує імпортування повної резервної копії, експортованої цією програмою, а також файлів, створених програмами Tickmate, HabitBull та Rewire. Більше інформації дивіться у ЧаПи.
+ Створює файли, які можна відкрити у програмах для роботи з таблицями (як-от: Microsoft Excel або OpenOffice Calc). Цей файл не можна імпортувати назад.
+ Створює файл, що містить усі ваші дані. Цей файл можна імпортувати назад.
+ Помилка створення звіту про помилку.
+ Створити звіт про помилку
+ Усунення несправностей
+ Допоможіть перекласти цю програму
+ Нічний режим
+ Користати цілком чорне тло у нічному режимі
+ Замінює сіре тло на цілком чорне у нічному режимі. Зменшує використання батареї в телефонах із дисплеєм AMOLED.
+ Оболонка
+ Зворотній лад днів
+ Показувати дні у зворотньому порядку на головному екрані
+ День
+ Тиждень
+ Місяць
+ Квартал
+ Рік
+ Усього
+
+ Так або ні
+ Кількість
+
+ раз у
+ Кожні %d дні(-в)
+ Кожні %d тижні(-в)
+ Кожні %d місяці (-в)
+ Сталість
+ Звук нагадування
+ Немає
+ Фільтр
+ Приховати завершені
+ Приховати архівовані
+ Закріпити сповіщення
+ Запобігає прихованню сповіщень.
+ Відновити базу даних
+ Базу даних відновлено.
+ Зняти позначку
+ Перемкнути
+ Дія
+ Звичка
+ Сортувати
+ Самотужки
+ За назвою
+ За кольором
+ За сталістю
+ Завантажити
+ Експортувати
+ Змінити значення
+ Календар
+ Число
+ Це поле не має бути порожнім
+ напр.: Скільки кроків ви сьогодні пройшли?
+ напр.: крок(-ів)
+ напр.: Ви робили сьогодні вправи?
+ Запитання
+ Мета
+ Так
+ Ні
+ Переглянути політику конфіденційності
+ Переглянути всіх учасників…
+ База даних
+
diff --git a/android/uhabits-android/src/main/res/values-uk/strings.xml b/android/uhabits-android/src/main/res/values-uk/strings.xml
deleted file mode 100644
index 34c54e0a9..000000000
--- a/android/uhabits-android/src/main/res/values-uk/strings.xml
+++ /dev/null
@@ -1,178 +0,0 @@
-
-
-
-
- Трекер звичок Loop
- Звички
- Налаштування
- Змінити
- Вилучити
- Архівувати
- Розархівувати
- Додати звичку
- Змінити колір
- Звичку створено
- Звички вилучено
- Звички відновлено
- Скасовувати нічого
- Повторювати нічого
- Звичку змінено
- Зміну звички скасовано
- Звички архівовано
- Звички повернуто з архіву
- Огляд
- Сила звички
- Історія
- Очистити
- Питання (приклад: \"Чи робили ви ранкову зарядку сьогодні?\")
- Повторювати
- рази (-ів) за
- дні(-в)
- Нагадування
- Скасувати
- Зберегти
- Серії
- У вас немає активних звичок
- Натисніть та утримуйте, щоб встановити або зняти пташку
- Вимкнути
- Назва не може бути порожньою.
- Число має бути додатнім.
- Можливо не більше одного повторення на день
- Додати звичку
- Змінити звичку
- Відзначити
- Відкласти
-
- Ласкаво просимо
- Трекер звичок Loop допомагає вам розвивати і підтримувати корисні звички.
- Додайте нові звички
- Щодня, після виконання вашої звички, ставте пташку в програмі.
- Продовжуйте в тому ж дусі
- Постійно дотримувані звички буде відзначено повною зірочкою.
- Відстежуйте свої успіхи
- Деталізовані хвилеписи демонструють, як ваші звички покращилися з часом.
- 15 хвилин
- 30 хвилин
- 1 година
- 2 години
- 4 години
- 8 годин
- 24 години
- Відзначати коротким натисканням
- Ставити пташки коротким натисканням, замість утримування. Дещо зручніше, але може стати причиною випадкових натискань.
- Час відкладення нагадувань
- Оцінити цей застосунок в Google Play
- Надіслати відозву розробникові
- Подивитися вихідний код на GitHub
- Переглянути вступні інструкції
- Посилання
- Поведінка
- Назва
- Налаштування
- Час відкладення
- Чи знаєте ви?
- Аби змінити порядок записів, натисніть і утримуйте назву запису, опісля перетягніть запис на потрібне місце.
- У поземному режимі відображається більше днів.
- Вилучити звички
- Звички буде вилучено. Цю дію не можна скасувати.
- Звичку вилучено / не знайдено
- У вихідні
- У будні
- Щодня
- Оберіть дні
- Експортувати як CVS
- Готово
- Очистити
- Оберіть години
- Оберіть хвилини
- Про програму
- Перекладачі
- Розробники
- Версія %s
- Частота
- Пташка
- Сила
- Найкращі серії
- Поточна серія
- Число повторень
- Останні %d дні(-в)
- Останні %d тижні (-в)
- Останні %d місяці (-в)
- Останні %d роки (-ів)
- Від початку
- Щодня
- Щотижня
- Двічі на тиждень
- 5 разів на тиждень
- Инше…
- Допомога & ЧаПи
- Помилка експортування даних.
- Помилка імпортування даних.
- Неможливо визначити тип файлу.
- Звички успішно імпортовано.
- Повна резервна копія успішно експортована.
- Імпортувати дані
- Експортувати повну резервну копію
- Підтримує імпортування повної резервної копії, експортованої цією програмою, а також файлів, створених програмами Tickmate, HabitBull та Rewire. Більше інформації дивіться у ЧаПи.
- Створює файли, які можна відкрити у програмах для роботи з таблицями (як-от: Microsoft Excel або OpenOffice Calc). Цей файл не можна імпортувати назад.
- Створює файл, що містить усі ваші дані. Цей файл можна імпортувати назад.
- Помилка створення звіту про помилку.
- Створити звіт про помилку
- Усунення несправностей
- Допоможіть перекласти цю програму
- Нічний режим
- Користати цілком чорне тло у нічному режимі
- Замінює сіре тло на цілком чорне у нічному режимі. Зменшує використання батареї в телефонах із дисплеєм AMOLED.
- Оболонка
- Зворотній лад днів
- Показувати дні у зворотньому порядку на головному екрані
- День
- Тиждень
- Місяць
- Квартал
- Рік
- Усього
-
- раз у
- Кожні %d дні(-в)
- Кожні %d тижні(-в)
- Кожні %d місяці (-в)
- Сталість
- Звук нагадування
- Немає
- Фільтр
- Приховати завершені
- Приховати архівовані
- Закріпити сповіщення
- Запобігає прихованню сповіщень.
- Відновити базу даних
- Базу даних відновлено.
- Зняти позначку
- Перемкнути
- Дія
- Звичка
- Сортувати
- Самотужки
- За назвою
- За кольором
- За сталістю
- Завантажити
- Експортувати
-
diff --git a/android/uhabits-android/src/main/res/values-vi-rVN/strings.xml b/android/uhabits-android/src/main/res/values-vi-rVN/strings.xml
new file mode 100644
index 000000000..e7147987a
--- /dev/null
+++ b/android/uhabits-android/src/main/res/values-vi-rVN/strings.xml
@@ -0,0 +1,179 @@
+
+
+
+
+ Trình theo dõi thói quen Loop
+ Thói quen
+ Cài đặt
+ Chỉnh sửa
+ Xoá
+ Lưu trữ
+ Hủy lưu trữ
+ Thêm thói quen
+ Thay đổi màu sắc
+ Thói quen đã được tạo
+ Thói quen đã bị xóa
+ Thói quen đã được phục hồi
+ Không có gì để hoàn tác
+ Không có gì để khôi phục
+ Thói quen đã được thay đổi
+ Thói quen đã huỷ chỉnh sửa
+ Thói quen đã được lưu trữ
+ Thói quen đã bị huỷ lưu trữ
+ Tổng quan
+ Độ mạnh của thói quen
+ Lịch sử
+ Xoá
+ Câu hỏi (Bạn đã ... hôm nay chưa?)
+ Lặp lại
+ lần trong
+ ngày
+ Nhắc nhở
+ Loại bỏ
+ Lưu
+ Mức độ
+ Bạn có không có thói quen nào đang hoạt động
+ Nhấn giữ để đánh dấu hoặc bỏ đánh dấu
+ Tắt
+ Tên không thể để trống.
+ Số phải là số dương.
+ Bạn có thể lặp lại tối đa một lần mỗi ngày
+ Tạo thói quen
+ Chỉnh sửa thói quen
+ Kiểm tra
+ Lúc khác
+
+ Chào mừng
+ Theo dõi thói quen Loop giúp bạn tạo ra và duy trì những thói quen tốt.
+ Tạo một số thói quen mới
+ Mỗi ngày, sau khi thực hiện các thói quen của bạn, hãy đánh dấu vào ứng dụng.
+ Hãy duy trì thói quen
+ Thói quen thực hiện một cách nhất quán trong một thời gian dài sẽ kiếm được trọn vẹn một ngôi sao.
+ Theo dõi quá trình của bạn
+ Đồ thị chi tiết cho bạn thấy các thói quen của bạn được cải thiện như thế nào theo thời gian.
+ 15 phút
+ 30 phút
+ 1 giờ
+ 2 giờ
+ 4 giờ
+ 8 giờ
+ 24 giờ
+ Bấm nhanh để chuyển trạng thái
+ Chỉ cần chạm một lần để đánh dấu thay cho việc nhấn giữ. Tiện lợi hơn nhưng có thể đánh dấu sai.
+ Khoảng thời gian báo lại lời nhắc
+ Đánh giá ứng dụng trên Google Play
+ Gửi phản hồi cho nhà phát triển
+ Xem mã nguồn trên Github
+ Xem giới thiệu ứng dụng
+ Liên kết
+ Hành vi
+ Tên
+ Cài đặt
+ Khoảng thời gian tạm dừng
+ Bạn đã biết?
+ Để sắp xếp lại các mục, nhấn giữ tên thói quen, sau đó kéo tới vị trí chính xác.
+ Bạn có thể xem thêm ngày bằng cách đặt điện thoại ở chế độ ngang.
+ Xoá bỏ thói quen
+ Thói quen sẽ bị xoá vĩnh viễn. Hành động này không thể khôi phục.
+ Thói quen đã bị xoá hoặc không tìm thấy
+ Cuối tuần
+ Thứ 2 đến thứ 6
+ Bất kỳ ngày nào trong tuần
+ Chọn ngày
+ Xuất dưới dạng CSV
+ Xong
+ Xoá
+ Chọn giờ
+ Chọn phút
+ Giới thiệu
+ Dịch giả
+ Nhà phát triển
+ Phiên bản %s
+ Tần suất
+ Đánh dấu
+ Độ mạnh
+ Duy trì lâu nhất
+ Số ngày duy trì hiện tại
+ Số lần lặp
+ Đã thực hiện được %d ngày
+ Đã thực hiện được %d tuần
+ Đã thực hiện được %d tháng
+ Đã thực hiện được %d năm
+ Toàn bộ thời gian
+ Hàng ngày
+ Hàng tuần
+ 2 lần một tuần
+ 5 lần một tuần
+ Tuỳ chỉnh…
+ Trợ giúp & Câu hỏi
+ Xuất dữ liệu thất bại.
+ Nhập dữ liệu thất bại.
+ Không xác nhận được file.
+ Thói quen được nhập thành công.
+ Xuất bản sao lưu đầy đủ thành công.
+ Nhập dữ liệu
+ Xuất toàn bộ sao lưu
+ Hồ trợ các bản sao lưu đầy đủ được xuất ra bởi ứng dụng, cũng như các file được tạo bởi Tickmate, HabitBull hoặc Rewire. Xem FAQ để biết thêm thông tin.
+ Các file tạo ra có thể mở bằng các phần mềm bảng tĩnh như Microsoft Excel hoặc OpenOffice Calc. Nhưng file này không thể nhập lại.
+ Tạo ra một tệp chứa tất cả dữ liệu của bạn. Tệp này có thể nhập lại.
+ Tạo báo cáo về lỗi.
+ Tạo báo cáo lỗi
+ Xử lí sự cố
+ Giúp dịch ứng dụng
+ Chế độ ban đêm
+ Sử dụng màu đen thuần trong chế độ ban đêm
+ Thay thế nền màu xám bởi màu đen thuần trong chế độ ban đêm. Giảm thiểu việc sử dụng pin của điện thoại có màn hình AMOLED.
+ Giao diện
+ Đảo ngược thứ tự của ngày
+ Hiển thị ngày ngược trên màn hình chính
+ Ngày
+ Tuần
+ Tháng
+ Quý
+ Năm
+ Tổng
+
+
+ lần trong
+ Mỗi %d ngày
+ Mỗi %d tuần
+ Mỗi %d tháng
+ Điểm
+ Âm báo
+ Không có
+ Lọc
+ Ẩn mục đã hoàn thành
+ Ẩn mục đã lưu trữ
+ Gửi thông báo cố định
+ Không cho các thông báo bị vuốt ngang mất.
+ Sửa cơ sở dữ liệu
+ Cơ sở dữ liệu đã được sửa.
+ Bỏ đánh dấu
+ Bật/tắt
+ Hành động
+ Thói quen
+ Sắp xếp
+ Thủ công
+ Theo tên
+ Theo màu sắc
+ Theo điểm số
+ Tải về
+ Xuất dữ liệu ra
+
diff --git a/android/uhabits-android/src/main/res/values-vi/strings.xml b/android/uhabits-android/src/main/res/values-vi/strings.xml
deleted file mode 100644
index ccbf7c9b8..000000000
--- a/android/uhabits-android/src/main/res/values-vi/strings.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-
-
-
-
- Herhaalde Gewoonte Boekhouer
- Gewoontes
- Instellings
- Redigeer
- Verwyder
- Argiveer
- Deargiveer
- Voeg gewoonte by
- Verander kleur
- Gewoonte geskep
- Gewoontes verwyder
- Gewoontes herstel
- Niks om terug te doen nie
- Niks om oor te doen nie
- Gewoonte verander
- Gewoonte terug verander
- Gewoontes geargiveer
- Gewoontes gedeargiveer
- Oorsig
-
- Welkom
- 15 minute
- 30 minute
- 1 uur
- 2 ure
- 4 ure
- 8 ure
- 24 ure
- Instellings
-
-
diff --git a/android/uhabits-android/src/main/res/values-zh-rCN/strings.xml b/android/uhabits-android/src/main/res/values-zh-rCN/strings.xml
index e0cc1352d..47efdd5e0 100644
--- a/android/uhabits-android/src/main/res/values-zh-rCN/strings.xml
+++ b/android/uhabits-android/src/main/res/values-zh-rCN/strings.xml
@@ -19,160 +19,162 @@
~ with this program. If not, see .
-->
- 循环习惯记录
- 习惯
- 设置
- 编辑
- 删除
- 存档
- 取消存档
- 添加新习惯
- 选择颜色
- 习惯已创建
- 习惯已删除
- 习惯已恢复
- 没有可以撤销的习惯.
- 没有可以恢复的习惯.
- 习惯已被修改.
- 修改已取消.
- 习惯存档成功.
- 存档已取消.
- 总览
- 习惯强度
- 历史
- 取消
- 提醒问题(你今天 xxx 了吗)
- 重复
- 次每
- 天
- 提醒
- 放弃
- 保存
- 连续完成次数
- 你还没有任何习惯
- 长按 标记/取消标记
- 关闭
- 习惯标题不能为空
- 数字必须大于零.
- 每天最多重复一次
- 新建习惯
- 编辑习惯
- 标记
- 以后再说
-
- 欢迎
- 循环习惯记录器帮助你建立和维持好习惯.
- 建立一些新习惯
- 每当你完成一项习惯后,就在应用上做一个标记
- 保持习惯
- 当连续完成习惯达到一定时间时,你将可以点亮该习惯的成就之星
- 记录你的进步
- 详细图表展示长期以来习惯养成情况
- 15分钟
- 30分钟
- 1小时
- 2小时
- 4小时
- 8小时
- 24 小时
- 轻触以启动重复
- 更加方便,但有可能造成意外记录
- 提醒延迟间隔
- 去Play商店评价这个应用
- 发送反馈给开发者
- 在Github上查看源代码
- 阅读应用介绍
- 链接
- 功能
- 习惯标题
- 设置
- 推迟提醒间隔
- 你知道吗?
- 如果要重新排列习惯,按住习惯的名字拖到想要的位置
- 转至横屏查看更多日期
- 删除该习惯
- 习惯会被永久删除,且该操作不可恢复
- 习惯已删/找不到
- 周末
- 工作日
- 每天
- 选择天数
- 导出数据 (CSV)
- 完成
- 取消
- 选择小时
- 选择分钟
- 关于应用
- 翻译者
- 开发者
- 当前版本:%s
- 频率
- 标记
- 强度
- 最佳连续完成次数
- 当前连续完成次数
- 重复次数
- 过去 %d 天
- 过去 %d 周
- 过去 %d 月
- 过去 %d 年
- 全部
- 每天
- 每周
- 每周两次
- 每周5次
- 自定义
- 帮助 & 常见问题
- 导出数据失败
- 导入数据失败
- 无法识别文件
- 习惯导入成功
- 习惯备份成功
- 导入数据
- 导出完整备份
- 支持此应用导出的备份文件, 也支持 Tickmate , HabitBull 或 Rewire 导出文件,请参阅常见问题以获取更多信息。
- 生成可以通过电子表格软件打开的文件,如 Microsoft Excel 或 OpenOffice Calc。该文件无法重新导入。
- 生成一个包含所有数据的文件。该文件可以重新导入。
- 错误报告生成失败
- 生成错误报告
- 故障排除
- 帮助翻译这个应用
- 夜间模式
- 在夜间模式中使用纯黑色
- 以纯黑色背景代替夜间模式中的灰色背景。这将帮助减少 AMOLED 屏幕手机的电量使用。
- 界面
- 反向顺序的日子
- 在主界面显示反向顺序的日子
- 天
- 周
- 月
- 季度
- 年
- 总数
-
- 次每
- 每 %d 天
- 每 %d 周
- 每 %d 月
- 成绩
- 提醒声音
- 无
- 筛选
- 隐藏已完成项目
- 隐藏已存档
- 使提醒持久
- 防止提醒被滑掉
- 修复数据库
- 数据库已修复
- 取消选中
- 切换
- 操作
- 习惯
- 排序
- 手动
- 根据名称
- 根据颜色
- 根据分数
- 下载
- 导出
+ Loop习惯记录
+ 习惯
+ 设置
+ 编辑
+ 删除
+ 存档
+ 取消存档
+ 添加新习惯
+ 选择颜色
+ 习惯已创建
+ 习惯已删除
+ 习惯已恢复
+ 没有可以撤销的习惯.
+ 没有可以恢复的习惯.
+ 习惯已被修改.
+ 修改已取消.
+ 习惯存档成功.
+ 存档已取消.
+ 总览
+ 习惯强度
+ 历史
+ 取消
+ 提醒问题(你今天 xxx 了吗)
+ 重复
+ 次每
+ 天
+ 提醒
+ 放弃
+ 保存
+ 连续完成次数
+ 你还没有任何习惯
+ 长按 标记/取消标记
+ 关闭
+ 习惯标题不能为空
+ 数字必须大于零.
+ 每天最多重复一次
+ 新建习惯
+ 编辑习惯
+ 标记
+ 以后再说
+
+ 欢迎
+ 循环习惯记录器帮助你建立和维持好习惯.
+ 建立一些新习惯
+ 每当你完成一项习惯后,就在应用上做一个标记
+ 保持习惯
+ 当连续完成习惯达到一定时间时,你将可以点亮该习惯的成就之星
+ 记录你的进步
+ 详细图表展示长期以来习惯养成情况
+ 15分钟
+ 30分钟
+ 1小时
+ 2小时
+ 4小时
+ 8小时
+ 24 小时
+ 轻触以启动重复
+ 更加方便,但有可能造成意外记录
+ 提醒延迟间隔
+ 去Play商店评价这个应用
+ 发送反馈给开发者
+ 在Github上查看源代码
+ 阅读应用介绍
+ 链接
+ 功能
+ 习惯标题
+ 设置
+ 推迟提醒间隔
+ 你知道吗?
+ 如果要重新排列习惯,按住习惯的名字拖到想要的位置
+ 转至横屏查看更多日期
+ 删除该习惯
+ 习惯会被永久删除,且该操作不可恢复
+ 习惯已删/找不到
+ 周末
+ 工作日
+ 每天
+ 选择天数
+ 导出数据 (CSV)
+ 完成
+ 取消
+ 选择小时
+ 选择分钟
+ 关于应用
+ 翻译者
+ 开发者
+ 当前版本:%s
+ 频率
+ 标记
+ 强度
+ 最佳连续完成次数
+ 当前连续完成次数
+ 重复次数
+ 过去 %d 天
+ 过去 %d 周
+ 过去 %d 月
+ 过去 %d 年
+ 全部
+ 每天
+ 每周
+ 每周两次
+ 每周5次
+ 自定义
+ 帮助 & 常见问题
+ 导出数据失败
+ 导入数据失败
+ 无法识别文件
+ 习惯导入成功
+ 习惯备份成功
+ 导入数据
+ 导出完整备份
+ 支持此应用导出的备份文件, 也支持 Tickmate , HabitBull 或 Rewire 导出文件,请参阅常见问题以获取更多信息。
+ 生成可以通过电子表格软件打开的文件,如 Microsoft Excel 或 OpenOffice Calc。该文件无法重新导入。
+ 生成一个包含所有数据的文件。该文件可以重新导入。
+ 错误报告生成失败
+ 生成错误报告
+ 故障排除
+ 帮助翻译这个应用
+ 夜间模式
+ 在夜间模式中使用纯黑色
+ \"以纯黑色背景代替夜间模式中的灰色背景。
+这将帮助减少 AMOLED 屏幕手机的电量使用。\"
+ 界面
+ 反向顺序的日子
+ 在主界面显示反向顺序的日子
+ 天
+ 周
+ 月
+ 季度
+ 年
+ 总数
+
+
+ 次每
+ 每 %d 天
+ 每 %d 周
+ 每 %d 月
+ 成绩
+ 提醒声音
+ 无
+ 筛选
+ 隐藏已完成项目
+ 隐藏已存档
+ 使提醒持久
+ 防止提醒被滑掉
+ 修复数据库
+ 数据库已修复
+ 取消选中
+ 切换
+ 操作
+ 习惯
+ 排序
+ 手动
+ 根据名称
+ 根据颜色
+ 根据分数
+ 下载
+ 导出
diff --git a/android/uhabits-android/src/main/res/values-zh-rTW/strings.xml b/android/uhabits-android/src/main/res/values-zh-rTW/strings.xml
index 585663c45..e82014c77 100644
--- a/android/uhabits-android/src/main/res/values-zh-rTW/strings.xml
+++ b/android/uhabits-android/src/main/res/values-zh-rTW/strings.xml
@@ -19,160 +19,165 @@
~ with this program. If not, see .
-->
- Loop 習以為常
- 習慣
- 偏好設定
- 編輯
- 刪除
- 封存
- 取消封存
- 加入新習慣
- 選擇顏色
- 習慣已增加
- 習慣已刪除
- 習慣已恢復
- 沒有可以撤銷的習慣
- 沒有可以恢復的習慣
- 習慣已經被修改
- 修改已取消
- 習慣已封存
- 習慣已取消封存
- 總覽
- 習慣強度
- 歴史紀錄
- 清空
- 問題(你今天…了嗎?)
- 重複
- 次每
- 日
- 提醒
- 取消
- 保存
- 記錄
- 你還沒有任何習慣
- 長按以標記/取消標記
- 關閉
- 習慣標題不能空白
- 數字必需大於零
- 每天最多重複一次
- 添加習慣
- 編輯習慣
- 標記
- 稍後
-
- 歡迎
- 習以為常幫你創建並保持你的習慣。
- 建立一些習慣吧
- 每天,在完成你的習慣後,進入APP來打個勾吧。
- 堅持下去!
- 習以為常幫助你建立並維持好習慣
- 追蹤你的進步
- 詳細的圖表將顯示你的進步
- 15分鐘
- 30分鐘
- 1小時
- 2小時
- 4小時
- 8小時
- 24 小時
- 短按來記錄習慣
- 但有可能造成意外記錄
- 提醒延遲間隔
- 在Google Play上評價這個App
- 發送改進意見給開發者
- 在GitHub上查看原始碼
- App簡介
- 連結
- 功能
- 習慣標題
- 設定
- 延遲時間間隔
- 你知道嗎?
- 如果要重新排列習慣,拖曳習慣到想要的位置
- 把手機橫放可以看到更多天數
- 刪除
- 習慣會被永久刪除,而且該操作不可恢復
- 習慣已刪除/找不到
- 周末
- 工作日
- 每天
- 選擇天數
- 匯出數據 (CSV)
- 完成
- 取消
- 選擇小時
- 選擇分鐘
- 關於本程式
- 翻譯者
- 開發者
- %s 版
- 頻率
- 標記
- 強度
- 最長紀錄
- 目前紀錄
- 重複次數
- 過去 %d 天
- 過去 %d 周
- 過去 %d 月
- 過去 %d 年
- 全部
- 每天
- 每週
- 每週兩次
- 每週五次
- 自訂週期
- 幫助& 常見問題
- 輸出資料失敗
- 輸入資料失敗
- 無法辨識
- 習慣輸入成功
- 習慣備份成功
- 匯入資料
- 匯出完整備份
- 支援此程式所匯出的資料, 也支援Tickmate,HabitBull 或 Rewire 所產生的文件。請參閱常見問題以獲得更多訊息。
- 生成可以利用表格程式打開的文件,如Microsoft Excel或OpenOffice Calc。此文件無法重新匯入。
- 生成一個包含所有資料的文件。該文件可以再重新匯入。
- 錯誤報告:生成失敗
- 產生錯誤報告
- 問題排除
- 協助翻譯本程式
- 夜間模式
- 在夜間模式中使用深色設定
- 在夜間模式中,使用黑色背景取代灰色背景。這樣可以減少AMOLED螢幕的手機電量消耗。
- 介面
- 反向排序日期
- 在主畫面上顯示反向排序的結果
- 日
- 周
- 月
- 季
- 年
- 總計
-
- 次每
- 每 %d 天
- 每 %d 周
- 每 %d 月
- 分數
- 提醒音效
- 無
- 篩選
- 隱藏已完成的習慣
- 隱藏已封存習慣
- 使提醒保持常駐
- 防止提醒被滑動移除
- 修復資料庫
- 資料庫已修復
- 取消選取
- 切換
- 操作
- 習慣
- 排序
- 手動
- 根據名稱
- 根據顏色
- 根據分數
- 下載
- 匯出
+ Loop 習以為常
+ 習慣
+ 偏好設定
+ 編輯
+ 刪除
+ 封存
+ 取消封存
+ 加入新習慣
+ 選擇顏色
+ 習慣已增加
+ 習慣已刪除
+ 習慣已恢復
+ 沒有可以撤銷的習慣
+ 沒有可以恢復的習慣
+ 習慣已經被修改
+ 修改已取消
+ 習慣已封存
+ 習慣已取消封存
+ 總覽
+ 習慣強度
+ 歴史紀錄
+ 清空
+ 問題(你今天…了嗎?)
+ 重複
+ 次每
+ 日
+ 提醒
+ 取消
+ 儲存
+ 記錄
+ 你還沒有任何習慣
+ 請以長按來標記或取消標記
+ 關閉
+ 習慣標題不能空白
+ 數字必需大於零
+ 每天最多重複一次
+ 新增習慣
+ 編輯習慣
+ 標記
+ 稍後
+
+ 歡迎
+ 「Loop 習以為常」可以幫您記錄並培養好習慣。
+ 開始來建立一些習慣吧
+ 每天,在完成你的習慣後,進入APP來打個勾吧。
+ 堅持下去!
+ 習以為常幫助你建立並維持好習慣
+ 追蹤您的進度
+ 詳細的圖表將顯示你的持續進步
+ 15 分鐘
+ 30 分鐘
+ 1 小時
+ 2 小時
+ 4 小時
+ 8 小時
+ 24 小時
+ 短按來記錄習慣
+ 但有可能造成意外記錄
+ 提醒延遲間隔
+ 在 Google Play 上評價這個 App
+ 傳送改進意見給開發者
+ 在 GitHub 上查看原始碼
+ App 簡介
+ 連結
+ 功能
+ 習慣標題
+ 設定
+ 延遲時間間隔
+ 你知道嗎?
+ 如果要重新排列習慣,可以將其拖曳到想要的位置
+ 把手機橫放可以看到更多天數
+ 刪除
+ 習慣會被永久刪除,而且該操作不可恢復
+ 習慣已刪除 / 搜尋不到
+ 週末
+ 工作日
+ 每天
+ 選擇天數
+ 匯出數據 (CSV)
+ 完成
+ 取消
+ 選擇小時
+ 選擇分鐘
+ 關於本程式
+ 翻譯人員
+ 開發者
+ %s 版
+ 頻率
+ 標記
+ 強度
+ 最長紀錄
+ 目前紀錄
+ 重複次數
+ 過去 %d 天
+ 過去 %d 週
+ 過去 %d 個月
+ 過去 %d 年
+ 全部
+ 每天
+ 每週
+ 每週兩次
+ 每週五次
+ 自訂週期
+ 幫助& 常見問題
+ 輸出資料失敗
+ 輸入資料失敗
+ 無法辨識
+ 習慣輸入成功
+ 習慣備份成功
+ 匯入資料
+ 匯出完整備份
+ 可使用本程式所匯出的資料。
+另外也支援其他 App「Tickmate」、「HabitBull」或「Rewire」所產生的文件。
+請參閱「常見問題」來了解更多訊息。
+ 產生可以利用表格軟體打開的文件,如「Microsoft Excel」或「OpenOffice Calc」。
+此文件無法重新匯入本程式。
+ 產生一個包含所有資料的文件。
+該文件可以再重新匯入。
+ 錯誤報告:輸出失敗
+ 輸出錯誤報告
+ 問題排除
+ 協助翻譯本程式
+ 夜間模式
+ 在夜間模式中使用深色設定
+ 在夜間模式中,使用黑色背景取代灰色背景。這樣可以減少 AMOLED 螢幕手機的電量消耗。
+ 介面
+ 反向排序日期
+ 在主畫面上顯示反向排序的結果
+ 日
+ 週
+ 月
+ 季
+ 年
+ 總計
+
+
+ 次每
+ 每 %d 天
+ 每 %d 週
+ 每 %d 個月
+ 分數
+ 提醒音效
+ 無
+ 篩選
+ 隱藏已完成的習慣
+ 隱藏已封存習慣
+ 使提醒保持常駐
+ 防止提醒被滑動移除
+ 修復資料庫
+ 資料庫已修復
+ 取消選取
+ 切換
+ 操作
+ 習慣
+ 排序
+ 手動
+ 根據名稱
+ 根據顏色
+ 根據分數
+ 下載
+ 匯出
diff --git a/android/uhabits-android/src/main/res/values/attrs.xml b/android/uhabits-android/src/main/res/values/attrs.xml
index a6a431075..4fb100075 100644
--- a/android/uhabits-android/src/main/res/values/attrs.xml
+++ b/android/uhabits-android/src/main/res/values/attrs.xml
@@ -41,8 +41,6 @@
-
-
diff --git a/android/uhabits-android/src/main/res/values/constants.xml b/android/uhabits-android/src/main/res/values/constants.xml
index 57c788f75..0bf396697 100644
--- a/android/uhabits-android/src/main/res/values/constants.xml
+++ b/android/uhabits-android/src/main/res/values/constants.xml
@@ -22,6 +22,8 @@
market://details?id=org.isoron.uhabitsmailto:dev@loophabits.org?subject=Feedback%20about%20Loop%20Habit%20Trackermailto:dev@loophabits.org?subject=Bug%20Report%20-%20Loop%20Habit%20Tracker
+ http://loophabits.org/privacy
+ https://github.com/iSoron/uhabits/graphs/contributorshttps://github.com/iSoron/uhabitshttp://translate.loophabits.org/dev@loophabits.org
@@ -121,9 +123,27 @@
dailyweekly
- montly
+ monthly15100
+
+
+ 100%
+ 80%
+ 60%
+ 40%
+ 20%
+ 0%
+
+
+
+ 255
+ 204
+ 153
+ 102
+ 51
+ 0
+
\ No newline at end of file
diff --git a/android/uhabits-android/src/main/res/values/fontawesome.xml b/android/uhabits-android/src/main/res/values/fontawesome.xml
index 964b03954..ff6aef460 100644
--- a/android/uhabits-android/src/main/res/values/fontawesome.xml
+++ b/android/uhabits-android/src/main/res/values/fontawesome.xml
@@ -21,11 +21,16 @@
-
+
+
+
+
+
+
@@ -131,13 +136,11 @@
-
-
@@ -174,7 +177,6 @@
-
@@ -182,7 +184,6 @@
-
@@ -238,7 +239,6 @@
-
diff --git a/android/uhabits-android/src/main/res/values/strings.xml b/android/uhabits-android/src/main/res/values/strings.xml
index 917bd8b30..fd6a021b8 100644
--- a/android/uhabits-android/src/main/res/values/strings.xml
+++ b/android/uhabits-android/src/main/res/values/strings.xml
@@ -20,6 +20,7 @@
Loop Habit Tracker
+ LoopHabitsSettingsEdit
@@ -128,12 +129,13 @@
Version %sFrequencyCheckmark
- StackView Widget For All Habits
- Checkmark Stack Widget
- Frequency Stack Widget
- Score Stack Widget
- History Stack Widget
- Streaks Stack Widget
+
+ StackView Widget For All Habits
+ Checkmark Stack Widget
+ Frequency Stack Widget
+ Score Stack Widget
+ History Stack Widget
+ Streaks Stack WidgetStrength
@@ -169,9 +171,9 @@
TroubleshootingHelp translate this app
- Night mode
- Use pure black in night mode
- Replaces gray backgrounds with pure black in night mode. Reduces battery usage in phones with AMOLED display.
+ Dark theme
+ Use pure black in dark theme
+ Replaces gray backgrounds with pure black in dark theme. Reduces battery usage in phones with AMOLED display.InterfaceReverse order of daysShow days in reverse order on the main screen.
@@ -235,4 +237,32 @@
NoChange sound, vibration, light and other notification settingsCustomize notifications
+ View privacy policy
+ View all contributors…
+ Database
+ Widget opacity
+ Makes widgets more transparent or more opaque in your home screen.
+ First day of the week
+ Have you completed this habit today?
+ Notes
+ (Optional)
+
+ e.g. Did you wake up early today? Did you exercise? Did you play chess?
+ Measurable
+ e.g. How many miles did you run today? How many pages did you read? How many calories did you eat?
+ Subjective
+ e.g. Are you felling happy today? Definitely, somewhat, not at all? How frequently did you snack? Very often, sometimes, never?
+ %d times per week
+ %d times per month
+ e.g. Exercise
+ Color
+ e.g. 15
+ e.g. Run
+ e.g. How many miles did you run today?
+ e.g. miles
+ Every month
+ Cannot be blank
+ Today
+
+
\ No newline at end of file
diff --git a/android/uhabits-android/src/main/res/values/styles.xml b/android/uhabits-android/src/main/res/values/styles.xml
index 9b3df185b..0e7035784 100644
--- a/android/uhabits-android/src/main/res/values/styles.xml
+++ b/android/uhabits-android/src/main/res/values/styles.xml
@@ -18,10 +18,11 @@
-->
-
-
-
-
-
@@ -262,4 +253,106 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/android/uhabits-android/src/main/res/values/styles_dialog.xml b/android/uhabits-android/src/main/res/values/styles_dialog.xml
index 3dc983310..e538bb5c4 100644
--- a/android/uhabits-android/src/main/res/values/styles_dialog.xml
+++ b/android/uhabits-android/src/main/res/values/styles_dialog.xml
@@ -24,7 +24,7 @@
match_parentwrap_content10
- textMultiLine
+ textCapSentences|textMultiLine