Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3cea72fb authored by tim peng's avatar tim peng Committed by Android (Google) Code Review
Browse files

Merge changes from topic "media_output_dialog" into rvc-qpr-dev

* changes:
  Redirect to output switcher panel to the new dialog
  Update rule of launching media output dialog
  Update OutputSwitcher from MediaOutputSlice to MediaOutputDialog in Settings
  Add PairNewBluetoothReceiver to launch Bluetooth pairing page
parents de2f2754 7207584d
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -3412,6 +3412,15 @@
                       android:value="com.android.settings.sound.MediaControlsSettings" />
        </activity>

        <receiver
            android:name=".media.BluetoothPairingReceiver"
            android:exported="true"
            android:permission="android.permission.BLUETOOTH_ADMIN">
            <intent-filter>
                <action android:name="com.android.settings.action.LAUNCH_BLUETOOTH_PAIRING"/>
            </intent-filter>/>
        </receiver>

        <!-- This is the longest AndroidManifest.xml ever. -->
    </application>
</manifest>
+46 −0
Original line number Diff line number Diff line
/*
 * 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 com.android.settings.media;

import android.app.settings.SettingsEnums;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.text.TextUtils;

import com.android.settings.R;
import com.android.settings.bluetooth.BluetoothPairingDetail;
import com.android.settings.core.SubSettingLauncher;
import com.android.settingslib.media.MediaOutputSliceConstants;

/**
 * BroadcastReceiver for handling media output intent
 */
public class BluetoothPairingReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (TextUtils.equals(MediaOutputSliceConstants.ACTION_LAUNCH_BLUETOOTH_PAIRING,
                intent.getAction())) {
            context.startActivity(new SubSettingLauncher(context)
                    .setDestination(BluetoothPairingDetail.class.getName())
                    .setTitleRes(R.string.bluetooth_pairing_page_title)
                    .setSourceMetricsCategory(SettingsEnums.BLUETOOTH_PAIRING_RECEIVER)
                    .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)
                    .toIntent());
        }
    }
}
+26 −28
Original line number Diff line number Diff line
@@ -16,18 +16,15 @@

package com.android.settings.media;

import static android.app.PendingIntent.FLAG_UPDATE_CURRENT;

import static com.android.settings.slices.CustomSliceRegistry.MEDIA_OUTPUT_INDICATOR_SLICE_URI;

import android.annotation.ColorInt;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.media.session.MediaController;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;

import androidx.annotation.VisibleForTesting;
import androidx.core.graphics.drawable.IconCompat;
@@ -63,14 +60,9 @@ public class MediaOutputIndicatorSlice implements CustomSliceable {
                com.android.internal.R.drawable.ic_settings_bluetooth);
        final CharSequence title = mContext.getString(R.string.media_output_label_title,
                Utils.getApplicationLabel(mContext, getWorker().getPackageName()));
        final int requestCode = TextUtils.isEmpty(getWorker().getPackageName())
                ? 0
                : getWorker().getPackageName().hashCode();
        final PendingIntent primaryActionIntent = PendingIntent.getActivity(mContext,
                requestCode,
                getMediaOutputSliceIntent(), FLAG_UPDATE_CURRENT);
        final SliceAction primarySliceAction = SliceAction.createDeeplink(
                primaryActionIntent, icon, ListBuilder.ICON_IMAGE, title);
        final SliceAction primarySliceAction = SliceAction.create(
                getBroadcastIntent(mContext), icon, ListBuilder.ICON_IMAGE, title);

        @ColorInt final int color = Utils.getColorAccentDefaultColor(mContext);
        // To set an empty icon to indent the row
        final ListBuilder listBuilder = new ListBuilder(mContext, getUri(), ListBuilder.INFINITY)
