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

Commit e4eb0821 authored by Andre Le's avatar Andre Le
Browse files

CastDetailsView: Use controller content manager within the details view

Create an instance of MediaRouteControllerContentManager within
CastDetailsContent to manages showing the content of the cast controller
when needed.

Bug: 378514236
Flag: com.android.systemui.qs_tile_detailed_view
Test: CastTileTest
Test: Click on cast tile in the QS -> the cast controller show up
correctly in the details view

Change-Id: Ib4e956857a423cb8e8eef24b2ddda2f04c3d16c3
parent 43a6a234
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -86,10 +86,7 @@ public abstract class MediaRouteDialogPresenter {
    public static Dialog createDialog(Context context, int routeTypes,
            View.OnClickListener extendedSettingsClickListener, int theme,
            boolean showProgressBarWhenEmpty) {
        final MediaRouter router = context.getSystemService(MediaRouter.class);

        MediaRouter.RouteInfo route = router.getSelectedRoute();
        if (route.isDefault() || !route.matchesTypes(routeTypes)) {
        if (shouldShowChooserDialog(context, routeTypes)) {
            final MediaRouteChooserDialog d = new MediaRouteChooserDialog(context, theme,
                    showProgressBarWhenEmpty);
            d.setRouteTypes(routeTypes);
@@ -99,4 +96,11 @@ public abstract class MediaRouteDialogPresenter {
            return new MediaRouteControllerDialog(context, theme);
        }
    }

    /** Whether we should show the chooser dialog or the controller dialog.. */
    public static boolean shouldShowChooserDialog(Context context, int routeTypes) {
        final MediaRouter router = context.getSystemService(MediaRouter.class);
        MediaRouter.RouteInfo route = router.getSelectedRoute();
        return route.isDefault() || !route.matchesTypes(routeTypes);
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -133,7 +133,7 @@ private fun MapTileDetailsContent(tileDetailsViewModel: TileDetailsViewModel) {
        is BluetoothDetailsViewModel ->
            BluetoothDetailsContent(tileDetailsViewModel.detailsContentViewModel)
        is ModesDetailsViewModel -> ModesDetailsContent(tileDetailsViewModel)
        is CastDetailsViewModel -> CastDetailsContent()
        is CastDetailsViewModel -> CastDetailsContent(tileDetailsViewModel)
    }
}

+2 −1
Original line number Diff line number Diff line
@@ -192,7 +192,8 @@ public class CastTile extends QSTileImpl<BooleanState> {

    @Override
    public boolean getDetailsViewModel(Consumer<TileDetailsViewModel> callback) {
        CastDetailsViewModel viewModel = mCastDetailsViewModelFactory.create();
        CastDetailsViewModel viewModel = mCastDetailsViewModelFactory
                .create(mShadeDialogContextInteractor.getContext(), ROUTE_TYPE_REMOTE_DISPLAY);
        handleClick(() -> {
            if (!mKeyguard.isShowing()) {
                callback.accept(viewModel);
+19 −3
Original line number Diff line number Diff line
@@ -20,18 +20,34 @@ import android.view.LayoutInflater
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.viewinterop.AndroidView
import com.android.internal.R
import com.android.internal.app.MediaRouteControllerContentManager

@Composable
fun CastDetailsContent() {
    // TODO(b/378514236): Finish implementing this function.
fun CastDetailsContent(castDetailsViewModel: CastDetailsViewModel) {
    if (castDetailsViewModel.shouldShowChooserDialog()) {
        // TODO(b/378514236): Show the chooser UI here.
        return
    }

    val contentManager: MediaRouteControllerContentManager = remember {
        castDetailsViewModel.createControllerContentManager()
    }

    AndroidView(
        modifier = Modifier.fillMaxWidth().fillMaxHeight(),
        factory = { context ->
            // Inflate with the existing dialog xml layout
            val view =
                LayoutInflater.from(context).inflate(R.layout.media_route_controller_dialog, null)
            contentManager.bindViews(view)
            contentManager.onAttachedToWindow()

            view
        },
        onRelease = { contentManager.onDetachedFromWindow() },
    )
}
+31 −3
Original line number Diff line number Diff line
@@ -16,21 +16,37 @@

package com.android.systemui.qs.tiles.dialog

import android.content.Context
import android.content.Intent
import android.graphics.drawable.Drawable
import android.provider.Settings
import com.android.internal.app.MediaRouteControllerContentManager
import com.android.internal.app.MediaRouteDialogPresenter
import com.android.systemui.plugins.qs.TileDetailsViewModel
import com.android.systemui.qs.tiles.base.actions.QSTileIntentUserInputHandler
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject

/** The view model used for the screen record details view in the Quick Settings */
class CastDetailsViewModel
@AssistedInject
constructor(private val qsTileIntentUserActionHandler: QSTileIntentUserInputHandler) :
    TileDetailsViewModel {
constructor(
    private val qsTileIntentUserActionHandler: QSTileIntentUserInputHandler,
    @Assisted private val context: Context,
    @Assisted private val routeTypes: Int,
) : MediaRouteControllerContentManager.Delegate, TileDetailsViewModel {
    @AssistedFactory
    fun interface Factory {
        fun create(): CastDetailsViewModel
        fun create(context: Context, routeTypes: Int): CastDetailsViewModel
    }

    fun shouldShowChooserDialog(): Boolean {
        return MediaRouteDialogPresenter.shouldShowChooserDialog(context, routeTypes)
    }

    fun createControllerContentManager(): MediaRouteControllerContentManager {
        return MediaRouteControllerContentManager(context, this)
    }

    override fun clickOnSettingsButton() {
@@ -47,4 +63,16 @@ constructor(private val qsTileIntentUserActionHandler: QSTileIntentUserInputHand
    // TODO(b/388321032): Replace this string with a string in a translatable xml file,
    override val subTitle: String
        get() = "Searching for devices..."

    override fun setMediaRouteDeviceTitle(title: CharSequence?) {
        // TODO(b/378514236): Finish implementing this function.
    }

    override fun setMediaRouteDeviceIcon(icon: Drawable?) {
        // TODO(b/378514236): Finish implementing this function.
    }

    override fun dismissView() {
        // TODO(b/378514236): Finish implementing this function.
    }
}