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

Commit c078bc2a authored by Dave Mankoff's avatar Dave Mankoff
Browse files

1/N Add QSFragmentComponent

This introduces the QSFragmentComponent as a way to create
QS related view controllers. The QSPanelController is introduced, but
doesn't do much other than proxy through most QSPanel calls.

Bug: 168904199
Test: manual && atest SystemUITests
Change-Id: I1fccda95f38722bf0215b2f15f65cd70ec66283a
parent 96aaf608
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -19,7 +19,7 @@ package com.android.keyguard;
import android.view.ViewGroup;

import com.android.keyguard.dagger.KeyguardBouncerScope;
import com.android.keyguard.dagger.RootView;
import com.android.systemui.dagger.qualifiers.RootView;
import com.android.systemui.statusbar.phone.KeyguardBouncer;
import com.android.systemui.util.ViewController;

+1 −0
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import com.android.keyguard.KeyguardMessageArea;
import com.android.keyguard.KeyguardSecurityContainer;
import com.android.keyguard.KeyguardSecurityViewFlipper;
import com.android.systemui.R;
import com.android.systemui.dagger.qualifiers.RootView;
import com.android.systemui.statusbar.phone.KeyguardBouncer;

import dagger.Module;
+2 −2
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 The Android Open Source Project
 * 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.
@@ -14,7 +14,7 @@
 * limitations under the License.
 */

package com.android.keyguard.dagger;
package com.android.systemui.dagger.qualifiers;

import static java.lang.annotation.RetentionPolicy.RUNTIME;

+29 −21
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ import com.android.systemui.media.MediaHost;
import com.android.systemui.plugins.qs.QS;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.qs.customize.QSCustomizer;
import com.android.systemui.qs.dagger.QSFragmentComponent;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.notification.stack.StackStateAnimator;
@@ -70,7 +71,6 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
    private HeightListener mPanelView;
    protected QuickStatusBarHeader mHeader;
    private QSCustomizer mQSCustomizer;
    protected QSPanel mQSPanel;
    protected NonInterceptingScrollView mQSPanelScrollView;
    private QSDetail mQSDetail;
    private boolean mListening;
@@ -82,6 +82,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca

    private final RemoteInputQuickSettingsDisabler mRemoteInputQuickSettingsDisabler;
    private final InjectionInflationController mInjectionInflater;
    private final QSFragmentComponent.Factory mQsComponentFactory;
    private final QSContainerImplController.Builder mQSContainerImplControllerBuilder;
    private final QSTileHost mHost;
    private boolean mShowCollapsedOnKeyguard;
@@ -96,14 +97,17 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
    private int[] mTmpLocation = new int[2];
    private int mLastViewHeight;
    private float mLastHeaderTranslation;
    private QSPanelController mQSPanelController;

    @Inject
    public QSFragment(RemoteInputQuickSettingsDisabler remoteInputQsDisabler,
            InjectionInflationController injectionInflater, QSTileHost qsTileHost,
            StatusBarStateController statusBarStateController, CommandQueue commandQueue,
            QSFragmentComponent.Factory qsComponentFactory,
            QSContainerImplController.Builder qsContainerImplControllerBuilder) {
        mRemoteInputQuickSettingsDisabler = remoteInputQsDisabler;
        mInjectionInflater = injectionInflater;
        mQsComponentFactory = qsComponentFactory;
        mQSContainerImplControllerBuilder = qsContainerImplControllerBuilder;
        commandQueue.observe(getLifecycle(), this);
        mHost = qsTileHost;
@@ -120,8 +124,9 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        mQSPanel = view.findViewById(R.id.quick_settings_panel);
        QSFragmentComponent qsFragmentComponent = mQsComponentFactory.create(this);
        mQSPanelController = qsFragmentComponent.getQSPanelController();

        mQSPanelScrollView = view.findViewById(R.id.expanded_qs_scroll_view);
        mQSPanelScrollView.addOnLayoutChangeListener(
                (v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> {
@@ -135,7 +140,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
        });
        mQSDetail = view.findViewById(R.id.qs_detail);
        mHeader = view.findViewById(R.id.header);
        mQSPanel.setHeaderContainer(view.findViewById(R.id.header_text_container));
        mQSPanelController.setHeaderContainer(view.findViewById(R.id.header_text_container));
        mFooter = view.findViewById(R.id.qs_footer);
        mContainer = view.findViewById(id.quick_settings_container);

@@ -144,8 +149,9 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
                .build();
        mQSContainerImplController.init();

        mQSDetail.setQsPanel(mQSPanel, mHeader, (View) mFooter);
        mQSAnimator = new QSAnimator(this, mHeader.findViewById(R.id.quick_qs_panel), mQSPanel);
        mQSDetail.setQsPanel(mQSPanelController.getView(), mHeader, (View) mFooter);
        mQSAnimator = new QSAnimator(
                this, mHeader.findViewById(R.id.quick_qs_panel), mQSPanelController.getView());


        mQSCustomizer = view.findViewById(R.id.qs_customize);
@@ -156,7 +162,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
            setEditLocation(view);
            mQSCustomizer.restoreInstanceState(savedInstanceState);
            if (mQsExpanded) {
                mQSPanel.getTileLayout().restoreInstanceState(savedInstanceState);
                mQSPanelController.getTileLayout().restoreInstanceState(savedInstanceState);
            }
        }
        setHost(mHost);
@@ -188,7 +194,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
        outState.putBoolean(EXTRA_LISTENING, mListening);
        mQSCustomizer.saveInstanceState(outState);
        if (mQsExpanded) {
            mQSPanel.getTileLayout().saveInstanceState(outState);
            mQSPanelController.getTileLayout().saveInstanceState(outState);
        }
    }

