summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Fietz <martin.fietz@gmail.com>2018-01-21 11:10:20 +0100
committerMartin Fietz <martin.fietz@gmail.com>2018-01-21 11:10:20 +0100
commitd3491d1858bf33f894f07652169254b5821b0e9d (patch)
tree74449084cd33cdcdf9a2c04291ba5c9d36defffb
parente4770e7edce8116f764fdb748cb3d4252c91b8dd (diff)
parentf7c048e5b4717a997c26be42332395dc3b0f6f02 (diff)
downloadAntennaPod-d3491d1858bf33f894f07652169254b5821b0e9d.zip
Merge branch 'develop' into refactor
# Conflicts: # app/src/main/java/de/danoeh/antennapod/activity/MediaplayerInfoActivity.java # core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java
-rw-r--r--.tx/config1
-rw-r--r--app/src/main/AndroidManifest.xml7
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/FeedInfoActivity.java2
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/ImportExportActivity.java185
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/MediaplayerInfoActivity.java3
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/DownloadLogAdapter.java2
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/itunes/ItunesAdapter.java2
-rw-r--r--app/src/main/java/de/danoeh/antennapod/dialog/EpisodesApplyActionFragment.java2
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/DownloadsFragment.java2
-rw-r--r--app/src/main/java/de/danoeh/antennapod/preferences/PreferenceController.java8
-rw-r--r--app/src/main/res/layout/import_export_activity.xml28
-rw-r--r--app/src/main/res/xml/preferences.xml3
-rw-r--r--build.gradle2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java8
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/PodDBAdapter.java2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/syndication/HtmlToPlainText.java2
-rw-r--r--core/src/main/res/values-bg/strings.xml239
-rw-r--r--core/src/main/res/values-pt/strings.xml11
-rw-r--r--core/src/main/res/values/strings.xml9
-rw-r--r--gradle/wrapper/gradle-wrapper.jarbin54708 -> 54333 bytes
-rw-r--r--gradle/wrapper/gradle-wrapper.properties2
22 files changed, 504 insertions, 18 deletions
diff --git a/.tx/config b/.tx/config
index 5baf71152..0659eaff4 100644
--- a/.tx/config
+++ b/.tx/config
@@ -7,6 +7,7 @@ source_lang = en
trans.ast_ES = core/src/main/res/values-b+ast/strings.xml
trans.ar = core/src/main/res/values-ar/strings.xml
trans.az = core/src/main/res/values-az/strings.xml
+trans.bg = core/src/main/res/values-bg/strings.xml
trans.ca = core/src/main/res/values-ca/strings.xml
trans.ca_ES = core/src/main/res/values-ca-rES/strings.xml
trans.cs_CZ = core/src/main/res/values-cs-rCZ/strings.xml
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6be5bd1b3..8c3c86358 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -168,6 +168,13 @@
android:value="de.danoeh.antennapod.activity.PreferenceActivity"/>
</activity>
<activity
+ android:name=".activity.ImportExportActivity"
+ android:label="@string/import_export">
+ <meta-data
+ android:name="android.support.PARENT_ACTIVITY"
+ android:value="de.danoeh.antennapod.activity.PreferenceActivity"/>
+ </activity>
+ <activity
android:name=".activity.OpmlImportFromPathActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:label="@string/opml_import_label">
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/FeedInfoActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/FeedInfoActivity.java
index 7580becdc..8dea41b7c 100644
--- a/app/src/main/java/de/danoeh/antennapod/activity/FeedInfoActivity.java
+++ b/app/src/main/java/de/danoeh/antennapod/activity/FeedInfoActivity.java
@@ -379,7 +379,7 @@ public class FeedInfoActivity extends AppCompatActivity {
}
}
- private class ApplyToEpisodesDialog extends ConfirmationDialog {
+ private static class ApplyToEpisodesDialog extends ConfirmationDialog {
private final Feed feed;
private final boolean autoDownload;
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/ImportExportActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/ImportExportActivity.java
new file mode 100644
index 000000000..6a97adcc3
--- /dev/null
+++ b/app/src/main/java/de/danoeh/antennapod/activity/ImportExportActivity.java
@@ -0,0 +1,185 @@
+package de.danoeh.antennapod.activity;
+
+import android.content.ComponentName;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Environment;
+import android.os.ParcelFileDescriptor;
+import android.support.design.widget.Snackbar;
+import android.support.v4.content.IntentCompat;
+import android.support.v7.app.AlertDialog;
+import android.support.v7.app.AppCompatActivity;
+import android.util.Log;
+import android.view.MenuItem;
+import de.danoeh.antennapod.R;
+import de.danoeh.antennapod.core.preferences.UserPreferences;
+import de.danoeh.antennapod.core.storage.PodDBAdapter;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.IOUtils;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.channels.FileChannel;
+
+/**
+ * Displays the 'import/export' screen
+ */
+public class ImportExportActivity extends AppCompatActivity {
+ private static final int REQUEST_CODE_RESTORE = 43;
+ private static final int REQUEST_CODE_BACKUP_DOCUMENT = 44;
+ private static final String EXPORT_FILENAME = "AntennaPodBackup.db";
+ private static final String TAG = ImportExportActivity.class.getSimpleName();
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ setTheme(UserPreferences.getTheme());
+ super.onCreate(savedInstanceState);
+ getSupportActionBar().setDisplayShowHomeEnabled(true);
+ setContentView(R.layout.import_export_activity);
+
+ findViewById(R.id.button_export).setOnClickListener(view -> backup());
+ findViewById(R.id.button_import).setOnClickListener(view -> restore());
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ if (item.getItemId() == android.R.id.home) {
+ finish();
+ return true;
+ } else {
+ return super.onOptionsItemSelected(item);
+ }
+ }
+
+ private void backup() {
+ if (Build.VERSION.SDK_INT >= 19) {
+ Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT)
+ .addCategory(Intent.CATEGORY_OPENABLE)
+ .setType("application/x-sqlite3")
+ .putExtra(Intent.EXTRA_TITLE, EXPORT_FILENAME);
+
+ startActivityForResult(intent, REQUEST_CODE_BACKUP_DOCUMENT);
+ } else {
+ try {
+ File sd = Environment.getExternalStorageDirectory();
+ File backupDB = new File(sd, EXPORT_FILENAME);
+ writeBackupTo(new FileOutputStream(backupDB));
+ } catch (IOException e) {
+ Log.e(TAG, Log.getStackTraceString(e));
+ Snackbar.make(findViewById(R.id.import_export_layout), e.getLocalizedMessage(), Snackbar.LENGTH_SHORT).show();
+ }
+ }
+ }
+
+ private void restore() {
+ if (Build.VERSION.SDK_INT >= 19) {
+ Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
+ intent.setType("*/*");
+ startActivityForResult(intent, REQUEST_CODE_RESTORE);
+ } else {
+ Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
+ intent.setType("*/*");
+ startActivityForResult(Intent.createChooser(intent,
+ getString(R.string.import_select_file)), REQUEST_CODE_RESTORE);
+ }
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
+ if (resultCode != RESULT_OK || resultData == null) {
+ return;
+ }
+ Uri uri = resultData.getData();
+
+ if (requestCode == REQUEST_CODE_RESTORE) {
+ restoreFrom(uri);
+ } else if (requestCode == REQUEST_CODE_BACKUP_DOCUMENT) {
+ backupToDocument(uri);
+ }
+ }
+
+ private void restoreFrom(Uri inputUri) {
+ File currentDB = getDatabasePath(PodDBAdapter.DATABASE_NAME);
+ InputStream inputStream = null;
+ try {
+ inputStream = getContentResolver().openInputStream(inputUri);
+ FileUtils.copyInputStreamToFile(inputStream, currentDB);
+ displayImportSuccessDialog();
+ } catch (IOException e) {
+ Log.e(TAG, Log.getStackTraceString(e));
+ Snackbar.make(findViewById(R.id.import_export_layout), e.getLocalizedMessage(), Snackbar.LENGTH_SHORT).show();
+ } finally {
+ IOUtils.closeQuietly(inputStream);
+ }
+ }
+
+ private void displayImportSuccessDialog() {
+ AlertDialog.Builder d = new AlertDialog.Builder(ImportExportActivity.this);
+ d.setMessage(R.string.import_ok);
+ d.setCancelable(false);
+ d.setPositiveButton(android.R.string.ok, (dialogInterface, i) -> {
+ Intent intent = new Intent(getApplicationContext(), SplashActivity.class);
+ ComponentName cn = intent.getComponent();
+ Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
+ startActivity(mainIntent);
+ });
+ d.show();
+ }
+
+ private void backupToDocument(Uri uri) {
+ ParcelFileDescriptor pfd = null;
+ FileOutputStream fileOutputStream = null;
+ try {
+ pfd = getContentResolver().openFileDescriptor(uri, "w");
+ fileOutputStream = new FileOutputStream(pfd.getFileDescriptor());
+ writeBackupTo(fileOutputStream);
+
+ Snackbar.make(findViewById(R.id.import_export_layout),
+ R.string.export_ok, Snackbar.LENGTH_SHORT).show();
+ } catch (IOException e) {
+ Log.e(TAG, Log.getStackTraceString(e));
+ Snackbar.make(findViewById(R.id.import_export_layout), e.getLocalizedMessage(), Snackbar.LENGTH_SHORT).show();
+ } finally {
+ IOUtils.closeQuietly(fileOutputStream);
+
+ if (pfd != null) {
+ try {
+ pfd.close();
+ } catch (IOException e) {
+ Log.d(TAG, "Unable to close ParcelFileDescriptor");
+ }
+ }
+ }
+ }
+
+ private void writeBackupTo(FileOutputStream outFileStream) {
+ FileChannel src = null;
+ FileChannel dst = null;
+ try {
+ File currentDB = getDatabasePath(PodDBAdapter.DATABASE_NAME);
+
+ if (currentDB.exists()) {
+ src = new FileInputStream(currentDB).getChannel();
+ dst = outFileStream.getChannel();
+ dst.transferFrom(src, 0, src.size());
+
+ Snackbar.make(findViewById(R.id.import_export_layout),
+ R.string.export_ok, Snackbar.LENGTH_SHORT).show();
+ } else {
+ Snackbar.make(findViewById(R.id.import_export_layout),
+ "Can not access current database", Snackbar.LENGTH_SHORT).show();
+ }
+ } catch (IOException e) {
+ Log.e(TAG, Log.getStackTraceString(e));
+ Snackbar.make(findViewById(R.id.import_export_layout), e.getLocalizedMessage(), Snackbar.LENGTH_SHORT).show();
+ } finally {
+ IOUtils.closeQuietly(src);
+ IOUtils.closeQuietly(dst);
+ }
+ }
+}
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerInfoActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerInfoActivity.java
index ae7040e0e..5e182d39e 100644
--- a/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerInfoActivity.java
+++ b/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerInfoActivity.java
@@ -72,12 +72,13 @@ import rx.schedulers.Schedulers;
*/
public abstract class MediaplayerInfoActivity extends MediaplayerActivity implements NavDrawerActivity {
+ private static final String TAG = "MediaplayerInfoActivity";
+
private static final int POS_COVER = 0;
private static final int POS_DESCR = 1;
private static final int POS_CHAPTERS = 2;
private static final int NUM_CONTENT_FRAGMENTS = 3;
- private final String TAG = "MediaplayerInfoActivity";
private static final String PREFS = "AudioPlayerActivityPreferences";
private static final String PREF_KEY_SELECTED_FRAGMENT_POSITION = "selectedFragmentPosition";
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/DownloadLogAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/DownloadLogAdapter.java
index 2c6aa8f72..7c0be47b6 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/DownloadLogAdapter.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/DownloadLogAdapter.java
@@ -29,7 +29,7 @@ import de.danoeh.antennapod.core.storage.DownloadRequestException;
/** Displays a list of DownloadStatus entries. */
public class DownloadLogAdapter extends BaseAdapter {
- private final String TAG = "DownloadLogAdapter";
+ private static final String TAG = "DownloadLogAdapter";
private final Context context;
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/itunes/ItunesAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/itunes/ItunesAdapter.java
index 10b5330c1..e493a2ecc 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/itunes/ItunesAdapter.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/itunes/ItunesAdapter.java
@@ -162,7 +162,7 @@ public class ItunesAdapter extends ArrayAdapter<ItunesAdapter.Podcast> {
/**
* View holder object for the GridView
*/
- class PodcastViewHolder {
+ static class PodcastViewHolder {
/**
* ImageView holding the Podcast image
diff --git a/app/src/main/java/de/danoeh/antennapod/dialog/EpisodesApplyActionFragment.java b/app/src/main/java/de/danoeh/antennapod/dialog/EpisodesApplyActionFragment.java
index 04d4ae247..10ce12771 100644
--- a/app/src/main/java/de/danoeh/antennapod/dialog/EpisodesApplyActionFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/dialog/EpisodesApplyActionFragment.java
@@ -32,7 +32,7 @@ import de.danoeh.antennapod.core.util.LongList;
public class EpisodesApplyActionFragment extends Fragment {
- public String TAG = "EpisodeActionFragment";
+ public static final String TAG = "EpisodeActionFragment";
private static final int ACTION_QUEUE = 1;
private static final int ACTION_MARK_PLAYED = 2;
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/DownloadsFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/DownloadsFragment.java
index 0e9e36df0..9c4d00e31 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/DownloadsFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/DownloadsFragment.java
@@ -78,7 +78,7 @@ public class DownloadsFragment extends Fragment {
viewPager.setCurrentItem(lastPosition);
}
- public class DownloadsPagerAdapter extends FragmentPagerAdapter {
+ public static class DownloadsPagerAdapter extends FragmentPagerAdapter {
final Resources resources;
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 8c2ece735..b5e0f1e99 100644
--- a/app/src/main/java/de/danoeh/antennapod/preferences/PreferenceController.java
+++ b/app/src/main/java/de/danoeh/antennapod/preferences/PreferenceController.java
@@ -38,6 +38,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;
@@ -90,6 +91,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";
@@ -173,6 +175,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..6614a8710
--- /dev/null
+++ b/app/src/main/res/layout/import_export_activity.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:id="@+id/import_export_layout"
+ android:padding="8dp">
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/import_export_warning"
+ android:gravity="center_horizontal"/>
+
+ <Button
+ android:text="@string/label_export"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:id="@+id/button_export"
+ android:layout_marginTop="24dp"/>
+
+ <Button
+ android:text="@string/label_import"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:id="@+id/button_import"/>
+
+</LinearLayout>
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
@@ -316,6 +316,9 @@
android:key="prefHtmlExport"
android:title="@string/html_export_label"/>
<Preference
+ android:key="importExport"
+ android:title="@string/import_export"/>
+ <Preference
android:key="statistics"
android:title="@string/statistics_label"/>
</PreferenceCategory>
diff --git a/build.gradle b/build.gradle
index 70f377975..632c8e7bd 100644
--- a/build.gradle
+++ b/build.gradle
@@ -69,7 +69,7 @@ project.ext {
}
task wrapper(type: Wrapper) {
- gradleVersion = "4.2"
+ gradleVersion = "4.4.1"
}
// free build hack: common functions
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java
index 44861f8d1..d66af22ef 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java
@@ -127,8 +127,8 @@ public class DownloadService extends Service {
private NotificationCompat.Builder notificationCompatBuilder;
- private final int NOTIFICATION_ID = 2;
- private final int REPORT_ID = 3;
+ private static final int NOTIFICATION_ID = 2;
+ private static final int REPORT_ID = 3;
/**
* Currently running downloads.
@@ -611,7 +611,7 @@ public class DownloadService extends Service {
private volatile boolean isActive = true;
private volatile boolean isCollectingRequests = false;
- private final long WAIT_TIMEOUT = 3000;
+ private static final long WAIT_TIMEOUT = 3000;
/**
@@ -950,7 +950,7 @@ public class DownloadService extends Service {
* <p/>
* Currently, this handler only handles FeedMedia objects, because Feeds and FeedImages are deleted if the download fails.
*/
- private class FailedDownloadHandler implements Runnable {
+ private static class FailedDownloadHandler implements Runnable {
private final DownloadRequest request;
private final DownloadStatus status;
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java
index 2bb20482c..181a6f619 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java
@@ -314,7 +314,7 @@ public class HttpDownloader extends Downloader {
}
}
- private class BasicAuthorizationInterceptor implements Interceptor {
+ private static class BasicAuthorizationInterceptor implements Interceptor {
private final DownloadRequest downloadRequest;
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 460f9b661..67f42bc93 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
@@ -44,7 +44,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/java/de/danoeh/antennapod/core/util/syndication/HtmlToPlainText.java b/core/src/main/java/de/danoeh/antennapod/core/util/syndication/HtmlToPlainText.java
index 642b75ffd..cc6a8ec90 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/syndication/HtmlToPlainText.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/syndication/HtmlToPlainText.java
@@ -40,7 +40,7 @@ public class HtmlToPlainText {
}
// the formatting rules, implemented in a breadth-first DOM traverse
- private class FormattingVisitor implements NodeVisitor {
+ private static class FormattingVisitor implements NodeVisitor {
private final StringBuilder accum = new StringBuilder(); // holds the accumulated text
diff --git a/core/src/main/res/values-bg/strings.xml b/core/src/main/res/values-bg/strings.xml
new file mode 100644
index 000000000..286c9a3eb
--- /dev/null
+++ b/core/src/main/res/values-bg/strings.xml
@@ -0,0 +1,239 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources xmlns:tools="http://schemas.android.com/tools">
+ <!--Activitiy and fragment titles-->
+ <string name="feeds_label">Емисии</string>
+ <string name="statistics_label">Статистика</string>
+ <string name="add_feed_label">Добавяне на подкаст</string>
+ <string name="episodes_label">Епизоди</string>
+ <string name="all_episodes_short_label">Всички</string>
+ <string name="favorite_episodes_label">Любими</string>
+ <string name="new_label">Нови</string>
+ <string name="settings_label">Настройки</string>
+ <string name="downloads_label">Изтеглени</string>
+ <string name="downloads_running_label">Текущи</string>
+ <string name="downloads_completed_label">Завършени</string>
+ <string name="downloads_log_label">Дневник</string>
+ <string name="subscriptions_label">Абонаменти</string>
+ <string name="subscriptions_list_label">Списък с абонаменти</string>
+ <string name="cancel_download_label">Отказ\nИзтегляне</string>
+ <string name="playback_history_label">История</string>
+ <string name="gpodnet_main_label">gpodder.net</string>
+ <string name="gpodnet_auth_label">gpodder.net Вход</string>
+ <string name="free_space_label">%1$s свободни</string>
+ <string name="episode_cache_full_title">Пълен кеш на епизодите</string>
+ <string name="episode_cache_full_message">Ограничението на кеша на епизодите е достигнато. Можете да увеличите размера на кеша в настройките.</string>
+ <!--Statistics fragment-->
+ <!--Main activity-->
+ <string name="drawer_feed_counter_new_unplayed">Брой нови и непускани епизоди</string>
+ <string name="drawer_feed_counter_new">Брой нови епизоди</string>
+ <string name="drawer_feed_counter_unplayed">Брой непускани епизоди</string>
+ <string name="drawer_feed_counter_downloaded">Брой изтеглени епизоди</string>
+ <string name="drawer_feed_counter_none">Никакви</string>
+ <!--Webview actions-->
+ <string name="copy_url_label">Копирай URL адрес</string>
+ <string name="share_url_label">Сподели URL адрес</string>
+ <string name="copied_url_msg">Адресът е копиран</string>
+ <!--Playback history-->
+ <string name="clear_history_label">Изтриване на историята</string>
+ <!--Other-->
+ <string name="confirm_label">Потвърди</string>
+ <string name="cancel_label">Отказ</string>
+ <string name="yes">Да</string>
+ <string name="no">Не</string>
+ <string name="author_label">Автор</string>
+ <string name="language_label">Език</string>
+ <string name="url_label">URL</string>
+ <string name="podcast_settings_label">Настройки</string>
+ <string name="cover_label">Снимка</string>
+ <string name="error_label">Грешка</string>
+ <string name="error_msg_prefix">Възникна грешка:</string>
+ <string name="external_storage_error_msg">Няма налична външна памет. Уверете се, че външната памет е монтирана, за да може приложението да работи правилно.</string>
+ <string name="description_label">Описание</string>
+ <string name="most_recent_prefix">Най-нов епизод:\u0020</string>
+ <string name="size_prefix">Размер:\u0020</string>
+ <string name="loading_label">Зареждане…</string>
+ <string name="feed_auto_download_always">Винаги</string>
+ <string name="feed_auto_download_never">Никога</string>
+ <string name="episode_cleanup_never">Никога</string>
+ <!--'Add Feed' Activity labels-->
+ <string name="feedurl_label">URL адрес на емисията</string>
+ <string name="etxtFeedurlHint">www.primer.com/emisiq</string>
+ <string name="txtvfeedurl_label">Добавяне на подкаст по URL адрес</string>
+ <string name="podcastdirectories_label">Намиране на подкаст в директория</string>
+ <!--Actions on feeds-->
+ <string name="mark_all_read_label">Маркирай всички като слушани</string>
+ <string name="mark_all_read_msg">Всички епизоди са маркирани като слушани</string>
+ <string name="mark_all_read_confirmation_msg">Моля, потвърдете, че искате да маркирате всички епизоди като слушани.</string>
+ <string name="mark_all_read_feed_confirmation_msg">Моля, потвърдете, че искате да маркирате всички епизоди в тази емисия като слушани.</string>
+ <string name="mark_all_seen_label">Маркирай всички като прегледани</string>
+ <string name="mark_all_seen_msg">Всички епизоди са маркирани като прегледани</string>
+ <string name="mark_all_seen_confirmation_msg">Моля, потвърдете, че искате да маркирате всички епизоди като прегледани.</string>
+ <string name="show_info_label">Покажи информация</string>
+ <string name="rename_feed_label">Преименуване на подкаст</string>
+ <string name="remove_feed_label">Премахване на подкаст</string>
+ <string name="share_label">Споделяне...</string>
+ <string name="share_link_label">Сподели връзка</string>
+ <string name="share_file_label">Сподели файл</string>
+ <string name="share_link_with_position_label">Сподели връзка с позиция</string>
+ <string name="share_feed_url_label">Сподели URL адрес на емисията</string>
+ <string name="share_item_url_label">Сподели URL адрес на епизода</string>
+ <string name="share_item_url_with_position_label">Сподели URL адрес на епизода с позиция</string>
+ <string name="feed_remover_msg">Премахване на емисията</string>
+ <!--actions on feeditems-->
+ <string name="stream_label">Стрийм</string>
+ <string name="marked_as_seen_label">Маркиран като прегледан</string>
+ <string name="mark_read_label">Маркирай като слушан</string>
+ <string name="marked_as_read_label">Маркиран като слушан</string>
+ <string name="mark_unread_label">Маркирай като неслушан</string>
+ <string name="add_to_queue_label">Добави в опашката</string>
+ <string name="added_to_queue_label">Добавен в опашката</string>
+ <string name="remove_from_queue_label">Премахни от опашката</string>
+ <!--Download messages and labels-->
+ <string name="download_type_feed">Емисия</string>
+ <string name="authentication_notification_title">Необходимо удостоверяване</string>
+ <string name="confirm_mobile_download_dialog_enable_temporarily">Разреши временно</string>
+ <!--Mediaplayer messages-->
+ <string name="player_error_msg">Грешка!</string>
+ <!--Queue operations-->
+ <string name="lock_queue">Заключване на опашката</string>
+ <string name="unlock_queue">Отключване на опашката</string>
+ <string name="queue_locked">Опашката е заключена</string>
+ <string name="queue_unlocked">Опашката е отключена</string>
+ <string name="clear_queue_label">Изчистване на опашката</string>
+ <string name="clear_queue_confirmation_msg">Моля, потвърдете, че искате да изчистите ВСИЧКИ епизоди в опашката</string>
+ <!--Flattr-->
+ <!--Flattr-->
+ <!--Variable Speed-->
+ <!--Empty list labels-->
+ <!--Preferences-->
+ <string name="storage_pref">Съхранение</string>
+ <string name="project_pref">Проект</string>
+ <string name="other_pref">Други</string>
+ <string name="about_pref">Относно</string>
+ <string name="queue_label">Опашка</string>
+ <string name="services_label">Услуги</string>
+ <string name="flattr_label">Flattr</string>
+ <string name="pref_episode_cleanup_title">Почистване на епизодите</string>
+ <string name="pref_episode_cleanup_summary">Епизодите, които не са в опашката и не са в любими, отговарят на условията за премахване, ако автоматичното изтегляне се нуждае от място за нови епизоди</string>
+ <string name="pref_pauseOnDisconnect_sum">Пауза на възпроизвеждането, когато слушалките или Bluetooth прекъснат връзка</string>
+ <string name="pref_unpauseOnHeadsetReconnect_sum">Възстановане на възпроизвеждането, когато слушалките се свържат отново</string>
+ <string name="pref_unpauseOnBluetoothReconnect_sum">Възстановане на възпроизвеждането, когато Bluetooth се свърже отново</string>
+ <string name="pref_followQueue_sum">Преминаване към следващия епизод в опашката след завършване на възпроизвеждането</string>
+ <string name="pref_auto_delete_sum">Изтриване на епизода, когато възпроизвеждането завърши</string>
+ <string name="pref_auto_delete_title">Автоматично изтриване</string>
+ <string name="pref_smart_mark_as_played_sum">Маркиране на епизодите като слушани, дори когато остават определени секунди от времето за възпроизвеждане</string>
+ <string name="playback_pref">Възпроизвеждане</string>
+ <string name="network_pref">Мрежа</string>
+ <string name="pref_autoUpdateIntervallOrTime_title">Актуализиране през интервал или час на деня</string>
+ <string name="pref_autoUpdateIntervallOrTime_sum">Задайте интервал или конкретно време от деня, за да опресните автоматично емисиите</string>
+ <string name="pref_autoUpdateIntervallOrTime_message">Можете да зададете <i>интервал</i> като \"на всеки 2 часа\", да зададете конкретно <i>време от деня</i> като \"7:00 ч.\", или да изберете <i>деактивиране</i> на всички автоматични актуализации.\n\n<small>Моля, обърнете внимание: Времето за актуализиране е неточно. Може да срещнете кратко забавяне.</small></string>
+ <string name="pref_autoUpdateIntervallOrTime_Disable">Деактивиране</string>
+ <string name="pref_autoUpdateIntervallOrTime_Interval">Задай интервал</string>
+ <string name="pref_autoUpdateIntervallOrTime_TimeOfDay">Задай време от деня</string>
+ <string name="pref_autoUpdateIntervallOrTime_every">на всеки %1$s</string>
+ <string name="pref_autoUpdateIntervallOrTime_at">в %1$s</string>
+ <string name="pref_downloadMediaOnWifiOnly_sum">Изтегляне на медийни файлове само през WiFi</string>
+ <string name="pref_followQueue_title">Непрекъснато възпроизвеждане</string>
+ <string name="pref_downloadMediaOnWifiOnly_title">Изтегляне през WiFi</string>
+ <string name="pref_pauseOnHeadsetDisconnect_title">Прекъсване на слушалки</string>
+ <string name="pref_unpauseOnHeadsetReconnect_title">Повторно свързване на слушалки</string>
+ <string name="pref_unpauseOnBluetoothReconnect_title">Повторно свързване на Bluetooth</string>
+ <string name="pref_mobileUpdate_title">Мобилни актуализации</string>
+ <string name="pref_mobileUpdate_sum">Разрешаване на актуализации чрез мобилната връзка за данни</string>
+ <string name="flattr_settings_label">Flattr настройки</string>
+ <string name="pref_flattr_auth_title">Flattr вход</string>
+ <string name="user_interface_label">Потребителски интерфейс</string>
+ <string name="pref_set_theme_title">Избор на тема</string>
+ <string name="pref_nav_drawer_feed_order_title">Задайте ред на абонаментите</string>
+ <string name="pref_nav_drawer_feed_order_sum">Променете реда на абонаментите си</string>
+ <string name="pref_nav_drawer_feed_counter_title">Задайте брояча на абонаментите</string>
+ <string name="pref_nav_drawer_feed_counter_sum">Променете информацията, показвана от брояча на абонаментите</string>
+ <string name="pref_set_theme_sum">Променете външния вид на AntennaPod.</string>
+ <string name="pref_automatic_download_title">Автоматично изтегляне</string>
+ <string name="pref_automatic_download_sum">Конфигуриране на автоматично изтегляне на епизоди.</string>
+ <string name="pref_autodl_wifi_filter_title">Активиране на Wi-Fi филтър</string>
+ <string name="pref_autodl_wifi_filter_sum">Позволява автоматично изтегляне само за избрани Wi-Fi мрежи.</string>
+ <string name="pref_autodl_allow_on_mobile_title">Изтегляне чрез мобилна връзка</string>
+ <string name="pref_autodl_allow_on_mobile_sum">Позволява автоматично изтегляне чрез мобилната връзка за данни.</string>
+ <string name="pref_automatic_download_on_battery_title">Изтегляне, когато не се зарежда</string>
+ <string name="pref_automatic_download_on_battery_sum">Позволява автоматично изтегляне, когато батерията не се зарежда</string>
+ <string name="pref_parallel_downloads_title">Паралелни файлове за изтегляне</string>
+ <string name="pref_episode_cache_title">Кеш на епизодите</string>
+ <string name="pref_theme_title_light">Светла</string>
+ <string name="pref_theme_title_dark">Тъмна</string>
+ <string name="pref_episode_cache_unlimited">Неограничен</string>
+ <string name="pref_update_interval_hours_plural">часа</string>
+ <string name="pref_update_interval_hours_singular">час</string>
+ <string name="pref_update_interval_hours_manual">Ръчно</string>
+ <string name="pref_gpodnet_authenticate_title">Вход</string>
+ <string name="pref_gpodnet_authenticate_sum">Влезте с профила си в gpodder.net, за да синхронизирате абонаментите си.</string>
+ <string name="pref_gpodnet_logout_title">Изход</string>
+ <string name="pref_gpodnet_logout_toast">Успешен изход</string>
+ <string name="pref_image_cache_size_title">Кеш на изображенията</string>
+ <string name="pref_image_cache_size_sum">Размер на кеша за изображения.</string>
+ <string name="crash_report_title">Доклад за срив</string>
+ <string name="crash_report_sum">Изпратете най-новия доклад за срив чрез имейл</string>
+ <string name="send_email">Изпращане на имейл</string>
+ <string name="experimental_pref">Експериментални</string>
+ <string name="pref_proxy_title">Прокси</string>
+ <string name="pref_faq">Често задавани въпроси</string>
+ <string name="pref_known_issues">Известни проблеми</string>
+ <!--Auto-Flattr dialog-->
+ <!--Search-->
+ <string name="search_status_no_results">Няма намерени резултати</string>
+ <string name="search_label">Търсене</string>
+ <string name="no_results_for_query">Няма намерени резултати за \"%1$s\"</string>
+ <!--OPML import and export-->
+ <string name="opml_import_option">Опция %1$d</string>
+ <string name="opml_import_label">OPML импортиране</string>
+ <string name="opml_directory_error">ГРЕШКА!</string>
+ <string name="opml_import_error_no_file">Не е избран файл!</string>
+ <string name="select_all_label">Избери всички</string>
+ <string name="opml_export_label">OPML експортиране</string>
+ <string name="html_export_label">HTML експортиране</string>
+ <string name="exporting_label">Експортиране...</string>
+ <string name="export_error_label">Грешка при експортиране</string>
+ <string name="opml_export_success_title">Успешно OPML експортиране.</string>
+ <string name="opml_export_success_sum">.opml файлът беше записан в:\u0020</string>
+ <string name="opml_import_ask_read_permission">Необходим е достъп до външната памет за прочитане на OPML файла</string>
+ <!--Sleep timer-->
+ <string name="time_seconds">секунди</string>
+ <string name="time_minutes">минути</string>
+ <string name="time_hours">часа</string>
+ <plurals name="time_seconds_quantified">
+ <item quantity="one">1 секунда</item>
+ <item quantity="other">%d секунди</item>
+ </plurals>
+ <plurals name="time_minutes_quantified">
+ <item quantity="one">1 минута</item>
+ <item quantity="other">%d минути</item>
+ </plurals>
+ <plurals name="time_hours_quantified">
+ <item quantity="one">1 час</item>
+ <item quantity="other">%d часа</item>
+ </plurals>
+ <!--gpodder.net-->
+ <string name="gpodnet_taglist_header">КАТЕГОРИИ</string>
+ <string name="gpodnet_toplist_header">ТОП ПОДКАСТИ</string>
+ <string name="gpodnet_suggestions_header">ПРЕДЛОЖЕНИЯ</string>
+ <string name="gpodnetauth_login_title">Вход</string>
+ <string name="gpodnetauth_login_butLabel">Вход</string>
+ <string name="username_label">Потребителско име</string>
+ <string name="password_label">Парола</string>
+ <!--Directory chooser-->
+ <string name="choose_data_directory">Изберете папка с данни</string>
+ <string name="choose_data_directory_permission_rationale">Необходим е достъп до външната памет за промяна на папката с данни</string>
+ <!--Online feed view-->
+ <!--Content descriptions for image buttons-->
+ <!--Feed information screen-->
+ <!--Progress information-->
+ <!--AntennaPodSP-->
+ <string name="filter">Филтър</string>
+ <!--Episodes apply actions-->
+ <!--Sort-->
+ <!--Rating dialog-->
+ <!--Audio controls-->
+ <!--proxy settings-->
+ <!--Casting-->
+ <!--<string name="cast_failed_to_connect">Could not connect to the device</string>-->
+</resources>
diff --git a/core/src/main/res/values-pt/strings.xml b/core/src/main/res/values-pt/strings.xml
index 154b451b6..8be0b8443 100644
--- a/core/src/main/res/values-pt/strings.xml
+++ b/core/src/main/res/values-pt/strings.xml
@@ -9,7 +9,6 @@
<string name="favorite_episodes_label">Favoritos</string>
<string name="new_label">Novos</string>
<string name="settings_label">Definições</string>
- <string name="add_new_feed_label">Adicionar podcast</string>
<string name="downloads_label">Descargas</string>
<string name="downloads_running_label">Em curso</string>
<string name="downloads_completed_label">Terminada</string>
@@ -115,6 +114,7 @@
<string name="remove_feed_label">Remover podcast</string>
<string name="share_label">Partilhar...</string>
<string name="share_link_label">Partilhar ligação</string>
+ <string name="share_file_label">Partilhar ficheiro</string>
<string name="share_link_with_position_label">Partilhar ligação com posição</string>
<string name="share_feed_url_label">Partilhar URL da fonte</string>
<string name="share_item_url_label">Partilhar URL do episódio</string>
@@ -143,6 +143,7 @@
<string name="stream_label">Emitir</string>
<string name="remove_label">Remover</string>
<string name="delete_label">Apagar</string>
+ <string name="delete_failed">Episódio não apagado. Experimente reiniciar o dispositivo.</string>
<string name="remove_episode_lable">Remover episódio</string>
<string name="marked_as_seen_label">Marcar como visto</string>
<string name="mark_read_label">Marcar como reproduzido</string>
@@ -266,7 +267,7 @@
<!--Variable Speed-->
<string name="download_plugin_label">Descarregar extra</string>
<string name="no_playback_plugin_title">Extra não instalado</string>
- <string name="no_playback_plugin_or_sonic_msg">Para que a velocidade variável de reprodução funcione, recomendamos que ative o Sonic Media Player incorporado [Android 4.1+].\n\nEm alternativa, pode transferir o extra <i>Prestissimo</i>, disponível na Google Play.\nQuaisquer problemas que ocorram com o Prestissimo não são da responsabilidade dos programadores do AntennaPod e devem ser reportados ao dono do extra.</string>
+ <string name="no_playback_plugin_or_sonic_msg">Para que a velocidade variável de reprodução funcione, recomendamos que ative o Sonic Media Player incorporado [Android 4.1+].\n\nEm alternativa, pode descarregar o extra <i>Prestissimo</i>, disponível na Google Play.\nQuaisquer problemas que ocorram com o Prestissimo não são da responsabilidade dos programadores do AntennaPod e devem ser reportados ao dono do extra.</string>
<string name="set_playback_speed_label">Velocidades de reprodução</string>
<string name="enable_sonic">Ativar Sonic</string>
<!--Empty list labels-->
@@ -298,6 +299,8 @@
<string name="pref_smart_mark_as_played_title">Marcar como reproduzido (inteligente)</string>
<string name="pref_skip_keeps_episodes_sum">Manter episódios mesmo que tenham sido ignorados</string>
<string name="pref_skip_keeps_episodes_title">Manter episódios ignorados</string>
+ <string name="pref_favorite_keeps_episodes_sum">Manter episódios se forem assinalados como favoritos</string>
+ <string name="pref_favorite_keeps_episodes_title">Manter episódios favoritos</string>
<string name="playback_pref">Reprodução</string>
<string name="network_pref">Rede</string>
<string name="pref_autoUpdateIntervallOrTime_title">Intervalo de atualização ou hora do dia</string>
@@ -341,6 +344,8 @@
<string name="pref_automatic_download_sum">Configurar a descarga automática dos episódios</string>
<string name="pref_autodl_wifi_filter_title">Ativar filtro Wi-Fi</string>
<string name="pref_autodl_wifi_filter_sum">Apenas permitir descargas automáticas através de redes sem fios</string>
+ <string name="pref_autodl_allow_on_mobile_title">Descarregar através de dados móveis</string>
+ <string name="pref_autodl_allow_on_mobile_sum">Permitir descargas automáticas através de ligações de dados móveis.</string>
<string name="pref_automatic_download_on_battery_title">Descarregar se não estiver a carregar</string>
<string name="pref_automatic_download_on_battery_sum">Permitir descarga automática se a bateria não estiver a ser carregada</string>
<string name="pref_parallel_downloads_title">Descargas simultâneas</string>
@@ -408,7 +413,7 @@
<string name="pref_cast_title">Suporte Chromecast</string>
<string name="pref_cast_message_play_flavor">Ativar suporte a reprodução multimédia em dispositivos Cast (tais como Chromecast, Android TV...)</string>
<string name="pref_cast_message_free_flavor">O Chromecast necessita de bibliotecas proprietárias de terceiros que estão desativadas nesta versão do AntennaPod</string>
- <string name="pref_enqueue_downloaded_title">Colocar descarregados na fila</string>
+ <string name="pref_enqueue_downloaded_title">Colocar descargas na fila</string>
<string name="pref_enqueue_downloaded_summary">Adicionar à fila os episódios descarregados</string>
<!--Auto-Flattr dialog-->
<string name="auto_flattr_enable">Ativar flattr automático</string>
diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml
index a940c031b..2ee295997 100644
--- a/core/src/main/res/values/strings.xml
+++ b/core/src/main/res/values/strings.xml
@@ -661,6 +661,15 @@
<string name="proxy_host_invalid_error">Host is not a valid IP address or domain</string>
<string name="proxy_port_invalid_error">Port not valid</string>
+ <!-- Database import/export -->
+ <string name="import_export">Database import/export</string>
+ <string name="import_export_warning">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.</string>
+ <string name="label_import">Import</string>
+ <string name="label_export">Export</string>
+ <string name="import_select_file">Select file to import</string>
+ <string name="export_ok">Export successful. The database was written to the SD card.</string>
+ <string name="import_ok">Import successful.\n\nPlease press OK to restart AntennaPod</string>
+
<!-- Casting -->
<string name="cast_media_route_menu_title">Play on&#8230;</string>
<string name="cast_disconnect_label">Disconnect the cast session</string>
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index 736fb7d3f..99340b4ad 100644
--- a/gradle/wrapper/gradle-wrapper.jar
+++ b/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 52dd1f044..2c2bbe5f9 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-4.2-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.4.1-bin.zip