From 584b11fce362443b6738c345eb2d1714108fec93 Mon Sep 17 00:00:00 2001 From: FineFindus <63370021+FineFindus@users.noreply.github.com> Date: Sat, 5 Aug 2023 20:35:57 +0200 Subject: [PATCH] feat: allow playing multiple media (#755) * feat: allow playing multiple media * replace audio overlay icon --------- Co-authored-by: sk --- .../java/org/joinmastodon/android/AudioPlayerService.java | 3 ++- .../org/joinmastodon/android/GlobalUserPreferences.java | 3 +++ .../fragments/settings/SettingsBehaviorFragment.java | 4 +++- .../java/org/joinmastodon/android/model/Attachment.java | 8 ++++++++ .../joinmastodon/android/ui/photoviewer/PhotoViewer.java | 4 +++- .../drawable/ic_fluent_play_circle_hint_24_regular.xml | 3 +++ mastodon/src/main/res/values/strings_sk.xml | 2 ++ 7 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 mastodon/src/main/res/drawable/ic_fluent_play_circle_hint_24_regular.xml diff --git a/mastodon/src/main/java/org/joinmastodon/android/AudioPlayerService.java b/mastodon/src/main/java/org/joinmastodon/android/AudioPlayerService.java index 4a01c13f0..362c2fb02 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/AudioPlayerService.java +++ b/mastodon/src/main/java/org/joinmastodon/android/AudioPlayerService.java @@ -169,7 +169,8 @@ public class AudioPlayerService extends Service{ } updateNotification(false, false); - getSystemService(AudioManager.class).requestAudioFocus(audioFocusChangeListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); + int audiofocus = GlobalUserPreferences.overlayMedia ? AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK : AudioManager.AUDIOFOCUS_GAIN; + getSystemService(AudioManager.class).requestAudioFocus(audioFocusChangeListener, AudioManager.STREAM_MUSIC, audiofocus); player=new MediaPlayer(); player.setOnPreparedListener(this::onPlayerPrepared); diff --git a/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java b/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java index 22bf062a9..200499599 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java +++ b/mastodon/src/main/java/org/joinmastodon/android/GlobalUserPreferences.java @@ -59,6 +59,7 @@ public class GlobalUserPreferences{ public static boolean disableM3PillActiveIndicator; public static boolean showNavigationLabels; public static boolean displayPronounsInTimelines, displayPronounsInThreads, displayPronounsInUserListings; + public static boolean overlayMedia; private static SharedPreferences getPrefs(){ return MastodonApp.context.getSharedPreferences("global", Context.MODE_PRIVATE); @@ -117,6 +118,7 @@ public class GlobalUserPreferences{ displayPronounsInTimelines=prefs.getBoolean("displayPronounsInTimelines", true); displayPronounsInThreads=prefs.getBoolean("displayPronounsInThreads", true); displayPronounsInUserListings=prefs.getBoolean("displayPronounsInUserListings", true); + overlayMedia=prefs.getBoolean("overlayMedia", false); if (prefs.contains("prefixRepliesWithRe")) { prefixReplies = prefs.getBoolean("prefixRepliesWithRe", false) @@ -174,6 +176,7 @@ public class GlobalUserPreferences{ .putBoolean("displayPronounsInTimelines", displayPronounsInTimelines) .putBoolean("displayPronounsInThreads", displayPronounsInThreads) .putBoolean("displayPronounsInUserListings", displayPronounsInUserListings) + .putBoolean("overlayMedia", overlayMedia) .apply(); } diff --git a/mastodon/src/main/java/org/joinmastodon/android/fragments/settings/SettingsBehaviorFragment.java b/mastodon/src/main/java/org/joinmastodon/android/fragments/settings/SettingsBehaviorFragment.java index 9051b605f..919f6fbe6 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/fragments/settings/SettingsBehaviorFragment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/fragments/settings/SettingsBehaviorFragment.java @@ -30,7 +30,7 @@ public class SettingsBehaviorFragment extends BaseSettingsFragment impleme // MEGALODON private MastodonLanguage.LanguageResolver languageResolver; private ListItem prefixRepliesItem, replyVisibilityItem; - private CheckableListItem forwardReportsItem, remoteLoadingItem, showBoostsItem, showRepliesItem, loadNewPostsItem, seeNewPostsBtnItem; + private CheckableListItem forwardReportsItem, remoteLoadingItem, showBoostsItem, showRepliesItem, loadNewPostsItem, seeNewPostsBtnItem, overlayMediaItem; @Override public void onCreate(Bundle savedInstanceState){ @@ -47,6 +47,7 @@ public class SettingsBehaviorFragment extends BaseSettingsFragment impleme languageItem=new ListItem<>(getString(R.string.default_post_language), postLanguage!=null ? postLanguage.getDisplayName(getContext()) : null, R.drawable.ic_fluent_local_language_24_regular, this::onDefaultLanguageClick), altTextItem=new CheckableListItem<>(R.string.settings_alt_text_reminders, 0, CheckableListItem.Style.SWITCH, GlobalUserPreferences.altTextReminders, R.drawable.ic_fluent_image_alt_text_24_regular, ()->toggleCheckableItem(altTextItem)), playGifsItem=new CheckableListItem<>(R.string.settings_gif, 0, CheckableListItem.Style.SWITCH, GlobalUserPreferences.playGifs, R.drawable.ic_fluent_gif_24_regular, ()->toggleCheckableItem(playGifsItem)), + overlayMediaItem=new CheckableListItem<>(R.string.sk_settings_continues_playback, R.string.sk_settings_continues_playback_summary, CheckableListItem.Style.SWITCH, GlobalUserPreferences.overlayMedia, R.drawable.ic_fluent_play_circle_hint_24_regular, ()->toggleCheckableItem(overlayMediaItem)), customTabsItem=new CheckableListItem<>(R.string.settings_custom_tabs, 0, CheckableListItem.Style.SWITCH, GlobalUserPreferences.useCustomTabs, R.drawable.ic_fluent_link_24_regular, ()->toggleCheckableItem(customTabsItem)), confirmUnfollowItem=new CheckableListItem<>(R.string.settings_confirm_unfollow, 0, CheckableListItem.Style.SWITCH, GlobalUserPreferences.confirmUnfollow, R.drawable.ic_fluent_person_delete_24_regular, ()->toggleCheckableItem(confirmUnfollowItem)), confirmBoostItem=new CheckableListItem<>(R.string.settings_confirm_boost, 0, CheckableListItem.Style.SWITCH, GlobalUserPreferences.confirmBoost, R.drawable.ic_fluent_arrow_repeat_all_24_regular, ()->toggleCheckableItem(confirmBoostItem)), @@ -162,6 +163,7 @@ public class SettingsBehaviorFragment extends BaseSettingsFragment impleme protected void onHidden(){ super.onHidden(); GlobalUserPreferences.playGifs=playGifsItem.checked; + GlobalUserPreferences.overlayMedia=overlayMediaItem.checked; GlobalUserPreferences.useCustomTabs=customTabsItem.checked; GlobalUserPreferences.altTextReminders=altTextItem.checked; GlobalUserPreferences.confirmUnfollow=customTabsItem.checked; diff --git a/mastodon/src/main/java/org/joinmastodon/android/model/Attachment.java b/mastodon/src/main/java/org/joinmastodon/android/model/Attachment.java index 069959fbf..b198eb446 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/model/Attachment.java +++ b/mastodon/src/main/java/org/joinmastodon/android/model/Attachment.java @@ -3,6 +3,7 @@ package org.joinmastodon.android.model; import android.graphics.Bitmap; import android.graphics.PointF; import android.graphics.drawable.Drawable; +import android.media.MediaMetadataRetriever; import com.google.gson.annotations.SerializedName; @@ -77,6 +78,13 @@ public class Attachment extends BaseModel{ return 0; } + public boolean hasSound() { + MediaMetadataRetriever retriever = new MediaMetadataRetriever(); + retriever.setDataSource(url); + String hasAudioStr = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_HAS_AUDIO); + return "yes".equals(hasAudioStr); + } + @Override public void postprocess() throws ObjectValidationException{ super.postprocess(); diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/photoviewer/PhotoViewer.java b/mastodon/src/main/java/org/joinmastodon/android/ui/photoviewer/PhotoViewer.java index fe120f4d4..ce2caf221 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/photoviewer/PhotoViewer.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/photoviewer/PhotoViewer.java @@ -45,6 +45,7 @@ import android.widget.TextView; import android.widget.Toast; import android.widget.Toolbar; +import org.joinmastodon.android.GlobalUserPreferences; import org.joinmastodon.android.R; import org.joinmastodon.android.api.MastodonAPIController; import org.joinmastodon.android.model.Attachment; @@ -418,7 +419,8 @@ public class PhotoViewer implements ZoomPanView.Listener{ WindowManager.LayoutParams wlp=(WindowManager.LayoutParams) windowView.getLayoutParams(); wlp.flags|=WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; wm.updateViewLayout(windowView, wlp); - activity.getSystemService(AudioManager.class).requestAudioFocus(audioFocusListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); + int audiofocus = GlobalUserPreferences.overlayMedia ? AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK : AudioManager.AUDIOFOCUS_GAIN; + activity.getSystemService(AudioManager.class).requestAudioFocus(audioFocusListener, AudioManager.STREAM_MUSIC, audiofocus); } screenOnRefCount++; } diff --git a/mastodon/src/main/res/drawable/ic_fluent_play_circle_hint_24_regular.xml b/mastodon/src/main/res/drawable/ic_fluent_play_circle_hint_24_regular.xml new file mode 100644 index 000000000..547dee77f --- /dev/null +++ b/mastodon/src/main/res/drawable/ic_fluent_play_circle_hint_24_regular.xml @@ -0,0 +1,3 @@ + + + diff --git a/mastodon/src/main/res/values/strings_sk.xml b/mastodon/src/main/res/values/strings_sk.xml index e9d392283..dff93af8f 100644 --- a/mastodon/src/main/res/values/strings_sk.xml +++ b/mastodon/src/main/res/values/strings_sk.xml @@ -16,6 +16,8 @@ Image description Unlisted Show replies + Audio overlay + Allow already playing media to continue playing, overlaying the new playback Quoting %s Reply visibility All replies