Add error resolution for missing permission am: e7cb020b5d am: ad53ed36a2

Change-Id: If6320a1d1dd5c43658783e547604cc42593b88be
diff --git a/OWNERS b/OWNERS
index f0f7c14..e2dc47b 100644
--- a/OWNERS
+++ b/OWNERS
@@ -2,3 +2,5 @@
 # Please update this list if you find better candidates.
 stenning@google.com
 ajchen@google.com
+igorr@google.com
+arnaudberry@google.com
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 7e4e990..ac6d4a1 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -21,6 +21,8 @@
     <string name="genres_title">Genres</string>
     <string name="albums_title">Albums</string>
     <string name="playback_error">Something went wrong.</string>
+    <string name="permission_error">Missing permission.</string>
+    <string name="permission_error_resolve">Grant permission</string>
     <string name="playlist">Now Playing</string>
     <string name="shuffle">Shuffle</string>
 
diff --git a/src/com/android/car/media/localmediaplayer/LocalMediaBrowserService.java b/src/com/android/car/media/localmediaplayer/LocalMediaBrowserService.java
index 6f3e5fd..26a440f 100644
--- a/src/com/android/car/media/localmediaplayer/LocalMediaBrowserService.java
+++ b/src/com/android/car/media/localmediaplayer/LocalMediaBrowserService.java
@@ -113,10 +113,6 @@
     public void onCreate() {
         super.onCreate();
 
-        if (!Utils.hasRequiredPermissions(this)) {
-            Utils.startPermissionRequest(this);
-        }
-
         mDataModel = new DataModel(this);
         addRootItems();
         mSession = new MediaSession(this, MEDIA_SESSION_TAG);
diff --git a/src/com/android/car/media/localmediaplayer/Player.java b/src/com/android/car/media/localmediaplayer/Player.java
index 2bb763b..e39b394 100644
--- a/src/com/android/car/media/localmediaplayer/Player.java
+++ b/src/com/android/car/media/localmediaplayer/Player.java
@@ -173,7 +173,7 @@
         }
         // Check permissions every time we try to play
         if (!Utils.hasRequiredPermissions(mContext)) {
-            Utils.startPermissionRequest(mContext);
+            setMissingPermissionError();
         } else {
             requestAudioFocus(() -> resumePlayback());
         }
@@ -231,6 +231,25 @@
         editor.commit();
     }
 
+    private void setMissingPermissionError() {
+        Intent prefsIntent = new Intent();
+        prefsIntent.setClass(mContext, PermissionsActivity.class);
+        prefsIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, prefsIntent, 0);
+
+        Bundle extras = new Bundle();
+        extras.putString(Utils.ERROR_RESOLUTION_ACTION_LABEL,
+                mContext.getString(R.string.permission_error_resolve));
+        extras.putParcelable(Utils.ERROR_RESOLUTION_ACTION_INTENT, pendingIntent);
+
+        PlaybackState state = new PlaybackState.Builder()
+                .setState(PlaybackState.STATE_ERROR, 0, 0)
+                .setErrorMessage(mContext.getString(R.string.permission_error))
+                .setExtras(extras)
+                .build();
+        mSession.setPlaybackState(state);
+    }
+
     private boolean maybeRebuildQueue(Playlist playlist) {
         List<QueueItem> queue = new ArrayList<>();
         int foundIdx = 0;
@@ -269,6 +288,10 @@
     }
 
     public boolean maybeRestoreState() {
+        if (!Utils.hasRequiredPermissions(mContext)) {
+            setMissingPermissionError();
+            return false;
+        }
         String serialized = mSharedPrefs.getString(CURRENT_PLAYLIST_KEY, null);
         if (serialized == null) {
             return false;
diff --git a/src/com/android/car/media/localmediaplayer/Utils.java b/src/com/android/car/media/localmediaplayer/Utils.java
index d761794..5df3760 100644
--- a/src/com/android/car/media/localmediaplayer/Utils.java
+++ b/src/com/android/car/media/localmediaplayer/Utils.java
@@ -27,6 +27,12 @@
         android.Manifest.permission.READ_EXTERNAL_STORAGE
     };
 
+    static final String ERROR_RESOLUTION_ACTION_INTENT =
+            "android.media.extras.ERROR_RESOLUTION_ACTION_INTENT";
+
+    static final String ERROR_RESOLUTION_ACTION_LABEL =
+            "android.media.extras.ERROR_RESOLUTION_ACTION_LABEL";
+
     static Uri getUriForResource(Context context, int id) {
         Resources res = context.getResources();
         return Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE
@@ -43,12 +49,4 @@
         }
         return true;
     }
-
-    static void startPermissionRequest(Context context) {
-        if (!Utils.hasRequiredPermissions(context)) {
-            Intent intent = new Intent(context, PermissionsActivity.class);
-            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-            context.startActivity(intent);
-        }
-    }
 }