diff options
author | cliambrown <liam@cliambrown.com> | 2022-09-18 12:10:18 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-09-18 18:10:18 +0200 |
commit | a528e8adfd09271e4cc33a5cddbfe6acc36fd15e (patch) | |
tree | bc7ff0529ebea2502b125003b54cd6ab19eb218f /core/src/main | |
parent | fcce8e9e0eeb73d9f6a9a885787af2bc72698e90 (diff) | |
download | AntennaPod-a528e8adfd09271e4cc33a5cddbfe6acc36fd15e.zip |
Add Quick Settings tile (#6006)
Diffstat (limited to 'core/src/main')
3 files changed, 86 insertions, 1 deletions
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 @@ <manifest xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" package="de.danoeh.antennapod.core"> + xmlns:tools="http://schemas.android.com/tools" package="de.danoeh.antennapod.core"> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" @@ -46,6 +46,19 @@ android:label="@string/feed_update_receiver_name" android:exported="true" tools:ignore="ExportedReceiver" /> <!-- allow feeds update to be triggered by external apps --> + + <service + android:name=".service.QuickSettingsTileService" + android:enabled="true" + android:exported="true" + android:label="@string/app_name" + android:icon="@drawable/ic_notification" + android:permission="android.permission.BIND_QUICK_SETTINGS_TILE"> + <intent-filter> + <action android:name="android.service.quicksettings.action.QS_TILE" /> + </intent-filter> + <meta-data android:name="android.service.quicksettings.ACTIVE_TILE" android:value="true" /> + </service> </application> <queries> 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); |