From a528e8adfd09271e4cc33a5cddbfe6acc36fd15e Mon Sep 17 00:00:00 2001 From: cliambrown Date: Sun, 18 Sep 2022 12:10:18 -0400 Subject: Add Quick Settings tile (#6006) --- core/src/main/AndroidManifest.xml | 15 ++++- .../core/service/QuickSettingsTileService.java | 65 ++++++++++++++++++++++ .../core/service/playback/PlaybackService.java | 7 +++ 3 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 core/src/main/java/de/danoeh/antennapod/core/service/QuickSettingsTileService.java (limited to 'core/src/main') diff --git a/core/src/main/AndroidManifest.xml b/core/src/main/AndroidManifest.xml index 3dd15a588..3a5266ec1 100644 --- a/core/src/main/AndroidManifest.xml +++ b/core/src/main/AndroidManifest.xml @@ -1,5 +1,5 @@ + xmlns:tools="http://schemas.android.com/tools" package="de.danoeh.antennapod.core"> + + + + + + + diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/QuickSettingsTileService.java b/core/src/main/java/de/danoeh/antennapod/core/service/QuickSettingsTileService.java new file mode 100644 index 000000000..ba0b3617e --- /dev/null +++ b/core/src/main/java/de/danoeh/antennapod/core/service/QuickSettingsTileService.java @@ -0,0 +1,65 @@ +package de.danoeh.antennapod.core.service; + +import android.content.ComponentName; +import android.content.Intent; +import android.os.Build; +import android.os.IBinder; +import android.service.quicksettings.Tile; +import android.service.quicksettings.TileService; +import android.util.Log; +import android.view.KeyEvent; + +import androidx.annotation.RequiresApi; + +import de.danoeh.antennapod.core.preferences.PlaybackPreferences; +import de.danoeh.antennapod.core.receiver.MediaButtonReceiver; +import de.danoeh.antennapod.core.service.playback.PlaybackService; + +@RequiresApi(api = Build.VERSION_CODES.N) +public class QuickSettingsTileService extends TileService { + + private static final String TAG = "QuickSettingsTileSvc"; + + @Override + public void onTileAdded() { + super.onTileAdded(); + updateTile(); + } + + @Override + public void onClick() { + super.onClick(); + Intent intent = new Intent(this, MediaButtonReceiver.class); + intent.setAction(MediaButtonReceiver.NOTIFY_BUTTON_RECEIVER); + intent.putExtra(Intent.EXTRA_KEY_EVENT, + new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE)); + sendBroadcast(intent); + } + + // Update the tile status when TileService.requestListeningState() is called elsewhere + @Override + public void onStartListening() { + super.onStartListening(); + updateTile(); + } + + // Without this, the tile may not be in the correct state after boot + @Override + public IBinder onBind(Intent intent) { + TileService.requestListeningState(this, new ComponentName(this, QuickSettingsTileService.class)); + return super.onBind(intent); + } + + public void updateTile() { + Tile qsTile = getQsTile(); + if (qsTile == null) { + Log.d(TAG, "Ignored call to update QS tile: getQsTile() returned null."); + } else { + boolean isPlaying = PlaybackService.isRunning + && PlaybackPreferences.getCurrentPlayerStatus() + == PlaybackPreferences.PLAYER_STATUS_PLAYING; + qsTile.setState(isPlaying ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE); + qsTile.updateTile(); + } + } +} 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 77d71bfb8..08a01f0a7 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 @@ -22,6 +22,7 @@ import android.os.Build; import android.os.Bundle; import android.os.IBinder; import android.os.Vibrator; +import android.service.quicksettings.TileService; import android.support.v4.media.MediaBrowserCompat; import android.support.v4.media.MediaDescriptionCompat; import android.support.v4.media.MediaMetadataCompat; @@ -44,6 +45,7 @@ import androidx.core.app.NotificationManagerCompat; import androidx.media.MediaBrowserServiceCompat; import androidx.preference.PreferenceManager; +import de.danoeh.antennapod.core.service.QuickSettingsTileService; import de.danoeh.antennapod.event.playback.BufferUpdateEvent; import de.danoeh.antennapod.event.playback.PlaybackServiceEvent; import de.danoeh.antennapod.event.PlayerErrorEvent; @@ -846,6 +848,11 @@ public class PlaybackService extends MediaBrowserServiceCompat { break; } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + TileService.requestListeningState(getApplicationContext(), + new ComponentName(getApplicationContext(), QuickSettingsTileService.class)); + } + IntentUtils.sendLocalBroadcast(getApplicationContext(), ACTION_PLAYER_STATUS_CHANGED); bluetoothNotifyChange(newInfo, AVRCP_ACTION_PLAYER_STATUS_CHANGED); bluetoothNotifyChange(newInfo, AVRCP_ACTION_META_CHANGED); -- cgit v1.2.3