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

Commit 80d0a3b7 authored by Dave Mankoff's avatar Dave Mankoff
Browse files

Stop sharing the QSPanel outside of its Fragment.

Introduce a QSDetailDisplayer that can be injected where it is needed,
and proxies requests through to the QuickSettings as appropriate.

Bug: 168904199
Test: atest SystemUITests
Change-Id: If9c3f173088d4d5337bb2b56defc6ed27befce78
parent 7dbf4ed3
Loading
Loading
Loading
Loading
+45 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 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.systemui.qs;

import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.plugins.qs.DetailAdapter;

import javax.inject.Inject;

/**
 * Proxy class for talking with the QSPanel and showing custom content within it.
 */
@SysUISingleton
public class QSDetailDisplayer {
    private QSPanelController mQsPanelController;

    @Inject
    public QSDetailDisplayer() {
    }

    public void setQsPanelController(QSPanelController qsPanelController) {
        mQsPanelController = qsPanelController;
    }

    /** Show the supplied DetailAdapter in the Quick Settings. */
    public void showDetailAdapter(DetailAdapter detailAdapter, int x, int y) {
        if (mQsPanelController != null) {
            mQsPanelController.showDetailDapater(detailAdapter, x, y);
        }
    }
}
+0 −12
Original line number Diff line number Diff line
@@ -17,22 +17,10 @@ package com.android.systemui.qs;

import android.view.View;

import androidx.annotation.Nullable;

/**
 * The bottom footer of the quick settings panel.
 */
public interface QSFooter {
    /**
     * Sets the given {@link QSPanel} to be the one that will display the quick settings.
     */
    void setQSPanel(@Nullable QSPanel panel);

    /**
     * Sets the given {@link QuickQSPanel} to be the one associated with quick settings.
     */
    default void setQQSPanel(@Nullable QuickQSPanel panel) {};

    /**
     * Sets whether or not the footer should be visible.
     *
+1 −19
Original line number Diff line number Diff line
@@ -59,7 +59,6 @@ public class QSFooterView extends FrameLayout {
    private boolean mShouldShowBuildText;

    private boolean mQsDisabled;
    private QuickQSPanel mQuickQsPanel;

    private boolean mExpanded;

@@ -115,8 +114,6 @@ public class QSFooterView extends FrameLayout {

        updateResources();

        addOnLayoutChangeListener((v, left, top, right, bottom, oldLeft, oldTop, oldRight,
                oldBottom) -> updateAnimator(right - left));
        setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES);
        setBuildText();
    }
@@ -139,9 +136,7 @@ public class QSFooterView extends FrameLayout {
        }
    }

    private void updateAnimator(int width) {
        int numTiles = mQuickQsPanel != null ? mQuickQsPanel.getNumQuickTiles()
                : QuickQSPanel.getDefaultMaxTiles();
    void updateAnimator(int width, int numTiles) {
        int size = mContext.getResources().getDimensionPixelSize(R.dimen.qs_quick_tile_size)
                - mContext.getResources().getDimensionPixelSize(dimen.qs_quick_tile_padding);
        int remaining = (width - numTiles * size) / (numTiles - 1);
@@ -289,19 +284,6 @@ public class QSFooterView extends FrameLayout {
        return mExpanded && mMultiUserSwitch.isMultiUserEnabled();
    }

    /** */
    public void setQSPanel(final QSPanel qsPanel) {
        if (qsPanel != null) {
            mMultiUserSwitch.setQsPanel(qsPanel);
            qsPanel.setFooterPageIndicator(mPageIndicator);
        }
    }

    public void setQQSPanel(@Nullable QuickQSPanel panel) {
        mQuickQsPanel = panel;
    }


