Skip to content

Commit

Permalink
Merge branch 'develop' into refactor
Browse files Browse the repository at this point in the history
# Conflicts:
#	app/src/main/java/de/danoeh/antennapod/activity/MediaplayerInfoActivity.java
#	core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java
  • Loading branch information
mfietz committed Jan 21, 2018
2 parents e4770e7 + f7c048e commit d3491d1
Show file tree
Hide file tree
Showing 22 changed files with 504 additions and 18 deletions.
1 change: 1 addition & 0 deletions .tx/config
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
7 changes: 7 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,13 @@
android:name="android.support.PARENT_ACTIVITY"
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"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -379,7 +379,7 @@ private void updateAutoDownloadSettings() {
}
}

private class ApplyToEpisodesDialog extends ConfirmationDialog {
private static class ApplyToEpisodesDialog extends ConfirmationDialog {

private final Feed feed;
private final boolean autoDownload;
Expand Down
Original file line number Diff line number Diff line change
@@ -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);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -72,12 +72,13 @@
*/
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";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
/** 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;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ public static Podcast fromToplist(JSONObject json) throws JSONException {
/**
* View holder object for the GridView
*/
class PodcastViewHolder {
static class PodcastViewHolder {

/**
* ImageView holding the Podcast image
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@

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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ public void onStart() {
viewPager.setCurrentItem(lastPosition);
}

public class DownloadsPagerAdapter extends FragmentPagerAdapter {
public static class DownloadsPagerAdapter extends FragmentPagerAdapter {

final Resources resources;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@

import com.afollestad.materialdialogs.MaterialDialog;

import de.danoeh.antennapod.activity.ImportExportActivity;
import org.apache.commons.lang3.ArrayUtils;

import java.io.File;
Expand Down Expand Up @@ -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";
Expand Down Expand Up @@ -173,6 +175,12 @@ public void onCreate() {
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(
Expand Down
28 changes: 28 additions & 0 deletions app/src/main/res/layout/import_export_activity.xml
Original file line number Diff line number Diff line change
@@ -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>
3 changes: 3 additions & 0 deletions app/src/main/res/xml/preferences.xml
Original file line number Diff line number Diff line change
Expand Up @@ -315,6 +315,9 @@
<Preference
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"/>
Expand Down
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ project.ext {
}

task wrapper(type: Wrapper) {
gradleVersion = "4.2"
gradleVersion = "4.4.1"
}

// free build hack: common functions
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -611,7 +611,7 @@ private class FeedSyncThread extends Thread {
private volatile boolean isActive = true;
private volatile boolean isCollectingRequests = false;

private final long WAIT_TIMEOUT = 3000;
private static final long WAIT_TIMEOUT = 3000;


/**
Expand Down Expand Up @@ -950,7 +950,7 @@ private void writeFileUrl(DownloadRequest request) {
* <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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -314,7 +314,7 @@ public static String encodeCredentials(String username, String password, String
}
}

private class BasicAuthorizationInterceptor implements Interceptor {
private static class BasicAuthorizationInterceptor implements Interceptor {

private final DownloadRequest downloadRequest;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
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.
Expand Down
Loading

0 comments on commit d3491d1

Please sign in to comment.