summaryrefslogtreecommitdiff
path: root/app/src/main/java/de/danoeh/antennapod
diff options
context:
space:
mode:
authorByteHamster <ByteHamster@users.noreply.github.com>2023-10-29 16:10:38 +0100
committerGitHub <noreply@github.com>2023-10-29 16:10:38 +0100
commit4931734d94a30d4b9b83c13a7869fc84bbf22a11 (patch)
tree2c5ca755f771abda555b3ca12523ffda96639354 /app/src/main/java/de/danoeh/antennapod
parent8a011badd3253dde83769ec9dc3be3129528e4b7 (diff)
downloadAntennaPod-4931734d94a30d4b9b83c13a7869fc84bbf22a11.zip
Allow hiding notification permission nag (#6730)
- Support showing most error messages as a snackbar - Ask for notification permission when enabling episode notifications - Clarify what we use notifications for
Diffstat (limited to 'app/src/main/java/de/danoeh/antennapod')
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/PreferenceActivity.java28
-rw-r--r--app/src/main/java/de/danoeh/antennapod/activity/VideoplayerActivity.java15
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/FeedSettingsFragment.java32
-rw-r--r--app/src/main/java/de/danoeh/antennapod/ui/home/HomeFragment.java6
-rw-r--r--app/src/main/java/de/danoeh/antennapod/ui/home/sections/AllowNotificationsSection.java14
5 files changed, 93 insertions, 2 deletions
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/PreferenceActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/PreferenceActivity.java
index b101c20c0..6202f62da 100644
--- a/app/src/main/java/de/danoeh/antennapod/activity/PreferenceActivity.java
+++ b/app/src/main/java/de/danoeh/antennapod/activity/PreferenceActivity.java
@@ -4,6 +4,7 @@ import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
+import android.util.Log;
import android.view.MenuItem;
import android.view.View;
@@ -17,9 +18,11 @@ import androidx.preference.PreferenceFragmentCompat;
import com.bytehamster.lib.preferencesearch.SearchPreferenceResult;
import com.bytehamster.lib.preferencesearch.SearchPreferenceResultListener;
+import com.google.android.material.snackbar.Snackbar;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.core.preferences.ThemeSwitcher;
import de.danoeh.antennapod.databinding.SettingsActivityBinding;
+import de.danoeh.antennapod.event.MessageEvent;
import de.danoeh.antennapod.fragment.preferences.AutoDownloadPreferencesFragment;
import de.danoeh.antennapod.fragment.preferences.ImportExportPreferencesFragment;
import de.danoeh.antennapod.fragment.preferences.MainPreferencesFragment;
@@ -29,6 +32,9 @@ import de.danoeh.antennapod.fragment.preferences.PlaybackPreferencesFragment;
import de.danoeh.antennapod.fragment.preferences.synchronization.SynchronizationPreferencesFragment;
import de.danoeh.antennapod.fragment.preferences.SwipePreferencesFragment;
import de.danoeh.antennapod.fragment.preferences.UserInterfacePreferencesFragment;
+import org.greenrobot.eventbus.EventBus;
+import org.greenrobot.eventbus.Subscribe;
+import org.greenrobot.eventbus.ThreadMode;
/**
* PreferenceActivity for API 11+. In order to change the behavior of the preference UI, see
@@ -162,4 +168,26 @@ public class PreferenceActivity extends AppCompatActivity implements SearchPrefe
result.highlight(fragment);
}
}
+
+ @Override
+ protected void onStart() {
+ super.onStart();
+ EventBus.getDefault().register(this);
+ }
+
+ @Override
+ protected void onStop() {
+ super.onStop();
+ EventBus.getDefault().unregister(this);
+ }
+
+ @Subscribe(threadMode = ThreadMode.MAIN)
+ public void onEventMainThread(MessageEvent event) {
+ Log.d(FRAGMENT_TAG, "onEvent(" + event + ")");
+ Snackbar s = Snackbar.make(binding.getRoot(), event.message, Snackbar.LENGTH_LONG);
+ if (event.action != null) {
+ s.setAction(event.actionText, v -> event.action.accept(this));
+ }
+ s.show();
+ }
}
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/VideoplayerActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/VideoplayerActivity.java
index fe5eb369c..e3473937e 100644
--- a/app/src/main/java/de/danoeh/antennapod/activity/VideoplayerActivity.java
+++ b/app/src/main/java/de/danoeh/antennapod/activity/VideoplayerActivity.java
@@ -32,9 +32,11 @@ import android.widget.SeekBar;
import androidx.annotation.Nullable;
import androidx.interpolator.view.animation.FastOutSlowInInterpolator;
import com.bumptech.glide.Glide;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.dialog.MediaPlayerErrorDialog;
import de.danoeh.antennapod.dialog.VariableSpeedDialog;
+import de.danoeh.antennapod.event.MessageEvent;
import de.danoeh.antennapod.event.playback.BufferUpdateEvent;
import de.danoeh.antennapod.event.playback.PlaybackPositionEvent;
import de.danoeh.antennapod.event.PlayerErrorEvent;
@@ -85,7 +87,7 @@ public class VideoplayerActivity extends CastEnabledActivity implements SeekBar.
private boolean videoSurfaceCreated = false;
private boolean destroyingDueToReload = false;
private long lastScreenTap = 0;
- private Handler videoControlsHider = new Handler(Looper.getMainLooper());
+ private final Handler videoControlsHider = new Handler(Looper.getMainLooper());
private VideoplayerActivityBinding viewBinding;
private PlaybackController controller;
private boolean showTimeLeft = false;
@@ -516,6 +518,17 @@ public class VideoplayerActivity extends CastEnabledActivity implements SeekBar.
MediaPlayerErrorDialog.show(this, event);
}
+ @Subscribe(threadMode = ThreadMode.MAIN)
+ public void onEventMainThread(MessageEvent event) {
+ Log.d(TAG, "onEvent(" + event + ")");
+ final MaterialAlertDialogBuilder errorDialog = new MaterialAlertDialogBuilder(this);
+ errorDialog.setMessage(event.message);
+ if (event.action != null) {
+ errorDialog.setPositiveButton(event.actionText, (dialog, which) -> event.action.accept(this));
+ }
+ errorDialog.show();
+ }
+
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/FeedSettingsFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/FeedSettingsFragment.java
index 1df1e02a2..7e9c3d093 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/FeedSettingsFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/FeedSettingsFragment.java
@@ -1,12 +1,22 @@
package de.danoeh.antennapod.fragment;
+import android.Manifest;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.net.Uri;
+import android.os.Build;
import android.os.Bundle;
+import android.provider.Settings;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.Toast;
+import androidx.activity.result.ActivityResultLauncher;
+import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.core.content.ContextCompat;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.appbar.MaterialToolbar;
import androidx.fragment.app.Fragment;
@@ -122,6 +132,23 @@ public class FeedSettingsFragment extends Fragment {
return fragment;
}
+ boolean notificationPermissionDenied = false;
+ private final ActivityResultLauncher<String> requestPermissionLauncher =
+ registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> {
+ if (isGranted) {
+ return;
+ }
+ if (notificationPermissionDenied) {
+ Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
+ Uri uri = Uri.fromParts("package", getContext().getPackageName(), null);
+ intent.setData(uri);
+ startActivity(intent);
+ return;
+ }
+ Toast.makeText(getContext(), R.string.notification_permission_denied, Toast.LENGTH_LONG).show();
+ notificationPermissionDenied = true;
+ });
+
@Override
public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent, Bundle state) {
final RecyclerView view = super.onCreateRecyclerView(inflater, parent, state);
@@ -466,6 +493,11 @@ public class FeedSettingsFragment extends Fragment {
pref.setChecked(feedPreferences.getShowEpisodeNotification());
pref.setOnPreferenceChangeListener((preference, newValue) -> {
+ if (Build.VERSION.SDK_INT >= 33 && ContextCompat.checkSelfPermission(getContext(),
+ Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) {
+ requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS);
+ return false;
+ }
boolean checked = newValue == Boolean.TRUE;
feedPreferences.setShowEpisodeNotification(checked);
DBWriter.setFeedPreferences(feedPreferences);
diff --git a/app/src/main/java/de/danoeh/antennapod/ui/home/HomeFragment.java b/app/src/main/java/de/danoeh/antennapod/ui/home/HomeFragment.java
index 1a700a296..21b36bc49 100644
--- a/app/src/main/java/de/danoeh/antennapod/ui/home/HomeFragment.java
+++ b/app/src/main/java/de/danoeh/antennapod/ui/home/HomeFragment.java
@@ -59,6 +59,7 @@ public class HomeFragment extends Fragment implements Toolbar.OnMenuItemClickLis
public static final String TAG = "HomeFragment";
public static final String PREF_NAME = "PrefHomeFragment";
public static final String PREF_HIDDEN_SECTIONS = "PrefHomeSectionsString";
+ public static final String PREF_DISABLE_NOTIFICATION_PERMISSION_NAG = "DisableNotificationPermissionNag";
private static final String KEY_UP_ARROW = "up_arrow";
private boolean displayUpArrow;
@@ -95,7 +96,10 @@ public class HomeFragment extends Fragment implements Toolbar.OnMenuItemClickLis
if (Build.VERSION.SDK_INT >= 33 && ContextCompat.checkSelfPermission(getContext(),
Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) {
- addSection(new AllowNotificationsSection());
+ SharedPreferences prefs = getContext().getSharedPreferences(HomeFragment.PREF_NAME, Context.MODE_PRIVATE);
+ if (!prefs.getBoolean(HomeFragment.PREF_DISABLE_NOTIFICATION_PERMISSION_NAG, false)) {
+ addSection(new AllowNotificationsSection());
+ }
}
List<String> hiddenSections = getHiddenSections(getContext());
diff --git a/app/src/main/java/de/danoeh/antennapod/ui/home/sections/AllowNotificationsSection.java b/app/src/main/java/de/danoeh/antennapod/ui/home/sections/AllowNotificationsSection.java
index b023a19bf..0a0d30485 100644
--- a/app/src/main/java/de/danoeh/antennapod/ui/home/sections/AllowNotificationsSection.java
+++ b/app/src/main/java/de/danoeh/antennapod/ui/home/sections/AllowNotificationsSection.java
@@ -1,6 +1,7 @@
package de.danoeh.antennapod.ui.home.sections;
import android.Manifest;
+import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
@@ -15,6 +16,7 @@ import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
+import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import de.danoeh.antennapod.R;
import de.danoeh.antennapod.activity.MainActivity;
import de.danoeh.antennapod.databinding.HomeSectionNotificationBinding;
@@ -29,6 +31,7 @@ public class AllowNotificationsSection extends Fragment {
((MainActivity) getActivity()).loadFragment(HomeFragment.TAG, null);
} else {
viewBinding.openSettingsButton.setVisibility(View.VISIBLE);
+ viewBinding.allowButton.setVisibility(View.GONE);
Toast.makeText(getContext(), R.string.notification_permission_denied, Toast.LENGTH_LONG).show();
}
});
@@ -49,6 +52,17 @@ public class AllowNotificationsSection extends Fragment {
intent.setData(uri);
startActivity(intent);
});
+ viewBinding.denyButton.setOnClickListener(v -> {
+ MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(getContext());
+ builder.setMessage(R.string.notification_permission_deny_warning);
+ builder.setPositiveButton(R.string.deny_label, (dialog, which) -> {
+ getContext().getSharedPreferences(HomeFragment.PREF_NAME, Context.MODE_PRIVATE)
+ .edit().putBoolean(HomeFragment.PREF_DISABLE_NOTIFICATION_PERMISSION_NAG, true).apply();
+ ((MainActivity) getActivity()).loadFragment(HomeFragment.TAG, null);
+ });
+ builder.setNegativeButton(R.string.cancel_label, null);
+ builder.show();
+ });
return viewBinding.getRoot();
}
}