@@ -249,9 +255,9 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
    }

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

        if (mQSAnimator != null) {
@@ -278,7 +284,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
    private void updateQsState() {
        final boolean expandVisually = mQsExpanded || mStackScrollerOverscrolling
                || mHeaderAnimating;
        mQSPanel.setExpanded(mQsExpanded);
        mQSPanelController.setExpanded(mQsExpanded);
        mQSDetail.setExpanded(mQsExpanded);
        boolean keyguardShowing = isKeyguardShowing();
        mHeader.setVisibility((mQsExpanded || !keyguardShowing || mHeaderAnimating
@@ -294,7 +300,8 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
                : View.INVISIBLE);
        mFooter.setExpanded((keyguardShowing && !mHeaderAnimating && !mShowCollapsedOnKeyguard)
                || (mQsExpanded && !mStackScrollerOverscrolling));
        mQSPanel.setVisibility(!mQsDisabled && expandVisually ? View.VISIBLE : View.INVISIBLE);
        mQSPanelController.setVisibility(
                !mQsDisabled && expandVisually ? View.VISIBLE : View.INVISIBLE);
    }

    private boolean isKeyguardShowing() {
@@ -318,7 +325,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
    }

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

    public QSCustomizer getCustomizer() {
@@ -327,7 +334,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca

    @Override
    public boolean isShowingDetail() {
        return mQSPanel.isShowingCustomize() || mQSDetail.isShowingDetail();
        return mQSPanelController.isShowingCustomize() || mQSDetail.isShowingDetail();
    }

    @Override
@@ -339,7 +346,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
    public void setExpanded(boolean expanded) {
        if (DEBUG) Log.d(TAG, "setExpanded " + expanded);
        mQsExpanded = expanded;
        mQSPanel.setListening(mListening, mQsExpanded);
        mQSPanelController.setListening(mListening, mQsExpanded);
        updateQsState();
    }

@@ -368,7 +375,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
        mListening = listening;
        mQSContainerImplController.setListening(listening);
        mFooter.setListening(listening);
        mQSPanel.setListening(mListening, mQsExpanded);
        mQSPanelController.setListening(mListening, mQsExpanded);
    }

    @Override
@@ -409,8 +416,8 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
        mHeader.setExpansion(onKeyguardAndExpanded, expansion,
                panelTranslationY);
        mFooter.setExpansion(onKeyguardAndExpanded ? 1 : expansion);
        mQSPanel.getQsTileRevealController().setExpansion(expansion);
        mQSPanel.getTileLayout().setExpansion(expansion);
        mQSPanelController.getQsTileRevealController().setExpansion(expansion);
        mQSPanelController.getTileLayout().setExpansion(expansion);
        mQSPanelScrollView.setTranslationY(translationScaleY * heightDiff);
        if (fullyCollapsed) {
            mQSPanelScrollView.setScrollY(0);
@@ -448,7 +455,8 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
            float expandedMediaPosition = absoluteBottomPosition - mQSPanelScrollView.getScrollY()
                    + mQSPanelScrollView.getScrollRange();
            // The expanded media host should never move below the laid out position
            pinToBottom(expandedMediaPosition, mQSPanel.getMediaHost(), true /* expanded */);
            pinToBottom(
                    expandedMediaPosition, mQSPanelController.getMediaHost(), true /* expanded */);
            // The expanded media host should never move above the laid out position
            pinToBottom(absoluteBottomPosition, mHeader.getHeaderQsPanel().getMediaHost(),
                    false /* expanded */);
@@ -538,7 +546,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca

    @Override
    public void closeDetail() {
        mQSPanel.closeDetail();
        mQSPanelController.closeDetail();
    }

    public void notifyCustomizeChanged() {
+109 −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 android.annotation.NonNull;
import android.view.ViewGroup;

import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.media.MediaHost;
import com.android.systemui.qs.customize.QSCustomizer;
import com.android.systemui.qs.dagger.QSScope;
import com.android.systemui.util.ViewController;

import javax.inject.Inject;

/**
 * Controller for {@link QSPanel}.
 */
@QSScope
public class QSPanelController extends ViewController<QSPanel> {
    private final BroadcastDispatcher mBroadcastDispatcher;

    @Inject
    QSPanelController(QSPanel view, BroadcastDispatcher broadcastDispatcher) {
        super(view);
        mBroadcastDispatcher = broadcastDispatcher;
    }

    @Override
    protected void onViewAttached() {

    }

    @Override
    protected void onViewDetached() {

    }

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


    /**
     * Set the header container of quick settings.
     */
    public void setHeaderContainer(@NonNull ViewGroup headerContainer) {
        mView.setHeaderContainer(headerContainer);
    }

    public QSPanel.QSTileLayout getTileLayout() {
        return mView.getTileLayout();
    }

    /** */
    public void setHost(QSTileHost host, QSCustomizer customizer) {
        mView.setHost(host, customizer);
    }

    /** */
    public void setExpanded(boolean qsExpanded) {
        mView.setExpanded(qsExpanded);
    }

    /** */
    public boolean isShowingCustomize() {
        return mView.isShowingCustomize();
    }

    /** */
    public void setVisibility(int visibility) {
        mView.setVisibility(visibility);
    }

    /** */
    public void setListening(boolean listening, boolean expanded) {
        mView.setListening(listening, expanded);
    }

    /** */
    public QSTileRevealController getQsTileRevealController() {
        return mView.getQsTileRevealController();
    }

    /** */
    public MediaHost getMediaHost() {
        return mView.getMediaHost();
    }

    /** */
    public void closeDetail() {
        mView.closeDetail();
    }
}
Loading