diff --git a/app/src/main/java/de/tadris/fitness/activity/SettingsActivity.java b/app/src/main/java/de/tadris/fitness/activity/SettingsActivity.java
index 1537f5f..0d94355 100644
--- a/app/src/main/java/de/tadris/fitness/activity/SettingsActivity.java
+++ b/app/src/main/java/de/tadris/fitness/activity/SettingsActivity.java
@@ -50,7 +50,8 @@ import java.io.File;
import java.io.FileNotFoundException;
import de.tadris.fitness.R;
-import de.tadris.fitness.util.export.Exporter;
+import de.tadris.fitness.export.BackupController;
+import de.tadris.fitness.export.RestoreController;
import de.tadris.fitness.util.unit.UnitUtils;
import de.tadris.fitness.view.ProgressDialogController;
@@ -185,8 +186,8 @@ public class SettingsActivity extends PreferenceActivity {
new File(file).getParentFile().mkdirs();
Uri uri= FileProvider.getUriForFile(getBaseContext(), "de.tadris.fitness.fileprovider", new File(file));
- Exporter.exportData(getBaseContext(), new File(file),
- (progress, action) -> mHandler.post(() -> dialogController.setProgress(progress, action)));
+ BackupController backupController= new BackupController(getBaseContext(), new File(file), (progress, action) -> mHandler.post(() -> dialogController.setProgress(progress, action)));
+ backupController.exportData();
mHandler.post(() -> {
dialogController.cancel();
@@ -254,10 +255,10 @@ public class SettingsActivity extends PreferenceActivity {
dialogController.show();
new Thread(() -> {
try{
- Exporter.importData(getBaseContext(), uri,
+ RestoreController restoreController= new RestoreController(getBaseContext(), uri,
(progress, action) -> mHandler.post(() -> dialogController.setProgress(progress, action)));
+ restoreController.restoreData();
- // DO on backup finished
mHandler.post(dialogController::cancel);
}catch (Exception e){
e.printStackTrace();
diff --git a/app/src/main/java/de/tadris/fitness/export/BackupController.java b/app/src/main/java/de/tadris/fitness/export/BackupController.java
new file mode 100644
index 0000000..2c5edc9
--- /dev/null
+++ b/app/src/main/java/de/tadris/fitness/export/BackupController.java
@@ -0,0 +1,90 @@
+package de.tadris.fitness.export;
+
+import android.content.Context;
+
+import com.fasterxml.jackson.dataformat.xml.XmlMapper;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import de.tadris.fitness.Instance;
+import de.tadris.fitness.R;
+import de.tadris.fitness.data.AppDatabase;
+import de.tadris.fitness.data.UserPreferences;
+import de.tadris.fitness.util.unit.UnitUtils;
+
+public class BackupController {
+
+ public static final int VERSION= 1;
+
+ private Context context;
+ private File output;
+ private ExportStatusListener listener;
+ private UserPreferences preferences;
+ private AppDatabase database;
+
+ private FitoTrackDataContainer dataContainer;
+
+ public BackupController(Context context, File output, ExportStatusListener listener) {
+ this.context = context;
+ this.output = output;
+ this.listener = listener;
+ }
+
+ public void exportData() throws IOException {
+ listener.onStatusChanged(0, context.getString(R.string.initialising));
+ init();
+ listener.onStatusChanged(10, context.getString(R.string.preferences));
+ newContainer();
+
+ saveSettingsToContainer();
+ listener.onStatusChanged(20, context.getString(R.string.workouts));
+ saveWorkoutsToContainer();
+ listener.onStatusChanged(40, context.getString(R.string.locationData));
+ saveSamplesToContainer();
+ listener.onStatusChanged(60, context.getString(R.string.converting));
+ writeContainerToOutputFile();
+ listener.onStatusChanged(100, context.getString(R.string.finished));
+ }
+
+ private void init(){
+ preferences= Instance.getInstance(context).userPreferences;
+ database= Instance.getInstance(context).db;
+ UnitUtils.setUnit(context); // Ensure unit system is correct
+ }
+
+ private void newContainer(){
+ dataContainer= new FitoTrackDataContainer();
+ dataContainer.version= VERSION;
+ dataContainer.workouts= new ArrayList<>();
+ dataContainer.samples= new ArrayList<>();
+ }
+
+ private void saveSettingsToContainer(){
+ FitoTrackSettings settings= new FitoTrackSettings();
+ settings.weight= preferences.getUserWeight();
+ settings.mapStyle= preferences.getMapStyle();
+ settings.preferredUnitSystem= String.valueOf(UnitUtils.CHOSEN_SYSTEM.getId());
+ dataContainer.settings= settings;
+ }
+
+ private void saveWorkoutsToContainer(){
+ dataContainer.workouts.addAll(Arrays.asList(database.workoutDao().getWorkouts()));
+ }
+
+ private void saveSamplesToContainer(){
+ dataContainer.samples.addAll(Arrays.asList(database.workoutDao().getSamples()));
+ }
+
+ private void writeContainerToOutputFile() throws IOException {
+ XmlMapper mapper= new XmlMapper();
+ mapper.writeValue(output, dataContainer);
+ }
+
+ public interface ExportStatusListener{
+ void onStatusChanged(int progress, String action);
+ }
+
+}
diff --git a/app/src/main/java/de/tadris/fitness/util/export/FitoTrackDataContainer.java b/app/src/main/java/de/tadris/fitness/export/FitoTrackDataContainer.java
similarity index 98%
rename from app/src/main/java/de/tadris/fitness/util/export/FitoTrackDataContainer.java
rename to app/src/main/java/de/tadris/fitness/export/FitoTrackDataContainer.java
index c1c9c0a..bfdfb8a 100644
--- a/app/src/main/java/de/tadris/fitness/util/export/FitoTrackDataContainer.java
+++ b/app/src/main/java/de/tadris/fitness/export/FitoTrackDataContainer.java
@@ -17,7 +17,7 @@
* along with this program. If not, see .
*/
-package de.tadris.fitness.util.export;
+package de.tadris.fitness.export;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
diff --git a/app/src/main/java/de/tadris/fitness/util/export/FitoTrackSettings.java b/app/src/main/java/de/tadris/fitness/export/FitoTrackSettings.java
similarity index 97%
rename from app/src/main/java/de/tadris/fitness/util/export/FitoTrackSettings.java
rename to app/src/main/java/de/tadris/fitness/export/FitoTrackSettings.java
index 7d6527c..44b50b2 100644
--- a/app/src/main/java/de/tadris/fitness/util/export/FitoTrackSettings.java
+++ b/app/src/main/java/de/tadris/fitness/export/FitoTrackSettings.java
@@ -17,7 +17,7 @@
* along with this program. If not, see .
*/
-package de.tadris.fitness.util.export;
+package de.tadris.fitness.export;
public class FitoTrackSettings {
diff --git a/app/src/main/java/de/tadris/fitness/export/RestoreController.java b/app/src/main/java/de/tadris/fitness/export/RestoreController.java
new file mode 100644
index 0000000..6eeab3c
--- /dev/null
+++ b/app/src/main/java/de/tadris/fitness/export/RestoreController.java
@@ -0,0 +1,107 @@
+package de.tadris.fitness.export;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.net.Uri;
+import android.preference.PreferenceManager;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.dataformat.xml.XmlMapper;
+
+import java.io.IOException;
+
+import de.tadris.fitness.Instance;
+import de.tadris.fitness.R;
+import de.tadris.fitness.data.AppDatabase;
+import de.tadris.fitness.data.Workout;
+import de.tadris.fitness.data.WorkoutSample;
+
+public class RestoreController {
+
+ private Context context;
+ private Uri input;
+ private ImportStatusListener listener;
+ private FitoTrackDataContainer dataContainer;
+ private AppDatabase database;
+
+ public RestoreController(Context context, Uri input, ImportStatusListener listener) {
+ this.context = context;
+ this.input = input;
+ this.listener = listener;
+ this.database= Instance.getInstance(context).db;
+ }
+
+ public void restoreData() throws IOException, UnsupportedVersionException{
+ listener.onStatusChanged(0, context.getString(R.string.loadingFile));
+ loadDataFromFile();
+ checkVersion();
+ listener.onStatusChanged(40, context.getString(R.string.preferences));
+ restoreSettings();
+
+ restoreDatabase();
+ listener.onStatusChanged(100, context.getString(R.string.finished));
+ }
+
+ private void loadDataFromFile() throws IOException {
+ XmlMapper xmlMapper = new XmlMapper();
+ xmlMapper.configure(JsonParser.Feature.IGNORE_UNDEFINED, true);
+ dataContainer = xmlMapper.readValue(context.getContentResolver().openInputStream(input), FitoTrackDataContainer.class);
+ }
+
+ private void checkVersion() throws UnsupportedVersionException {
+ if(dataContainer.version != 1){
+ throw new UnsupportedVersionException("Version Code" + dataContainer.version + " is unsupported!");
+ }
+ }
+
+ @SuppressLint("ApplySharedPref")
+ private void restoreSettings(){
+ PreferenceManager.getDefaultSharedPreferences(context)
+ .edit().clear()
+ .putInt("weight", dataContainer.settings.weight)
+ .putString("unitSystem", dataContainer.settings.preferredUnitSystem)
+ .putBoolean("firstStart", false).putString("mapStyle", dataContainer.settings.mapStyle)
+ .commit();
+ }
+
+ private void restoreDatabase(){
+ database.runInTransaction(() -> {
+ resetDatabase();
+ restoreWorkouts();
+ restoreSamples();
+ });
+ }
+
+ private void resetDatabase(){
+ database.clearAllTables();
+ }
+
+ private void restoreWorkouts(){
+ listener.onStatusChanged(60, context.getString(R.string.workouts));
+ if(dataContainer.workouts != null){
+ for(Workout workout : dataContainer.workouts){
+ database.workoutDao().insertWorkout(workout);
+ }
+ }
+ }
+
+ private void restoreSamples(){
+ listener.onStatusChanged(80, context.getString(R.string.locationData));
+ if(dataContainer.samples != null){
+ for(WorkoutSample sample : dataContainer.samples){
+ database.workoutDao().insertSample(sample);
+ }
+ }
+ }
+
+ public interface ImportStatusListener{
+ void onStatusChanged(int progress, String action);
+ }
+
+ public static class UnsupportedVersionException extends Exception{
+ public UnsupportedVersionException(String message) {
+ super(message);
+ }
+ }
+
+}
diff --git a/app/src/main/java/de/tadris/fitness/util/export/Exporter.java b/app/src/main/java/de/tadris/fitness/util/export/Exporter.java
deleted file mode 100644
index c2e165b..0000000
--- a/app/src/main/java/de/tadris/fitness/util/export/Exporter.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (c) 2019 Jannis Scheibe
- *
- * This file is part of FitoTrack
- *
- * FitoTrack 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.
- *
- * FitoTrack 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 de.tadris.fitness.util.export;
-
-import android.annotation.SuppressLint;
-import android.content.Context;
-import android.net.Uri;
-import android.preference.PreferenceManager;
-
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.dataformat.xml.XmlMapper;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-
-import de.tadris.fitness.Instance;
-import de.tadris.fitness.R;
-import de.tadris.fitness.data.AppDatabase;
-import de.tadris.fitness.data.UserPreferences;
-import de.tadris.fitness.data.Workout;
-import de.tadris.fitness.data.WorkoutSample;
-import de.tadris.fitness.util.unit.UnitUtils;
-
-public class Exporter {
-
- public static final int VERSION= 1;
-
- public static void exportData(Context context, File output, ExportStatusListener listener) throws IOException {
- listener.onStatusChanged(0, context.getString(R.string.initialising));
- UserPreferences preferences= Instance.getInstance(context).userPreferences;
- AppDatabase database= Instance.getInstance(context).db;
- UnitUtils.setUnit(context);
-
- FitoTrackDataContainer container= new FitoTrackDataContainer();
- container.version= VERSION;
- container.workouts= new ArrayList<>();
- container.samples= new ArrayList<>();
-
- listener.onStatusChanged(10, context.getString(R.string.preferences));
- FitoTrackSettings settings= new FitoTrackSettings();
- settings.weight= preferences.getUserWeight();
- settings.mapStyle= preferences.getMapStyle();
- settings.preferredUnitSystem= String.valueOf(UnitUtils.CHOSEN_SYSTEM.getId());
- container.settings= settings;
-
- listener.onStatusChanged(20, context.getString(R.string.workouts));
- container.workouts.addAll(Arrays.asList(database.workoutDao().getWorkouts()));
- listener.onStatusChanged(40, context.getString(R.string.locationData));
- container.samples.addAll(Arrays.asList(database.workoutDao().getSamples()));
-
- listener.onStatusChanged(60, context.getString(R.string.converting));
-
- XmlMapper mapper= new XmlMapper();
- mapper.writeValue(output, container);
-
- listener.onStatusChanged(100, context.getString(R.string.finished));
- }
-
- @SuppressLint("ApplySharedPref")
- public static void importData(Context context, Uri input, ExportStatusListener listener) throws IOException, UnsupportedVersionException {
- listener.onStatusChanged(0, context.getString(R.string.loadingFile));
- XmlMapper xmlMapper = new XmlMapper();
- xmlMapper.configure(JsonParser.Feature.IGNORE_UNDEFINED, true);
- FitoTrackDataContainer container = xmlMapper.readValue(context.getContentResolver().openInputStream(input), FitoTrackDataContainer.class);
-
- if(container.version != 1){
- throw new UnsupportedVersionException("Version Code" + container.version + " is unsupported!");
- }
-
- listener.onStatusChanged(40, context.getString(R.string.preferences));
- PreferenceManager.getDefaultSharedPreferences(context)
- .edit().clear()
- .putInt("weight", container.settings.weight)
- .putString("unitSystem", container.settings.preferredUnitSystem)
- .putBoolean("firstStart", false).putString("mapStyle", container.settings.mapStyle)
- .commit();
-
- AppDatabase database= Instance.getInstance(context).db;
-
- database.runInTransaction(() -> {
- database.clearAllTables();
-
- listener.onStatusChanged(60, context.getString(R.string.workouts));
- if(container.workouts != null){
- for(Workout workout : container.workouts){
- database.workoutDao().insertWorkout(workout);
- }
- }
-
- listener.onStatusChanged(80, context.getString(R.string.locationData));
- if(container.samples != null){
- for(WorkoutSample sample : container.samples){
- database.workoutDao().insertSample(sample);
- }
- }
- });
-
-
- listener.onStatusChanged(100, context.getString(R.string.finished));
- }
-
-
- public interface ExportStatusListener{
- void onStatusChanged(int progress, String action);
- }
-
- public static class UnsupportedVersionException extends Exception{
- public UnsupportedVersionException(String message) {
- super(message);
- }
- }
-
-}