From f02130a61ef9453b463b298bcebdcbb6a32cb5de Mon Sep 17 00:00:00 2001 From: OliE Date: Tue, 23 May 2017 18:06:09 +0200 Subject: [PATCH] add database backup function --- .../gui/preferences/BackupPreferences.java | 206 ++++++++++++++++++ .../main/res/drawable/preferences_backup.png | Bin 0 -> 706 bytes .../app/src/main/res/values-de/strings.xml | 5 + .../app/src/main/res/values/strings.xml | 5 + .../src/main/res/xml/backup_preferences.xml | 6 + .../src/main/res/xml/header_preferences.xml | 4 + 6 files changed, 226 insertions(+) create mode 100644 android_app/app/src/main/java/com/health/openscale/gui/preferences/BackupPreferences.java create mode 100644 android_app/app/src/main/res/drawable/preferences_backup.png create mode 100644 android_app/app/src/main/res/xml/backup_preferences.xml diff --git a/android_app/app/src/main/java/com/health/openscale/gui/preferences/BackupPreferences.java b/android_app/app/src/main/java/com/health/openscale/gui/preferences/BackupPreferences.java new file mode 100644 index 00000000..f94bc531 --- /dev/null +++ b/android_app/app/src/main/java/com/health/openscale/gui/preferences/BackupPreferences.java @@ -0,0 +1,206 @@ +/* Copyright (C) 2014 olie.xdev +* +* This program 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. +* +* This program 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 com.health.openscale.gui.preferences; + +import android.os.Bundle; +import android.os.Environment; +import android.preference.EditTextPreference; +import android.preference.ListPreference; +import android.preference.MultiSelectListPreference; +import android.preference.Preference; +import android.preference.PreferenceFragment; +import android.preference.PreferenceGroup; +import android.preference.PreferenceManager; +import android.widget.Toast; + +import com.health.openscale.R; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.channels.FileChannel; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +public class BackupPreferences extends PreferenceFragment { + private static final String PREFERENCE_KEY_IMPORT_BACKUP = "importBackup"; + private static final String PREFERENCE_KEY_EXPORT_BACKUP = "exportBackup"; + + private Preference importBackup; + private Preference exportBackup; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + addPreferencesFromResource(R.xml.backup_preferences); + + + importBackup = (Preference) findPreference(PREFERENCE_KEY_IMPORT_BACKUP); + importBackup.setOnPreferenceClickListener(new onClickListenerImportBackup()); + + exportBackup = (Preference) findPreference(PREFERENCE_KEY_EXPORT_BACKUP); + exportBackup.setOnPreferenceClickListener(new onClickListenerExportBackup()); + + initSummary(getPreferenceScreen()); + } + + private void initSummary(Preference p) { + if (p instanceof PreferenceGroup) { + PreferenceGroup pGrp = (PreferenceGroup) p; + for (int i = 0; i < pGrp.getPreferenceCount(); i++) { + initSummary(pGrp.getPreference(i)); + } + } else { + updatePrefSummary(p); + } + } + + private void updatePrefSummary(Preference p) + { + if (p instanceof ListPreference) + { + ListPreference listPref = (ListPreference) p; + p.setSummary(listPref.getEntry()); + } + + if (p instanceof EditTextPreference) + { + EditTextPreference editTextPref = (EditTextPreference) p; + if (p.getTitle().toString().contains("assword")) + { + p.setSummary("******"); + } + else + { + p.setSummary(editTextPref.getText()); + } + } + + if (p instanceof MultiSelectListPreference) + { + MultiSelectListPreference editMultiListPref = (MultiSelectListPreference) p; + + CharSequence[] entries = editMultiListPref.getEntries(); + CharSequence[] entryValues = editMultiListPref.getEntryValues(); + List currentEntries = new ArrayList<>(); + Set currentEntryValues = editMultiListPref.getValues(); + + for (int i = 0; i < entries.length; i++) + { + if (currentEntryValues.contains(entryValues[i].toString())) currentEntries.add(entries[i].toString()); + } + + p.setSummary(currentEntries.toString()); + } + } + + private class onClickListenerImportBackup implements Preference.OnPreferenceClickListener { + @Override + public boolean onPreferenceClick(Preference preference) { + File exportDir = new File(Environment.getExternalStorageDirectory(), PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext()).getString("exportDir", "openScale Backup")); + + importBackup("openScaleDatabase.db", exportDir); + importBackup("openScaleUserDatabase.db", exportDir); + + return true; + } + } + + private class onClickListenerExportBackup implements Preference.OnPreferenceClickListener { + @Override + public boolean onPreferenceClick(Preference preference) { + File exportDir = new File(Environment.getExternalStorageDirectory(), PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext()).getString("exportDir", "openScale Backup")); + + exportBackup("openScaleDatabase.db", exportDir); + exportBackup("openScaleUserDatabase.db", exportDir); + + return true; + } + } + + private boolean importBackup(String databaseName, File exportDir) { + if(!isExternalStoragePresent()) + return false; + + File exportFile = new File(Environment.getDataDirectory() + + "/data/com.health.openscale" + + "/databases/" + databaseName ); + File importFile = new File(exportDir, databaseName); + + if (!importFile.exists()) { + Toast.makeText(getActivity().getApplicationContext(), getResources().getString(R.string.error_importing) + " " + exportDir + "/" + databaseName + " " + getResources().getString(R.string.label_not_found), Toast.LENGTH_SHORT).show(); + return false; + } + + try { + exportFile.createNewFile(); + copyFile(importFile, exportFile); + Toast.makeText(getActivity().getApplicationContext(), getResources().getString(R.string.info_data_imported) + " " + exportDir + "/" + databaseName, Toast.LENGTH_SHORT).show(); + } catch (IOException e) { + Toast.makeText(getActivity().getApplicationContext(), getResources().getString(R.string.error_importing) + " " + e.getMessage(), Toast.LENGTH_SHORT).show(); + return false; + } + + return true; + } + + private boolean exportBackup(String databaseName, File exportDir) { + if(!isExternalStoragePresent()) + return false; + + File dbFile = new File(Environment.getDataDirectory() + + "/data/com.health.openscale" + + "/databases/" + databaseName ); + + File file = new File(exportDir, databaseName); + + if (!exportDir.exists()) { + exportDir.mkdirs(); + } + + try { + file.createNewFile(); + copyFile(dbFile, file); + + Toast.makeText(getActivity().getApplicationContext(), getResources().getString(R.string.info_data_exported) + " " + exportDir + "/" + databaseName, Toast.LENGTH_SHORT).show(); + } catch (IOException e) { + Toast.makeText(getActivity().getApplicationContext(), getResources().getString(R.string.error_exporting) + " " + e.getMessage(), Toast.LENGTH_SHORT).show(); + return false; + } + + return true; + } + + private void copyFile(File src, File dst) throws IOException { + FileChannel inChannel = new FileInputStream(src).getChannel(); + FileChannel outChannel = new FileOutputStream(dst).getChannel(); + try { + inChannel.transferTo(0, inChannel.size(), outChannel); + } finally { + if (inChannel != null) + inChannel.close(); + if (outChannel != null) + outChannel.close(); + } + } + + private boolean isExternalStoragePresent() { + return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED); + } +} diff --git a/android_app/app/src/main/res/drawable/preferences_backup.png b/android_app/app/src/main/res/drawable/preferences_backup.png new file mode 100644 index 0000000000000000000000000000000000000000..3da295cd0d6438335ce3123a94c9ee1ff09c8e08 GIT binary patch literal 706 zcmV;z0zLhSP)kQ1>{LE%Jux$4p+2bu^%nFb;5&X=u=ie4DC zAg|Oeyc1VZu$hK52&_ald`TBEX|wIP<<{ADcFyVIyf9jeJ$FBN9=^}>efb44C{?1# zR*$N%LZy^3F)_dEanpp!EKh)_H?@cva@Adb88;!MOqo)Rwy09>E1%{hQQ!JNts;vd zVy&|-N3Hv=}z-7I9j7yo5M1imZ zRd(2>+1nn`m=Of%@V@6YJ1$TtZCap6U{=x%oqElAJyR^4EjpuHx3D6G3WSi7lrSxs zWu$U~LJfJZbLJM!vB|?sX!h%vC;BgJ@Ua&%wZanGP5Z`_GcLOJFY1%F+biyfA@#Wo zac7%Rg+o@Wc&$Nd8Y5jsh#c|U;T^^Y6mIEq`I&78isP?lHi%j^Q8c}a(vl_qV z`dRFhK_@k-Q)zjgzR{qSUJ^lrHO_f8;~&;&@stuNVTat${v;o&F)ZpM?->?x*x-Bv ofrxUo`IVJ08!1Y@igaBt Waage Datentransfer Bt Waage Initialisierung Folgendes wird unterstützt + Datensicherung + Exportiere Datensicherung + Importiere Datensicherung + Export Ordner + nicht gefunden \ No newline at end of file diff --git a/android_app/app/src/main/res/values/strings.xml b/android_app/app/src/main/res/values/strings.xml index ce09d020..4133e10c 100644 --- a/android_app/app/src/main/res/values/strings.xml +++ b/android_app/app/src/main/res/values/strings.xml @@ -140,4 +140,9 @@ Bt scale data transfer Bt scale data history Following will supported + Export backup + Import backup + Backup + Export dir + not found diff --git a/android_app/app/src/main/res/xml/backup_preferences.xml b/android_app/app/src/main/res/xml/backup_preferences.xml new file mode 100644 index 00000000..b57ae20d --- /dev/null +++ b/android_app/app/src/main/res/xml/backup_preferences.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/android_app/app/src/main/res/xml/header_preferences.xml b/android_app/app/src/main/res/xml/header_preferences.xml index 318a5108..775b25ac 100644 --- a/android_app/app/src/main/res/xml/header_preferences.xml +++ b/android_app/app/src/main/res/xml/header_preferences.xml @@ -20,4 +20,8 @@ android:fragment="com.health.openscale.gui.preferences.ReminderPreferences" android:title="@string/label_reminder" android:icon="@drawable/preferences_reminder"/> +
\ No newline at end of file