From 9f7888dd330e2b31f5bb376cda8635a915b74a7a Mon Sep 17 00:00:00 2001
From: 7LPdWcaW <7LPdWcaW@gmail.com>
Date: Mon, 28 Oct 2019 18:55:44 +0000
Subject: [PATCH 01/33] Fixes incorrect date formatter
---
.../main/java/me/anon/lib/export/MarkdownProcessor.kt | 10 +++++-----
app/src/main/java/me/anon/lib/helper/BackupHelper.kt | 2 +-
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/app/src/main/java/me/anon/lib/export/MarkdownProcessor.kt b/app/src/main/java/me/anon/lib/export/MarkdownProcessor.kt
index c7d325dd..d9818299 100644
--- a/app/src/main/java/me/anon/lib/export/MarkdownProcessor.kt
+++ b/app/src/main/java/me/anon/lib/export/MarkdownProcessor.kt
@@ -77,7 +77,7 @@ class MarkdownProcessor : ExportProcessor()
}
val planted = DateTimeUtils.toLocalDateTime(Timestamp(plant.plantDate))
- documentBuilder.append("**Planted:** ").append(planted.format(DateTimeFormatter.ofPattern("yyyy-mm-dd HH:mm")))
+ documentBuilder.append("**Planted:** ").append(planted.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")))
documentBuilder.append(NEW_LINE + NEW_LINE)
documentBuilder.append("**From clone?:** ").append(plant.clone)
@@ -106,7 +106,7 @@ class MarkdownProcessor : ExportProcessor()
{
val harvested = DateTimeUtils.toLocalDateTime(Timestamp(stageDate))
- documentBuilder.append("**Harvested:** ").append(harvested.format(DateTimeFormatter.ofPattern("yyyy-mm-dd HH:mm")))
+ documentBuilder.append("**Harvested:** ").append(harvested.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")))
documentBuilder.append(NEW_LINE + NEW_LINE)
}
}
@@ -123,7 +123,7 @@ class MarkdownProcessor : ExportProcessor()
val stageName = key.enString
documentBuilder.append(" - ").append(stageName).append(NEW_LINE + NEW_LINE)
- documentBuilder.append("\t - ").append("**Set on:** ").append(stageDateTime.format(DateTimeFormatter.ofPattern("yyyy-mm-dd HH:mm"))).append(NEW_LINE)
+ documentBuilder.append("\t - ").append("**Set on:** ").append(stageDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"))).append(NEW_LINE)
if (key != PlantStage.HARVESTED)
{
@@ -265,7 +265,7 @@ class MarkdownProcessor : ExportProcessor()
val actionDate = DateTimeUtils.toLocalDateTime(Timestamp(action.date))
documentBuilder.append("| ")
- documentBuilder.append(actionDate.format(DateTimeFormatter.ofPattern("yyyy-mm-dd HH:mm")))
+ documentBuilder.append(actionDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")))
documentBuilder.append(" | ")
// stage date
@@ -381,7 +381,7 @@ class MarkdownProcessor : ExportProcessor()
val actionDate = DateTimeUtils.toLocalDateTime(Timestamp(action.date))
documentBuilder.append("| ")
- documentBuilder.append(actionDate.format(DateTimeFormatter.ofPattern("yyyy-mm-dd HH:mm")))
+ documentBuilder.append(actionDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")))
documentBuilder.append(" | ")
documentBuilder.append(action.getTypeStr())
documentBuilder.append(" | ")
diff --git a/app/src/main/java/me/anon/lib/helper/BackupHelper.kt b/app/src/main/java/me/anon/lib/helper/BackupHelper.kt
index 918b4e2a..ba1b3dcd 100644
--- a/app/src/main/java/me/anon/lib/helper/BackupHelper.kt
+++ b/app/src/main/java/me/anon/lib/helper/BackupHelper.kt
@@ -46,7 +46,7 @@ object BackupHelper
}
}
- return DateTimeUtils.toLocalDateTime(Timestamp(date.time)).format(DateTimeFormatter.ofPattern("yyyy-mm-dd HH:mm:ss"))
+ return DateTimeUtils.toLocalDateTime(Timestamp(date.time)).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))
}
return ""
From 17e454aa64b4e4cf4d2b9c3c1068b4351708d1a0 Mon Sep 17 00:00:00 2001
From: 7LPdWcaW <7LPdWcaW@gmail.com>
Date: Mon, 28 Oct 2019 19:14:23 +0000
Subject: [PATCH 02/33] Adds support for backups from older versions
---
.../anon/grow/fragment/SettingsFragment.java | 18 ++++--
.../me/anon/lib/helper/MigrationHelper.java | 56 ++++++++++---------
2 files changed, 45 insertions(+), 29 deletions(-)
diff --git a/app/src/main/java/me/anon/grow/fragment/SettingsFragment.java b/app/src/main/java/me/anon/grow/fragment/SettingsFragment.java
index f98922e4..ef18a0c6 100644
--- a/app/src/main/java/me/anon/grow/fragment/SettingsFragment.java
+++ b/app/src/main/java/me/anon/grow/fragment/SettingsFragment.java
@@ -65,12 +65,14 @@
import me.anon.lib.helper.AddonHelper;
import me.anon.lib.helper.BackupHelper;
import me.anon.lib.helper.EncryptionHelper;
+import me.anon.lib.helper.MigrationHelper;
import me.anon.lib.helper.NotificationHelper;
import me.anon.lib.helper.PathHelper;
import me.anon.lib.manager.FileManager;
import me.anon.lib.manager.GardenManager;
import me.anon.lib.manager.PlantManager;
import me.anon.lib.manager.ScheduleManager;
+import me.anon.lib.task.AsyncCallback;
import me.anon.lib.task.DecryptTask;
import me.anon.lib.task.EncryptTask;
import me.anon.model.Garden;
@@ -836,20 +838,23 @@ else if ("restore".equals(preference.getKey()))
}
File file = new File(backupPath.getPath() + "/" + backup);
- if (backup.contains("plants") && backup.endsWith(".bak"))
+ if (backup.contains("plants"))
{
+ current.requireMigration = !backup.endsWith(".bak");
current.plantsPath = backupPath.getPath() + "/" + backup;
current.size += file.length();
}
- if (backup.contains("gardens") && backup.endsWith(".bak"))
+ if (backup.contains("gardens"))
{
+ current.requireMigration = !backup.endsWith(".bak");
current.gardenPath = backupPath.getPath() + "/" + backup;
current.size += file.length();
}
- if (backup.contains("schedules") && backup.endsWith(".bak"))
+ if (backup.contains("schedules"))
{
+ current.requireMigration = !backup.endsWith(".bak");
current.schedulePath = backupPath.getPath() + "/" + backup;
current.size += file.length();
}
@@ -1057,12 +1062,16 @@ private void completeRestore(BackupData selectedBackup)
else
{
SnackBar.show(getActivity(), getString(R.string.restore_complete, selectedBackup.toString()), Snackbar.LENGTH_LONG, null);
- getActivity().recreate();
}
FileManager.getInstance().removeFile(PlantManager.FILES_DIR + "/plants.temp");
FileManager.getInstance().removeFile(GardenManager.FILES_DIR + "/gardens.temp");
FileManager.getInstance().removeFile(ScheduleManager.FILES_DIR + "/schedules.temp");
+
+ if (selectedBackup.requireMigration)
+ {
+ MigrationHelper.migratePpm(getActivity());
+ }
}
@Override public void onActivityResult(int requestCode, int resultCode, Intent data)
@@ -1133,6 +1142,7 @@ public class BackupData
String gardenPath;
String schedulePath;
long size = 0;
+ boolean requireMigration = false;
@Override public String toString()
{
diff --git a/app/src/main/java/me/anon/lib/helper/MigrationHelper.java b/app/src/main/java/me/anon/lib/helper/MigrationHelper.java
index 62ed3e82..ed2b5416 100644
--- a/app/src/main/java/me/anon/lib/helper/MigrationHelper.java
+++ b/app/src/main/java/me/anon/lib/helper/MigrationHelper.java
@@ -40,31 +40,7 @@ public static boolean performMigration(Context context, final AsyncCallback call
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
if (!preferences.getBoolean("migration_tds", false))
{
- // migrate ppm to tds
- boolean usingEc = preferences.getBoolean("tds_ec", false);
- for (Plant plant : PlantManager.getInstance().getPlants())
- {
- for (Action action : plant.getActions())
- {
- if (action instanceof Water && ((Water)action).getPpm() != null)
- {
- Tds replacement = new Tds();
- if (usingEc && ((Water)action).getPpm() < 25)
- {
- replacement.setAmount(Unit.toTwoDecimalPlaces((((Water)action).getPpm() * 2d) / 1000d));
- replacement.setType(TdsUnit.EC);
- }
- else
- {
- replacement.setAmount(((Water)action).getPpm());
- replacement.setType(TdsUnit.PPM500);
- }
-
- ((Water)action).setTds(replacement);
- ((Water)action).setPpm(null);
- }
- }
- }
+ migratePpm(context);
preferences.edit().putBoolean("migration_tds", true).apply();
PlantManager.getInstance().save(callback, true);
@@ -77,4 +53,34 @@ public static boolean performMigration(Context context, final AsyncCallback call
}
return false;
}
+
+ public static void migratePpm(Context context)
+ {
+ // migrate ppm to tds
+ SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
+ boolean usingEc = preferences.getBoolean("tds_ec", false);
+ for (Plant plant : PlantManager.getInstance().getPlants())
+ {
+ for (Action action : plant.getActions())
+ {
+ if (action instanceof Water && ((Water)action).getPpm() != null)
+ {
+ Tds replacement = new Tds();
+ if (usingEc && ((Water)action).getPpm() < 25)
+ {
+ replacement.setAmount(Unit.toTwoDecimalPlaces((((Water)action).getPpm() * 2d) / 1000d));
+ replacement.setType(TdsUnit.EC);
+ }
+ else
+ {
+ replacement.setAmount(((Water)action).getPpm());
+ replacement.setType(TdsUnit.PPM500);
+ }
+
+ ((Water)action).setTds(replacement);
+ ((Water)action).setPpm(null);
+ }
+ }
+ }
+ }
}
From df1551c03f057439892a418ce0fd0365d67819d7 Mon Sep 17 00:00:00 2001
From: 7LPdWcaW <7LPdWcaW@gmail.com>
Date: Mon, 28 Oct 2019 19:33:43 +0000
Subject: [PATCH 03/33] Adds camera permission
---
app/src/main/AndroidManifest.xml | 1 +
.../java/me/anon/grow/fragment/PlantDetailsFragment.java | 6 ++++++
.../main/java/me/anon/grow/fragment/ViewPhotosFragment.java | 6 ++++++
app/src/main/res/values/strings.xml | 2 ++
4 files changed, 15 insertions(+)
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index b75e7d11..a5299dd9 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -4,6 +4,7 @@
>
+
Export complete
Include images?
There is no data available
+
+ Camera permission is required to take photos
From b10d858521bc25697e12ae41bca8cd22f890c736 Mon Sep 17 00:00:00 2001
From: "transifex-integration[bot]"
<43880903+transifex-integration[bot]@users.noreply.github.com>
Date: Tue, 29 Oct 2019 14:56:33 +0000
Subject: [PATCH 04/33] Apply translations in es
translation completed for the source file '/app/src/main/res/values/strings.xml'
on the 'es' language
---
app/src/main/res/values-es/strings.xml | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index 09b67361..8541d2c8 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -394,7 +394,7 @@
Se falló en establecer la ubicación para imágenes
Ubicación de las imágenes guardadas
Limpiar el cache de imágenes
- Disco de imágenes y caché de memoria vaciados
+ Imágenes y caché en memoria y disco vaciados
Importando imágenes, esto puede tomar un ratito…
Tarea de información
Tarea completada
@@ -406,4 +406,6 @@
Exportado por completo
¿Incluir imágenes?
No hay ninguna información disponible
+
+ Para tomar fotos se necesita el permiso para la cámara
From 83a951b21a7ce772059014582c7a75ad9a573486 Mon Sep 17 00:00:00 2001
From: "transifex-integration[bot]"
<43880903+transifex-integration[bot]@users.noreply.github.com>
Date: Sat, 2 Nov 2019 12:22:41 +0000
Subject: [PATCH 05/33] Apply translations in fr
translation completed for the source file '/app/src/main/res/values/strings.xml'
on the 'fr' language
---
app/src/main/res/values-fr/strings.xml | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 155e9b70..309a2512 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -83,8 +83,6 @@
Date
Aujourd\'hui
Curé depuis %s jours
- %s jours
- Jours %s
Arrosages
Changements d\'état
@@ -407,4 +405,7 @@
%s exporté à %s
Export complet
Inclure les images ?
+ Aucune donnée accessible
+
+ Permission d\'utiliser l\'appareil photo requise pour prendre des photos
From 94d29b81f8c00a760a78d90ceebeb44ae7a08732 Mon Sep 17 00:00:00 2001
From: "transifex-integration[bot]"
<43880903+transifex-integration[bot]@users.noreply.github.com>
Date: Sun, 10 Nov 2019 12:57:44 +0000
Subject: [PATCH 06/33] Apply translations in uk
translation completed for the source file '/app/src/main/res/values/strings.xml'
on the 'uk' language
---
app/src/main/res/values-uk/strings.xml | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index 9ca6236a..c032d2ca 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -174,7 +174,7 @@
Встановити
Змінити
Додати
- Відмінити
+ Скасувати
дію
Ок
Обов\'язкове поле
@@ -410,7 +410,7 @@
Очистити кеш зображень
Кеш зображень очищено
Імпортую зображення, це може тривати довго...
- Завдання даних
+ Обробка даних
Завдання виконано
Немає дій
@@ -420,4 +420,6 @@
Експорт завершено
Включити зображення?
Дані відсутні
+
+ Камері потрібен дозвіл щоб робити знімки
From fb9fabe931da917d3a5bc41758cd9fed2799b624 Mon Sep 17 00:00:00 2001
From: "transifex-integration[bot]"
<43880903+transifex-integration[bot]@users.noreply.github.com>
Date: Sun, 10 Nov 2019 13:01:56 +0000
Subject: [PATCH 07/33] Apply translations in ru
translation completed for the source file '/app/src/main/res/values/strings.xml'
on the 'ru' language
---
app/src/main/res/values-ru/strings.xml | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 0935d3b4..e1d25532 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -410,7 +410,7 @@
Очистить кеш изображений
Кеш изображений очищен
Импорт изображений, может занять некоторое время...
- Задание данных
+ Обработка данных
Задание выполнено
Нет действий
@@ -420,4 +420,6 @@
Экспорт завершён
Включить изображения?
Данные отсутствуют
+
+ Камере необходимо разрешение чтобы делать фото
From 264de939857c796ac027aaafd9dd4b44a539f5da Mon Sep 17 00:00:00 2001
From: 7LPdWcaW <7LPdWcaW@gmail.com>
Date: Tue, 19 Nov 2019 11:34:29 +0000
Subject: [PATCH 08/33] Fixes crash with landscape mode
---
.../res/layout-land/actions_list_view.xml | 77 +++++++++++++------
app/src/main/res/layout/actions_list_view.xml | 4 +-
.../main/res/layout/garden_tracker_view.xml | 4 +-
app/src/main/res/layout/garden_view.xml | 4 +-
app/src/main/res/layout/image_grid_view.xml | 4 +-
app/src/main/res/layout/plant_list_view.xml | 4 +-
.../main/res/layout/schedule_list_view.xml | 4 +-
app/src/main/res/values-land/dimens.xml | 5 ++
app/src/main/res/values/dimens.xml | 1 +
9 files changed, 73 insertions(+), 34 deletions(-)
create mode 100644 app/src/main/res/values-land/dimens.xml
diff --git a/app/src/main/res/layout-land/actions_list_view.xml b/app/src/main/res/layout-land/actions_list_view.xml
index 8ad23d70..8d067991 100644
--- a/app/src/main/res/layout-land/actions_list_view.xml
+++ b/app/src/main/res/layout-land/actions_list_view.xml
@@ -6,40 +6,73 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
>
-
-
+
+
+
+
-
-
-
+
+
+
+ 128dp
+
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index ab4ba952..73bfbd84 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -4,4 +4,5 @@
8dp
4dp
190dp
+ 256dp
From b2b068e86269b58847f6ff99eafe0f842b8a1e04 Mon Sep 17 00:00:00 2001
From: 7LPdWcaW <7LPdWcaW@gmail.com>
Date: Tue, 19 Nov 2019 11:56:54 +0000
Subject: [PATCH 09/33] Deletes plant folder if no images left
---
.../grow/fragment/PlantDetailsFragment.java | 27 ++++++++-
.../grow/fragment/ViewPhotosFragment.java | 60 +++++++++++++++++--
2 files changed, 81 insertions(+), 6 deletions(-)
diff --git a/app/src/main/java/me/anon/grow/fragment/PlantDetailsFragment.java b/app/src/main/java/me/anon/grow/fragment/PlantDetailsFragment.java
index 6eaf185e..83db0617 100644
--- a/app/src/main/java/me/anon/grow/fragment/PlantDetailsFragment.java
+++ b/app/src/main/java/me/anon/grow/fragment/PlantDetailsFragment.java
@@ -523,8 +523,31 @@ private void setUi()
{
if (resultCode == Activity.RESULT_CANCELED)
{
- new File(plant.getImages().get(plant.getImages().size() - 1)).delete();
- plant.getImages().remove(plant.getImages().size() - 1);
+ File imageFile = new File(plant.getImages().get(plant.getImages().size() - 1));
+
+ if (imageFile.delete())
+ {
+ plant.getImages().remove(plant.getImages().size() - 1);
+ }
+
+ File folderFile = imageFile.getParentFile();
+ String[] list = folderFile.list();
+ if (list != null)
+ {
+ if (list.length == 1 && ".nomedia".equals(list[0]))
+ {
+ new File(folderFile, ".nomedia").delete();
+ }
+
+ if (folderFile.list() == null || folderFile.list().length == 0)
+ {
+ folderFile.delete();
+ }
+ }
+ else
+ {
+ folderFile.delete();
+ }
}
else
{
diff --git a/app/src/main/java/me/anon/grow/fragment/ViewPhotosFragment.java b/app/src/main/java/me/anon/grow/fragment/ViewPhotosFragment.java
index 560f80e2..beb0e637 100644
--- a/app/src/main/java/me/anon/grow/fragment/ViewPhotosFragment.java
+++ b/app/src/main/java/me/anon/grow/fragment/ViewPhotosFragment.java
@@ -24,7 +24,9 @@
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -181,11 +183,38 @@ else if (item.getItemId() == R.id.delete)
{
@Override public void onClick(DialogInterface dialog, int which)
{
+ Set folders = new HashSet<>();
for (String integer : adapter.getSelected())
{
String image = adapter.getImages().get(Integer.parseInt(integer));
- new File(image).delete();
- plant.getImages().remove(image);
+ File imageFile = new File(image);
+
+ folders.add(imageFile.getParentFile().getPath());
+ if (imageFile.delete())
+ {
+ plant.getImages().remove(image);
+ }
+ }
+
+ for (String folder : folders)
+ {
+ File folderFile = new File(folder);
+ if (folderFile.isDirectory())
+ {
+ String[] list = folderFile.list();
+ if (list != null)
+ {
+ if (list.length == 1 && ".nomedia".equals(list[0]))
+ {
+ new File(folderFile, ".nomedia").delete();
+ }
+
+ if (folderFile.list() == null || folderFile.list().length == 0)
+ {
+ folderFile.delete();
+ }
+ }
+ }
}
PlantManager.getInstance().upsert(plant);
@@ -424,8 +453,31 @@ private void setEmpty()
{
if (resultCode == Activity.RESULT_CANCELED)
{
- new File(plant.getImages().get(plant.getImages().size() - 1)).delete();
- plant.getImages().remove(plant.getImages().size() - 1);
+ File imageFile = new File(plant.getImages().get(plant.getImages().size() - 1));
+
+ if (imageFile.delete())
+ {
+ plant.getImages().remove(plant.getImages().size() - 1);
+ }
+
+ File folderFile = imageFile.getParentFile();
+ String[] list = folderFile.list();
+ if (list != null)
+ {
+ if (list.length == 1 && ".nomedia".equals(list[0]))
+ {
+ new File(folderFile, ".nomedia").delete();
+ }
+
+ if (folderFile.list() == null || folderFile.list().length == 0)
+ {
+ folderFile.delete();
+ }
+ }
+ else
+ {
+ folderFile.delete();
+ }
}
else
{
From 83d3d3ff480a02169891e1d9d83461c1999b3bc5 Mon Sep 17 00:00:00 2001
From: 7LPdWcaW <7LPdWcaW@gmail.com>
Date: Tue, 19 Nov 2019 13:53:55 +0000
Subject: [PATCH 10/33] Closes #161 Fixes issue with adding plant via garden
not working
---
.../main/java/me/anon/grow/fragment/GardenFragment.java | 7 +++++++
.../main/java/me/anon/grow/fragment/GardenHostFragment.kt | 7 +++++++
2 files changed, 14 insertions(+)
diff --git a/app/src/main/java/me/anon/grow/fragment/GardenFragment.java b/app/src/main/java/me/anon/grow/fragment/GardenFragment.java
index 9508e054..cb961293 100644
--- a/app/src/main/java/me/anon/grow/fragment/GardenFragment.java
+++ b/app/src/main/java/me/anon/grow/fragment/GardenFragment.java
@@ -387,6 +387,13 @@ private synchronized void saveCurrentState()
{
Plant plant = data.getParcelableExtra("plant");
PlantManager.getInstance().upsert(plant);
+
+ if (requestCode == 5 && !garden.getPlantIds().contains(plant.getId()))
+ {
+ garden.getPlantIds().add(plant.getId());
+ GardenManager.getInstance().save();
+ }
+
filter();
PlantWidgetProvider.triggerUpdateAll(getActivity());
}
diff --git a/app/src/main/java/me/anon/grow/fragment/GardenHostFragment.kt b/app/src/main/java/me/anon/grow/fragment/GardenHostFragment.kt
index 6a36c2f6..592f4746 100644
--- a/app/src/main/java/me/anon/grow/fragment/GardenHostFragment.kt
+++ b/app/src/main/java/me/anon/grow/fragment/GardenHostFragment.kt
@@ -1,5 +1,6 @@
package me.anon.grow.fragment
+import android.content.Intent
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
@@ -45,6 +46,12 @@ class GardenHostFragment : Fragment()
}
}
+ override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?)
+ {
+ super.onActivityResult(requestCode, resultCode, data)
+ childFragmentManager.findFragmentById(R.id.child_fragment_holder)?.onActivityResult(requestCode, resultCode, data)
+ }
+
override fun onSaveInstanceState(outState: Bundle)
{
outState.putParcelable("garden", garden)
From c6b2ceb8dafc67d7b8278f6fa32860fad67f4df7 Mon Sep 17 00:00:00 2001
From: 7LPdWcaW <7LPdWcaW@gmail.com>
Date: Thu, 21 Nov 2019 11:37:33 +0000
Subject: [PATCH 11/33] Formats temp and delivery numbers in watering
---
.../me/anon/grow/fragment/WateringFragment.java | 16 ++++++----------
1 file changed, 6 insertions(+), 10 deletions(-)
diff --git a/app/src/main/java/me/anon/grow/fragment/WateringFragment.java b/app/src/main/java/me/anon/grow/fragment/WateringFragment.java
index fd5e7cf4..79d8f4e6 100644
--- a/app/src/main/java/me/anon/grow/fragment/WateringFragment.java
+++ b/app/src/main/java/me/anon/grow/fragment/WateringFragment.java
@@ -41,6 +41,7 @@
import me.anon.lib.TempUnit;
import me.anon.lib.Unit;
import me.anon.lib.Views;
+import me.anon.lib.ext.NumberUtilsKt;
import me.anon.lib.manager.PlantManager;
import me.anon.lib.manager.ScheduleManager;
import me.anon.model.Action;
@@ -395,14 +396,14 @@ private void setHints()
if (!averageAmount.isNaN())
{
- amount.setHint(String.valueOf(ML.to(selectedDeliveryUnit, averageAmount)) + selectedDeliveryUnit.getLabel());
+ amount.setHint(NumberUtilsKt.formatWhole(ML.to(selectedDeliveryUnit, averageAmount)) + selectedDeliveryUnit.getLabel());
}
tempContainer.setVisibility(View.VISIBLE);
if (!averageTemp.isNaN())
{
- temp.setHint(String.valueOf(CELCIUS.to(selectedTemperatureUnit, averageTemp)) + selectedTemperatureUnit.getLabel());
+ temp.setHint(NumberUtilsKt.formatWhole(CELCIUS.to(selectedTemperatureUnit, averageTemp)) + selectedTemperatureUnit.getLabel());
}
notes.setHint(hintFeed.get(0).getNotes());
@@ -466,12 +467,7 @@ private void setUi()
if (water.getTds() != null)
{
- String ppm = String.valueOf(water.getTds().getAmount().intValue());
- if (selectedTdsUnit.getDecimalPlaces() == 2)
- {
- ppm = "" + Unit.toTwoDecimalPlaces(water.getTds().getAmount());
- }
-
+ String ppm = NumberUtilsKt.formatWhole(water.getTds().getAmount());
waterPpm.setText(ppm);
}
@@ -482,14 +478,14 @@ private void setUi()
if (water.getAmount() != null)
{
- amount.setText(String.valueOf(ML.to(selectedDeliveryUnit, water.getAmount())));
+ amount.setText(NumberUtilsKt.formatWhole(ML.to(selectedDeliveryUnit, water.getAmount())));
}
tempContainer.setVisibility(View.VISIBLE);
if (water.getTemp() != null)
{
- temp.setHint(String.valueOf(CELCIUS.to(selectedTemperatureUnit, water.getTemp())) + selectedTemperatureUnit.getLabel());
+ temp.setHint(NumberUtilsKt.formatWhole(CELCIUS.to(selectedTemperatureUnit, water.getTemp())) + selectedTemperatureUnit.getLabel());
}
populateAdditives();
From da8d15a65281dd2c3a21c1a5a31bca873a8fe299 Mon Sep 17 00:00:00 2001
From: 7LPdWcaW <7LPdWcaW@gmail.com>
Date: Thu, 21 Nov 2019 11:45:47 +0000
Subject: [PATCH 12/33] Bumps cache image size
---
app/src/main/java/me/anon/grow/MainApplication.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/src/main/java/me/anon/grow/MainApplication.java b/app/src/main/java/me/anon/grow/MainApplication.java
index 8ab701c9..5b775046 100644
--- a/app/src/main/java/me/anon/grow/MainApplication.java
+++ b/app/src/main/java/me/anon/grow/MainApplication.java
@@ -270,7 +270,7 @@ protected File getFile(String imageUri)
return new File(dir, fileName);
}
})
- .diskCacheExtraOptions(512, 512, null)
+ .diskCacheExtraOptions(768, 768, null)
.imageDecoder(new BaseImageDecoder(false)
{
@Override protected InputStream getImageStream(ImageDecodingInfo decodingInfo) throws IOException
From 8d02c96b818a49ef5281984fdc933bf463061fc4 Mon Sep 17 00:00:00 2001
From: 7LPdWcaW <7LPdWcaW@gmail.com>
Date: Thu, 21 Nov 2019 11:48:33 +0000
Subject: [PATCH 13/33] Adds backup path preference
---
app/src/main/java/me/anon/grow/MainApplication.java | 7 ++++++-
app/src/main/java/me/anon/lib/helper/BackupHelper.kt | 2 +-
2 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/app/src/main/java/me/anon/grow/MainApplication.java b/app/src/main/java/me/anon/grow/MainApplication.java
index 5b775046..d56d5b30 100644
--- a/app/src/main/java/me/anon/grow/MainApplication.java
+++ b/app/src/main/java/me/anon/grow/MainApplication.java
@@ -3,6 +3,7 @@
import android.app.AlarmManager;
import android.app.Application;
import android.app.PendingIntent;
+import android.app.backup.BackupManager;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
@@ -35,6 +36,7 @@
import me.anon.controller.receiver.BackupService;
import me.anon.lib.handler.ExceptionHandler;
+import me.anon.lib.helper.BackupHelper;
import me.anon.lib.manager.FileManager;
import me.anon.lib.manager.GardenManager;
import me.anon.lib.manager.PlantManager;
@@ -120,9 +122,12 @@ public static SharedPreferences getDefaultPreferences()
PlantManager.getInstance().initialise(this);
encrypted = PreferenceManager.getDefaultSharedPreferences(this).getBoolean("encrypt", false) || PlantManager.isFileEncrypted();
+ BackupHelper.FILES_PATH = PreferenceManager.getDefaultSharedPreferences(this).getString("backup_location", "");
FileManager.IMAGE_PATH = PreferenceManager.getDefaultSharedPreferences(this).getString("image_location", "");
+ if (TextUtils.isEmpty(BackupHelper.FILES_PATH)) BackupHelper.FILES_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + "/backups/GrowTracker/";
if (TextUtils.isEmpty(FileManager.IMAGE_PATH)) FileManager.IMAGE_PATH = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getPath() + "/GrowTracker/";
- new File(FileManager.IMAGE_PATH).mkdir();
+ new File(FileManager.IMAGE_PATH).mkdirs();
+ new File(BackupHelper.FILES_PATH).mkdirs();
isTablet = getResources().getBoolean(R.bool.is_tablet);
diff --git a/app/src/main/java/me/anon/lib/helper/BackupHelper.kt b/app/src/main/java/me/anon/lib/helper/BackupHelper.kt
index ba1b3dcd..52814258 100644
--- a/app/src/main/java/me/anon/lib/helper/BackupHelper.kt
+++ b/app/src/main/java/me/anon/lib/helper/BackupHelper.kt
@@ -21,7 +21,7 @@ import kotlin.collections.ArrayList
object BackupHelper
{
@JvmField
- public var FILES_PATH = Environment.getExternalStorageDirectory().absolutePath + "/backups/GrowTracker"
+ public var FILES_PATH = Environment.getExternalStorageDirectory().absolutePath + "/backups/GrowTracker/"
@JvmStatic
public fun getLastBackup(): String
From 46f508f2a7529a4685455f176c213181bc11a433 Mon Sep 17 00:00:00 2001
From: 7LPdWcaW <7LPdWcaW@gmail.com>
Date: Thu, 21 Nov 2019 14:37:01 +0000
Subject: [PATCH 14/33] Adds basic backup path functionality
---
app/src/main/AndroidManifest.xml | 1 +
.../anon/grow/fragment/SettingsFragment.java | 55 +++++++++++++++++--
.../java/me/anon/lib/helper/BackupHelper.kt | 28 +++++-----
.../java/me/anon/lib/helper/PathHelper.java | 44 ++++++++++++++-
app/src/main/res/values/strings.xml | 6 +-
app/src/main/res/xml/preferences.xml | 54 ++++++++++--------
6 files changed, 146 insertions(+), 42 deletions(-)
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index a5299dd9..5193da2d 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -13,6 +13,7 @@
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:name=".MainApplication"
+ android:requestLegacyExternalStorage="true"
>
= 21)
+ {
+ Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
+ startActivityForResult(intent, REQUEST_PICK_BACKUP_DOCUMENT);
+ }
+ }
else if ("clear_image_cache".equals(preference.getKey()))
{
ImageLoader.getInstance().clearDiskCache();
@@ -1115,10 +1128,44 @@ else if (requestCode == REQUEST_PICK_DOCUMENT && Build.VERSION.SDK_INT >= 19)
}
}
- if (resultCode != Activity.RESULT_CANCELED)
+ SnackBar.show(getActivity(), getString(R.string.settings_image_location_error), Snackbar.LENGTH_LONG, null);
+ }
+ else if (requestCode == REQUEST_PICK_BACKUP_DOCUMENT && Build.VERSION.SDK_INT >= 19)
+ {
+ if (resultCode == Activity.RESULT_OK)
{
- SnackBar.show(getActivity(), getString(R.string.settings_image_location_error), Snackbar.LENGTH_LONG, null);
+ Uri treeUri = data.getData();
+ DocumentFile pickedDir = DocumentFile.fromTreeUri(getActivity(), treeUri);
+
+ Uri docUri = DocumentsContract.buildDocumentUriUsingTree(treeUri, DocumentsContract.getTreeDocumentId(treeUri));
+
+ if (pickedDir != null)
+ {
+ String filePath = null;
+ try
+ {
+ filePath = PathHelper.getPath(getActivity(), docUri);
+
+ if (!TextUtils.isEmpty(filePath) && new File(filePath).exists())
+ {
+ if (!filePath.endsWith("/")) filePath = filePath + "/";
+
+ if (new File(filePath).canWrite())
+ {
+ BackupHelper.FILES_PATH = filePath;
+ findPreference("backup_location").getSharedPreferences().edit().putString("backup_location", filePath).apply();
+ findPreference("backup_location").setSummary(Html.fromHtml(getString(R.string.settings_backup_location_summary, filePath)));
+ return;
+ }
+ }
+ }
+ catch (URISyntaxException e)
+ {
+ }
+ }
}
+
+ SnackBar.show(getActivity(), getString(R.string.settings_backup_location_error), Snackbar.LENGTH_LONG, null);
}
}
diff --git a/app/src/main/java/me/anon/lib/helper/BackupHelper.kt b/app/src/main/java/me/anon/lib/helper/BackupHelper.kt
index 52814258..858c7302 100644
--- a/app/src/main/java/me/anon/lib/helper/BackupHelper.kt
+++ b/app/src/main/java/me/anon/lib/helper/BackupHelper.kt
@@ -28,25 +28,27 @@ object BackupHelper
{
File(FILES_PATH).listFiles()?.let {
val sorted = ArrayList(it.sortedBy { it.lastModified() })
- val parts = sorted.last().name.split(".")
- var date = Date()
- try
- {
- date = Date(java.lang.Long.parseLong(parts[0]))
- }
- catch (e: NumberFormatException)
- {
+ sorted.lastOrNull()?.let { str ->
+ val parts = str.name.split(".")
+ var date = Date()
try
{
- date = SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").parse(parts[0])
+ date = Date(java.lang.Long.parseLong(parts[0]))
}
- catch (e2: Exception)
+ catch (e: NumberFormatException)
{
- date = Date(sorted.last().lastModified())
+ try
+ {
+ date = SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").parse(parts[0])
+ }
+ catch (e2: Exception)
+ {
+ date = Date(sorted.last().lastModified())
+ }
}
- }
- return DateTimeUtils.toLocalDateTime(Timestamp(date.time)).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))
+ return DateTimeUtils.toLocalDateTime(Timestamp(date.time)).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))
+ }
}
return ""
diff --git a/app/src/main/java/me/anon/lib/helper/PathHelper.java b/app/src/main/java/me/anon/lib/helper/PathHelper.java
index f08efdac..5f561d85 100644
--- a/app/src/main/java/me/anon/lib/helper/PathHelper.java
+++ b/app/src/main/java/me/anon/lib/helper/PathHelper.java
@@ -9,6 +9,7 @@
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
+import android.text.TextUtils;
import java.net.URISyntaxException;
@@ -45,12 +46,27 @@ public static String getPath(Context context, Uri uri) throws URISyntaxException
}
}
- return "/storage/" + split[0] + "/" + split[1];
+ return "/storage/" + TextUtils.join("/", split);
}
else if (isDownloadsDocument(uri))
{
final String id = DocumentsContract.getDocumentId(uri);
- uri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
+ if (!TextUtils.isEmpty(id))
+ {
+ if (id.startsWith("raw:"))
+ {
+ return id.replaceFirst("raw:", "");
+ }
+ try
+ {
+ final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
+ return getDataColumn(context, contentUri, null, null);
+ }
+ catch (NumberFormatException e)
+ {
+ return null;
+ }
+ }
}
else if (isMediaDocument(uri))
{
@@ -129,4 +145,28 @@ public static boolean isMediaDocument(Uri uri)
{
return "com.android.providers.media.documents".equals(uri.getAuthority());
}
+
+ public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs)
+ {
+ Cursor cursor = null;
+ final String column = "_data";
+ final String[] projection = {column};
+ try
+ {
+ cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
+ if (cursor != null && cursor.moveToFirst())
+ {
+ final int index = cursor.getColumnIndexOrThrow(column);
+ return cursor.getString(index);
+ }
+ }
+ finally
+ {
+ if (cursor != null)
+ {
+ cursor.close();
+ }
+ }
+ return null;
+ }
}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index d55c0b7d..7d47cfc8 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -246,7 +246,7 @@
Provide this password during unencryption phase to prevent data from being loaded
Warning
This is basic form of AES encryption based on a provided passphrase. This is not a guaranteed form of protection from law enforcement agencies.
- Backup enabled, backups will be stored in /sdcard/backups/GrowTracker/
+ Backup enabled, backups will be stored in %s
Restore to %s completed
Could not restore from backup %s. File may be %s
encrypted
@@ -425,4 +425,8 @@
There is no data available
Camera permission is required to take photos
+ Backup management
+ Backup storage location
+ Backup storage location, currently <b>%s</b>
+ Failed to set backup location
diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml
index ca50f123..a95824ba 100644
--- a/app/src/main/res/xml/preferences.xml
+++ b/app/src/main/res/xml/preferences.xml
@@ -71,13 +71,6 @@
app:title="@string/settings_data_management"
android:key="settings_data"
>
-
-
+
+
+
+
+
+
+
+
+
+
-
-
-
-
Date: Fri, 22 Nov 2019 17:33:16 +0000
Subject: [PATCH 15/33] Apply translations in uk
translation completed for the source file '/app/src/main/res/values/strings.xml'
on the 'uk' language
---
app/src/main/res/values-uk/strings.xml | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index c032d2ca..bf1f96b9 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -246,7 +246,7 @@
Введіть цей пароль під час розшифрування щоб упередити завантаження даних
Увага
Використовується базова форма AES-шифрування на основі введеного пароля. Даний спосіб не гарантує захисту від правоохоронних органів.
- Резервне копіювання ввімкнено. Резервні копії будуть зберігатися в /sdcard/backups/GrowTracker/
+ Резервне копіювання ввімкнено, копії зберігатимуться до %s
Відновлення до %s завершено
Не вдалося відновити з копії %s. Можливо файл %s
зашифрований
@@ -422,4 +422,8 @@
Дані відсутні
Камері потрібен дозвіл щоб робити знімки
+ Керування резервними копіями
+ Розташування резервних копій
+ Наразі <b>%s</b>
+ Не вдалося встановити розташування резервних копій
From 70eb3ac79c9d6bffec105796109d7083d3e54ce2 Mon Sep 17 00:00:00 2001
From: "transifex-integration[bot]"
<43880903+transifex-integration[bot]@users.noreply.github.com>
Date: Fri, 22 Nov 2019 17:41:23 +0000
Subject: [PATCH 16/33] Apply translations in ru
translation completed for the source file '/app/src/main/res/values/strings.xml'
on the 'ru' language
---
app/src/main/res/values-ru/strings.xml | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index e1d25532..530f1460 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -246,7 +246,7 @@
Используйте этот пароль на стадии расшифровки чтобы не допустить загрузки данных
Внимание
Используется базовая форма AES-шифрования на основе введённого пароля. Данный метод не гарантирует защиту от доступа правоохранительными органами.
- Включено резервное копирование. Резервные копии будут храниться в /sdcard/backups/GrowTracker/
+ Резервное копирование включено, копии будут храниться в %s
Восстановление в %s завершено
Не удалось восстановить резервную копию %s. Возможно файл %s
зашифрован
@@ -422,4 +422,8 @@
Данные отсутствуют
Камере необходимо разрешение чтобы делать фото
+ Управление резервными копиями
+ Расположение резервных копий
+ Расположение резервных копий, сейчас <b>%s</b>
+ Не удалось изменить расположение резервных копий
From 414c6c9f2b35fe19ba2b8e313f711c7d96cb91ad Mon Sep 17 00:00:00 2001
From: 7LPdWcaW <7LPdWcaW@gmail.com>
Date: Sat, 23 Nov 2019 14:06:30 +0000
Subject: [PATCH 17/33] Adds basic import functionality
---
.../anon/grow/fragment/SettingsFragment.java | 83 ++++++++++++++++---
.../java/me/anon/lib/helper/BackupHelper.kt | 2 +-
app/src/main/res/values/strings.xml | 3 +
app/src/main/res/xml/preferences.xml | 5 ++
4 files changed, 79 insertions(+), 14 deletions(-)
diff --git a/app/src/main/java/me/anon/grow/fragment/SettingsFragment.java b/app/src/main/java/me/anon/grow/fragment/SettingsFragment.java
index db209e8e..7726cf3e 100644
--- a/app/src/main/java/me/anon/grow/fragment/SettingsFragment.java
+++ b/app/src/main/java/me/anon/grow/fragment/SettingsFragment.java
@@ -1,6 +1,5 @@
package me.anon.grow.fragment;
-import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.ComponentName;
@@ -15,22 +14,21 @@
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
-import android.os.Environment;
import android.provider.DocumentsContract;
import android.text.Html;
-import android.text.SpannableString;
import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
-import android.text.util.Linkify;
import android.util.Base64;
import android.view.View;
import android.widget.TextView;
import com.google.android.material.snackbar.Snackbar;
import com.nostra13.universalimageloader.core.ImageLoader;
+import com.squareup.moshi.Types;
import java.io.BufferedInputStream;
import java.io.File;
+import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URISyntaxException;
@@ -66,23 +64,26 @@
import me.anon.lib.helper.BackupHelper;
import me.anon.lib.helper.EncryptionHelper;
import me.anon.lib.helper.MigrationHelper;
+import me.anon.lib.helper.MoshiHelper;
import me.anon.lib.helper.NotificationHelper;
import me.anon.lib.helper.PathHelper;
import me.anon.lib.manager.FileManager;
import me.anon.lib.manager.GardenManager;
import me.anon.lib.manager.PlantManager;
import me.anon.lib.manager.ScheduleManager;
-import me.anon.lib.task.AsyncCallback;
import me.anon.lib.task.DecryptTask;
import me.anon.lib.task.EncryptTask;
import me.anon.model.Garden;
import me.anon.model.Plant;
+import static android.app.Activity.RESULT_OK;
+
public class SettingsFragment extends PreferenceFragmentCompat implements Preference.OnPreferenceClickListener, Preference.OnPreferenceChangeListener
{
private static final int REQUEST_UNINSTALL = 0x01;
private static final int REQUEST_PICK_DOCUMENT = 0x02;
private static final int REQUEST_PICK_BACKUP_DOCUMENT = 0x03;
+ private static final int REQUEST_PICK_IMPORT_DOCUMENT = 0x04;
@Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey)
{
@@ -155,7 +156,9 @@ public class SettingsFragment extends PreferenceFragmentCompat implements Prefer
findPreference("restore").setOnPreferenceClickListener(this);
findPreference("image_location").setOnPreferenceClickListener(this);
findPreference("backup_location").setOnPreferenceClickListener(this);
+ findPreference("import").setOnPreferenceClickListener(this);
+ findPreference("import").setEnabled(!MainApplication.isEncrypted());
findPreference("failsafe").setEnabled(((SwitchPreferenceCompat)findPreference("encrypt")).isChecked());
if (MainApplication.isFailsafe())
@@ -183,7 +186,7 @@ public class SettingsFragment extends PreferenceFragmentCompat implements Prefer
{
Intent refresh = new Intent();
refresh.putExtra("refresh", true);
- getActivity().setResult(Activity.RESULT_OK, refresh);
+ getActivity().setResult(RESULT_OK, refresh);
}
}
@@ -298,7 +301,7 @@ private void populateAddons()
{
Intent refresh = new Intent();
refresh.putExtra("refresh", true);
- getActivity().setResult(Activity.RESULT_OK, refresh);
+ getActivity().setResult(RESULT_OK, refresh);
if ("force_dark".equals(preference.getKey()))
{
@@ -581,7 +584,7 @@ else if ("auto_backup".equalsIgnoreCase(preference.getKey()))
{
Intent refresh = new Intent();
refresh.putExtra("refresh", true);
- getActivity().setResult(Activity.RESULT_OK, refresh);
+ getActivity().setResult(RESULT_OK, refresh);
if ("delivery_unit".equals(preference.getKey()))
{
@@ -1037,6 +1040,16 @@ else if ("clear_image_cache".equals(preference.getKey()))
ImageLoader.getInstance().clearMemoryCache();
SnackBar.show(getActivity(), getString(R.string.cache_cleared), Snackbar.LENGTH_SHORT, null);
}
+ else if ("import".equals(preference.getKey()))
+ {
+ Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
+ intent.setType("*/*");
+
+ intent.addCategory(Intent.CATEGORY_OPENABLE);
+ intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
+
+ startActivityForResult(intent, REQUEST_PICK_IMPORT_DOCUMENT);
+ }
return false;
}
@@ -1099,7 +1112,7 @@ private void completeRestore(BackupData selectedBackup)
}
else if (requestCode == REQUEST_PICK_DOCUMENT && Build.VERSION.SDK_INT >= 19)
{
- if (resultCode == Activity.RESULT_OK)
+ if (resultCode == RESULT_OK)
{
Uri treeUri = data.getData();
DocumentFile pickedDir = DocumentFile.fromTreeUri(getActivity(), treeUri);
@@ -1116,10 +1129,14 @@ else if (requestCode == REQUEST_PICK_DOCUMENT && Build.VERSION.SDK_INT >= 19)
if (!TextUtils.isEmpty(filePath) && new File(filePath).exists())
{
if (!filePath.endsWith("/")) filePath = filePath + "/";
- findPreference("image_location").getSharedPreferences().edit().putString("image_location", filePath).apply();
- findPreference("image_location").setSummary(Html.fromHtml(getString(R.string.settings_image_location_summary, filePath)));
- return;
+ if (new File(filePath).canWrite())
+ {
+ findPreference("image_location").getSharedPreferences().edit().putString("image_location", filePath).apply();
+ findPreference("image_location").setSummary(Html.fromHtml(getString(R.string.settings_image_location_summary, filePath)));
+
+ return;
+ }
}
}
catch (URISyntaxException e)
@@ -1132,7 +1149,7 @@ else if (requestCode == REQUEST_PICK_DOCUMENT && Build.VERSION.SDK_INT >= 19)
}
else if (requestCode == REQUEST_PICK_BACKUP_DOCUMENT && Build.VERSION.SDK_INT >= 19)
{
- if (resultCode == Activity.RESULT_OK)
+ if (resultCode == RESULT_OK)
{
Uri treeUri = data.getData();
DocumentFile pickedDir = DocumentFile.fromTreeUri(getActivity(), treeUri);
@@ -1155,6 +1172,13 @@ else if (requestCode == REQUEST_PICK_BACKUP_DOCUMENT && Build.VERSION.SDK_INT >=
BackupHelper.FILES_PATH = filePath;
findPreference("backup_location").getSharedPreferences().edit().putString("backup_location", filePath).apply();
findPreference("backup_location").setSummary(Html.fromHtml(getString(R.string.settings_backup_location_summary, filePath)));
+
+ // refresh backup size
+ String currentBackup = findPreference("backup_size").getSharedPreferences().getString("backup_size", "20");
+ findPreference("backup_size").setSummary(Html.fromHtml(getString(R.string.settings_backup_size, currentBackup, lengthToString(BackupHelper.backupSize()))));
+
+ // refresh last backup
+ findPreference("backup_now").setSummary(Html.fromHtml(getString(R.string.settings_lastbackup_summary, BackupHelper.getLastBackup())));
return;
}
}
@@ -1167,6 +1191,39 @@ else if (requestCode == REQUEST_PICK_BACKUP_DOCUMENT && Build.VERSION.SDK_INT >=
SnackBar.show(getActivity(), getString(R.string.settings_backup_location_error), Snackbar.LENGTH_LONG, null);
}
+ else if (requestCode == REQUEST_PICK_IMPORT_DOCUMENT)
+ {
+ if (resultCode == RESULT_OK && data.getData() != null)
+ {
+ try
+ {
+ File temp = new File(getActivity().getCacheDir(), "importtemp.json");
+ InputStream inputStream = getActivity().getContentResolver().openInputStream(data.getData());
+ FileManager.getInstance().copyFile(inputStream, new FileOutputStream(temp));
+
+ if (temp.exists())
+ {
+ // Try reading as plants
+ ArrayList plants = MoshiHelper.parse(temp, Types.newParameterizedType(ArrayList.class, Plant.class));
+ if (plants != null)
+ {
+ // backup
+ FileManager.getInstance().copyFile(PlantManager.FILES_DIR + "/plants." + PlantManager.getInstance().getFileExt(), PlantManager.FILES_DIR + "/plants." + PlantManager.getInstance().getFileExt() + ".bak");
+ FileManager.getInstance().copyFile(temp.getPath(), PlantManager.FILES_DIR + "/plants." + PlantManager.getInstance().getFileExt());
+ PlantManager.getInstance().load();
+ SnackBar.show(getActivity(), getString(R.string.settings_import_success), Snackbar.LENGTH_LONG, null);
+ return;
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ SnackBar.show(getActivity(), getString(R.string.settings_import_error), Snackbar.LENGTH_LONG, null);
+ }
}
public String lengthToString(long bytes)
diff --git a/app/src/main/java/me/anon/lib/helper/BackupHelper.kt b/app/src/main/java/me/anon/lib/helper/BackupHelper.kt
index 858c7302..993a9c7a 100644
--- a/app/src/main/java/me/anon/lib/helper/BackupHelper.kt
+++ b/app/src/main/java/me/anon/lib/helper/BackupHelper.kt
@@ -51,7 +51,7 @@ object BackupHelper
}
}
- return ""
+ return "-"
}
@JvmStatic
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 7d47cfc8..327d16be 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -429,4 +429,7 @@
Backup storage location
Backup storage location, currently <b>%s</b>
Failed to set backup location
+ Failed to import plants from file
+ Import plants from file
+ File successfully imported from file
diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml
index a95824ba..76e5f70a 100644
--- a/app/src/main/res/xml/preferences.xml
+++ b/app/src/main/res/xml/preferences.xml
@@ -133,6 +133,11 @@
app:key="restore"
app:title="@string/settings_restore_backup"
/>
+
+
Date: Mon, 25 Nov 2019 08:19:16 +0000
Subject: [PATCH 18/33] Apply translations in uk
translation completed for the source file '/app/src/main/res/values/strings.xml'
on the 'uk' language
---
app/src/main/res/values-uk/strings.xml | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index bf1f96b9..b6e3bfc0 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -149,7 +149,7 @@
Мін:
Макс:
- Середній:
+ Серед:
Температура
Загальні
Не вдалося завантажити рослину
@@ -426,4 +426,7 @@
Розташування резервних копій
Наразі <b>%s</b>
Не вдалося встановити розташування резервних копій
+ Не вдалося імпортувати
+ Імпортувати рослини з файлу
+ Імпорт завершено
From 5cfda827a244480084c1c76a639c2a5d4cd233b6 Mon Sep 17 00:00:00 2001
From: 7LPdWcaW <7LPdWcaW@gmail.com>
Date: Mon, 25 Nov 2019 20:13:19 +0000
Subject: [PATCH 19/33] Fixes bad grammar
---
app/src/main/res/values/strings.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 327d16be..39850cd9 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -431,5 +431,5 @@
Failed to set backup location
Failed to import plants from file
Import plants from file
- File successfully imported from file
+ Plantsp successfully imported from file
From 035baca557655850c925bcdde60a78714ba327bc Mon Sep 17 00:00:00 2001
From: 7LPdWcaW <7LPdWcaW@gmail.com>
Date: Mon, 25 Nov 2019 20:13:30 +0000
Subject: [PATCH 20/33] Fixes missing localisation for last feeding
---
.../main/java/me/anon/grow/fragment/PlantDetailsFragment.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/src/main/java/me/anon/grow/fragment/PlantDetailsFragment.java b/app/src/main/java/me/anon/grow/fragment/PlantDetailsFragment.java
index 83db0617..583cd952 100644
--- a/app/src/main/java/me/anon/grow/fragment/PlantDetailsFragment.java
+++ b/app/src/main/java/me/anon/grow/fragment/PlantDetailsFragment.java
@@ -284,7 +284,7 @@ private void setLastFeeding()
DateFormat timeFormat = android.text.format.DateFormat.getTimeFormat(getActivity());
Date actionDate = new Date(lastWater.getDate());
lastFeedingFullDate.setText(dateFormat.format(actionDate) + " " + timeFormat.format(actionDate));
- lastFeedingDate.setText(Html.fromHtml("" + new DateRenderer(getActivity()).timeAgo(lastWater.getDate()).formattedDate + " ago"));
+ lastFeedingDate.setText(Html.fromHtml(getString(R.string.ago, "" + new DateRenderer(getActivity()).timeAgo(lastWater.getDate()).formattedDate + "")));
final Water finalLastWater = lastWater;
duplicateFeeding.setOnClickListener(new View.OnClickListener()
From 2307c238195ea6c965b0c684ac93ea8698e82140 Mon Sep 17 00:00:00 2001
From: "transifex-integration[bot]"
<43880903+transifex-integration[bot]@users.noreply.github.com>
Date: Fri, 6 Dec 2019 19:05:08 +0000
Subject: [PATCH 21/33] Apply translations in uk
translation completed for the source file '/app/src/main/res/values/strings.xml'
on the 'uk' language.
From 9b54a4e6c711018eb044ba4672e11611e829f96e Mon Sep 17 00:00:00 2001
From: 7LPdWcaW <7LPdWcaW@gmail.com>
Date: Sat, 7 Dec 2019 16:47:00 +0000
Subject: [PATCH 22/33] Reduces buffer for import/encrypt tasks
---
app/src/main/java/me/anon/lib/task/DecryptTask.java | 2 +-
app/src/main/java/me/anon/lib/task/EncryptTask.java | 2 +-
app/src/main/java/me/anon/lib/task/ImportTask.java | 12 ++++++------
3 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/app/src/main/java/me/anon/lib/task/DecryptTask.java b/app/src/main/java/me/anon/lib/task/DecryptTask.java
index c9ac4713..fa8a8057 100644
--- a/app/src/main/java/me/anon/lib/task/DecryptTask.java
+++ b/app/src/main/java/me/anon/lib/task/DecryptTask.java
@@ -80,7 +80,7 @@ public DecryptTask(Context appContext)
dis = new DecryptInputStream(cipher, temp);
fos = new FileOutputStream(file);
- byte[] buffer = new byte[524288];
+ byte[] buffer = new byte[8192];
int len;
while ((len = dis.read(buffer)) != -1)
diff --git a/app/src/main/java/me/anon/lib/task/EncryptTask.java b/app/src/main/java/me/anon/lib/task/EncryptTask.java
index 92db51de..d7b198d1 100644
--- a/app/src/main/java/me/anon/lib/task/EncryptTask.java
+++ b/app/src/main/java/me/anon/lib/task/EncryptTask.java
@@ -80,7 +80,7 @@ public EncryptTask(Context appContext)
fis = new FileInputStream(temp);
eos = new EncryptOutputStream(cipher, file);
- byte[] buffer = new byte[524288];
+ byte[] buffer = new byte[8192];
int len = 0;
while ((len = fis.read(buffer)) != -1)
diff --git a/app/src/main/java/me/anon/lib/task/ImportTask.java b/app/src/main/java/me/anon/lib/task/ImportTask.java
index 946170b3..a72cbcdf 100644
--- a/app/src/main/java/me/anon/lib/task/ImportTask.java
+++ b/app/src/main/java/me/anon/lib/task/ImportTask.java
@@ -139,12 +139,12 @@ public void copyImage(Context context, Uri imageUri, File newLocation)
ParcelFileDescriptor parcelFileDescriptor = context.getContentResolver().openFileDescriptor(imageUri, "r");
FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
- InputStream streamIn = new BufferedInputStream(new FileInputStream(fileDescriptor), 524288);
+ InputStream streamIn = new BufferedInputStream(new FileInputStream(fileDescriptor), 8192);
- OutputStream streamOut = new BufferedOutputStream(eos, 524288);
+ OutputStream streamOut = new BufferedOutputStream(eos, 8192);
int len;
- byte[] buffer = new byte[524288];
+ byte[] buffer = new byte[8192];
while ((len = streamIn.read(buffer)) != -1)
{
streamOut.write(buffer, 0, len);
@@ -163,11 +163,11 @@ else if (imageUri.getScheme().startsWith("file"))
String image = imageUri.getPath();
- InputStream streamIn = new BufferedInputStream(new FileInputStream(new File(image)), 524288);
- OutputStream streamOut = new BufferedOutputStream(eos, 524288);
+ InputStream streamIn = new BufferedInputStream(new FileInputStream(new File(image)), 8192);
+ OutputStream streamOut = new BufferedOutputStream(eos, 8192);
int len;
- byte[] buffer = new byte[524288];
+ byte[] buffer = new byte[8192];
while ((len = streamIn.read(buffer)) != -1)
{
streamOut.write(buffer, 0, len);
From 7ccd34a140984f91fcea7d694f114ba4447bb95a Mon Sep 17 00:00:00 2001
From: 7LPdWcaW <7LPdWcaW@gmail.com>
Date: Sat, 7 Dec 2019 16:52:54 +0000
Subject: [PATCH 23/33] Ensures image was copied successfully and removes
unsuccessful images
---
app/src/main/java/me/anon/lib/task/ImportTask.java | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/app/src/main/java/me/anon/lib/task/ImportTask.java b/app/src/main/java/me/anon/lib/task/ImportTask.java
index a72cbcdf..593bf66e 100644
--- a/app/src/main/java/me/anon/lib/task/ImportTask.java
+++ b/app/src/main/java/me/anon/lib/task/ImportTask.java
@@ -91,7 +91,12 @@ public ImportTask(Context appContext, AsyncCallback callback)
{
File toPath = new File(to, System.currentTimeMillis() + ".jpg");
copyImage(appContext, filePath, toPath);
- imagesToAdd.add(toPath.getPath());
+
+ if (toPath.exists())
+ {
+ imagesToAdd.add(toPath.getPath());
+ }
+
publishProgress(++count, total);
}
@@ -150,8 +155,8 @@ public void copyImage(Context context, Uri imageUri, File newLocation)
streamOut.write(buffer, 0, len);
}
- streamIn.close();
streamOut.flush();
+ streamIn.close();
streamOut.close();
}
else if (imageUri.getScheme().startsWith("file"))
@@ -173,13 +178,14 @@ else if (imageUri.getScheme().startsWith("file"))
streamOut.write(buffer, 0, len);
}
- streamIn.close();
streamOut.flush();
+ streamIn.close();
streamOut.close();
}
}
catch (Exception e)
{
+ newLocation.delete();
e.printStackTrace();
}
}
From 4a1f61fb618c5c7084c6ff80da3c974b1992ac15 Mon Sep 17 00:00:00 2001
From: 7LPdWcaW <7LPdWcaW@gmail.com>
Date: Sat, 7 Dec 2019 16:53:51 +0000
Subject: [PATCH 24/33] Fixes string again
---
app/src/main/res/values/strings.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 39850cd9..ec36659a 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -431,5 +431,5 @@
Failed to set backup location
Failed to import plants from file
Import plants from file
- Plantsp successfully imported from file
+ Plants successfully imported from file
From 988e7ec8c6d4a47c5270c946c98db402f03224e2 Mon Sep 17 00:00:00 2001
From: 7LPdWcaW <7LPdWcaW@gmail.com>
Date: Sat, 7 Dec 2019 17:08:47 +0000
Subject: [PATCH 25/33] Disables calendar view in landscape for now
---
.../main/java/me/anon/grow/fragment/ActionsListFragment.java | 2 +-
app/src/main/res/layout-land/actions_list_view.xml | 1 +
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/app/src/main/java/me/anon/grow/fragment/ActionsListFragment.java b/app/src/main/java/me/anon/grow/fragment/ActionsListFragment.java
index 74f2db2a..2501a543 100644
--- a/app/src/main/java/me/anon/grow/fragment/ActionsListFragment.java
+++ b/app/src/main/java/me/anon/grow/fragment/ActionsListFragment.java
@@ -160,7 +160,7 @@ else if (getArguments() != null)
}
});
calendar.setCurrentDate(CalendarDay.today());
- calendar.setVisibility(filtered ? View.VISIBLE : View.GONE);
+ calendar.setVisibility(filtered && getResources().getBoolean(R.bool.is_portrait) ? View.VISIBLE : View.GONE);
adapter.setFilterDate(selectedFilterDate);
setActions();
diff --git a/app/src/main/res/layout-land/actions_list_view.xml b/app/src/main/res/layout-land/actions_list_view.xml
index 8d067991..7e523d01 100644
--- a/app/src/main/res/layout-land/actions_list_view.xml
+++ b/app/src/main/res/layout-land/actions_list_view.xml
@@ -16,6 +16,7 @@
android:layout_height="200dp"
android:id="@+id/calendar"
android:layout_marginBottom="12dp"
+ android:visibility="gone"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
From 3184c70518bcfa63e9291b69545805dc9640be22 Mon Sep 17 00:00:00 2001
From: "transifex-integration[bot]"
<43880903+transifex-integration[bot]@users.noreply.github.com>
Date: Sun, 8 Dec 2019 10:28:26 +0000
Subject: [PATCH 26/33] Apply translations in uk
translation completed for the source file '/app/src/main/res/values/strings.xml'
on the 'uk' language.
From aa95c53ef4f58e64edf2c8be33b6843724da2530 Mon Sep 17 00:00:00 2001
From: "transifex-integration[bot]"
<43880903+transifex-integration[bot]@users.noreply.github.com>
Date: Sun, 8 Dec 2019 10:29:26 +0000
Subject: [PATCH 27/33] Apply translations in ru
translation completed for the source file '/app/src/main/res/values/strings.xml'
on the 'ru' language.
---
app/src/main/res/values-ru/strings.xml | 3 +++
1 file changed, 3 insertions(+)
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 530f1460..0be65b56 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -426,4 +426,7 @@
Расположение резервных копий
Расположение резервных копий, сейчас <b>%s</b>
Не удалось изменить расположение резервных копий
+ Не удалось импортировать растения
+ Импортировать растения из файла
+ Растение успешно импортировано из файла
From 6511d447d0e69adfef9142a408988c51d1782787 Mon Sep 17 00:00:00 2001
From: "transifex-integration[bot]"
<43880903+transifex-integration[bot]@users.noreply.github.com>
Date: Mon, 9 Dec 2019 20:04:37 +0000
Subject: [PATCH 28/33] Apply translations in nl_NL
translation completed for the source file '/app/src/main/res/values/strings.xml'
on the 'nl_NL' language.
---
app/src/main/res/values-nl_NL/strings.xml | 418 ++++++++++++++++++++++
1 file changed, 418 insertions(+)
create mode 100644 app/src/main/res/values-nl_NL/strings.xml
diff --git a/app/src/main/res/values-nl_NL/strings.xml b/app/src/main/res/values-nl_NL/strings.xml
new file mode 100644
index 00000000..d8f79ab7
--- /dev/null
+++ b/app/src/main/res/values-nl_NL/strings.xml
@@ -0,0 +1,418 @@
+
+
+
+ Versie %s
+ Instellingen
+
+
+ %s planten
+
+ Alle planten
+
+ Alle
+ Acties toegevoegd
+ Aantekeningen toegevoegd
+ Water geven toegevoegd
+ Tuin verwijderd
+
+ Weet je zeker dat je de tuin <b>\'%s\'</b> wilt verwijderen? De planten worden niet verwijderd.
+ Water geven
+ Actie
+
+ De widget is niet beschikbaar zolang versleuteling is ingeschakeld
+ Plant toevoegen
+ Plantinformatie
+ Plantstatistieken
+
+ Foto maken
+
+ Kiezen uit fotogalerij
+ Kies een optie
+ Afbeelding kiezen
+ Toepassen op andere plant
+ Plant kiezen
+ Afbeelding toegevoegd
+ Nóg één maken
+
+ Schema\'s
+ Schema-informatie
+ Schemadatum
+ Naam
+ Licht voeden
+ Omschrijving
+
+ Elke 2 weken licht voeden
+
+ + Voeding toevoegen
+ + Schema toevoegen
+ + Toevoeging toevoegen
+ Toevoegingen
+ Toevoeging
+ Vanaf datum
+ Vanaf fase
+ Tot datum
+ Tot fase
+ Samenstellen uit schema
+ Samenstellen uit vorige
+ Weet je het zeker?
+ Wil je het geselecteerde schema kopiëren?
+ Wil je het geselecteerde schema verwijderen?
+ Schema gekopieerd
+ Schema verwijderd
+ Ongedaan maken
+ Voederschema\'s
+ Voederschema
+ App is bijgewerkt
+ De app is geüpdatet naar versie %s
+ Wijzigingslog bekijken
+ Verwerpen
+
+
+ %s water geven
+ Meerdere planten water geven
+
+ Aantekeningen
+ Waterinformatie
+ pH-waarde
+ PPM
+ Afvoer
+ Hoeveelheid (%s)
+ Temperatuur (º%s)
+ Datum en tijd
+ Nu
+ Datum
+ Vandaag
+ %s dagen genezen
+
+ Water geven
+ Fase-aanpassingen
+
+ Klonen
+ Kopiëren naar
+ Actie bewerken
+ Actie verwijderen
+
+ Planten selecteren
+ Tuinen
+ Alle planten
+ + Tuin toevoegen
+ Aanvullend
+ Instellingen
+ Verwijderen
+ Delen
+ Foto
+ Water gegeven op
+ Opnieuw water geven
+
+ Plantnaam
+ Plant toevoegen
+ Plantensoort
+ Citroengras
+ Groei-informatie
+ Geplant op
+ Gemiddeld
+
+ Gemiddelde informatie
+
+ Aarde en perliet (half-om-half)
+ Uit kloon?
+ Fase-informatie
+ Plantfase
+ Foto\'s bekijken
+ Geschiedenis tonen
+ Statistieken tonen
+ Foto\'s
+ Geschiedenis
+ Statistieken
+ Filter
+ Geplant
+ Ontkiemd
+ Gewied
+ Groeiende
+ Bloeiende
+ Drogende
+ Genezende
+ Geplukt
+
+ %s geleden geplukt
+ Tuin exporteren
+ Tuin aanpassen
+ Tuin verwijderen
+ Exporteren
+
+ Totaaltijd:
+ Totaal water gegeven:
+ Totaal bijgesteld:
+ Gem. tijd tussen water geven:
+ Toevoegingen filteren
+ pH-waarde
+
+ Min.:
+ Max.:
+ Gem.:
+ Temperatuur
+ Algemeen
+ Kan plant niet laden
+ Oeps, vergeten! (OV)
+ Bijstellen
+ Bladvoeding
+ Lagestresstraining
+ Lolly
+ Bestrijdingsmiddel
+ Afgedekt
+ Verpot
+ Bijsnijden
+ ScrOG Tuck
+
+ Water gegeven
+ Aantekening
+ Item verwijderen?
+ Weet je zeker dat je het volgende wilt verwijderen:
+ Weet je zeker dat je <b>%s</b> foto\'s wilt verwijderen? Je kunt dit niet ongedaan maken.
+ Bewerken
+ fase
+ Instellen
+ Aanpassen
+ Toevoegen
+ Annuleren
+ actie
+ Oké
+ Veld is vereist
+ Fout: onjuiste toegangscode
+ Water geven aanpassen
+ toegevoegd
+ Actie gekloond
+ meerdere planten
+ Actie toegevoegd aan
+ Aantekening bijgewerkt
+ bijgewerkt
+ Fase bijgewerkt
+ Gebeurtenis verwijderd
+ Klaar
+ Tuin
+ Alles selecteren
+ Niets selecteren
+ Toestaan
+ Inschakelen
+ Afwijzen
+ Kiemplant:
+ Kiemplant
+
+ Oeps
+ Het lijkt erop dat de app vorige keer gecrasht is. Wil je deze anonieme logbestanden versturen? Ze worden verstuurd naar <a href=\"https://github.com/7LPdWcaW/GrowTracker-Android/issues\">github.com/7LPdWcaW/GrowTracker-Android/issues</a> - er worden geen persoonlijke gegevens meegestuurd. Je kunt de bestanden ook handmatig plaatsen op <a href=\"https://reddit.com/r/growutils\">reddit.com/r/growutils</a>. De logbestanden worden opgeslagen in <i>%s<i>
+ Ja
+ Nee
+
+ Voer je toegangscode in
+ Voer een toegangscode in
+ Voer nogmaals je toegangscode in
+ Fout: de toegangscodes komen niet overeen
+
+ Er is een fatale fout opgetreden tijdens het opslaan van de tuingegevens. Maak hier een back-up van.
+ In gebruik
+ %s geleden
+ Water gegeven: <b>%s</b> geleden
+ Water gegeven: <b>%s</b> geleden
+ Geplant: <b>%s</b> geleden
+
+ GrowTracker heeft toegang nodig tot je externe opslag om foto\'s op te slaan. Er worden geen andere gegevens uitgelezen.
+
+ Water geven toegevoegd
+ Weet je zeker dat je <b>%s</b> en alle bijbehorende foto\'s wilt verwijderen? Je kunt dit niet ongedaan maken.
+ Bezig met verwijderen van plant...
+
+ Plant gekloond
+ Openen
+
+ Bezig met exporteren van groeilog...
+ Bezig met exporteren van groeilog...
+ %s toegevoegd
+ Voer een naam in
+ Bezig met exporteren van %s...
+
+ Aarde
+ Hydrocultuur
+ Kokosvezel
+ Luchtcultuur
+ Afbeeldingen verbergen
+ Afbeeldingen tonen
+
+ De te tonen tuin na het openen van de app - momenteel: <b>%s</b>
+ Kaartstijl kiezen - momenteel: %s
+ De standaard maateenheid - momenteel: <b>%s</b>
+ De standaard maateenheid bij toevoegingen - momenteel: <b>%s</b>
+ De standaard temperatuureenheid - momenteel: <b>%s</b>
+ Momenteel: <b>%s MiB</b> / Verbruik: <b>%s</b>
+ Voer dit wachtvoord in tijdens het ontgrendelen om te voorkomen dat er informatie wordt geladen
+ Waarschuwing
+ Dit is een basale vorm van AES-versleuteling gebaseerd op de opgegeven toegangscode. Dit is geen gegarandeerde vorm van bescherming tegen handhaving.
+ Back-ups ingeschakeld. Back-ups worden opgeslagen in %s
+ Herstellen van %s voltooid
+ De back-up, %s, kan niet worden hersteld. Het bestand is mogelijk %s.
+ versleuteld
+ onversleuteld
+
+ Maat kiezen
+ Temperatuur kiezen
+ Tuin kiezen
+ Back-up kiezen
+ Je kunt deze back-up alleen herstellen als je versleuteling hebt ingeschakeld en hetzelfde wachtwoord opgeeft
+
+ Gebackupt naar
+ Er zijn geen te herstellen back-ups
+ Alles/Niets
+
+ Toevoer-pH-waarde
+ Afvoer-pH-waarde
+ Gemiddelde pH-waarde
+
+ Plantenfoto\'s
+
+ Toev.-pH:
+ Afv.-pH:
+ Hoeveelheid:
+ Temp.:
+ Toevoegingen:
+ EC:
+ PPM:
+
+ Schema kiezen
+ Acties
+ Donker thema gebruiken
+ Stelt het donkere thema in in de app, ongeacht de systeeminstelling voor dag- en nachtthema\'s
+ Geplukte items verbergen
+ Verberg alle planten die reeds geplukt zijn
+ Plantvolgorde omdraaien
+ Toont de planten in omgekeerde volgorde. (herstart vereist)
+ Standaardtuin
+
+ Eenheden
+ Toevoereenheid
+ Maateenheid
+ Temperatuureenheid
+ TDS-eenheid
+ De standaard tds-eenheid - momenteel: <b>%s</b>
+ Gegevensbeheer
+ Automatisch back-uppen
+ Plantinformatie elke 24 uur automatisch back-uppen
+ Nu back-uppen
+ Back-upgrootte
+ Grootte (in MiB)
+ Back-uplimiet (MiB)
+ Herstellen uit back-up
+ Gegevens versleutelen
+ Voegt een pincode toe aan de app en versleutelt alle gegevens/afbeeldingen
+ Noodwachtwoord
+ Stel een noodwachtwoord in waarmee je informatietoegang voorkomt
+ Uitbreidingen
+ Over
+ Leesmij
+ Informatie exporteren
+ Kaartstijl
+ Je hebt geen planten
+ Je hebt geen schema\'s
+ Je hebt geen foto\'s
+ Eerdere acties
+ Kalender tonen/verbergen
+
+ %d geselecteerd
+ Met dank aan
+ Vertaald door
+ Helpen met vertalen
+ Bezig met versleutelen; even geduld...
+ Bezig met ontsleutelen; even geduld...
+
+
+ 1s
+ s
+ m
+ u
+ d
+ w
+ ma
+ j
+
+ Informatie
+
+
+ - seconde
+ - seconden
+
+
+
+ - minuut
+ - minuten
+
+
+
+ - uur
+ - uur
+
+
+
+ - dag
+ - dagen
+
+
+
+ - week
+ - weken
+
+
+
+ - maand
+ - maanden
+
+
+
+ - jaar
+ - jaar
+
+
+
+ - Origineel
+ - Compact
+ - Extreem
+
+
+ Alle niet-opgeslagen aanpassingen gaan verloren
+ Afsluiten
+ Planten
+ Luchtvochtigheid
+ Huidige temperatuur:
+ Huidige luchtvochtigheid:
+ Lichtschema
+ Item verwijderen?
+ Weet je zeker dat je <b>\'%s\'</b> wilt verwijderen?
+ Tonen
+ Verbergen
+ Lichten aan
+ Lichten uit
+
+ Gebackupt: <b>%s</b>
+ Opslaglocatie van afbeeldingen - momenteel: <b>%s</b>
+ Kan afbeeldingslocatie niet instellen
+ Opslaglocatie voor afbeeldingen
+ Afbeeldingscache wissen
+ Afbeeldings- en geheugencache gewist
+ Bezig met importeren; even geduld...
+ Gegevenstaak
+ Taak volbracht
+ Er zijn geen acties
+
+ Bezig met exporteren van groeilog van %s...
+ %s is geëxporteerd
+ %s is geëxporteerd naar %s
+ Exporteren voltooid
+ Afbeeldingen bijvoegen?
+ Er in geen informatie beschikbaar
+
+ Cameramachtiging vereist om foto\'s te maken
+ Back-upbeheer
+ Opslaglocatie
+ Opslaglocatie van back-ups - momenteel: <b>%s</b>
+ Kan back-uplocatie niet instellen
+ Kan planten niet importeren uit bestand
+ Planten importeren uit bestand
+ De planten zijn geïmporteerd
+
From 91e710b2b47ab0647537cf69a43f049a92348847 Mon Sep 17 00:00:00 2001
From: "transifex-integration[bot]"
<43880903+transifex-integration[bot]@users.noreply.github.com>
Date: Tue, 10 Dec 2019 12:43:54 +0000
Subject: [PATCH 29/33] Apply translations in fr
translation completed for the source file '/app/src/main/res/values/strings.xml'
on the 'fr' language.
---
app/src/main/res/values-fr/strings.xml | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 309a2512..b8306f06 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -246,7 +246,7 @@
Fournir ce password pendant la phase de décryptage pour éviter de charger les données
Attention
Il s\'agit d\'une forme basique d\'encryptage AES sur base d\'une phrase de passe fournie par l\'utilisateur. Ne pas considérer comme une forme de protection absolue contre le gouvernement ou toute agence de surveillance.
- Backup activé, les backups seront enregistrés dans /sdcard/backups/GrowTracker/
+ Backup activé, sauvegarde dans %s
Restoration à %s complete.
Impossible de restaurer depuis le backup %s. Le fichier est peut être %s.
encrypté
@@ -408,4 +408,11 @@
Aucune donnée accessible
Permission d\'utiliser l\'appareil photo requise pour prendre des photos
+ Gestions des backups
+ Emplacement de stockage des backups
+ L\'emplacement de stockage des backups est actuellement <b>%s</b>
+ Impossible de stocker à cet emplacement
+ Impossible d\'importer les plantes depuis le fichier
+ Importer des plantes depuis un fichier
+ Plantes bien importées depuis le fichier
From 385fb189c24872f0a06f1906c8035e60f43eba72 Mon Sep 17 00:00:00 2001
From: 7LPdWcaW <7LPdWcaW@gmail.com>
Date: Wed, 18 Dec 2019 13:30:50 +0000
Subject: [PATCH 30/33] Adds translator to readme
---
README.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/README.md b/README.md
index e3efad62..c0a1c513 100644
--- a/README.md
+++ b/README.md
@@ -279,6 +279,7 @@ Translations provided by;
- Alex (Noxmiles) - de 
- Basti B (Weltenesche) - de 
+- Heimen Stoffels (Vistaus) - nl 
- EmmanuelMess - es 
- Maxtille - fr 
- Patrick B (EukalyptusX) - de 
From 4314b8c8d244400b44dae9a8c2d57bc6ac43bb9f Mon Sep 17 00:00:00 2001
From: 7LPdWcaW <7LPdWcaW@gmail.com>
Date: Wed, 18 Dec 2019 13:30:58 +0000
Subject: [PATCH 31/33] Bumps version codes and adds changelog
---
app/build.gradle | 4 ++--
app/src/main/res/values/strings.xml | 1 +
fastlane/metadata/android/en-GB/changelogs/1370.txt | 12 ++++++++++++
3 files changed, 15 insertions(+), 2 deletions(-)
create mode 100644 fastlane/metadata/android/en-GB/changelogs/1370.txt
diff --git a/app/build.gradle b/app/build.gradle
index e3c6bf08..326212d3 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -29,8 +29,8 @@ android {
applicationId "me.anon.grow"
minSdkVersion 17
targetSdkVersion 29
- versionCode getCommitCountTotal()
- versionName "2.6"
+ versionCode 1370//getCommitCountTotal()
+ versionName "2.6.1"
versionNameSuffix (travis ? "-alpha" : "")
compileOptions {
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index ec36659a..765f15b8 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -336,6 +336,7 @@
- Alex (Noxmiles) - de
- Basti B (Weltenesche) - de
+ - Heimen Stoffels (Vistaus) - nl/NL
- EmmanuelMess - es
- Maxtille - fr
- Patrick B (EukalyptusX) - de
diff --git a/fastlane/metadata/android/en-GB/changelogs/1370.txt b/fastlane/metadata/android/en-GB/changelogs/1370.txt
new file mode 100644
index 00000000..87fa3d16
--- /dev/null
+++ b/fastlane/metadata/android/en-GB/changelogs/1370.txt
@@ -0,0 +1,12 @@
+- Adds Dutch (Netherlands) localisations
+- Adds custom backup path setting
+- Adds import plants from file functionality
+
+- Allows old backups to be visible
+
+- Fixes issue with adding plant via garden not working
+- Fixes grow log date formatting
+- Fixes issue with folders not being deleted if there are no images
+- Fixes issue with camera intent not taking photos correctly due to lack of permission
+- Fixes issue with calendar obstructing actions view in landscape
+- Fixes issue with importing large images causing corrupt images
From d822b7a90cd4bc305b6fdded382a697870724d9a Mon Sep 17 00:00:00 2001
From: 7LPdWcaW <7LPdWcaW@gmail.com>
Date: Wed, 18 Dec 2019 13:39:06 +0000
Subject: [PATCH 32/33] Fixes invalid language qualifier
---
app/src/main/res/{values-nl_NL => values-nl-rNL}/strings.xml | 0
1 file changed, 0 insertions(+), 0 deletions(-)
rename app/src/main/res/{values-nl_NL => values-nl-rNL}/strings.xml (100%)
diff --git a/app/src/main/res/values-nl_NL/strings.xml b/app/src/main/res/values-nl-rNL/strings.xml
similarity index 100%
rename from app/src/main/res/values-nl_NL/strings.xml
rename to app/src/main/res/values-nl-rNL/strings.xml
From 5291721656f91af12af181c1e1fb69aca9d2fe61 Mon Sep 17 00:00:00 2001
From: 7LPdWcaW <7LPdWcaW@gmail.com>
Date: Wed, 18 Dec 2019 13:46:27 +0000
Subject: [PATCH 33/33] Updates readme
---
README.md | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index c0a1c513..65a5e402 100644
--- a/README.md
+++ b/README.md
@@ -6,11 +6,11 @@ Welcome to grow tracker. This is a utility app designed for gardening and tracki
[Latest Nightly Build (Experimental!)](https://github.com/7LPdWcaW/GrowTracker-Android/releases/tag/alpha)
-[Latest APK: (SHA256) 4009957e99cc7e0d8a4d1fd9ef8f724cbd65566eb776c94350b6ed1e8a405275 v2.6](https://github.com/7LPdWcaW/GrowTracker-Android/releases/download/v2.6/v2.6-production.apk)
+[Latest APK: (SHA256) 501786b7350eceb7b894a5745c06c378f1d2f2e6f4bf659ee2576b3dfaca5732 v2.6.1](https://github.com/7LPdWcaW/GrowTracker-Android/releases/download/v2.6.1/v2.6.1-production.apk)
-[Latest APK (English only): (SHA256) 0f9cd87e57bcb9e402c9aeafba719a9f19be5c26fae54f756924da286403dcaa v2.6](https://github.com/7LPdWcaW/GrowTracker-Android/releases/download/v2.6/v2.6-en.apk)
+[Latest APK (English only): (SHA256) e366c67c54548da4c46206c953e8847ba6e4c933449ca8d33525601ee2d87bb8 v2.6.1](https://github.com/7LPdWcaW/GrowTracker-Android/releases/download/v2.6.1/v2.6.1-en.apk)
-[Latest APK (Discrete): (SHA256) 3feb38df6d8044d71fa3616092afe1242f5a9d2dd69d39e0660d125d57590f59 v2.6](https://github.com/7LPdWcaW/GrowTracker-Android/releases/download/v2.6/v2.6-discrete.apk)
+[Latest APK (Discrete): (SHA256) 3b5edaceb462c6fcd51d11652943357976f75b53dacdfe650f422933357688d9 v2.6.1](https://github.com/7LPdWcaW/GrowTracker-Android/releases/download/v2.6.1/v2.6.1-discrete.apk)
[Get it on F-Droid with automatic updates](https://f-droid.org/packages/me.anon.grow/)