Merge "Add new api for showing media output switcher dialog." into tm-qpr-dev am: a2896db85b

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/20911786

Change-Id: Icf0a6dad30cfc782565b1ef70eac1be232492fc5
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Bishoy Gendy
2023-01-17 16:55:45 +00:00
committed by Automerger Merge Worker
7 changed files with 136 additions and 0 deletions

View File

@@ -338,4 +338,11 @@ oneway interface IStatusBar
* @param leftOrTop indicates where the stage split is.
*/
void enterStageSplitFromRunningApp(boolean leftOrTop);
/**
* Shows the media output switcher dialog.
*
* @param packageName of the session for which the output switcher is shown.
*/
void showMediaOutputSwitcher(String packageName);
}

View File

@@ -31,6 +31,7 @@ import com.android.systemui.globalactions.GlobalActionsComponent
import com.android.systemui.keyboard.KeyboardUI
import com.android.systemui.keyguard.KeyguardViewMediator
import com.android.systemui.log.SessionTracker
import com.android.systemui.media.dialog.MediaOutputSwitcherDialogUI
import com.android.systemui.media.RingtonePlayer
import com.android.systemui.media.taptotransfer.MediaTttCommandLineHelper
import com.android.systemui.media.taptotransfer.receiver.MediaTttChipControllerReceiver
@@ -217,6 +218,12 @@ abstract class SystemUICoreStartableModule {
@ClassKey(ToastUI::class)
abstract fun bindToastUI(service: ToastUI): CoreStartable
/** Inject into MediaOutputSwitcherDialogUI. */
@Binds
@IntoMap
@ClassKey(MediaOutputSwitcherDialogUI::class)
abstract fun MediaOutputSwitcherDialogUI(sysui: MediaOutputSwitcherDialogUI): CoreStartable
/** Inject into VolumeUI. */
@Binds
@IntoMap

View File

@@ -532,6 +532,11 @@ object Flags {
@JvmField
val OUTPUT_SWITCHER_DEVICE_STATUS = unreleasedFlag(2502, "output_switcher_device_status")
// TODO(b/20911786): Tracking Bug
@JvmField
val OUTPUT_SWITCHER_SHOW_API_ENABLED =
unreleasedFlag(2503, "output_switcher_show_api_enabled", teamfood = true)
// TODO(b259590361): Tracking bug
val EXPERIMENTAL_FLAG = unreleasedFlag(2, "exp_flag_release")
}

View File

@@ -0,0 +1,71 @@
/*
* Copyright (C) 2023 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 com.android.systemui.media.dialog;
import android.annotation.MainThread;
import android.content.Context;
import android.text.TextUtils;
import android.util.Log;
import com.android.systemui.CoreStartable;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.flags.FeatureFlags;
import com.android.systemui.flags.Flags;
import com.android.systemui.statusbar.CommandQueue;
import javax.inject.Inject;
/** Controls display of media output switcher. */
@SysUISingleton
public class MediaOutputSwitcherDialogUI implements CoreStartable, CommandQueue.Callbacks {
private static final String TAG = "MediaOutputSwitcherDialogUI";
private final CommandQueue mCommandQueue;
private final MediaOutputDialogFactory mMediaOutputDialogFactory;
private final FeatureFlags mFeatureFlags;
@Inject
public MediaOutputSwitcherDialogUI(
Context context,
CommandQueue commandQueue,
MediaOutputDialogFactory mediaOutputDialogFactory,
FeatureFlags featureFlags) {
mCommandQueue = commandQueue;
mMediaOutputDialogFactory = mediaOutputDialogFactory;
mFeatureFlags = featureFlags;
}
@Override
public void start() {
if (mFeatureFlags.isEnabled(Flags.OUTPUT_SWITCHER_SHOW_API_ENABLED)) {
mCommandQueue.addCallback(this);
} else {
Log.w(TAG, "Show media output switcher is not enabled.");
}
}
@Override
@MainThread
public void showMediaOutputSwitcher(String packageName) {
if (!TextUtils.isEmpty(packageName)) {
mMediaOutputDialogFactory.create(packageName, false, null);
} else {
Log.e(TAG, "Unable to launch media output dialog. Package name is empty.");
}
}
}

View File

@@ -45,12 +45,14 @@ import android.hardware.fingerprint.IUdfpsHbmListener;
import android.inputmethodservice.InputMethodService.BackDispositionMode;
import android.media.INearbyMediaDevicesProvider;
import android.media.MediaRoute2Info;
import android.os.Binder;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.os.ParcelFileDescriptor;
import android.os.Process;
import android.os.RemoteException;
import android.util.Pair;
import android.util.SparseArray;
@@ -168,6 +170,7 @@ public class CommandQueue extends IStatusBar.Stub implements
private static final int MSG_SHOW_REAR_DISPLAY_DIALOG = 69 << MSG_SHIFT;
private static final int MSG_GO_TO_FULLSCREEN_FROM_SPLIT = 70 << MSG_SHIFT;
private static final int MSG_ENTER_STAGE_SPLIT_FROM_RUNNING_APP = 71 << MSG_SHIFT;
private static final int MSG_SHOW_MEDIA_OUTPUT_SWITCHER = 72 << MSG_SHIFT;
public static final int FLAG_EXCLUDE_NONE = 0;
public static final int FLAG_EXCLUDE_SEARCH_PANEL = 1 << 0;
@@ -492,6 +495,11 @@ public class CommandQueue extends IStatusBar.Stub implements
* @see IStatusBar#enterStageSplitFromRunningApp
*/
default void enterStageSplitFromRunningApp(boolean leftOrTop) {}
/**
* @see IStatusBar#showMediaOutputSwitcher
*/
default void showMediaOutputSwitcher(String packageName) {}
}
public CommandQueue(Context context) {
@@ -1261,6 +1269,19 @@ public class CommandQueue extends IStatusBar.Stub implements
}
}
@Override
public void showMediaOutputSwitcher(String packageName) {
int callingUid = Binder.getCallingUid();
if (callingUid != 0 && callingUid != Process.SYSTEM_UID) {
throw new SecurityException("Call only allowed from system server.");
}
synchronized (mLock) {
SomeArgs args = SomeArgs.obtain();
args.arg1 = packageName;
mHandler.obtainMessage(MSG_SHOW_MEDIA_OUTPUT_SWITCHER, args).sendToTarget();
}
}
@Override
public void requestAddTile(
@NonNull ComponentName componentName,
@@ -1777,6 +1798,13 @@ public class CommandQueue extends IStatusBar.Stub implements
mCallbacks.get(i).enterStageSplitFromRunningApp((Boolean) msg.obj);
}
break;
case MSG_SHOW_MEDIA_OUTPUT_SWITCHER:
args = (SomeArgs) msg.obj;
String clientPackageName = (String) args.arg1;
for (int i = 0; i < mCallbacks.size(); i++) {
mCallbacks.get(i).showMediaOutputSwitcher(clientPackageName);
}
break;
}
}
}

View File

@@ -191,4 +191,12 @@ public interface StatusBarManagerInternal {
* @see com.android.internal.statusbar.IStatusBar#enterStageSplitFromRunningApp
*/
void enterStageSplitFromRunningApp(boolean leftOrTop);
/**
* Shows the media output switcher dialog.
*
* @param packageName of the session for which the output switcher is shown.
* @see com.android.internal.statusbar.IStatusBar#showMediaOutputSwitcher
*/
void showMediaOutputSwitcher(String packageName);
}

View File

@@ -714,6 +714,16 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D
} catch (RemoteException ex) { }
}
}
@Override
public void showMediaOutputSwitcher(String packageName) {
if (mBar != null) {
try {
mBar.showMediaOutputSwitcher(packageName);
} catch (RemoteException ex) {
}
}
}
};
private final GlobalActionsProvider mGlobalActionsProvider = new GlobalActionsProvider() {