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() {}
-}