summaryrefslogtreecommitdiff
path: root/core/src/main
diff options
context:
space:
mode:
authorcliambrown <liam@cliambrown.com>2022-09-18 12:10:18 -0400
committerGitHub <noreply@github.com>2022-09-18 18:10:18 +0200
commita528e8adfd09271e4cc33a5cddbfe6acc36fd15e (patch)
treebc7ff0529ebea2502b125003b54cd6ab19eb218f /core/src/main
parentfcce8e9e0eeb73d9f6a9a885787af2bc72698e90 (diff)
downloadAntennaPod-a528e8adfd09271e4cc33a5cddbfe6acc36fd15e.zip
Add Quick Settings tile (#6006)
Diffstat (limited to 'core/src/main')
-rw-r--r--core/src/main/AndroidManifest.xml15
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/QuickSettingsTileService.java65
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java7
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);