diff --git a/app/src/main/java/com/readrops/app/fragments/settings/AccountSettingsFragment.java b/app/src/main/java/com/readrops/app/fragments/settings/AccountSettingsFragment.java index 33c8cd1e..cffaac30 100644 --- a/app/src/main/java/com/readrops/app/fragments/settings/AccountSettingsFragment.java +++ b/app/src/main/java/com/readrops/app/fragments/settings/AccountSettingsFragment.java @@ -2,6 +2,8 @@ package com.readrops.app.fragments.settings; import android.Manifest; +import android.app.Notification; +import android.app.PendingIntent; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; @@ -9,10 +11,11 @@ import android.os.Bundle; import android.os.Environment; import android.provider.Settings; import android.util.Log; -import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.core.app.NotificationCompat; +import androidx.core.app.NotificationManagerCompat; import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProviders; @@ -26,6 +29,7 @@ import com.readrops.app.activities.ManageFeedsFoldersActivity; import com.readrops.app.database.entities.account.Account; import com.readrops.app.database.entities.account.AccountType; import com.readrops.app.utils.OPMLMatcher; +import com.readrops.app.utils.ReadropsApp; import com.readrops.app.utils.Utils; import com.readrops.app.viewmodels.AccountViewModel; import com.readrops.readropslibrary.opml.OPMLParser; @@ -153,13 +157,13 @@ public class AccountSettingsFragment extends PreferenceFragmentCompat { @Override public void onError(Throwable e) { - Toast.makeText(getContext(), e.getMessage(), Toast.LENGTH_LONG).show(); + Utils.showSnackbar(getView(), e.getMessage()); } }))) .show(); } - // region opml parsing + // region opml import private void openOPMLFile() { Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); @@ -207,6 +211,14 @@ public class AccountSettingsFragment extends PreferenceFragmentCompat { }); } + private void displayErrorMessage() { + new MaterialDialog.Builder(getActivity()) + .title(R.string.processing_file_failed) + .neutralText(R.string.cancel) + .iconRes(R.drawable.ic_error) + .show(); + } + //endregion //region opml export @@ -232,28 +244,44 @@ public class AccountSettingsFragment extends PreferenceFragmentCompat { } catch (IOException e) { Log.e(TAG, e.getMessage()); - displayErrorMessage(); + Utils.showSnackbar(getView(), e.getMessage()); } }) .subscribe(new DisposableCompletableObserver() { @Override public void onComplete() { - Log.d(TAG, "onComplete: "); + displayNotification(file); } @Override public void onError(Throwable e) { - + Utils.showSnackbar(getView(), e.getMessage()); } }); } catch (Exception e) { Log.e(TAG, e.getMessage()); - - displayErrorMessage(); + Utils.showSnackbar(getView(), e.getMessage()); } } + private void displayNotification(File file) { + Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setData(Uri.parse(file.getAbsolutePath())); + + Notification notification = new NotificationCompat.Builder(getContext(), ReadropsApp.OPML_EXPORT_CHANNEL_ID) + .setContentTitle(getString(R.string.opml_export)) + .setContentText(file.getName()) + .setSmallIcon(R.drawable.ic_readrops) + .setContentIntent(PendingIntent.getActivity(getContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)) + .setDeleteIntent(PendingIntent.getActivity(getContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)) + .setAutoCancel(true) + .build(); + + NotificationManagerCompat manager = NotificationManagerCompat.from(getContext()); + manager.notify(2, notification); + } + private boolean isExternalStoragePermissionGranted() { return ContextCompat.checkSelfPermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED; } @@ -288,12 +316,4 @@ public class AccountSettingsFragment extends PreferenceFragmentCompat { } //endregion - - private void displayErrorMessage() { - new MaterialDialog.Builder(getActivity()) - .title(R.string.processing_file_failed) - .neutralText(R.string.cancel) - .iconRes(R.drawable.ic_error) - .show(); - } } diff --git a/app/src/main/java/com/readrops/app/utils/ReadropsApp.java b/app/src/main/java/com/readrops/app/utils/ReadropsApp.java index 689d41d1..a92a8282 100644 --- a/app/src/main/java/com/readrops/app/utils/ReadropsApp.java +++ b/app/src/main/java/com/readrops/app/utils/ReadropsApp.java @@ -14,28 +14,35 @@ import io.reactivex.plugins.RxJavaPlugins; public class ReadropsApp extends Application { public static final String FEEDS_COLORS_CHANNEL_ID = "feedsColorsChannel"; + public static final String OPML_EXPORT_CHANNEL_ID = "opmlExportChannel"; @Override public void onCreate() { super.onCreate(); - RxJavaPlugins.setErrorHandler(e -> { }); + RxJavaPlugins.setErrorHandler(e -> { + }); if (BuildConfig.DEBUG) { Stetho.initializeWithDefaults(this); } - createNotificationChannel(); + createNotificationChannels(); } - private void createNotificationChannel() { + private void createNotificationChannels() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { NotificationChannel feedsColorsChannel = new NotificationChannel(FEEDS_COLORS_CHANNEL_ID, getString(R.string.feeds_colors), NotificationManager.IMPORTANCE_DEFAULT); feedsColorsChannel.setDescription(getString(R.string.get_feeds_colors)); + NotificationChannel opmlExportChannel = new NotificationChannel(OPML_EXPORT_CHANNEL_ID, + getString(R.string.opml_export), NotificationManager.IMPORTANCE_DEFAULT); + NotificationManager manager = getSystemService(NotificationManager.class); + manager.createNotificationChannel(feedsColorsChannel); + manager.createNotificationChannel(opmlExportChannel); } } } diff --git a/app/src/main/res/values-fr-rFR/strings.xml b/app/src/main/res/values-fr-rFR/strings.xml index 073a3e82..cdceeab1 100644 --- a/app/src/main/res/values-fr-rFR/strings.xml +++ b/app/src/main/res/values-fr-rFR/strings.xml @@ -97,8 +97,8 @@ Traitement du fichier OPML Cette opération peut prendre un certain temps car il faut interroger chaque flux. Une erreur s\'est produite lors du traitement du fichier - Importer un fichier OPML - Exporter les flux et les dossiers dans un fichier OPML + Import OPML + Export OPML L\'export des soubscriptions nécessite l\'accès au stockage Réessayer Permissions diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 05341015..8f06743e 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -6,8 +6,8 @@ - @string/import_opml - @string/export_feeds_folders_opml + @string/opml_import + @string/opml_export diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 071d49f5..0c696f25 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -105,8 +105,8 @@ Processing OPML file This operation can take a significant time as each feed needs to be queried. An error occurred during the file processing - Import OPML file - Export feeds and folders to an OPML file + OPML import + OPML export Subscriptions Subscriptions export needs external storage permission Try again