diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 56d076441..919511a6f 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -176,6 +176,13 @@
android:name="android.support.PARENT_ACTIVITY"
android:value="de.danoeh.antennapod.activity.PreferenceActivity"/>
+
+
+
= 19) {
+ Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
+ intent.setType("*/*");
+ startActivityForResult(intent, READ_REQUEST_CODE_DOCUMENT);
+ } else {
+ Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
+ intent.setType("*/*");
+ startActivityForResult(Intent.createChooser(intent, "Select a File to import"), READ_REQUEST_CODE);
+ }
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
+ File currentDB = getDatabasePath(PodDBAdapter.DATABASE_NAME);
+
+ if (requestCode == READ_REQUEST_CODE_DOCUMENT && resultCode == RESULT_OK) {
+ if (resultData != null) {
+ Uri uri = resultData.getData();
+
+ try {
+ InputStream inputStream = getContentResolver().openInputStream(uri);
+ copyInputStreamToFile(inputStream, currentDB);
+ inputStream.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ }
+ } else if(requestCode == READ_REQUEST_CODE && resultCode == RESULT_OK) {
+ if (resultData != null) {
+ Uri uri = resultData.getData();
+ try {
+ File backupDB = new File(getPath(getBaseContext(), uri));
+
+ if (backupDB.exists()) {
+ FileChannel src = new FileInputStream(currentDB).getChannel();
+ FileChannel dst = new FileOutputStream(backupDB).getChannel();
+ dst.transferFrom(src, 0, src.size());
+ src.close();
+ dst.close();
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+
+ private void copyInputStreamToFile(InputStream in, File file) {
+ try {
+ OutputStream out = new FileOutputStream(file);
+ byte[] buf = new byte[1024];
+ int len;
+ while((len=in.read(buf))>0){
+ out.write(buf,0,len);
+ }
+ out.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ private static String getPath(Context context, Uri uri) {
+ if ("content".equalsIgnoreCase(uri.getScheme())) {
+ String[] projection = { "_data" };
+ Cursor cursor = null;
+
+ try {
+ cursor = context.getContentResolver().query(uri, projection, null, null, null);
+ int column_index = cursor.getColumnIndexOrThrow("_data");
+ if (cursor.moveToFirst()) {
+ return cursor.getString(column_index);
+ }
+ } catch (Exception e) {
+ // Eat it
+ }
+ }
+ else if ("file".equalsIgnoreCase(uri.getScheme())) {
+ return uri.getPath();
+ }
+
+ return null;
+ }
+
+ private void backup() {
+ try {
+ File sd = Environment.getExternalStorageDirectory();
+
+ if (sd.canWrite()) {
+ File currentDB = getDatabasePath(PodDBAdapter.DATABASE_NAME);
+ File backupDB = new File(sd, "AntennaPodBackup.db");
+
+ if (currentDB.exists()) {
+ FileChannel src = new FileInputStream(currentDB).getChannel();
+ FileChannel dst = new FileOutputStream(backupDB).getChannel();
+ dst.transferFrom(src, 0, src.size());
+ src.close();
+ dst.close();
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/app/src/main/java/de/danoeh/antennapod/preferences/PreferenceController.java b/app/src/main/java/de/danoeh/antennapod/preferences/PreferenceController.java
index 1ca0d0109..e8c35b9a7 100644
--- a/app/src/main/java/de/danoeh/antennapod/preferences/PreferenceController.java
+++ b/app/src/main/java/de/danoeh/antennapod/preferences/PreferenceController.java
@@ -39,6 +39,7 @@ import android.widget.Toast;
import com.afollestad.materialdialogs.MaterialDialog;
+import de.danoeh.antennapod.activity.ImportExportActivity;
import org.apache.commons.lang3.ArrayUtils;
import java.io.File;
@@ -95,6 +96,7 @@ public class PreferenceController implements SharedPreferences.OnSharedPreferenc
private static final String PREF_OPML_EXPORT = "prefOpmlExport";
private static final String PREF_HTML_EXPORT = "prefHtmlExport";
private static final String STATISTICS = "statistics";
+ private static final String IMPORT_EXPORT = "importExport";
private static final String PREF_ABOUT = "prefAbout";
private static final String PREF_CHOOSE_DATA_DIR = "prefChooseDataDir";
private static final String AUTO_DL_PREF_SCREEN = "prefAutoDownloadSettings";
@@ -191,6 +193,12 @@ public class PreferenceController implements SharedPreferences.OnSharedPreferenc
return true;
}
);
+ ui.findPreference(PreferenceController.IMPORT_EXPORT).setOnPreferenceClickListener(
+ preference -> {
+ activity.startActivity(new Intent(activity, ImportExportActivity.class));
+ return true;
+ }
+ );
ui.findPreference(PreferenceController.PREF_OPML_EXPORT).setOnPreferenceClickListener(
preference -> export(new OpmlWriter()));
ui.findPreference(PreferenceController.PREF_HTML_EXPORT).setOnPreferenceClickListener(
diff --git a/app/src/main/res/layout/import_export_activity.xml b/app/src/main/res/layout/import_export_activity.xml
new file mode 100644
index 000000000..91e798ead
--- /dev/null
+++ b/app/src/main/res/layout/import_export_activity.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml
index e81115627..8ed7da731 100644
--- a/app/src/main/res/xml/preferences.xml
+++ b/app/src/main/res/xml/preferences.xml
@@ -315,6 +315,9 @@
+
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java
index dc8692866..413048c93 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java
@@ -45,7 +45,7 @@ import de.greenrobot.event.EventBus;
public class PodDBAdapter {
private static final String TAG = "PodDBAdapter";
- private static final String DATABASE_NAME = "Antennapod.db";
+ public static final String DATABASE_NAME = "Antennapod.db";
/**
* Maximum number of arguments for IN-operator.
diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml
index a940c031b..545eea228 100644
--- a/core/src/main/res/values/strings.xml
+++ b/core/src/main/res/values/strings.xml
@@ -661,6 +661,12 @@
Host is not a valid IP address or domain
Port not valid
+
+ Database import/export
+ This experimental function can be used to transfer your subscriptions and played episodes to another device.\n\nExported databases can only be imported when using the same version of AntennaPod. Otherwise, this function will lead to unexpected behavior.\n\nAfter importing, episodes might be displayed as downloaded even though they are not. Just press the play button of the episodes to make AntennaPod detect this.
+ Import
+ Export
+
Play on…
Disconnect the cast session