From c7a091a97373d3009074dba7ec0eeaaae79b1a12 Mon Sep 17 00:00:00 2001 From: ibaker Date: Wed, 11 Oct 2023 06:25:44 -0700 Subject: [PATCH] Request notification permission when starting session demo app #minor-release PiperOrigin-RevId: 572556101 --- .../media3/demo/session/MainActivity.kt | 29 +++++++++++++++++++ demos/session/src/main/res/values/strings.xml | 2 ++ .../src/main/AndroidManifest.xml | 4 ++- .../demo/session/DemoPlaybackService.kt | 12 ++++++-- 4 files changed, 44 insertions(+), 3 deletions(-) diff --git a/demos/session/src/main/java/androidx/media3/demo/session/MainActivity.kt b/demos/session/src/main/java/androidx/media3/demo/session/MainActivity.kt index 7ea0682fe6..4788496f81 100644 --- a/demos/session/src/main/java/androidx/media3/demo/session/MainActivity.kt +++ b/demos/session/src/main/java/androidx/media3/demo/session/MainActivity.kt @@ -15,8 +15,11 @@ */ package androidx.media3.demo.session +import android.Manifest import android.content.ComponentName import android.content.Context +import android.content.pm.PackageManager +import android.os.Build import android.os.Bundle import android.view.LayoutInflater import android.view.MenuItem @@ -25,6 +28,7 @@ import android.view.ViewGroup import android.widget.ArrayAdapter import android.widget.ListView import android.widget.TextView +import android.widget.Toast import androidx.activity.OnBackPressedCallback import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat @@ -81,6 +85,14 @@ class MainActivity : AppCompatActivity() { } } ) + + if ( + Build.VERSION.SDK_INT >= 33 && + checkSelfPermission(Manifest.permission.POST_NOTIFICATIONS) != + PackageManager.PERMISSION_GRANTED + ) { + requestPermissions(arrayOf(Manifest.permission.POST_NOTIFICATIONS), /* requestCode= */ 0) + } } override fun onOptionsItemSelected(item: MenuItem): Boolean { @@ -101,6 +113,23 @@ class MainActivity : AppCompatActivity() { super.onStop() } + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + if (grantResults.isEmpty()) { + // Empty results are triggered if a permission is requested while another request was already + // pending and can be safely ignored in this case. + return + } + if (grantResults[0] != PackageManager.PERMISSION_GRANTED) { + Toast.makeText(applicationContext, R.string.notification_permission_denied, Toast.LENGTH_LONG) + .show() + } + } + private fun initializeBrowser() { browserFuture = MediaBrowser.Builder( diff --git a/demos/session/src/main/res/values/strings.xml b/demos/session/src/main/res/values/strings.xml index 632e2ce602..084a868abc 100644 --- a/demos/session/src/main/res/values/strings.xml +++ b/demos/session/src/main/res/values/strings.xml @@ -21,4 +21,6 @@ Shuffle Play Waiting for playlist to load… + + "Without notification access the app can't warn about failed background operations" diff --git a/demos/session_service/src/main/AndroidManifest.xml b/demos/session_service/src/main/AndroidManifest.xml index ec9063f36d..0fcea637ff 100644 --- a/demos/session_service/src/main/AndroidManifest.xml +++ b/demos/session_service/src/main/AndroidManifest.xml @@ -13,6 +13,8 @@ See the License for the specific language governing permissions and limitations under the License. --> - + + diff --git a/demos/session_service/src/main/java/androidx/media3/demo/session/DemoPlaybackService.kt b/demos/session_service/src/main/java/androidx/media3/demo/session/DemoPlaybackService.kt index 453d5b28dc..d60a3751b1 100644 --- a/demos/session_service/src/main/java/androidx/media3/demo/session/DemoPlaybackService.kt +++ b/demos/session_service/src/main/java/androidx/media3/demo/session/DemoPlaybackService.kt @@ -15,11 +15,12 @@ */ package androidx.media3.demo.session -import android.annotation.SuppressLint +import android.Manifest import android.app.NotificationChannel import android.app.NotificationManager import android.app.PendingIntent import android.content.Intent +import android.content.pm.PackageManager import android.os.Build import androidx.annotation.OptIn import androidx.core.app.NotificationCompat @@ -136,8 +137,15 @@ open class DemoPlaybackService : MediaLibraryService() { * by a media controller to resume playback when the {@link MediaSessionService} is in the * background. */ - @SuppressLint("MissingPermission") // TODO: b/280766358 - Request this permission at runtime. override fun onForegroundServiceStartNotAllowedException() { + if ( + Build.VERSION.SDK_INT >= 33 && + checkSelfPermission(Manifest.permission.POST_NOTIFICATIONS) != + PackageManager.PERMISSION_GRANTED + ) { + // Notification permission is required but not granted + return + } val notificationManagerCompat = NotificationManagerCompat.from(this@DemoPlaybackService) ensureNotificationChannel(notificationManagerCompat) val builder =