From 841bda020f782e28c586dd15f5c4c40ebe84694b Mon Sep 17 00:00:00 2001 From: hades Date: Wed, 17 Apr 2024 00:01:34 +0200 Subject: [PATCH] Do not enable sleep mode in Android Auto (#7053) When playback is started while an Android Auto projection is active, we want to prevent automatic sleep timer from starting. Note: the androidx.car.app library has not seen a full release since 1.2.0. We opted to use a release candidate here, which has a downgraded minSdk requirement, compatible with the current minSdk of AntennaPod at the time this dependency is introduced. --- playback/service/build.gradle | 1 + .../playback/service/PlaybackService.java | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/playback/service/build.gradle b/playback/service/build.gradle index 219565696..e93035bbb 100644 --- a/playback/service/build.gradle +++ b/playback/service/build.gradle @@ -26,6 +26,7 @@ dependencies { implementation project(':ui:chapters') annotationProcessor "androidx.annotation:annotation:$annotationVersion" + implementation "androidx.car.app:app:1.4.0-rc02" implementation "androidx.core:core:$coreVersion" implementation "androidx.appcompat:appcompat:$appcompatVersion" implementation "androidx.media:media:$mediaVersion" diff --git a/playback/service/src/main/java/de/danoeh/antennapod/playback/service/PlaybackService.java b/playback/service/src/main/java/de/danoeh/antennapod/playback/service/PlaybackService.java index 39ee4c3ad..4f9b7eb3c 100644 --- a/playback/service/src/main/java/de/danoeh/antennapod/playback/service/PlaybackService.java +++ b/playback/service/src/main/java/de/danoeh/antennapod/playback/service/PlaybackService.java @@ -45,9 +45,12 @@ import androidx.annotation.DrawableRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.StringRes; +import androidx.car.app.connection.CarConnection; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; import androidx.core.content.ContextCompat; +import androidx.lifecycle.LiveData; +import androidx.lifecycle.Observer; import androidx.media.MediaBrowserServiceCompat; import de.danoeh.antennapod.event.PlayerStatusEvent; @@ -170,6 +173,9 @@ public class PlaybackService extends MediaBrowserServiceCompat { private MediaSessionCompat mediaSession; private static volatile MediaType currentMediaType = MediaType.UNKNOWN; + private LiveData androidAutoConnectionState; + private boolean androidAutoConnected = false; + private Observer androidAutoConnectionObserver; private final IBinder mBinder = new LocalBinder(); @@ -226,6 +232,11 @@ public class PlaybackService extends MediaBrowserServiceCompat { stateManager = new PlaybackServiceStateManager(this); notificationBuilder = new PlaybackServiceNotificationBuilder(this); + androidAutoConnectionState = new CarConnection(this).getType(); + androidAutoConnectionObserver = connectionState -> { + androidAutoConnected = connectionState == CarConnection.CONNECTION_TYPE_PROJECTION; + }; + androidAutoConnectionState.observeForever(androidAutoConnectionObserver); ContextCompat.registerReceiver(this, autoStateUpdated, new IntentFilter("com.google.android.gms.car.media.STATUS"), ContextCompat.RECEIVER_EXPORTED); @@ -318,6 +329,7 @@ public class PlaybackService extends MediaBrowserServiceCompat { currentMediaType = MediaType.UNKNOWN; castStateListener.destroy(); + androidAutoConnectionState.removeObserver(androidAutoConnectionObserver); cancelPositionObserver(); if (mediaSession != null) { mediaSession.release(); @@ -860,6 +872,10 @@ public class PlaybackService extends MediaBrowserServiceCompat { int currentHour = now.get(Calendar.HOUR_OF_DAY); autoEnableByTime = SleepTimerPreferences.isInTimeRange(fromSetting, toSetting, currentHour); } + if (androidAutoConnected) { + Log.i(TAG, "Android Auto is connected, sleep timer will not be auto-enabled"); + autoEnableByTime = false; + } if (newInfo.getOldPlayerStatus() != null && newInfo.getOldPlayerStatus() != PlayerStatus.SEEKING && SleepTimerPreferences.autoEnable() && autoEnableByTime && !sleepTimerActive()) {