    void onUserInfoChanged(Drawable picture, boolean isGuestUser) {
        if (picture != null && isGuestUser && !(picture instanceof UserIconDrawable)) {
            picture = picture.getConstantState().newDrawable(getResources()).mutate();
+18 −16
Original line number Diff line number Diff line
@@ -26,8 +26,6 @@ import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.Nullable;

import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto;
import com.android.keyguard.KeyguardUpdateMonitor;
@@ -35,6 +33,7 @@ import com.android.systemui.R;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.qs.dagger.QSScope;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.phone.MultiUserSwitch;
import com.android.systemui.statusbar.phone.SettingsButton;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
import com.android.systemui.statusbar.policy.UserInfoController;
@@ -55,11 +54,15 @@ public class QSFooterViewController extends ViewController<QSFooterView> impleme
    private final DeviceProvisionedController mDeviceProvisionedController;
    private final UserTracker mUserTracker;
    private final QSPanelController mQsPanelController;
    private final QSDetailDisplayer mQsDetailDisplayer;
    private final QuickQSPanelController mQuickQSPanelController;
    private final TunerService mTunerService;
    private final MetricsLogger mMetricsLogger;
    private final SettingsButton mSettingsButton;
    private final TextView mBuildText;
    private final View mEdit;
    private final MultiUserSwitch mMultiUserSwitch;
    private final PageIndicator mPageIndicator;

    private final UserInfoController.OnUserInfoChangedListener mOnUserInfoChangedListener =
            new UserInfoController.OnUserInfoChangedListener() {
@@ -119,8 +122,9 @@ public class QSFooterViewController extends ViewController<QSFooterView> impleme
    QSFooterViewController(QSFooterView view, UserManager userManager,
            UserInfoController userInfoController, ActivityStarter activityStarter,
            DeviceProvisionedController deviceProvisionedController, UserTracker userTracker,
            QSPanelController qsPanelController, TunerService tunerService,
            MetricsLogger metricsLogger) {
            QSPanelController qsPanelController, QSDetailDisplayer qsDetailDisplayer,
            QuickQSPanelController quickQSPanelController,
            TunerService tunerService, MetricsLogger metricsLogger) {
        super(view);
        mUserManager = userManager;
        mUserInfoController = userInfoController;
@@ -128,17 +132,24 @@ public class QSFooterViewController extends ViewController<QSFooterView> impleme
        mDeviceProvisionedController = deviceProvisionedController;
        mUserTracker = userTracker;
        mQsPanelController = qsPanelController;
        mQsDetailDisplayer = qsDetailDisplayer;
        mQuickQSPanelController = quickQSPanelController;
        mTunerService = tunerService;
        mMetricsLogger = metricsLogger;

        mSettingsButton = mView.findViewById(R.id.settings_button);
        mBuildText = mView.findViewById(R.id.build);
        mEdit = mView.findViewById(android.R.id.edit);
        mMultiUserSwitch = mView.findViewById(R.id.multi_user_switch);
        mPageIndicator = mView.findViewById(R.id.footer_page_indicator);
    }


    @Override
    protected void onViewAttached() {
        mView.addOnLayoutChangeListener(
                (v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) ->
                        mView.updateAnimator(
                                right - left, mQuickQSPanelController.getNumQuickTiles()));
        mSettingsButton.setOnClickListener(mSettingsOnClickListener);
        mBuildText.setOnLongClickListener(view -> {
            CharSequence buildText = mBuildText.getText();
@@ -158,6 +169,8 @@ public class QSFooterViewController extends ViewController<QSFooterView> impleme
                mActivityStarter.postQSRunnableDismissingKeyguard(() ->
                        mQsPanelController.showEdit(view)));

        mMultiUserSwitch.setQSDetailDisplayer(mQsDetailDisplayer);
        mQsPanelController.setFooterPageIndicator(mPageIndicator);
        mView.updateEverything(isTunerEnabled());
    }

@@ -166,12 +179,6 @@ public class QSFooterViewController extends ViewController<QSFooterView> impleme
        setListening(false);
    }


    @Override
    public void setQSPanel(@Nullable QSPanel panel) {
        mView.setQSPanel(panel);
    }

    @Override
    public void setVisibility(int visibility) {
        mView.setVisibility(visibility);
@@ -219,11 +226,6 @@ public class QSFooterViewController extends ViewController<QSFooterView> impleme
        mView.setExpandClickListener(onClickListener);
    }

    @Override
    public void setQQSPanel(@Nullable QuickQSPanel panel) {
        mView.setQQSPanel(panel);
    }

    @Override
    public void disable(int state1, int state2, boolean animate) {
        mView.disable(state2, isTunerEnabled());
+8 −5
Original line number Diff line number Diff line
@@ -80,6 +80,8 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca

    private final RemoteInputQuickSettingsDisabler mRemoteInputQuickSettingsDisabler;
    private final InjectionInflationController mInjectionInflater;
    private final CommandQueue mCommandQueue;
    private final QSDetailDisplayer mQsDetailDisplayer;
    private final QSFragmentComponent.Factory mQsComponentFactory;
    private final QSTileHost mHost;
    private boolean mShowCollapsedOnKeyguard;
@@ -102,9 +104,12 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
    public QSFragment(RemoteInputQuickSettingsDisabler remoteInputQsDisabler,
            InjectionInflationController injectionInflater, QSTileHost qsTileHost,
            StatusBarStateController statusBarStateController, CommandQueue commandQueue,
            QSDetailDisplayer qsDetailDisplayer,
            QSFragmentComponent.Factory qsComponentFactory) {
        mRemoteInputQuickSettingsDisabler = remoteInputQsDisabler;
        mInjectionInflater = injectionInflater;
        mCommandQueue = commandQueue;
        mQsDetailDisplayer = qsDetailDisplayer;
        mQsComponentFactory = qsComponentFactory;
        commandQueue.observe(getLifecycle(), this);
        mHost = qsTileHost;
@@ -144,6 +149,8 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
        mQSPanelController.setHeaderContainer(view.findViewById(R.id.header_text_container));
        mFooter = qsFragmentComponent.getQSFooter();

        mQsDetailDisplayer.setQsPanelController(mQSPanelController);

        mQSContainerImplController = qsFragmentComponent.getQSContainerImplController();
        mQSContainerImplController.init();
        mContainer = mQSContainerImplController.getView();
@@ -183,6 +190,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
            setListening(false);
        }
        mQSCustomizerController.setQs(null);
        mQsDetailDisplayer.setQsPanelController(null);
    }

    @Override
@@ -254,7 +262,6 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca

    public void setHost(QSTileHost qsh) {
        mHeader.setQSPanel(mQSPanelController.getView());
        mFooter.setQSPanel(mQSPanelController.getView());
        mQSDetail.setHost(qsh);
    }

@@ -321,10 +328,6 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
        return mQSPanelController;
    }

    public QSPanel getQsPanel() {
        return mQSPanelController.getView();
    }

    @Override
    public boolean isShowingDetail() {
        return mQSCustomizerController.isCustomizing() || mQSDetail.isShowingDetail();
Loading