From 2c8ba50524ac47cf2587e7d0110e427be0806478 Mon Sep 17 00:00:00 2001 From: bachinger Date: Tue, 16 Jan 2024 10:06:27 -0800 Subject: [PATCH] Disable double-click detection for TV apps Issue: androidx/media#962 PiperOrigin-RevId: 598876214 --- RELEASENOTES.md | 2 ++ .../media3/session/MediaSessionImpl.java | 19 ++++++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 8f8dd5756c..3b783491a1 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -32,6 +32,8 @@ * Muxers: * IMA extension: * Session: + * Disable double-click detection for TV apps + ([#962](https://github.com/androidx/media/issues/962)). * UI: * Downloads: * OkHttp Extension: diff --git a/libraries/session/src/main/java/androidx/media3/session/MediaSessionImpl.java b/libraries/session/src/main/java/androidx/media3/session/MediaSessionImpl.java index add90f57bd..22e4a8101c 100644 --- a/libraries/session/src/main/java/androidx/media3/session/MediaSessionImpl.java +++ b/libraries/session/src/main/java/androidx/media3/session/MediaSessionImpl.java @@ -39,6 +39,7 @@ import android.app.PendingIntent; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; import android.net.Uri; import android.os.Bundle; import android.os.DeadObjectException; @@ -53,9 +54,11 @@ import android.support.v4.media.session.MediaSessionCompat; import android.view.KeyEvent; import android.view.ViewConfiguration; import androidx.annotation.CheckResult; +import androidx.annotation.DoNotInline; import androidx.annotation.FloatRange; import androidx.annotation.GuardedBy; import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; import androidx.media.MediaBrowserServiceCompat; import androidx.media3.common.AudioAttributes; import androidx.media3.common.DeviceInfo; @@ -1123,14 +1126,16 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; } // Double tap detection. int keyCode = keyEvent.getKeyCode(); + boolean isTvApp = Util.SDK_INT >= 21 && Api21.isTvApp(context); boolean doubleTapCompleted = false; switch (keyCode) { case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE: case KeyEvent.KEYCODE_HEADSETHOOK: - if (callerInfo.getControllerVersion() != ControllerInfo.LEGACY_CONTROLLER_VERSION + if (isTvApp + || callerInfo.getControllerVersion() != ControllerInfo.LEGACY_CONTROLLER_VERSION || keyEvent.getRepeatCount() != 0) { - // Double tap detection is only for media button events from external sources - // (for instance Bluetooth) and excluding long press (repeatCount > 0). + // Double tap detection is only for mobile apps that receive a media button event from + // external sources (for instance Bluetooth) and excluding long press (repeatCount > 0). mediaPlayPauseKeyHandler.flush(); } else if (mediaPlayPauseKeyHandler.hasPendingPlayPauseTask()) { // A double tap arrived. Clear the pending playPause task. @@ -1817,4 +1822,12 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; } } } + + @RequiresApi(21) + private static final class Api21 { + @DoNotInline + public static boolean isTvApp(Context context) { + return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_LEANBACK); + } + } }