@@ -83,22 +75,6 @@ public class MediaOutputIndicatorSlice implements CustomSliceable {
        return listBuilder.build();
    }

    @VisibleForTesting
    Intent getMediaOutputSliceIntent() {
        final MediaController mediaController = getWorker().getActiveLocalMediaController();
        final Intent intent = new Intent()
                .setPackage(Utils.SETTINGS_PACKAGE_NAME)
                .setAction(MediaOutputSliceConstants.ACTION_MEDIA_OUTPUT)
                .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        if (mediaController != null) {
            intent.putExtra(MediaOutputSliceConstants.KEY_MEDIA_SESSION_TOKEN,
                    mediaController.getSessionToken());
            intent.putExtra(MediaOutputSliceConstants.EXTRA_PACKAGE_NAME,
                    mediaController.getPackageName());
        }
        return intent;
    }

    private IconCompat createEmptyIcon() {
        final Bitmap bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
        return IconCompat.createWithBitmap(bitmap);
@@ -141,4 +117,26 @@ public class MediaOutputIndicatorSlice implements CustomSliceable {
                && getWorker().getMediaDevices().size() > 0
                && getWorker().getActiveLocalMediaController() != null;
    }

    @Override
    public void onNotifyChange(Intent intent) {
        final MediaController mediaController = getWorker().getActiveLocalMediaController();

        if (mediaController == null) {
            Log.d(TAG, "No active local media controller");
            return;
        }
        // Launch media output dialog
        mContext.sendBroadcast(new Intent()
                .setPackage(MediaOutputSliceConstants.SYSTEMUI_PACKAGE_NAME)
                .setAction(MediaOutputSliceConstants.ACTION_LAUNCH_MEDIA_OUTPUT_DIALOG)
                .putExtra(MediaOutputSliceConstants.KEY_MEDIA_SESSION_TOKEN,
                        mediaController.getSessionToken())
                .putExtra(MediaOutputSliceConstants.EXTRA_PACKAGE_NAME,
                        mediaController.getPackageName()));
        // Dismiss volume panel
        mContext.sendBroadcast(new Intent()
                .setPackage(MediaOutputSliceConstants.SETTINGS_PACKAGE_NAME)
                .setAction(MediaOutputSliceConstants.ACTION_CLOSE_PANEL));
    }
}
+32 −17
Original line number Diff line number Diff line
@@ -59,6 +59,9 @@ public class RemoteMediaSlice implements CustomSliceable {

    private static final String TAG = "RemoteMediaSlice";
    private static final String MEDIA_ID = "media_id";
    private static final String ACTION_LAUNCH_DIALOG = "action_launch_dialog";
    private static final String SESSION_INFO = "RoutingSessionInfo";
    private static final String CUSTOMIZED_ACTION = "customized_action";

    private final Context mContext;

@@ -77,6 +80,20 @@ public class RemoteMediaSlice implements CustomSliceable {
        final String id = intent.getStringExtra(MEDIA_ID);
        if (!TextUtils.isEmpty(id)) {
            getWorker().adjustSessionVolume(id, newPosition);
            return;
        }
        if (TextUtils.equals(ACTION_LAUNCH_DIALOG, intent.getStringExtra(CUSTOMIZED_ACTION))) {
            // Launch Media Output Dialog
            final RoutingSessionInfo info = intent.getParcelableExtra(SESSION_INFO);
            mContext.sendBroadcast(new Intent()
                    .setPackage(MediaOutputSliceConstants.SYSTEMUI_PACKAGE_NAME)
                    .setAction(MediaOutputSliceConstants.ACTION_LAUNCH_MEDIA_OUTPUT_DIALOG)
                    .putExtra(MediaOutputSliceConstants.EXTRA_PACKAGE_NAME,
                            info.getClientPackageName()));
            // Dismiss volume panel
            mContext.sendBroadcast(new Intent()
                    .setPackage(MediaOutputSliceConstants.SETTINGS_PACKAGE_NAME)
                    .setAction(MediaOutputSliceConstants.ACTION_CLOSE_PANEL));
        }
    }

@@ -133,8 +150,7 @@ public class RemoteMediaSlice implements CustomSliceable {
                    .setTitle(isMediaOutputDisabled ? spannableTitle : outputTitle)
                    .setSubtitle(info.getName())
                    .setTitleItem(emptyIcon, ListBuilder.ICON_IMAGE)
                    .setPrimaryAction(getMediaOutputSliceAction(
                            info.getClientPackageName(), isMediaOutputDisabled)));
                    .setPrimaryAction(getMediaOutputDialogAction(info, isMediaOutputDisabled)));
        }
        return listBuilder.build();
    }
@@ -167,23 +183,22 @@ public class RemoteMediaSlice implements CustomSliceable {
        return primarySliceAction;
    }

    private SliceAction getMediaOutputSliceAction(
            String packageName, boolean isMediaOutputDisabled) {
        final Intent intent = new Intent()
                .setAction(isMediaOutputDisabled
                        ? ""
                        : MediaOutputSliceConstants.ACTION_MEDIA_OUTPUT)
                .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                .putExtra(MediaOutputSliceConstants.EXTRA_PACKAGE_NAME, packageName);
        final IconCompat icon = IconCompat.createWithResource(mContext,
                R.drawable.ic_volume_remote);
        final int requestCode = TextUtils.isEmpty(packageName) ? 0 : packageName.hashCode();
        final PendingIntent primaryActionIntent = PendingIntent.getActivity(mContext,
                requestCode, intent, 0 /* flags */);
    private SliceAction getMediaOutputDialogAction(RoutingSessionInfo info,
            boolean isMediaOutputDisabled) {
        final Intent intent = new Intent(getUri().toString())
                .setData(getUri())
                .setClass(mContext, SliceBroadcastReceiver.class)
                .putExtra(CUSTOMIZED_ACTION, isMediaOutputDisabled ? "" : ACTION_LAUNCH_DIALOG)
                .putExtra(SESSION_INFO, info)
                .addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
        final PendingIntent primaryBroadcastIntent = PendingIntent.getBroadcast(mContext,
                info.hashCode(), intent, PendingIntent.FLAG_UPDATE_CURRENT);
        final SliceAction primarySliceAction = SliceAction.createDeeplink(
                primaryActionIntent, icon, ListBuilder.ICON_IMAGE,
                primaryBroadcastIntent,
                IconCompat.createWithResource(mContext, R.drawable.ic_volume_remote),
                ListBuilder.ICON_IMAGE,
                mContext.getString(R.string.media_output_label_title,
                        Utils.getApplicationLabel(mContext, packageName)));
                        Utils.getApplicationLabel(mContext, info.getClientPackageName())));
        return primarySliceAction;
    }

+3 −3
Original line number Diff line number Diff line
@@ -196,11 +196,11 @@ public class RemoteVolumeGroupController extends BasePreferenceController implem
            if (TextUtils.equals(info.getId(),
                    preference.getKey().substring(SWITCHER_PREFIX.length()))) {
                final Intent intent = new Intent()
                        .setAction(MediaOutputSliceConstants.ACTION_MEDIA_OUTPUT)
                        .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                        .setAction(MediaOutputSliceConstants.ACTION_LAUNCH_MEDIA_OUTPUT_DIALOG)
                        .setPackage(MediaOutputSliceConstants.SYSTEMUI_PACKAGE_NAME)
                        .putExtra(MediaOutputSliceConstants.EXTRA_PACKAGE_NAME,
                                info.getClientPackageName());
                mContext.startActivity(intent);
                mContext.sendBroadcast(intent);
                return true;
            }
        }
Loading