Update the logic for opening output switcher from Android S

Bug: 170595479
Test: Using supportV7Demos, opened the output switcher in R and S
Change-Id: Iafc7360aefaa51c0bc43ee2ef0ff640a18e9e359
diff --git a/mediarouter/mediarouter/build.gradle b/mediarouter/mediarouter/build.gradle
index 0afec28..993ef6e 100644
--- a/mediarouter/mediarouter/build.gradle
+++ b/mediarouter/mediarouter/build.gradle
@@ -27,6 +27,7 @@
     api("androidx.media:media:1.2.0")
     api(GUAVA_LISTENABLE_FUTURE)
 
+    implementation(project(":core:core"))
     implementation("androidx.appcompat:appcompat:1.1.0")
     implementation("androidx.palette:palette:1.0.0")
     implementation("androidx.recyclerview:recyclerview:1.1.0")
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteButton.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteButton.java
index 8f910d5..e56f791 100644
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteButton.java
+++ b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/MediaRouteButton.java
@@ -32,6 +32,7 @@
 import android.graphics.drawable.AnimationDrawable;
 import android.graphics.drawable.Drawable;
 import android.net.ConnectivityManager;
+import android.os.Build;
 import android.text.TextUtils;
 import android.util.AttributeSet;
 import android.util.Log;
@@ -44,6 +45,7 @@
 import androidx.appcompat.content.res.AppCompatResources;
 import androidx.appcompat.widget.TooltipCompat;
 import androidx.core.graphics.drawable.DrawableCompat;
+import androidx.core.os.BuildCompat;
 import androidx.core.view.ViewCompat;
 import androidx.fragment.app.FragmentActivity;
 import androidx.fragment.app.FragmentManager;
@@ -394,13 +396,28 @@
      * Returns {@code false} if there was no output switcher.
      */
     private boolean showOutputSwitcher() {
+        boolean result = false;
+        if (BuildCompat.isAtLeastS()) {
+            result = showOutputSwitcherForAndroidSAndAbove();
+            if (!result) {
+                // The intent action and related string constants are changed in S,
+                // however they are not public API yet. Try opening the output switcher with the
+                // old constants for devices that have prior version of the constants.
+                result = showOutputSwitcherForAndroidR();
+            }
+        } else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.R) {
+            result = showOutputSwitcherForAndroidR();
+        }
+        return result;
+    }
+
+    private boolean showOutputSwitcherForAndroidR() {
         Context context = getContext();
 
         Intent intent = new Intent()
-                .setAction(OutputSwitcherConstants.ACTION_MEDIA_OUTPUT)
-                .putExtra(OutputSwitcherConstants.EXTRA_PACKAGE_NAME, context.getPackageName())
-                .putExtra(OutputSwitcherConstants.KEY_MEDIA_SESSION_TOKEN,
-                        mRouter.getMediaSessionToken());
+                .setAction("com.android.settings.panel.action.MEDIA_OUTPUT")
+                .putExtra("com.android.settings.panel.extra.PACKAGE_NAME", context.getPackageName())
+                .putExtra("key_media_session_token", mRouter.getMediaSessionToken());
 
         PackageManager packageManager = context.getPackageManager();
         List<ResolveInfo> resolveInfos = packageManager.queryIntentActivities(intent, 0);
@@ -416,7 +433,33 @@
                 return true;
             }
         }
-        // There was no output switcher.
+        return false;
+    }
+
+    private boolean showOutputSwitcherForAndroidSAndAbove() {
+        Context context = getContext();
+
+        Intent intent = new Intent()
+                .setAction("com.android.systemui.action.LAUNCH_MEDIA_OUTPUT_DIALOG")
+                .setPackage("com.android.systemui")
+                .putExtra("package_name", context.getPackageName())
+                .putExtra("key_media_session_token", mRouter.getMediaSessionToken());
+
+        PackageManager packageManager = context.getPackageManager();
+        List<ResolveInfo> resolveInfos = packageManager.queryBroadcastReceivers(intent, 0);
+        for (ResolveInfo resolveInfo : resolveInfos) {
+            ActivityInfo activityInfo = resolveInfo.activityInfo;
+            if (activityInfo == null || activityInfo.applicationInfo == null) {
+                continue;
+            }
+            ApplicationInfo appInfo = activityInfo.applicationInfo;
+            if (((ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)
+                    & appInfo.flags) != 0) {
+                context.sendBroadcast(intent);
+                return true;
+            }
+        }
+
         return false;
     }
 
diff --git a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/OutputSwitcherConstants.java b/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/OutputSwitcherConstants.java
deleted file mode 100644
index ad28ebb..0000000
--- a/mediarouter/mediarouter/src/main/java/androidx/mediarouter/app/OutputSwitcherConstants.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.mediarouter.app;
-
-/**
- * Constants for opening Output Switcher activity.
- */
-class OutputSwitcherConstants {
-    /**
-     * Copied from MediaOutputSliceConstants.ACTION_MEDIA_OUTPUT.
-     */
-    static final String ACTION_MEDIA_OUTPUT = "com.android.settings.panel.action.MEDIA_OUTPUT";
-
-    /**
-     * Copied from MediaOutputSliceConstants.EXTRA_PACKAGE_NAME.
-     */
-    static final String EXTRA_PACKAGE_NAME = "com.android.settings.panel.extra.PACKAGE_NAME";
-
-    /**
-     * Copied from MediaOutputSliceConstants.KEY_MEDIA_SESSION_TOKEN.
-     */
-    static final String KEY_MEDIA_SESSION_TOKEN = "key_media_session_token";
-
-    private OutputSwitcherConstants() {}
-}