From be42cc0c7176c056a5b1b7c2b0d16ad6e9850312 Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Thu, 25 Jul 2019 00:38:00 +0200 Subject: Refactored mobile updates setting --- .../core/preferences/UserPreferences.java | 67 ++++++++++++++++++---- .../antennapod/core/util/FeedUpdateUtils.java | 2 +- .../danoeh/antennapod/core/util/NetworkUtils.java | 22 +++++-- .../core/util/download/AutoUpdateManager.java | 2 +- core/src/main/res/values/arrays.xml | 12 ++-- core/src/main/res/values/strings.xml | 12 ++-- 6 files changed, 91 insertions(+), 26 deletions(-) (limited to 'core/src') diff --git a/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java b/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java index 8f5f5ae1e..bcc4f533e 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java +++ b/core/src/main/java/de/danoeh/antennapod/core/preferences/UserPreferences.java @@ -17,7 +17,9 @@ import java.io.IOException; import java.net.Proxy; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.concurrent.TimeUnit; import de.danoeh.antennapod.core.R; @@ -78,14 +80,13 @@ public class UserPreferences { // Network private static final String PREF_ENQUEUE_DOWNLOADED = "prefEnqueueDownloaded"; public static final String PREF_UPDATE_INTERVAL = "prefAutoUpdateIntervall"; - public static final String PREF_MOBILE_UPDATE = "prefMobileUpdateAllowed"; + private static final String PREF_MOBILE_UPDATE = "prefMobileUpdateTypes"; public static final String PREF_EPISODE_CLEANUP = "prefEpisodeCleanup"; public static final String PREF_PARALLEL_DOWNLOADS = "prefParallelDownloads"; public static final String PREF_EPISODE_CACHE_SIZE = "prefEpisodeCacheSize"; public static final String PREF_ENABLE_AUTODL = "prefEnableAutoDl"; public static final String PREF_ENABLE_AUTODL_ON_BATTERY = "prefEnableAutoDownloadOnBattery"; public static final String PREF_ENABLE_AUTODL_WIFI_FILTER = "prefEnableAutoDownloadWifiFilter"; - public static final String PREF_ENABLE_AUTODL_ON_MOBILE = "prefEnableAutoDownloadOnMobile"; private static final String PREF_AUTODL_SELECTED_NETWORKS = "prefAutodownloadSelectedNetworks"; private static final String PREF_PROXY_TYPE = "prefProxyType"; private static final String PREF_PROXY_HOST = "prefProxyHost"; @@ -379,16 +380,63 @@ public class UserPreferences { return prefs.getString(PREF_UPDATE_INTERVAL, "").equals("0"); } - public static String getMobileUpdatesEnabled() { - return prefs.getString(PREF_MOBILE_UPDATE, "images"); + private static boolean isAllowMobileFor(String type) { + HashSet defaultValue = new HashSet<>(); + defaultValue.add("images"); + Set allowed = prefs.getStringSet(PREF_MOBILE_UPDATE, defaultValue); + return allowed.contains(type); } - public static boolean isAllowMobileUpdate() { - return getMobileUpdatesEnabled().equals("everything"); + public static boolean isAllowMobileFeedRefresh() { + return isAllowMobileFor("feed_refresh"); + } + + public static boolean isAllowMobileEpisodeDownload() { + return isAllowMobileFor("episode_download"); + } + + public static boolean isAllowMobileAutoDownload() { + return isAllowMobileFor("auto_download"); + } + + public static boolean isAllowMobileStreaming() { + return isAllowMobileFor("streaming"); } public static boolean isAllowMobileImages() { - return isAllowMobileUpdate() || getMobileUpdatesEnabled().equals("images"); + return isAllowMobileFor("images"); + } + + private static void setAllowMobileFor(String type, boolean allow) { + HashSet defaultValue = new HashSet<>(); + defaultValue.add("images"); + Set allowed = prefs.getStringSet(PREF_MOBILE_UPDATE, defaultValue); + if (allow) { + allowed.remove(type); + } else { + allowed.add(type); + } + prefs.edit().putStringSet(PREF_MOBILE_UPDATE, allowed).apply(); + } + + public static void setAllowMobileFeedRefresh(boolean allow) { + setAllowMobileFor("feed_refresh", allow); + } + + public static void setAllowMobileEpisodeDownload(boolean allow) { + setAllowMobileFor("episode_download", allow); + } + + public static void setAllowMobileAutoDownload(boolean allow) { + setAllowMobileFor("auto_download", allow); + } + + public static void setAllowMobileStreaming(boolean allow) { + setAllowMobileFor("streaming", allow); + } + + public static void setAllowMobileImages(boolean allow) { + setAllowMobileFor("images", allow); } public static int getParallelDownloads() { @@ -420,11 +468,6 @@ public class UserPreferences { return prefs.getBoolean(PREF_ENABLE_AUTODL_WIFI_FILTER, false); } - public static boolean isEnableAutodownloadOnMobile() { - return prefs.getBoolean(PREF_ENABLE_AUTODL_ON_MOBILE, false); - } - - public static int getImageCacheSize() { String cacheSizeString = prefs.getString(PREF_IMAGE_CACHE_SIZE, IMAGE_CACHE_DEFAULT_VALUE); int cacheSizeInt = Integer.parseInt(cacheSizeString); diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/FeedUpdateUtils.java b/core/src/main/java/de/danoeh/antennapod/core/util/FeedUpdateUtils.java index a0195975f..b425687ae 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/FeedUpdateUtils.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/FeedUpdateUtils.java @@ -24,7 +24,7 @@ public class FeedUpdateUtils { with().pollInterval(1, TimeUnit.SECONDS) .await() .atMost(10, TimeUnit.SECONDS) - .until(() -> NetworkUtils.networkAvailable() && NetworkUtils.isDownloadAllowed()); + .until(() -> NetworkUtils.networkAvailable() && NetworkUtils.isFeedRefreshAllowed()); DBTasks.refreshAllFeeds(context, null, callback); } catch (ConditionTimeoutException ignore) { Log.d(TAG, "Blocking automatic update: no wifi available / no mobile updates allowed"); diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/NetworkUtils.java b/core/src/main/java/de/danoeh/antennapod/core/util/NetworkUtils.java index d9431bc5d..ca48c9bc9 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/NetworkUtils.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/NetworkUtils.java @@ -74,7 +74,7 @@ public class NetworkUtils { return true; } } else { - if (!UserPreferences.isEnableAutodownloadOnMobile()) { + if (!UserPreferences.isAllowMobileAutoDownload()) { Log.d(TAG, "Auto Download not enabled on Mobile"); return false; } @@ -95,14 +95,28 @@ public class NetworkUtils { return info != null && info.isConnected(); } - public static boolean isDownloadAllowed() { - return UserPreferences.isAllowMobileUpdate() || !NetworkUtils.isNetworkMetered(); + public static boolean isEpisodeDownloadAllowed() { + return UserPreferences.isAllowMobileEpisodeDownload() || !NetworkUtils.isNetworkMetered(); + } + + public static boolean isEpisodeHeadDownloadAllowed() { + // It is not an image but it is a similarly tiny request + // that is probably not even considered a download by most users + return isImageAllowed(); } public static boolean isImageAllowed() { return UserPreferences.isAllowMobileImages() || !NetworkUtils.isNetworkMetered(); } + public static boolean isStreamingAllowed() { + return UserPreferences.isAllowMobileStreaming() || !NetworkUtils.isNetworkMetered(); + } + + public static boolean isFeedRefreshAllowed() { + return UserPreferences.isAllowMobileFeedRefresh() || !NetworkUtils.isNetworkMetered(); + } + private static boolean isNetworkMetered() { ConnectivityManager connManager = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); @@ -123,7 +137,7 @@ public class NetworkUtils { public static Single getFeedMediaSizeObservable(FeedMedia media) { return Single.create((SingleOnSubscribe) emitter -> { - if (!NetworkUtils.isDownloadAllowed()) { + if (!NetworkUtils.isEpisodeHeadDownloadAllowed()) { emitter.onSuccess(0L); return; } diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/download/AutoUpdateManager.java b/core/src/main/java/de/danoeh/antennapod/core/util/download/AutoUpdateManager.java index e5aaa2db0..412b150fa 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/download/AutoUpdateManager.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/download/AutoUpdateManager.java @@ -67,7 +67,7 @@ public class AutoUpdateManager { private static Constraints getConstraints() { Constraints.Builder constraints = new Constraints.Builder(); - if (UserPreferences.isAllowMobileUpdate()) { + if (UserPreferences.isAllowMobileFeedRefresh()) { constraints.setRequiredNetworkType(NetworkType.CONNECTED); } else { constraints.setRequiredNetworkType(NetworkType.UNMETERED); diff --git a/core/src/main/res/values/arrays.xml b/core/src/main/res/values/arrays.xml index 39d1c0a94..d5f1c30b1 100644 --- a/core/src/main/res/values/arrays.xml +++ b/core/src/main/res/values/arrays.xml @@ -62,15 +62,19 @@ - @string/pref_mobileUpdate_nothing + @string/pref_mobileUpdate_refresh + @string/pref_mobileUpdate_episode_download + @string/pref_mobileUpdate_auto_download + @string/pref_mobileUpdate_streaming @string/pref_mobileUpdate_images - @string/pref_mobileUpdate_everything - nothing + feed_refresh + episode_download + auto_download + streaming images - everything diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index 6025dc888..82a56cf88 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -265,6 +265,8 @@ Confirm Mobile Download Downloading over mobile data connection is disabled in the settings.\n\nYou can choose to either only add the episode to the queue or you can allow downloading temporarily.\n\nYour choice will be remembered for 10 minutes. Downloading over mobile data connection is disabled in the settings.\n\nDo you want to allow downloading temporarily?\n\nYour choice will be remembered for 10 minutes. + Confirm Mobile streaming + Streaming over mobile data connection is disabled in the settings. Do you want to stream anyway? Enqueue Allow temporarily @@ -386,10 +388,12 @@ Headphones Reconnect Bluetooth Reconnect Mobile Updates - Allow updates and manual episode downloads over the mobile data connection - Nothing - Images only - Everything + Select what should be allowed over the mobile data connection + Feed refresh + Cover images + Auto download + Episode download + Streaming Refreshing User Interface Select Theme -- cgit v1.2.3 From be8e7c32f138bab841d3b040dad0c85ee54875ac Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Thu, 25 Jul 2019 01:08:16 +0200 Subject: Display notification when trying to stream --- .../core/service/playback/PlaybackService.java | 37 ++++++++++++++++++++-- core/src/main/res/values/arrays.xml | 4 +++ core/src/main/res/values/strings.xml | 4 +-- 3 files changed, 40 insertions(+), 5 deletions(-) (limited to 'core/src') diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java index d4be0013f..6707d10f4 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java @@ -25,6 +25,7 @@ import android.preference.PreferenceManager; import android.support.annotation.NonNull; import android.support.annotation.StringRes; import android.support.v4.app.NotificationCompat; +import android.support.v4.app.NotificationManagerCompat; import android.support.v4.media.MediaBrowserCompat; import android.support.v4.media.MediaBrowserServiceCompat; import android.support.v4.media.MediaDescriptionCompat; @@ -67,6 +68,7 @@ import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.storage.FeedSearcher; import de.danoeh.antennapod.core.util.IntList; import de.danoeh.antennapod.core.util.IntentUtils; +import de.danoeh.antennapod.core.util.NetworkUtils; import de.danoeh.antennapod.core.util.QueueAccess; import de.danoeh.antennapod.core.util.gui.NotificationUtils; import de.danoeh.antennapod.core.util.playback.ExternalMedia; @@ -94,6 +96,7 @@ public class PlaybackService extends MediaBrowserServiceCompat { * True if media should be streamed. */ public static final String EXTRA_SHOULD_STREAM = "extra.de.danoeh.antennapod.core.service.shouldStream"; + public static final String EXTRA_ALLOW_STREAM_THIS_TIME = "extra.de.danoeh.antennapod.core.service.allowStream"; /** * True if playback should be started immediately after media has been * prepared. @@ -103,7 +106,6 @@ public class PlaybackService extends MediaBrowserServiceCompat { public static final String EXTRA_PREPARE_IMMEDIATELY = "extra.de.danoeh.antennapod.core.service.prepareImmediately"; public static final String ACTION_PLAYER_STATUS_CHANGED = "action.de.danoeh.antennapod.core.service.playerStatusChanged"; - public static final String EXTRA_NEW_PLAYER_STATUS = "extra.de.danoeh.antennapod.service.playerStatusChanged.newStatus"; private static final String AVRCP_ACTION_PLAYER_STATUS_CHANGED = "com.android.music.playstatechanged"; private static final String AVRCP_ACTION_META_CHANGED = "com.android.music.metachanged"; @@ -206,6 +208,7 @@ public class PlaybackService extends MediaBrowserServiceCompat { private static volatile boolean isCasting = false; private static final int NOTIFICATION_ID = 1; + private static final int NOTIFICATION_ID_STREAMING = 2; private PlaybackServiceMediaPlayer mediaPlayer; private PlaybackServiceTaskManager taskManager; @@ -467,8 +470,8 @@ public class PlaybackService extends MediaBrowserServiceCompat { } } else if (!flavorHelper.castDisconnect(castDisconnect) && playable != null) { started = true; - boolean stream = intent.getBooleanExtra(EXTRA_SHOULD_STREAM, - true); + boolean stream = intent.getBooleanExtra(EXTRA_SHOULD_STREAM, true); + boolean allowStreamThisTime = intent.getBooleanExtra(EXTRA_ALLOW_STREAM_THIS_TIME, false); boolean startWhenPrepared = intent.getBooleanExtra(EXTRA_START_WHEN_PREPARED, false); boolean prepareImmediately = intent.getBooleanExtra(EXTRA_PREPARE_IMMEDIATELY, false); sendNotificationBroadcast(NOTIFICATION_TYPE_RELOAD, 0); @@ -477,6 +480,11 @@ public class PlaybackService extends MediaBrowserServiceCompat { if (playable instanceof FeedMedia) { playable = DBReader.getFeedMedia(((FeedMedia) playable).getId()); } + if (stream && !NetworkUtils.isStreamingAllowed() && !allowStreamThisTime) { + displayStreamingNotAllowedNotification(intent); + stopService(); + return Service.START_NOT_STICKY; + } mediaPlayer.playMediaObject(playable, stream, startWhenPrepared, prepareImmediately); } else { Log.d(TAG, "Did not handle intent to PlaybackService: " + intent); @@ -487,6 +495,29 @@ public class PlaybackService extends MediaBrowserServiceCompat { return Service.START_NOT_STICKY; } + private void displayStreamingNotAllowedNotification(Intent originalIntent) { + Intent intent = new Intent(originalIntent); + intent.putExtra(EXTRA_ALLOW_STREAM_THIS_TIME, true); + PendingIntent pendingIntent; + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) { + pendingIntent = PendingIntent.getForegroundService(this, 0, intent, 0); + } else { + pendingIntent = PendingIntent.getService(this, 0, intent, 0); + } + + NotificationCompat.Builder builder = new NotificationCompat.Builder(this, NotificationUtils.CHANNEL_ID_USER_ACTION) + .setSmallIcon(R.drawable.stat_notify_sync_error) + .setContentTitle(getString(R.string.confirm_mobile_streaming_notification_title)) + .setContentText(getString(R.string.confirm_mobile_streaming_notification_message)) + .setStyle(new NotificationCompat.BigTextStyle() + .bigText(getString(R.string.confirm_mobile_streaming_notification_message))) + .setPriority(NotificationCompat.PRIORITY_DEFAULT) + .setContentIntent(pendingIntent) + .setAutoCancel(true); + NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); + notificationManager.notify(NOTIFICATION_ID_STREAMING, builder.build()); + } + /** * Handles media button events * return: keycode was handled diff --git a/core/src/main/res/values/arrays.xml b/core/src/main/res/values/arrays.xml index d5f1c30b1..49ebb7416 100644 --- a/core/src/main/res/values/arrays.xml +++ b/core/src/main/res/values/arrays.xml @@ -77,6 +77,10 @@ images + + images + + @string/episode_cleanup_queue_removal 0 diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index 82a56cf88..a6ba0740e 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -265,8 +265,8 @@ Confirm Mobile Download Downloading over mobile data connection is disabled in the settings.\n\nYou can choose to either only add the episode to the queue or you can allow downloading temporarily.\n\nYour choice will be remembered for 10 minutes. Downloading over mobile data connection is disabled in the settings.\n\nDo you want to allow downloading temporarily?\n\nYour choice will be remembered for 10 minutes. - Confirm Mobile streaming - Streaming over mobile data connection is disabled in the settings. Do you want to stream anyway? + Confirm Mobile streaming + Streaming over mobile data connection is disabled in the settings. Tap to stream anyway. Enqueue Allow temporarily -- cgit v1.2.3 From 1651b95f774a61333a5d020cc8925c139d38e48e Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Thu, 25 Jul 2019 13:53:54 +0200 Subject: Displaying notification when playback switches to streamed episode --- .../core/service/playback/PlaybackService.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) (limited to 'core/src') diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java index 6707d10f4..bc8725432 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java @@ -73,6 +73,7 @@ import de.danoeh.antennapod.core.util.QueueAccess; import de.danoeh.antennapod.core.util.gui.NotificationUtils; import de.danoeh.antennapod.core.util.playback.ExternalMedia; import de.danoeh.antennapod.core.util.playback.Playable; +import de.danoeh.antennapod.core.util.playback.PlaybackServiceStarter; import org.greenrobot.eventbus.EventBus; /** @@ -853,7 +854,22 @@ public class PlaybackService extends MediaBrowserServiceCompat { Log.e(TAG, "Error handling the queue in order to retrieve the next item", e); return null; } - return (nextItem != null) ? nextItem.getMedia() : null; + + if (nextItem == null || nextItem.getMedia() == null) { + return null; + } + + if (!nextItem.getMedia().localFileAvailable() && !NetworkUtils.isStreamingAllowed()) { + displayStreamingNotAllowedNotification( + new PlaybackServiceStarter(this, nextItem.getMedia()) + .prepareImmediately(true) + .startWhenPrepared(true) + .shouldStream(true) + .getIntent()); + stopService(); + return null; + } + return nextItem.getMedia(); } -- cgit v1.2.3 From de13f9b5644d4d8bd51683e845bfebd433d1f9c1 Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Thu, 25 Jul 2019 14:01:24 +0200 Subject: Updating pendingIntent --- .../de/danoeh/antennapod/core/service/playback/PlaybackService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'core/src') diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java index bc8725432..4da764d5a 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java @@ -501,9 +501,9 @@ public class PlaybackService extends MediaBrowserServiceCompat { intent.putExtra(EXTRA_ALLOW_STREAM_THIS_TIME, true); PendingIntent pendingIntent; if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) { - pendingIntent = PendingIntent.getForegroundService(this, 0, intent, 0); + pendingIntent = PendingIntent.getForegroundService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); } else { - pendingIntent = PendingIntent.getService(this, 0, intent, 0); + pendingIntent = PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); } NotificationCompat.Builder builder = new NotificationCompat.Builder(this, NotificationUtils.CHANNEL_ID_USER_ACTION) -- cgit v1.2.3 From d2084608a67bdd9359e8ec1dcea92acc30f577e6 Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Sat, 10 Aug 2019 17:20:26 +0200 Subject: Fixed reappearing notification --- .../de/danoeh/antennapod/core/service/playback/PlaybackService.java | 2 ++ 1 file changed, 2 insertions(+) (limited to 'core/src') diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java index 4da764d5a..2f1bc4207 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java @@ -483,6 +483,7 @@ public class PlaybackService extends MediaBrowserServiceCompat { } if (stream && !NetworkUtils.isStreamingAllowed() && !allowStreamThisTime) { displayStreamingNotAllowedNotification(intent); + writePlaybackPreferencesNoMediaPlaying(); stopService(); return Service.START_NOT_STICKY; } @@ -866,6 +867,7 @@ public class PlaybackService extends MediaBrowserServiceCompat { .startWhenPrepared(true) .shouldStream(true) .getIntent()); + writePlaybackPreferencesNoMediaPlaying(); stopService(); return null; } -- cgit v1.2.3