diff options
Diffstat (limited to 'app/src/main/java/de/danoeh/antennapod/activity/OpmlImportActivity.java')
-rw-r--r-- | app/src/main/java/de/danoeh/antennapod/activity/OpmlImportActivity.java | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/OpmlImportActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/OpmlImportActivity.java new file mode 100644 index 000000000..03e6b89db --- /dev/null +++ b/app/src/main/java/de/danoeh/antennapod/activity/OpmlImportActivity.java @@ -0,0 +1,159 @@ +package de.danoeh.antennapod.activity; + +import android.content.Intent; +import android.content.pm.PackageManager; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.os.Environment; +import android.util.Log; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.app.ActivityCompat; +import de.danoeh.antennapod.R; +import de.danoeh.antennapod.asynctask.OpmlFeedQueuer; +import de.danoeh.antennapod.asynctask.OpmlImportWorker; +import de.danoeh.antennapod.core.export.opml.OpmlElement; +import de.danoeh.antennapod.core.preferences.UserPreferences; +import de.danoeh.antennapod.core.util.LangUtils; +import org.apache.commons.lang3.ArrayUtils; + +import java.io.InputStreamReader; +import java.io.Reader; +import java.util.ArrayList; + +/** + * Activity for Opml Import. + * */ +public class OpmlImportActivity extends AppCompatActivity { + private static final String TAG = "OpmlImportBaseActivity"; + private static final int PERMISSION_REQUEST_READ_EXTERNAL_STORAGE = 5; + @Nullable private Uri uri; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + setTheme(UserPreferences.getTheme()); + super.onCreate(savedInstanceState); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + + + Uri uri = getIntent().getData(); + if (uri != null && uri.toString().startsWith("/")) { + uri = Uri.parse("file://" + uri.toString()); + } else { + String extraText = getIntent().getStringExtra(Intent.EXTRA_TEXT); + if (extraText != null) { + uri = Uri.parse(extraText); + } + } + importUri(uri); + } + + /** + * Handles the choices made by the user in the OpmlFeedChooserActivity and + * starts the OpmlFeedQueuer if necessary. + */ + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + Log.d(TAG, "Received result"); + if (resultCode == RESULT_CANCELED) { + Log.d(TAG, "Activity was cancelled"); + finish(); + } else { + int[] selected = data.getIntArrayExtra(OpmlFeedChooserActivity.EXTRA_SELECTED_ITEMS); + if (selected != null && selected.length > 0) { + OpmlFeedQueuer queuer = new OpmlFeedQueuer(this, selected) { + + @Override + protected void onPostExecute(Void result) { + super.onPostExecute(result); + Intent intent = new Intent(OpmlImportActivity.this, MainActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP + | Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + } + + }; + queuer.executeAsync(); + } else { + Log.d(TAG, "No items were selected"); + } + } + } + + void importUri(@Nullable Uri uri) { + if (uri == null) { + new AlertDialog.Builder(this) + .setMessage(R.string.opml_import_error_no_file) + .setPositiveButton(android.R.string.ok, null) + .show(); + return; + } + this.uri = uri; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M + && uri.toString().contains(Environment.getExternalStorageDirectory().toString())) { + int permission = ActivityCompat.checkSelfPermission(this, + android.Manifest.permission.READ_EXTERNAL_STORAGE); + if (permission != PackageManager.PERMISSION_GRANTED) { + requestPermission(); + return; + } + } + startImport(); + } + + private void requestPermission() { + String[] permissions = { android.Manifest.permission.READ_EXTERNAL_STORAGE }; + ActivityCompat.requestPermissions(this, permissions, PERMISSION_REQUEST_READ_EXTERNAL_STORAGE); + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, + @NonNull int[] grantResults) { + if (requestCode != PERMISSION_REQUEST_READ_EXTERNAL_STORAGE) { + return; + } + if (grantResults.length > 0 && ArrayUtils.contains(grantResults, PackageManager.PERMISSION_GRANTED)) { + startImport(); + } else { + new AlertDialog.Builder(this) + .setMessage(R.string.opml_import_ask_read_permission) + .setPositiveButton(android.R.string.ok, (dialog, which) -> requestPermission()) + .setNegativeButton(R.string.cancel_label, (dialog, which) -> finish()) + .show(); + } + } + + /** Starts the import process. */ + private void startImport() { + try { + Reader reader = new InputStreamReader(getContentResolver().openInputStream(uri), LangUtils.UTF_8); + OpmlImportWorker importWorker = new OpmlImportWorker(this, reader) { + + @Override + protected void onPostExecute(ArrayList<OpmlElement> result) { + super.onPostExecute(result); + if (result != null) { + Log.d(TAG, "Parsing was successful"); + OpmlImportHolder.setReadElements(result); + startActivityForResult(new Intent( + OpmlImportActivity.this, + OpmlFeedChooserActivity.class), 0); + } else { + Log.d(TAG, "Parser error occurred"); + } + } + }; + importWorker.executeAsync(); + } catch (Exception e) { + Log.d(TAG, Log.getStackTraceString(e)); + String message = getString(R.string.opml_reader_error); + new AlertDialog.Builder(this) + .setMessage(message + " " + e.getMessage()) + .setPositiveButton(android.R.string.ok, null) + .show(); + } + } +} |