Add Quick Settings tile (#6006)

This commit is contained in:
cliambrown 2022-09-18 12:10:18 -04:00 committed by GitHub
parent fcce8e9e0e
commit a528e8adfd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 87 additions and 1 deletions

View File

@ -119,6 +119,7 @@
<intent-filter>
<action android:name="de.danoeh.antennapod.intents.MAIN_ACTIVITY" />
<category android:name="android.intent.category.DEFAULT" />
<action android:name="android.service.quicksettings.action.QS_TILE_PREFERENCES"/>
</intent-filter>
</activity>

View File

@ -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>

View File

@ -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();
}
}
}

View File

@ -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);