diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DbManagementActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DbManagementActivity.java index b1a938b4..685a55b1 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DbManagementActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DbManagementActivity.java @@ -20,8 +20,10 @@ package nodomain.freeyourgadget.gadgetbridge.activities; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.IntentFilter; +import android.content.SharedPreferences; import android.database.sqlite.SQLiteOpenHelper; import android.os.Bundle; +import android.preference.PreferenceManager; import android.support.v4.app.NavUtils; import android.view.MenuItem; import android.view.View; @@ -33,6 +35,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; +import java.io.IOException; import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.R; @@ -40,10 +43,13 @@ import nodomain.freeyourgadget.gadgetbridge.database.DBHandler; import nodomain.freeyourgadget.gadgetbridge.database.DBHelper; import nodomain.freeyourgadget.gadgetbridge.util.FileUtils; import nodomain.freeyourgadget.gadgetbridge.util.GB; +import nodomain.freeyourgadget.gadgetbridge.util.ImportExportSharedPreferences; public class DbManagementActivity extends GBActivity { private static final Logger LOG = LoggerFactory.getLogger(DbManagementActivity.class); + private static SharedPreferences sharedPrefs; + private ImportExportSharedPreferences shared_file = new ImportExportSharedPreferences(); private Button exportDBButton; private Button importDBButton; @@ -95,6 +101,8 @@ public class DbManagementActivity extends GBActivity { deleteActivityDatabase(); } }); + + sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this); } private boolean hasOldActivityDatabase() { @@ -110,8 +118,33 @@ public class DbManagementActivity extends GBActivity { return getString(R.string.dbmanagementactivvity_cannot_access_export_path); } + private void exportShared() { + // BEGIN EXAMPLE + File myPath = null; + try { + myPath = FileUtils.getExternalFilesDir(); + File myFile = new File(myPath, "Export_preference"); + shared_file.exportToFile(sharedPrefs,myFile,null); + } catch (IOException ex) { + GB.toast(this, getString(R.string.dbmanagementactivity_error_exporting_shared, ex.getMessage()), Toast.LENGTH_LONG, GB.ERROR, ex); + } + } + + private void importShared() { + // BEGIN EXAMPLE + File myPath = null; + try { + myPath = FileUtils.getExternalFilesDir(); + File myFile = new File(myPath, "Export_preference"); + shared_file.importFromFile(sharedPrefs,myFile ); + } catch (Exception ex) { + GB.toast(DbManagementActivity.this, getString(R.string.dbmanagementactivity_error_importing_db, ex.getMessage()), Toast.LENGTH_LONG, GB.ERROR, ex); + } + } + private void exportDB() { try (DBHandler dbHandler = GBApplication.acquireDB()) { + exportShared(); DBHelper helper = new DBHelper(this); File dir = FileUtils.getExternalFilesDir(); File destFile = helper.exportDB(dbHandler, dir); @@ -130,6 +163,7 @@ public class DbManagementActivity extends GBActivity { @Override public void onClick(DialogInterface dialog, int which) { try (DBHandler dbHandler = GBApplication.acquireDB()) { + importShared(); DBHelper helper = new DBHelper(DbManagementActivity.this); File dir = FileUtils.getExternalFilesDir(); SQLiteOpenHelper sqLiteOpenHelper = dbHandler.getHelper(); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/ImportExportSharedPreferences.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/ImportExportSharedPreferences.java new file mode 100644 index 00000000..b51fdecf --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/ImportExportSharedPreferences.java @@ -0,0 +1,131 @@ +package nodomain.freeyourgadget.gadgetbridge.util; + + +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.Reader; +import java.io.Writer; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlSerializer; + +import android.content.SharedPreferences; +import android.util.Xml; + +import static nodomain.freeyourgadget.gadgetbridge.GBApplication.blacklist; + +public class ImportExportSharedPreferences { + + private static final String BOOLEAN = Boolean.class.getSimpleName(); + private static final String FLOAT = Float.class.getSimpleName(); + private static final String INTEGER = Integer.class.getSimpleName(); + private static final String LONG = Long.class.getSimpleName(); + private static final String STRING = String.class.getSimpleName(); + private static final String HASTSET = HashSet.class.getSimpleName(); + + private static final String NAME = "name"; + private static final String PREFERENCES = "preferences"; + + public static void exportToFile(SharedPreferences sharedPreferences, File outFile, + Set doNotExport) throws IOException { + export(sharedPreferences, new FileWriter(outFile), doNotExport); + } + + + public static void export(SharedPreferences sharedPreferences, Writer writer, + Set doNotExport) throws IOException { + XmlSerializer serializer = Xml.newSerializer(); + serializer.setOutput(writer); + serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true); + serializer.startDocument("UTF-8", true); + serializer.startTag("", PREFERENCES); + for (Map.Entry entry : sharedPreferences.getAll().entrySet()) { + String key = entry.getKey(); + if (doNotExport != null && doNotExport.contains(key)) continue; + + Object valueObject = entry.getValue(); + // Skip this entry if the value is null; + if (valueObject == null) continue; + + String valueType = valueObject.getClass().getSimpleName(); + String value = valueObject.toString(); + serializer.startTag("", valueType); + serializer.attribute("", NAME, key); + serializer.text(value); + serializer.endTag("", valueType); + + } + serializer.endTag("", PREFERENCES); + serializer.endDocument(); + writer.close(); + } + + public static boolean importFromFile(SharedPreferences sharedPreferences, File inFile) + throws Exception { + return importFromReader(sharedPreferences, new FileReader(inFile)); + } + + /** + * + * @param sharedPreferences + * @param in + * @return + * @throws Exception + */ + public static boolean importFromReader(SharedPreferences sharedPreferences, Reader in) + throws Exception { + SharedPreferences.Editor editor = sharedPreferences.edit(); + editor.clear(); + XmlPullParser parser = Xml.newPullParser(); + parser.setInput(in); + int eventType = parser.getEventType(); + String name = null; + String key = null; + while (eventType != XmlPullParser.END_DOCUMENT) { + switch (eventType) { + case XmlPullParser.START_TAG: + name = parser.getName(); + key = parser.getAttributeValue("", NAME); + break; + case XmlPullParser.TEXT: + // The parser is reading text outside an element if name is null, + // so simply ignore this text part (which is usually something like '\n') + if (name == null) break; + String text = parser.getText(); + if (BOOLEAN.equals(name)) { + editor.putBoolean(key, Boolean.parseBoolean(text)); + } else if (FLOAT.equals(name)) { + editor.putFloat(key, Float.parseFloat(text)); + } else if (INTEGER.equals(name)) { + editor.putInt(key, Integer.parseInt(text)); + } else if (LONG.equals(name)) { + editor.putLong(key, Long.parseLong(text)); + } else if (STRING.equals(name)) { + editor.putString(key, text); + } else if (HASTSET.equals(name)) { + if (key.equals("package_blacklist")) { + blacklist.clear(); + text=text.replace("[","").replace("]",""); + for (int z=0;zCannot access export path. Please contact the developers. Exported to: %1$s "Error exporting DB: %1$s" + "Error exporting preference: %1$s" Import Data? Really overwrite the current database? All your current activity data (if any) will be lost. Import successful. "Error importing DB: %1$s" + "Error importing preference: %1$s" Delete Activity Data? Really delete the entire database? All your activity data and information about your devices will be lost. Data successfully deleted.