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 | 164 |
1 files changed, 127 insertions, 37 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 index d4e9ee5d9..d236a7755 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/OpmlImportActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/OpmlImportActivity.java @@ -7,17 +7,31 @@ import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.util.Log; +import android.util.SparseBooleanArray; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.widget.ArrayAdapter; +import android.widget.ListView; +import android.widget.Toast; 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.storage.DownloadRequestException; +import de.danoeh.antennapod.core.storage.DownloadRequester; +import de.danoeh.antennapod.databinding.OpmlSelectionBinding; +import de.danoeh.antennapod.model.feed.Feed; +import io.reactivex.Completable; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; import org.apache.commons.io.ByteOrderMark; import org.apache.commons.io.input.BOMInputStream; import org.apache.commons.lang3.ArrayUtils; @@ -26,6 +40,7 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.util.ArrayList; +import java.util.List; /** * Activity for Opml Import. @@ -34,13 +49,72 @@ 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; + OpmlSelectionBinding viewBinding; + private ArrayAdapter<String> listAdapter; + private MenuItem selectAll; + private MenuItem deselectAll; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { setTheme(UserPreferences.getTheme()); super.onCreate(savedInstanceState); getSupportActionBar().setDisplayHomeAsUpEnabled(true); + viewBinding = OpmlSelectionBinding.inflate(getLayoutInflater()); + setContentView(viewBinding.getRoot()); + viewBinding.feedlist.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); + viewBinding.feedlist.setOnItemClickListener((parent, view, position, id) -> { + SparseBooleanArray checked = viewBinding.feedlist.getCheckedItemPositions(); + int checkedCount = 0; + for (int i = 0; i < checked.size(); i++) { + if (checked.valueAt(i)) { + checkedCount++; + } + } + if(checkedCount == listAdapter.getCount()) { + selectAll.setVisible(false); + deselectAll.setVisible(true); + } else { + deselectAll.setVisible(false); + selectAll.setVisible(true); + } + }); + viewBinding.butCancel.setOnClickListener(v -> { + setResult(RESULT_CANCELED); + finish(); + }); + viewBinding.butConfirm.setOnClickListener(v -> { + viewBinding.progressBar.setVisibility(View.VISIBLE); + Completable.fromAction(() -> { + DownloadRequester requester = DownloadRequester.getInstance(); + SparseBooleanArray checked = viewBinding.feedlist.getCheckedItemPositions(); + for (int i = 0; i < checked.size(); i++) { + if (!checked.valueAt(i)) { + continue; + } + OpmlElement element = OpmlImportHolder.getReadElements().get(checked.keyAt(i)); + Feed feed = new Feed(element.getXmlUrl(), null, element.getText()); + try { + requester.downloadFeed(getApplicationContext(), feed); + } catch (DownloadRequestException e) { + e.printStackTrace(); + } + } + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + () -> { + viewBinding.progressBar.setVisibility(View.GONE); + Intent intent = new Intent(OpmlImportActivity.this, MainActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + finish(); + }, e -> { + viewBinding.progressBar.setVisibility(View.GONE); + Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show(); + }); + }); Uri uri = getIntent().getData(); if (uri != null && uri.toString().startsWith("/")) { @@ -54,39 +128,6 @@ public class OpmlImportActivity extends AppCompatActivity { 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) { - super.onActivityResult(requestCode, resultCode, 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) @@ -108,6 +149,52 @@ public class OpmlImportActivity extends AppCompatActivity { startImport(); } + private List<String> getTitleList() { + List<String> result = new ArrayList<>(); + if (OpmlImportHolder.getReadElements() != null) { + for (OpmlElement element : OpmlImportHolder.getReadElements()) { + result.add(element.getText()); + } + } + return result; + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + super.onCreateOptionsMenu(menu); + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.opml_selection_options, menu); + selectAll = menu.findItem(R.id.select_all_item); + deselectAll = menu.findItem(R.id.deselect_all_item); + deselectAll.setVisible(false); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + final int itemId = item.getItemId(); + if (itemId == R.id.select_all_item) { + selectAll.setVisible(false); + selectAllItems(true); + deselectAll.setVisible(true); + return true; + } else if (itemId == R.id.deselect_all_item) { + deselectAll.setVisible(false); + selectAllItems(false); + selectAll.setVisible(true); + return true; + } else if (itemId == android.R.id.home) { + finish(); + } + return false; + } + + private void selectAllItems(boolean b) { + for (int i = 0; i < viewBinding.feedlist.getCount(); i++) { + viewBinding.feedlist.setItemChecked(i, b); + } + } + private void requestPermission() { String[] permissions = { android.Manifest.permission.READ_EXTERNAL_STORAGE }; ActivityCompat.requestPermissions(this, permissions, PERMISSION_REQUEST_READ_EXTERNAL_STORAGE); @@ -132,6 +219,7 @@ public class OpmlImportActivity extends AppCompatActivity { /** Starts the import process. */ private void startImport() { + viewBinding.progressBar.setVisibility(View.VISIBLE); try { InputStream opmlFileStream = getContentResolver().openInputStream(uri); BOMInputStream bomInputStream = new BOMInputStream(opmlFileStream); @@ -147,12 +235,14 @@ public class OpmlImportActivity extends AppCompatActivity { if (result != null) { Log.d(TAG, "Parsing was successful"); OpmlImportHolder.setReadElements(result); - startActivityForResult(new Intent( - OpmlImportActivity.this, - OpmlFeedChooserActivity.class), 0); + listAdapter = new ArrayAdapter<>(OpmlImportActivity.this, + android.R.layout.simple_list_item_multiple_choice, + getTitleList()); + viewBinding.feedlist.setAdapter(listAdapter); } else { Log.d(TAG, "Parser error occurred"); } + viewBinding.progressBar.setVisibility(View.GONE); } }; importWorker.executeAsync(); |