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

Commit 4a9d8843 authored by Dave Mankoff's avatar Dave Mankoff
Browse files

9/N Remove MediaHost from QSPanel

QSPanel no longer requires a MediaHost to be injected.

Bug: 168904199
Test: atest SystemUITests

Change-Id: I6f8c54bb8a1276885cd4617c7d66e1b5f2648153
parent 026e127e
Loading
Loading
Loading
Loading
+6 −5
Original line number Diff line number Diff line
@@ -17,7 +17,6 @@
package com.android.systemui.qs;

import static android.app.StatusBarManager.DISABLE2_QUICK_SETTINGS;
import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;

import android.content.Context;
import android.content.res.Configuration;
@@ -184,7 +183,8 @@ public class QSContainerImpl extends FrameLayout {
        mBackground.setVisibility(mQsDisabled ? View.GONE : View.VISIBLE);
    }

    void updateResources(QSPanelController qsPanelController) {
    void updateResources(QSPanelController qsPanelController,
            QuickStatusBarHeaderController quickStatusBarHeaderController) {
        LayoutParams layoutParams = (LayoutParams) mQSPanelContainer.getLayoutParams();
        layoutParams.topMargin = mContext.getResources().getDimensionPixelSize(
                com.android.internal.R.dimen.quick_qs_offset_height);
@@ -196,7 +196,7 @@ public class QSContainerImpl extends FrameLayout {
        boolean marginsChanged = padding != mContentPadding;
        mContentPadding = padding;
        if (marginsChanged) {
            updatePaddingsAndMargins(qsPanelController);
            updatePaddingsAndMargins(qsPanelController, quickStatusBarHeaderController);
        }
    }

@@ -252,7 +252,8 @@ public class QSContainerImpl extends FrameLayout {
        updateExpansion();
    }

    private void updatePaddingsAndMargins(QSPanelController qsPanelController) {
    private void updatePaddingsAndMargins(QSPanelController qsPanelController,
            QuickStatusBarHeaderController quickStatusBarHeaderController) {
        for (int i = 0; i < getChildCount(); i++) {
            View view = getChildAt(i);
            if (view == mQSCustomizer) {
@@ -271,7 +272,7 @@ public class QSContainerImpl extends FrameLayout {
            } else if (view == mHeader) {
                // The header contains the QQS panel which needs to have special padding, to
                // visually align them.
                mHeader.setContentMargins(mContentPadding, mContentPadding);
                quickStatusBarHeaderController.setContentMargins(mContentPadding, mContentPadding);
            } else {
                view.setPaddingRelative(
                        mContentPadding,
+2 −2
Original line number Diff line number Diff line
@@ -35,7 +35,7 @@ public class QSContainerImplController extends ViewController<QSContainerImpl> {
            new ConfigurationController.ConfigurationListener() {
        @Override
        public void onConfigChanged(Configuration newConfig) {
            mView.updateResources(mQsPanelController);
            mView.updateResources(mQsPanelController, mQuickStatusBarHeaderController);
        }
    };

@@ -60,7 +60,7 @@ public class QSContainerImplController extends ViewController<QSContainerImpl> {

    @Override
    protected void onViewAttached() {
        mView.updateResources(mQsPanelController);
        mView.updateResources(mQsPanelController, mQuickStatusBarHeaderController);
        mQsPanelController.setMediaVisibilityChangedListener((visible) -> {
            if (mQsPanelController.isShown()) {
                mView.onMediaVisibilityChanged(true);
+49 −104
Original line number Diff line number Diff line
@@ -16,7 +16,6 @@

package com.android.systemui.qs;

import static com.android.systemui.media.dagger.MediaModule.QS_PANEL;
import static com.android.systemui.util.InjectionInflationController.VIEW_CONTEXT;
import static com.android.systemui.util.Utils.useQsMediaPlayer;

@@ -42,7 +41,6 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.widget.RemeasuringLinearLayout;
import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.media.MediaHost;
import com.android.systemui.plugins.qs.DetailAdapter;
import com.android.systemui.plugins.qs.QSTile;
import com.android.systemui.qs.logging.QSLogger;
@@ -50,7 +48,6 @@ import com.android.systemui.settings.brightness.BrightnessSlider;
import com.android.systemui.statusbar.policy.BrightnessMirrorController;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.tuner.TunerService.Tunable;
import com.android.systemui.util.animation.DisappearParameters;

import java.util.ArrayList;
import java.util.List;
@@ -68,7 +65,6 @@ public class QSPanel extends LinearLayout implements Tunable {
    private static final String TAG = "QSPanel";

    protected final Context mContext;
    private final MediaHost mMediaHost;

    /**
     * The index where the content starts that needs to be moved between parents
@@ -135,14 +131,12 @@ public class QSPanel extends LinearLayout implements Tunable {
            @Named(VIEW_CONTEXT) Context context,
            AttributeSet attrs,
            QSLogger qsLogger,
            @Named(QS_PANEL) MediaHost mediaHost,
            UiEventLogger uiEventLogger
    ) {
        super(context, attrs);
        mUsingMediaPlayer = useQsMediaPlayer(context);
        mMediaTotalBottomMargin = getResources().getDimensionPixelSize(
                R.dimen.quick_settings_bottom_margin_media);
        mMediaHost = mediaHost;
        mContext = context;
        mQSLogger = qsLogger;
        mUiEventLogger = uiEventLogger;
@@ -213,36 +207,6 @@ public class QSPanel extends LinearLayout implements Tunable {
        return createRegularTileLayout();
    }

    /**
     * Update the way the media disappears based on if we're using the horizontal layout
     */
    void updateMediaDisappearParameters() {
        if (!mUsingMediaPlayer) {
            return;
        }
        DisappearParameters parameters = mMediaHost.getDisappearParameters();
        if (mUsingHorizontalLayout) {
            // Only height remaining
            parameters.getDisappearSize().set(0.0f, 0.4f);
            // Disappearing on the right side on the bottom
            parameters.getGonePivot().set(1.0f, 1.0f);
            // translating a bit horizontal
            parameters.getContentTranslationFraction().set(0.25f, 1.0f);
            parameters.setDisappearEnd(0.6f);
        } else {
            // Only width remaining
            parameters.getDisappearSize().set(1.0f, 0.0f);
            // Disappearing on the bottom
            parameters.getGonePivot().set(0.0f, 1.0f);
            // translating a bit vertical
            parameters.getContentTranslationFraction().set(0.0f, 1.05f);
            parameters.setDisappearEnd(0.95f);
        }
        parameters.setFadeStartPosition(0.95f);
        parameters.setDisappearStart(0.0f);
        mMediaHost.setDisappearParameters(parameters);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        if (mTileLayout instanceof PagedTileLayout) {
@@ -403,56 +367,6 @@ public class QSPanel extends LinearLayout implements Tunable {
        mDivider = findViewById(R.id.divider);
    }

    boolean switchTileLayout(boolean force, List<QSPanelControllerBase.TileRecord> records) {
        /** Whether or not the QuickQSPanel currently contains a media player. */
        boolean horizontal = shouldUseHorizontalLayout();
        if (mDivider != null) {
            if (!horizontal && mUsingMediaPlayer && mMediaHost.getVisible()) {
                mDivider.setVisibility(View.VISIBLE);
            } else {
                mDivider.setVisibility(View.GONE);
            }
        }
        if (horizontal != mUsingHorizontalLayout || force) {
            mUsingHorizontalLayout = horizontal;
            View visibleView = horizontal ? mHorizontalLinearLayout : (View) mRegularTileLayout;
            View hiddenView = horizontal ? (View) mRegularTileLayout : mHorizontalLinearLayout;
            ViewGroup newParent = horizontal ? mHorizontalContentContainer : this;
            QSTileLayout newLayout = horizontal ? mHorizontalTileLayout : mRegularTileLayout;
            if (hiddenView != null &&
                    (mRegularTileLayout != mHorizontalTileLayout ||
                            hiddenView != mRegularTileLayout)) {
                // Only hide the view if the horizontal and the regular view are different,
                // otherwise its reattached.
                hiddenView.setVisibility(View.GONE);
            }
            visibleView.setVisibility(View.VISIBLE);
            switchAllContentToParent(newParent, newLayout);
            reAttachMediaHost();
            if (mTileLayout != null) {
                mTileLayout.setListening(false);
                for (QSPanelControllerBase.TileRecord record : records) {
                    mTileLayout.removeTile(record);
                    record.tile.removeCallback(record.callback);
                }
            }
            mTileLayout = newLayout;
            if (needsDynamicRowsAndColumns()) {
                newLayout.setMinRows(horizontal ? 2 : 1);
                // Let's use 3 columns to match the current layout
                newLayout.setMaxColumns(horizontal ? 3 : TileLayout.NO_MAX_COLUMNS);
            }
            updateTileLayoutMargins();
            updateFooterMargin();
            updateDividerMargin();
            updateMediaDisappearParameters();
            updateMediaHostContentMargins();
            updateHorizontalLinearLayoutMargins();
            updatePadding();
            return true;
        }
        return false;
    }

    /**
     * Sets the listening state of the current layout to the state of the view. Used after
@@ -524,27 +438,19 @@ public class QSPanel extends LinearLayout implements Tunable {
        }
    }

    private boolean shouldUseHorizontalLayout() {
        return mUsingMediaPlayer && mMediaHost.getVisible()
                && getResources().getConfiguration().orientation
                == Configuration.ORIENTATION_LANDSCAPE;
    }

    protected void reAttachMediaHost() {
    /** Call when orientation has changed and MediaHost needs to be adjusted. */
    private void reAttachMediaHost(ViewGroup hostView, boolean horizontal) {
        if (!mUsingMediaPlayer) {
            return;
        }
        boolean horizontal = shouldUseHorizontalLayout();
        ViewGroup host = mMediaHost.getHostView();

        ViewGroup newParent = horizontal ? mHorizontalLinearLayout : this;
        ViewGroup currentParent = (ViewGroup) host.getParent();
        ViewGroup currentParent = (ViewGroup) hostView.getParent();
        if (currentParent != newParent) {
            if (currentParent != null) {
                currentParent.removeView(host);
                currentParent.removeView(hostView);
            }
            newParent.addView(host);
            LinearLayout.LayoutParams layoutParams = (LayoutParams) host.getLayoutParams();
            newParent.addView(hostView);
            LinearLayout.LayoutParams layoutParams = (LayoutParams) hostView.getLayoutParams();
            layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT;
            layoutParams.width = horizontal ? 0 : ViewGroup.LayoutParams.MATCH_PARENT;
            layoutParams.weight = horizontal ? 1.2f : 0;
@@ -763,14 +669,15 @@ public class QSPanel extends LinearLayout implements Tunable {
        return mDivider;
    }

    public void setContentMargins(int startMargin, int endMargin) {
    /** */
    public void setContentMargins(int startMargin, int endMargin, ViewGroup mediaHostView) {
        // Only some views actually want this content padding, others want to go all the way
        // to the edge like the brightness slider
        mContentMarginStart = startMargin;
        mContentMarginEnd = endMargin;
        updateTileLayoutMargins(mContentMarginStart - mVisualTilePadding,
                mContentMarginEnd - mVisualTilePadding);
        updateMediaHostContentMargins();
        updateMediaHostContentMargins(mediaHostView);
        updateFooterMargin();
        updateDividerMargin();
    }
@@ -826,13 +733,13 @@ public class QSPanel extends LinearLayout implements Tunable {
    /**
     * Update the margins of the media hosts
     */
    protected void updateMediaHostContentMargins() {
    protected void updateMediaHostContentMargins(ViewGroup mediaHostView) {
        if (mUsingMediaPlayer) {
            int marginStart = mContentMarginStart;
            if (mUsingHorizontalLayout) {
                marginStart = 0;
            }
            updateMargins(mMediaHost.getHostView(), marginStart, mContentMarginEnd);
            updateMargins(mediaHostView, marginStart, mContentMarginEnd);
        }
    }

@@ -871,6 +778,44 @@ public class QSPanel extends LinearLayout implements Tunable {
        mSecurityFooter = view;
    }

    void setUsingHorizontalLayout(boolean horizontal, ViewGroup mediaHostView, boolean force) {
        if (horizontal != mUsingHorizontalLayout || force) {
            mUsingHorizontalLayout = horizontal;
            View visibleView = horizontal ? mHorizontalLinearLayout : (View) mRegularTileLayout;
            View hiddenView = horizontal ? (View) mRegularTileLayout : mHorizontalLinearLayout;
            ViewGroup newParent = horizontal ? mHorizontalContentContainer : this;
            QSPanel.QSTileLayout newLayout = horizontal
                    ? mHorizontalTileLayout : mRegularTileLayout;
            if (hiddenView != null
                    && (mRegularTileLayout != mHorizontalTileLayout
                    || hiddenView != mRegularTileLayout)) {
                // Only hide the view if the horizontal and the regular view are different,
                // otherwise its reattached.
                hiddenView.setVisibility(View.GONE);
            }
            visibleView.setVisibility(View.VISIBLE);
            switchAllContentToParent(newParent, newLayout);
            reAttachMediaHost(mediaHostView, horizontal);
            mTileLayout = newLayout;
            newLayout.setListening(mListening);
            if (needsDynamicRowsAndColumns()) {
                newLayout.setMinRows(horizontal ? 2 : 1);
                // Let's use 3 columns to match the current layout
                newLayout.setMaxColumns(horizontal ? 3 : TileLayout.NO_MAX_COLUMNS);
            }
            updateMargins(mediaHostView);
        }
    }

    private void updateMargins(ViewGroup mediaHostView) {
        updateTileLayoutMargins();
        updateFooterMargin();
        updateDividerMargin();
        updateMediaHostContentMargins(mediaHostView);
        updateHorizontalLinearLayoutMargins();
        updatePadding();
    }

    private class H extends Handler {
        private static final int SHOW_DETAIL = 1;
        private static final int SET_TILE_VISIBILITY = 2;
+6 −9
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.systemui.qs;

import static com.android.systemui.media.dagger.MediaModule.QS_PANEL;
import static com.android.systemui.qs.QSPanel.QS_SHOW_BRIGHTNESS;
import static com.android.systemui.qs.dagger.QSFragmentModule.QS_USING_MEDIA_PLAYER;

import android.annotation.NonNull;
import android.content.res.Configuration;
@@ -77,13 +78,14 @@ public class QSPanelController extends QSPanelControllerBase<QSPanel> {
    @Inject
    QSPanelController(QSPanel view, QSSecurityFooter qsSecurityFooter, TunerService tunerService,
            QSTileHost qstileHost, QSCustomizerController qsCustomizerController,
            @Named(QS_USING_MEDIA_PLAYER) boolean usingMediaPlayer,
            @Named(QS_PANEL) MediaHost mediaHost,
            QSTileRevealController.Factory qsTileRevealControllerFactory,
            DumpManager dumpManager, MetricsLogger metricsLogger, UiEventLogger uiEventLogger,
            BrightnessController.Factory brightnessControllerFactory,
            BrightnessSlider.Factory brightnessSliderFactory) {
        super(view, qstileHost, qsCustomizerController, mediaHost, metricsLogger, uiEventLogger,
                dumpManager);
        super(view, qstileHost, qsCustomizerController, usingMediaPlayer, mediaHost, metricsLogger,
                uiEventLogger, dumpManager);
        mQsSecurityFooter = qsSecurityFooter;
        mTunerService = tunerService;
        mQsCustomizerController = qsCustomizerController;
@@ -111,7 +113,7 @@ public class QSPanelController extends QSPanelControllerBase<QSPanel> {
    protected void onViewAttached() {
        super.onViewAttached();

        mView.updateMediaDisappearParameters();
        updateMediaDisappearParameters();

        mTunerService.addTunable(mView, QS_SHOW_BRIGHTNESS);
        mView.updateResources();
@@ -142,11 +144,6 @@ public class QSPanelController extends QSPanelControllerBase<QSPanel> {
        super.onViewDetached();
    }

    /** TODO(b/168904199): Remove this method once view is controllerized. */
    QSPanel getView() {
        return mView;
    }

    /**
     * Set the header container of quick settings.
     */
@@ -277,7 +274,7 @@ public class QSPanelController extends QSPanelControllerBase<QSPanel> {

    /** */
    public void setContentMargins(int startMargin, int endMargin) {
        mView.setContentMargins(startMargin, endMargin);
        mView.setContentMargins(startMargin, endMargin, mMediaHost.getHostView());
    }

    /** */
+66 −2
Original line number Diff line number Diff line
@@ -17,10 +17,12 @@
package com.android.systemui.qs;

import static com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import static com.android.systemui.qs.dagger.QSFragmentModule.QS_USING_MEDIA_PLAYER;

import android.content.ComponentName;
import android.content.res.Configuration;
import android.metrics.LogMaker;
import android.view.View;

import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.UiEventLogger;
@@ -32,6 +34,7 @@ import com.android.systemui.plugins.qs.QSTileView;
import com.android.systemui.qs.customize.QSCustomizerController;
import com.android.systemui.qs.external.CustomTile;
import com.android.systemui.util.ViewController;
import com.android.systemui.util.animation.DisappearParameters;

import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -39,6 +42,8 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.stream.Collectors;

import javax.inject.Named;

import kotlin.Unit;
import kotlin.jvm.functions.Function1;

@@ -51,6 +56,7 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr
        implements Dumpable{
    protected final QSTileHost mHost;
    private final QSCustomizerController mQsCustomizerController;
    private final boolean mUsingMediaPlayer;
    protected final MediaHost mMediaHost;
    private final MetricsLogger mMetricsLogger;
    private final UiEventLogger mUiEventLogger;
@@ -81,12 +87,16 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr
        return null;
    };

    private boolean mUsingHorizontalLayout;

    protected QSPanelControllerBase(T view, QSTileHost host,
            QSCustomizerController qsCustomizerController, MediaHost mediaHost,
            QSCustomizerController qsCustomizerController,
            @Named(QS_USING_MEDIA_PLAYER) boolean usingMediaPlayer, MediaHost mediaHost,
            MetricsLogger metricsLogger, UiEventLogger uiEventLogger, DumpManager dumpManager) {
        super(view);
        mHost = host;
        mQsCustomizerController = qsCustomizerController;
        mUsingMediaPlayer = usingMediaPlayer;
        mMediaHost = mediaHost;
        mMetricsLogger = metricsLogger;
        mUiEventLogger = uiEventLogger;
@@ -242,13 +252,67 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr
    }

    boolean switchTileLayout(boolean force) {
        if (mView.switchTileLayout(force, mRecords)) {
        /** Whether or not the QuickQSPanel currently contains a media player. */
        boolean horizontal = shouldUseHorizontalLayout();
        if (mView.getDivider() != null) {
            if (!horizontal && mUsingMediaPlayer && mMediaHost.getVisible()) {
                mView.getDivider().setVisibility(View.VISIBLE);
            } else {
                mView.getDivider().setVisibility(View.GONE);
            }
        }
        if (horizontal != mUsingHorizontalLayout || force) {
            mUsingHorizontalLayout = horizontal;
            for (QSPanelControllerBase.TileRecord record : mRecords) {
                mView.removeTile(record);
                record.tile.removeCallback(record.callback);
            }
            mView.setUsingHorizontalLayout(mUsingHorizontalLayout, mMediaHost.getHostView(), force);
            updateMediaDisappearParameters();

            setTiles();

            return true;
        }
        return false;
    }

    /**
     * Update the way the media disappears based on if we're using the horizontal layout
     */
    void updateMediaDisappearParameters() {
        if (!mUsingMediaPlayer) {
            return;
        }
        DisappearParameters parameters = mMediaHost.getDisappearParameters();
        if (mUsingHorizontalLayout) {
            // Only height remaining
            parameters.getDisappearSize().set(0.0f, 0.4f);
            // Disappearing on the right side on the bottom
            parameters.getGonePivot().set(1.0f, 1.0f);
            // translating a bit horizontal
            parameters.getContentTranslationFraction().set(0.25f, 1.0f);
            parameters.setDisappearEnd(0.6f);
        } else {
            // Only width remaining
            parameters.getDisappearSize().set(1.0f, 0.0f);
            // Disappearing on the bottom
            parameters.getGonePivot().set(0.0f, 1.0f);
            // translating a bit vertical
            parameters.getContentTranslationFraction().set(0.0f, 1.05f);
            parameters.setDisappearEnd(0.95f);
        }
        parameters.setFadeStartPosition(0.95f);
        parameters.setDisappearStart(0.0f);
        mMediaHost.setDisappearParameters(parameters);
    }

    boolean shouldUseHorizontalLayout() {
        return mUsingMediaPlayer && mMediaHost.getVisible()
                && getResources().getConfiguration().orientation
                == Configuration.ORIENTATION_LANDSCAPE;
    }

    private void logTiles() {
        for (int i = 0; i < mRecords.size(); i++) {
            QSTile tile = mRecords.get(i).tile;
Loading