mirror of
https://github.com/russok/FitoTrack.git
synced 2025-10-28 16:22:12 -07:00
#9 Ability to Import and Export data
- Import and Export Backups working
This commit is contained in:
parent
2f71b2a3d5
commit
9329670ca8
@ -8,6 +8,7 @@
|
|||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
||||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
|
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:allowBackup="true"
|
android:allowBackup="true"
|
||||||
|
|||||||
@ -20,8 +20,19 @@
|
|||||||
package de.tadris.fitness.activity;
|
package de.tadris.fitness.activity;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
|
import android.app.AlertDialog;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.net.Uri;
|
||||||
|
import android.util.Log;
|
||||||
import android.util.TypedValue;
|
import android.util.TypedValue;
|
||||||
|
|
||||||
|
import androidx.annotation.StringRes;
|
||||||
|
|
||||||
|
import java.io.BufferedInputStream;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
|
||||||
|
import de.tadris.fitness.R;
|
||||||
|
|
||||||
abstract public class FitoTrackActivity extends Activity {
|
abstract public class FitoTrackActivity extends Activity {
|
||||||
|
|
||||||
|
|
||||||
@ -32,5 +43,30 @@ abstract public class FitoTrackActivity extends Activity {
|
|||||||
return value.data;
|
return value.data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void shareFile(Uri uri){
|
||||||
|
Intent intentShareFile = new Intent(Intent.ACTION_SEND);
|
||||||
|
intentShareFile.setDataAndType(uri, getContentResolver().getType(uri));
|
||||||
|
intentShareFile.putExtra(Intent.EXTRA_STREAM, uri);
|
||||||
|
intentShareFile.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
|
||||||
|
|
||||||
|
startActivity(Intent.createChooser(intentShareFile, getString(R.string.shareFile)));
|
||||||
|
|
||||||
|
Log.d("Export", uri.toString());
|
||||||
|
Log.d("Export", getContentResolver().getType(uri));
|
||||||
|
try {
|
||||||
|
Log.d("Export", new BufferedInputStream(getContentResolver().openInputStream(uri)).toString());
|
||||||
|
} catch (FileNotFoundException e) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void showErrorDialog(Exception e, @StringRes int title, @StringRes int message){
|
||||||
|
new AlertDialog.Builder(this)
|
||||||
|
.setTitle(title)
|
||||||
|
.setMessage(getString(message) + "\n\n" + e.getMessage())
|
||||||
|
.setPositiveButton(R.string.okay, null)
|
||||||
|
.create().show();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -19,30 +19,74 @@
|
|||||||
|
|
||||||
package de.tadris.fitness.activity;
|
package de.tadris.fitness.activity;
|
||||||
|
|
||||||
|
import android.Manifest;
|
||||||
import android.app.ActionBar;
|
import android.app.ActionBar;
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
|
import android.content.DialogInterface;
|
||||||
|
import android.content.Intent;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
|
import android.content.pm.PackageManager;
|
||||||
import android.media.Ringtone;
|
import android.media.Ringtone;
|
||||||
import android.media.RingtoneManager;
|
import android.media.RingtoneManager;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.os.Handler;
|
||||||
import android.preference.ListPreference;
|
import android.preference.ListPreference;
|
||||||
import android.preference.Preference;
|
import android.preference.Preference;
|
||||||
import android.preference.PreferenceActivity;
|
import android.preference.PreferenceActivity;
|
||||||
import android.preference.PreferenceManager;
|
import android.preference.PreferenceManager;
|
||||||
import android.preference.RingtonePreference;
|
import android.preference.RingtonePreference;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
|
import android.util.Log;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.NumberPicker;
|
import android.widget.NumberPicker;
|
||||||
|
|
||||||
|
import androidx.annotation.StringRes;
|
||||||
|
import androidx.core.app.ActivityCompat;
|
||||||
import androidx.core.app.NavUtils;
|
import androidx.core.app.NavUtils;
|
||||||
|
import androidx.core.content.FileProvider;
|
||||||
|
|
||||||
|
import java.io.BufferedInputStream;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
|
||||||
import de.tadris.fitness.R;
|
import de.tadris.fitness.R;
|
||||||
|
import de.tadris.fitness.util.export.Exporter;
|
||||||
|
import de.tadris.fitness.util.gpx.GpxExporter;
|
||||||
import de.tadris.fitness.util.unit.UnitUtils;
|
import de.tadris.fitness.util.unit.UnitUtils;
|
||||||
|
import de.tadris.fitness.view.ProgressDialogController;
|
||||||
|
|
||||||
public class SettingsActivity extends PreferenceActivity {
|
public class SettingsActivity extends PreferenceActivity {
|
||||||
|
|
||||||
|
|
||||||
|
protected void shareFile(Uri uri){
|
||||||
|
Intent intentShareFile = new Intent(Intent.ACTION_SEND);
|
||||||
|
intentShareFile.setDataAndType(uri, getContentResolver().getType(uri));
|
||||||
|
intentShareFile.putExtra(Intent.EXTRA_STREAM, uri);
|
||||||
|
intentShareFile.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
|
||||||
|
|
||||||
|
startActivity(Intent.createChooser(intentShareFile, getString(R.string.shareFile)));
|
||||||
|
|
||||||
|
Log.d("Export", uri.toString());
|
||||||
|
Log.d("Export", getContentResolver().getType(uri));
|
||||||
|
try {
|
||||||
|
Log.d("Export", new BufferedInputStream(getContentResolver().openInputStream(uri)).toString());
|
||||||
|
} catch (FileNotFoundException e) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void showErrorDialog(Exception e, @StringRes int title, @StringRes int message){
|
||||||
|
new AlertDialog.Builder(this)
|
||||||
|
.setTitle(title)
|
||||||
|
.setMessage(getString(message) + "\n\n" + e.getMessage())
|
||||||
|
.setPositiveButton(R.string.okay, null)
|
||||||
|
.create().show();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A preference value change listener that updates the preference's summary
|
* A preference value change listener that updates the preference's summary
|
||||||
* to reflect its new value.
|
* to reflect its new value.
|
||||||
@ -92,21 +136,6 @@ public class SettingsActivity extends PreferenceActivity {
|
|||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*@Override
|
|
||||||
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
|
|
||||||
public void onBuildHeaders(List<Header> target) {
|
|
||||||
loadHeadersFromResource(R.xml.pref_headers, target);
|
|
||||||
}*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Binds a preference's summary to its value. More specifically, when the
|
|
||||||
* preference's value is changed, its summary (line of text below the
|
|
||||||
* preference title) is updated to reflect the value. The summary is also
|
|
||||||
* immediately updated upon calling this method. The exact display format is
|
|
||||||
* dependent on the type of preference.
|
|
||||||
*
|
|
||||||
* @see #sBindPreferenceSummaryToValueListener
|
|
||||||
*/
|
|
||||||
private static void bindPreferenceSummaryToValue(Preference preference) {
|
private static void bindPreferenceSummaryToValue(Preference preference) {
|
||||||
// Set the listener to watch for value changes.
|
// Set the listener to watch for value changes.
|
||||||
preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener);
|
preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener);
|
||||||
@ -119,6 +148,8 @@ public class SettingsActivity extends PreferenceActivity {
|
|||||||
.getString(preference.getKey(), ""));
|
.getString(preference.getKey(), ""));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Handler mHandler= new Handler();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
@ -131,9 +162,117 @@ public class SettingsActivity extends PreferenceActivity {
|
|||||||
bindPreferenceSummaryToValue(findPreference("unitSystem"));
|
bindPreferenceSummaryToValue(findPreference("unitSystem"));
|
||||||
|
|
||||||
findPreference("weight").setOnPreferenceClickListener(preference -> showWeightPicker());
|
findPreference("weight").setOnPreferenceClickListener(preference -> showWeightPicker());
|
||||||
|
findPreference("import").setOnPreferenceClickListener(preference -> showImportDialog());
|
||||||
|
findPreference("export").setOnPreferenceClickListener(preference -> showExportDialog());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean showExportDialog(){
|
||||||
|
new AlertDialog.Builder(this)
|
||||||
|
.setTitle(R.string.exportData)
|
||||||
|
.setMessage(R.string.exportDataSummary)
|
||||||
|
.setNegativeButton(R.string.cancel, null)
|
||||||
|
.setPositiveButton(R.string.backup, (dialog, which) -> {
|
||||||
|
exportBackup();
|
||||||
|
}).create().show();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void exportBackup(){
|
||||||
|
ProgressDialogController dialogController= new ProgressDialogController(this, getString(R.string.backup));
|
||||||
|
dialogController.show();
|
||||||
|
new Thread(() -> {
|
||||||
|
try{
|
||||||
|
String file= getFilesDir().getAbsolutePath() + "/shared/backup.ftb";
|
||||||
|
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)));
|
||||||
|
|
||||||
|
mHandler.post(() -> {
|
||||||
|
dialogController.cancel();
|
||||||
|
shareFile(uri);
|
||||||
|
});
|
||||||
|
}catch (Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
mHandler.post(() -> {
|
||||||
|
dialogController.cancel();
|
||||||
|
showErrorDialog(e, R.string.error, R.string.errorExportFailed);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}).start();
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean showImportDialog(){
|
||||||
|
if(!hasPermission()){
|
||||||
|
requestPermissions();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
new AlertDialog.Builder(this)
|
||||||
|
.setTitle(R.string.importBackup)
|
||||||
|
.setMessage(R.string.importBackupMessage)
|
||||||
|
.setNegativeButton(R.string.cancel, null)
|
||||||
|
.setPositiveButton(R.string.restore, (dialog, which) -> {
|
||||||
|
importBackup();
|
||||||
|
}).create().show();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void requestPermissions(){
|
||||||
|
if (!hasPermission()) {
|
||||||
|
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 10);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasPermission(){
|
||||||
|
return ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final int FILE_SELECT_CODE= 21;
|
||||||
|
private void importBackup(){
|
||||||
|
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
|
||||||
|
intent.setType("*/*");
|
||||||
|
intent.addCategory(Intent.CATEGORY_OPENABLE);
|
||||||
|
try {
|
||||||
|
startActivityForResult(Intent.createChooser(intent, getString(R.string.chooseBackupFile)), FILE_SELECT_CODE);
|
||||||
|
} catch (android.content.ActivityNotFoundException ignored) { }
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||||
|
switch (requestCode) {
|
||||||
|
case FILE_SELECT_CODE:
|
||||||
|
if (resultCode == RESULT_OK){
|
||||||
|
importBackup(data.getData());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
super.onActivityResult(requestCode, resultCode, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void importBackup(Uri uri){
|
||||||
|
ProgressDialogController dialogController= new ProgressDialogController(this, getString(R.string.backup));
|
||||||
|
dialogController.show();
|
||||||
|
new Thread(() -> {
|
||||||
|
try{
|
||||||
|
Exporter.importData(getBaseContext(), uri,
|
||||||
|
(progress, action) -> mHandler.post(() -> dialogController.setProgress(progress, action)));
|
||||||
|
|
||||||
|
mHandler.post(() -> {
|
||||||
|
// DO on backup finished
|
||||||
|
dialogController.cancel();
|
||||||
|
});
|
||||||
|
}catch (Exception e){
|
||||||
|
e.printStackTrace();
|
||||||
|
mHandler.post(() -> {
|
||||||
|
dialogController.cancel();
|
||||||
|
showErrorDialog(e, R.string.error, R.string.errorImportFailed);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}).start();
|
||||||
|
}
|
||||||
|
|
||||||
private boolean showWeightPicker() {
|
private boolean showWeightPicker() {
|
||||||
final AlertDialog.Builder d = new AlertDialog.Builder(this);
|
final AlertDialog.Builder d = new AlertDialog.Builder(this);
|
||||||
final SharedPreferences preferences= PreferenceManager.getDefaultSharedPreferences(this);
|
final SharedPreferences preferences= PreferenceManager.getDefaultSharedPreferences(this);
|
||||||
|
|||||||
@ -39,6 +39,7 @@ import android.view.ViewGroup;
|
|||||||
import android.widget.EditText;
|
import android.widget.EditText;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import androidx.annotation.StringRes;
|
||||||
import androidx.core.app.ActivityCompat;
|
import androidx.core.app.ActivityCompat;
|
||||||
import androidx.core.content.FileProvider;
|
import androidx.core.content.FileProvider;
|
||||||
|
|
||||||
@ -347,46 +348,12 @@ public class ShowWorkoutActivity extends FitoTrackActivity {
|
|||||||
dialogController.cancel();
|
dialogController.cancel();
|
||||||
mHandler.post(() -> shareFile(uri));
|
mHandler.post(() -> shareFile(uri));
|
||||||
}catch (Exception e){
|
}catch (Exception e){
|
||||||
mHandler.post(() -> showErrorDialog(e));
|
mHandler.post(() -> showErrorDialog(e, R.string.error, R.string.errorGpxExportFailed));
|
||||||
}
|
}
|
||||||
}).start();
|
}).start();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void shareFile(Uri uri){
|
|
||||||
Intent intentShareFile = new Intent(Intent.ACTION_SEND);
|
|
||||||
intentShareFile.setDataAndType(uri, getContentResolver().getType(uri));
|
|
||||||
intentShareFile.putExtra(Intent.EXTRA_STREAM, uri);
|
|
||||||
intentShareFile.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
|
|
||||||
|
|
||||||
startActivity(Intent.createChooser(intentShareFile, getString(R.string.shareFile)));
|
|
||||||
|
|
||||||
Log.d("Export", uri.toString());
|
|
||||||
Log.d("Export", getContentResolver().getType(uri));
|
|
||||||
try {
|
|
||||||
Log.d("Export", new BufferedInputStream(getContentResolver().openInputStream(uri)).toString());
|
|
||||||
} catch (FileNotFoundException e) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*void requestPermissions(){
|
|
||||||
if (!hasPermission()) {
|
|
||||||
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 10);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean hasPermission(){
|
|
||||||
return ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
|
|
||||||
}*/
|
|
||||||
|
|
||||||
|
|
||||||
private void showErrorDialog(Exception e){
|
|
||||||
new AlertDialog.Builder(this)
|
|
||||||
.setTitle(R.string.error)
|
|
||||||
.setMessage(getString(R.string.errorGpxExportFailed) + "\n\n" + e.getMessage())
|
|
||||||
.setPositiveButton(R.string.okay, null)
|
|
||||||
.create().show();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onOptionsItemSelected(MenuItem item) {
|
public boolean onOptionsItemSelected(MenuItem item) {
|
||||||
|
|||||||
@ -46,5 +46,8 @@ public interface WorkoutDao {
|
|||||||
@Update
|
@Update
|
||||||
void updateWorkout(Workout workout);
|
void updateWorkout(Workout workout);
|
||||||
|
|
||||||
|
@Update
|
||||||
|
void insertSample(WorkoutSample sample);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
106
app/src/main/java/de/tadris/fitness/util/export/Exporter.java
Normal file
106
app/src/main/java/de/tadris/fitness/util/export/Exporter.java
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
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.dataformat.xml.XmlMapper;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
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.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.workouts.addAll(Arrays.asList(database.workoutDao().getWorkouts()));
|
||||||
|
|
||||||
|
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{
|
||||||
|
listener.onStatusChanged(0, context.getString(R.string.loadingFile));
|
||||||
|
XmlMapper xmlMapper = new XmlMapper();
|
||||||
|
FitoTrackDataContainer container = xmlMapper.readValue(context.getContentResolver().openInputStream(input), FitoTrackDataContainer.class);
|
||||||
|
|
||||||
|
if(container.version != 1){
|
||||||
|
throw new UnsupportedEncodingException("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)
|
||||||
|
.commit();
|
||||||
|
|
||||||
|
AppDatabase database= Instance.getInstance(context).db;
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,58 @@
|
|||||||
|
package de.tadris.fitness.util.export;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import de.tadris.fitness.data.Workout;
|
||||||
|
import de.tadris.fitness.data.WorkoutSample;
|
||||||
|
|
||||||
|
@JacksonXmlRootElement(localName = "fito-track")
|
||||||
|
public class FitoTrackDataContainer {
|
||||||
|
|
||||||
|
int version;
|
||||||
|
List<Workout> workouts;
|
||||||
|
List<WorkoutSample> samples;
|
||||||
|
FitoTrackSettings settings;
|
||||||
|
|
||||||
|
public FitoTrackDataContainer(){}
|
||||||
|
|
||||||
|
public FitoTrackDataContainer(int version, List<Workout> workouts, List<WorkoutSample> samples, FitoTrackSettings settings) {
|
||||||
|
this.version = version;
|
||||||
|
this.workouts = workouts;
|
||||||
|
this.samples = samples;
|
||||||
|
this.settings = settings;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getVersion() {
|
||||||
|
return version;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setVersion(int version) {
|
||||||
|
this.version = version;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Workout> getWorkouts() {
|
||||||
|
return workouts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setWorkouts(List<Workout> workouts) {
|
||||||
|
this.workouts = workouts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<WorkoutSample> getSamples() {
|
||||||
|
return samples;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSamples(List<WorkoutSample> samples) {
|
||||||
|
this.samples = samples;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FitoTrackSettings getSettings() {
|
||||||
|
return settings;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSettings(FitoTrackSettings settings) {
|
||||||
|
this.settings = settings;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,30 @@
|
|||||||
|
package de.tadris.fitness.util.export;
|
||||||
|
|
||||||
|
public class FitoTrackSettings {
|
||||||
|
|
||||||
|
String preferredUnitSystem;
|
||||||
|
int weight;
|
||||||
|
|
||||||
|
public FitoTrackSettings(){}
|
||||||
|
|
||||||
|
public FitoTrackSettings(String preferredUnitSystem, int weight) {
|
||||||
|
this.preferredUnitSystem = preferredUnitSystem;
|
||||||
|
this.weight = weight;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPreferredUnitSystem() {
|
||||||
|
return preferredUnitSystem;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPreferredUnitSystem(String preferredUnitSystem) {
|
||||||
|
this.preferredUnitSystem = preferredUnitSystem;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getWeight() {
|
||||||
|
return weight;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setWeight(int weight) {
|
||||||
|
this.weight = weight;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -53,6 +53,6 @@ public class ProgressDialogController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void cancel(){
|
public void cancel(){
|
||||||
dialog.dismiss();
|
dialog.cancel();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -25,8 +25,22 @@
|
|||||||
<string name="exporting">Exporting</string>
|
<string name="exporting">Exporting</string>
|
||||||
|
|
||||||
<string name="error">Error</string>
|
<string name="error">Error</string>
|
||||||
<string name="errorGpxExportFailed">The GPX export has been failed.</string>
|
<string name="errorGpxExportFailed">The GPX export has failed.</string>
|
||||||
|
<string name="errorExportFailed">The data export has failed.</string>
|
||||||
|
<string name="errorImportFailed">The data import has failed.</string>
|
||||||
<string name="shareFile">Share file</string>
|
<string name="shareFile">Share file</string>
|
||||||
|
<string name="initialising">Initialising</string>
|
||||||
|
<string name="preferences">Preferences</string>
|
||||||
|
<string name="workouts">Workouts</string>
|
||||||
|
<string name="locationData">Location data</string>
|
||||||
|
<string name="converting">Converting</string>
|
||||||
|
<string name="finished">Finished</string>
|
||||||
|
<string name="loadingFile">Loading file</string>
|
||||||
|
<string name="chooseBackupFile">Choose Backup-File</string>
|
||||||
|
|
||||||
|
<string name="importBackupMessage">WARNING: All your existing data in the app will be cleared. Are you sure, you want to restore this backup?</string>
|
||||||
|
<string name="restore">Restore</string>
|
||||||
|
<string name="backup">Backup</string>
|
||||||
|
|
||||||
<string name="pref_ringtone_silent">Silent</string>
|
<string name="pref_ringtone_silent">Silent</string>
|
||||||
|
|
||||||
@ -80,4 +94,8 @@
|
|||||||
<string name="pref_weight_summary">Your weight is needed to calculate the burned calories</string>
|
<string name="pref_weight_summary">Your weight is needed to calculate the burned calories</string>
|
||||||
<string name="pref_unit_system">Preferred system of units</string>
|
<string name="pref_unit_system">Preferred system of units</string>
|
||||||
<string name="settings">Settings</string>
|
<string name="settings">Settings</string>
|
||||||
|
<string name="exportData">Export Data</string>
|
||||||
|
<string name="exportDataSummary">This takes a backup of all your preferences and workout data</string>
|
||||||
|
<string name="importBackup">Import Data Backup</string>
|
||||||
|
<string name="importBackupSummary">Restore a taken backup</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@ -14,5 +14,14 @@
|
|||||||
android:summary="@string/pref_weight_summary"
|
android:summary="@string/pref_weight_summary"
|
||||||
android:title="@string/pref_weight" />
|
android:title="@string/pref_weight" />
|
||||||
|
|
||||||
|
<Preference
|
||||||
|
android:key="import"
|
||||||
|
android:summary="@string/importBackupSummary"
|
||||||
|
android:title="@string/importBackup" />
|
||||||
|
<Preference
|
||||||
|
android:key="export"
|
||||||
|
android:summary="@string/exportDataSummary"
|
||||||
|
android:title="@string/exportData" />
|
||||||
|
|
||||||
|
|
||||||
</PreferenceScreen>
|
</PreferenceScreen>
|
||||||
Loading…
x
Reference in New Issue
Block a user