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

Commit db5788bb authored by Fabián Kozynski's avatar Fabián Kozynski
Browse files

Extract QSFragment logic

Extract the logic into QSImpl so it's independent of the fragment. In
order for QSImpl to be properly initialized, it needs to be called with
a QSComponent.

Also, introduce a QSFlexiglassComponent and module.

Test: atest com.android.systemui.qs
Bug: 280887232
Change-Id: I5fd40b3393563320b2972c168315e1eeb951aae7
parent ee20263f
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import com.android.systemui.log.LogcatEchoTrackerDebug;
import com.android.systemui.log.LogcatEchoTrackerProd;
import com.android.systemui.log.table.TableLogBuffer;
import com.android.systemui.log.table.TableLogBufferFactory;
import com.android.systemui.qs.QSFragmentLegacy;
import com.android.systemui.statusbar.notification.NotifPipelineFlags;
import com.android.systemui.util.Compile;
import com.android.systemui.util.wakelock.WakeLockLog;
@@ -229,12 +230,12 @@ public class LogModule {
    }

    /**
     * Provides a logging buffer for logs related to {@link com.android.systemui.qs.QSFragment}'s
     * Provides a logging buffer for logs related to {@link QSFragmentLegacy}'s
     * disable flag adjustments.
     */
    @Provides
    @SysUISingleton
    @QSFragmentDisableLog
    @QSDisableLog
    public static LogBuffer provideQSFragmentDisableLogBuffer(LogBufferFactory factory) {
        return factory.create("QSFragmentDisableFlagsLog", 10 /* maxSize */,
                false /* systrace */);
+3 −2
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.systemui.log.dagger;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import com.android.systemui.log.LogBuffer;
import com.android.systemui.qs.QSFragmentLegacy;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
@@ -27,10 +28,10 @@ import javax.inject.Qualifier;

/**
 * A {@link LogBuffer} for disable flag adjustments made in
 * {@link com.android.systemui.qs.QSFragment}.
 * {@link QSFragmentLegacy}.
 */
@Qualifier
@Documented
@Retention(RUNTIME)
public @interface QSFragmentDisableLog {
public @interface QSDisableLog {
}
+9 −17
Original line number Diff line number Diff line
@@ -28,7 +28,7 @@ import androidx.annotation.Nullable;

import com.android.app.animation.Interpolators;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.plugins.qs.QS;
import com.android.systemui.dagger.qualifiers.RootView;
import com.android.systemui.plugins.qs.QSTile;
import com.android.systemui.plugins.qs.QSTileView;
import com.android.systemui.qs.QSPanel.QSTileLayout;
@@ -86,8 +86,7 @@ public class QSAnimator implements QSHost.Callback, PagedTileLayout.PageListener
    private final QuickQSPanel mQuickQsPanel;
    private final QSPanelController mQsPanelController;
    private final QuickQSPanelController mQuickQSPanelController;
    private final QuickStatusBarHeader mQuickStatusBarHeader;
    private final QS mQs;
    private final View mQsRootView;

    @Nullable
    private PagedTileLayout mPagedLayout;
@@ -115,8 +114,6 @@ public class QSAnimator implements QSHost.Callback, PagedTileLayout.PageListener
    // Brightness slider opacity driver. Uses linear interpolator.
    @Nullable
    private TouchAnimator mBrightnessOpacityAnimator;
    // Animator for Footer actions in QQS
    private TouchAnimator mQQSFooterActionsAnimator;
    // Height animator for QQS tiles (height changing from QQS size to QS size)
    @Nullable
    private HeightExpansionAnimator mQQSTileHeightAnimator;
@@ -144,22 +141,21 @@ public class QSAnimator implements QSHost.Callback, PagedTileLayout.PageListener
    private int[] mTmpLoc2 = new int[2];

    @Inject
    public QSAnimator(QS qs, QuickQSPanel quickPanel, QuickStatusBarHeader quickStatusBarHeader,
    public QSAnimator(@RootView View rootView, QuickQSPanel quickPanel,
            QSPanelController qsPanelController,
            QuickQSPanelController quickQSPanelController, QSHost qsTileHost,
            @Main Executor executor, TunerService tunerService,
            QSExpansionPathInterpolator qsExpansionPathInterpolator) {
        mQs = qs;
        mQsRootView = rootView;
        mQuickQsPanel = quickPanel;
        mQsPanelController = qsPanelController;
        mQuickQSPanelController = quickQSPanelController;
        mQuickStatusBarHeader = quickStatusBarHeader;
        mHost = qsTileHost;
        mExecutor = executor;
        mQSExpansionPathInterpolator = qsExpansionPathInterpolator;
        mHost.addCallback(this);
        mQsPanelController.addOnAttachStateChangeListener(this);
        qs.getView().addOnLayoutChangeListener(this);
        mQsRootView.addOnLayoutChangeListener(this);
        if (mQsPanelController.isAttachedToWindow()) {
            onViewAttachedToWindow(null);
        }
@@ -314,8 +310,7 @@ public class QSAnimator implements QSHost.Callback, PagedTileLayout.PageListener
                    break;
                }

                final View tileIcon = tileView.getIcon().getIconView();
                View view = mQs.getView();
                View view = mQsRootView;

                // This case: less tiles to animate in small displays.
                if (count < mQuickQSPanelController.getTileLayout().getNumVisibleTiles()) {
@@ -480,7 +475,7 @@ public class QSAnimator implements QSHost.Callback, PagedTileLayout.PageListener
                .setStartDelay(QS_TILE_LABEL_FADE_OUT_START)
                .setEndDelay(QS_TILE_LABEL_FADE_OUT_END);
        SideLabelTileLayout qqsLayout = (SideLabelTileLayout) mQuickQsPanel.getTileLayout();
        View view = mQs.getView();
        View view = mQsRootView;
        List<String> specs = mPagedLayout.getSpecsForPage(page);
        if (specs.isEmpty()) {
            // specs should not be empty in a valid secondary page, as we scrolled to it.
@@ -577,7 +572,7 @@ public class QSAnimator implements QSHost.Callback, PagedTileLayout.PageListener

            // For (1), compute the distance via the vertical distance between QQS and QS tile
            // layout top.
            View quickSettingsRootView = mQs.getView();
            View quickSettingsRootView = mQsRootView;
            View qsTileLayout = (View) mQsPanelController.getTileLayout();
            View qqsTileLayout = (View) mQuickQSPanelController.getTileLayout();
            getRelativePosition(mTmpLoc1, qsTileLayout, quickSettingsRootView);
@@ -607,7 +602,7 @@ public class QSAnimator implements QSHost.Callback, PagedTileLayout.PageListener
    private int getRelativeTranslationY(View view1, View view2) {
        int[] qsPosition = new int[2];
        int[] qqsPosition = new int[2];
        View commonView = mQs.getView();
        View commonView = mQsRootView;
        getRelativePositionInt(qsPosition, view1, commonView);
        getRelativePositionInt(qqsPosition, view2, commonView);
        return qsPosition[1] - qqsPosition[1];
@@ -690,9 +685,6 @@ public class QSAnimator implements QSHost.Callback, PagedTileLayout.PageListener
        if (mBrightnessTranslationAnimator != null) {
            mBrightnessTranslationAnimator.setPosition(position);
        }
        if (mQQSFooterActionsAnimator != null) {
            mQQSFooterActionsAnimator.setPosition(position);
        }
    }

    @Override
+9 −7
Original line number Diff line number Diff line
package com.android.systemui.qs

import com.android.systemui.log.dagger.QSFragmentDisableLog
import com.android.systemui.log.LogBuffer
import com.android.systemui.log.core.LogLevel
import com.android.systemui.log.dagger.QSDisableLog
import com.android.systemui.statusbar.disableflags.DisableFlagsLogger
import javax.inject.Inject

/** A helper class for logging disable flag changes made in [QSFragment]. */
class QSFragmentDisableFlagsLogger @Inject constructor(
    @QSFragmentDisableLog private val buffer: LogBuffer,
/** A helper class for logging disable flag changes made in [QSImpl]. */
class QSDisableFlagsLogger
@Inject
constructor(
    @QSDisableLog private val buffer: LogBuffer,
    private val disableFlagsLogger: DisableFlagsLogger
) {

    /**
     * Logs a string representing the new state received by [QSFragment] and any modifications that
     * were made to the flags locally.
     * Logs a string representing the new state received by [QSImpl] and any modifications that were
     * made to the flags locally.
     *
     * @param new see [DisableFlagsLogger.getDisableFlagsString]
     * @param newAfterLocalModification see [DisableFlagsLogger.getDisableFlagsString]
@@ -43,4 +45,4 @@ class QSFragmentDisableFlagsLogger @Inject constructor(
    }
}

private const val TAG = "QSFragmentDisableFlagsLog"
private const val TAG = "QSDisableFlagsLog"
+369 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2023 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.content.res.Configuration;
import android.os.Bundle;
import android.os.Trace;
import android.view.ContextThemeWrapper;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.FloatRange;
import androidx.annotation.Nullable;

import com.android.systemui.plugins.qs.QS;
import com.android.systemui.plugins.qs.QSContainerController;
import com.android.systemui.qs.dagger.QSFragmentComponent;
import com.android.systemui.res.R;
import com.android.systemui.statusbar.policy.BrightnessMirrorController;
import com.android.systemui.util.LifecycleFragment;

import java.util.function.Consumer;

import javax.inject.Inject;
import javax.inject.Provider;

public class QSFragmentLegacy extends LifecycleFragment implements QS {

    private final Provider<QSImpl> mQsImplProvider;

    private final QSFragmentComponent.Factory mQsComponentFactory;

    @Nullable
    private QSImpl mQsImpl;

    @Inject
    public QSFragmentLegacy(
            Provider<QSImpl> qsImplProvider,
            QSFragmentComponent.Factory qsComponentFactory
    ) {
        mQsComponentFactory = qsComponentFactory;
        mQsImplProvider = qsImplProvider;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
            Bundle savedInstanceState) {
        try {
            Trace.beginSection("QSFragment#onCreateView");
            inflater = inflater.cloneInContext(new ContextThemeWrapper(getContext(),
                    R.style.Theme_SystemUI_QuickSettings));
            return inflater.inflate(R.layout.qs_panel, container, false);
        } finally {
            Trace.endSection();
        }
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        QSFragmentComponent qsFragmentComponent = mQsComponentFactory.create(this);
        mQsImpl = mQsImplProvider.get();
        mQsImpl.onComponentCreated(qsFragmentComponent, savedInstanceState);
    }

    @Override
    public void setScrollListener(ScrollListener listener) {
        if (mQsImpl != null) {
            mQsImpl.setScrollListener(listener);
        }
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (mQsImpl != null) {
            mQsImpl.onCreate(savedInstanceState);
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (mQsImpl != null) {
            mQsImpl.onDestroy();
        }
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        if (mQsImpl != null) {
            mQsImpl.onSaveInstanceState(outState);
        }
    }

    @Override
    public View getHeader() {
        if (mQsImpl != null) {
            return mQsImpl.getHeader();
        } else {
            return null;
        }
    }

    @Override
    public void setHasNotifications(boolean hasNotifications) {
        if (mQsImpl != null) {
            mQsImpl.setHasNotifications(hasNotifications);
        }
    }

    @Override
    public void setPanelView(HeightListener panelView) {
        if (mQsImpl != null) {
            mQsImpl.setPanelView(panelView);
        }
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        if (mQsImpl != null) {
            mQsImpl.onConfigurationChanged(newConfig);
        }
    }

    @Override
    public void setFancyClipping(int leftInset, int top, int rightInset, int bottom,
            int cornerRadius, boolean visible, boolean fullWidth) {
        if (mQsImpl != null) {
            mQsImpl.setFancyClipping(leftInset, top, rightInset, bottom, cornerRadius, visible,
                    fullWidth);
        }
    }

    @Override
    public boolean isFullyCollapsed() {
        if (mQsImpl != null) {
            return mQsImpl.isFullyCollapsed();
        } else {
            return true;
        }
    }

    @Override
    public void setCollapsedMediaVisibilityChangedListener(Consumer<Boolean> listener) {
        if (mQsImpl != null) {
            mQsImpl.setCollapsedMediaVisibilityChangedListener(listener);
        }
    }

    @Override
    public void setContainerController(QSContainerController controller) {
        if (mQsImpl != null) {
            mQsImpl.setContainerController(controller);
        }
    }

    @Override
    public boolean isCustomizing() {
        if (mQsImpl != null) {
            return mQsImpl.isCustomizing();
        } else {
            return false;
        }
    }

    public QSPanelController getQSPanelController() {
        if (mQsImpl != null) {
            return mQsImpl.getQSPanelController();
        } else {
            return null;
        }
    }

    public void setBrightnessMirrorController(
            BrightnessMirrorController brightnessMirrorController) {
        if (mQsImpl != null) {
            mQsImpl.setBrightnessMirrorController(brightnessMirrorController);
        }
    }

    @Override
    public boolean isShowingDetail() {
        if (mQsImpl != null) {
            return mQsImpl.isShowingDetail();
        } else {
            return false;
        }
    }

    @Override
    public void setHeaderClickable(boolean clickable) {
        if (mQsImpl != null) {
            mQsImpl.setHeaderClickable(clickable);
        }
    }

    @Override
    public void setExpanded(boolean expanded) {
        if (mQsImpl != null) {
            mQsImpl.setExpanded(expanded);
        }
    }

    @Override
    public void setOverscrolling(boolean stackScrollerOverscrolling) {
        if (mQsImpl != null) {
            mQsImpl.setOverscrolling(stackScrollerOverscrolling);
        }
    }

    @Override
    public void setListening(boolean listening) {
        if (mQsImpl != null) {
            mQsImpl.setListening(listening);
        }
    }

    @Override
    public void setQsVisible(boolean visible) {
        if (mQsImpl != null) {
            mQsImpl.setQsVisible(visible);
        }
    }

    @Override
    public void setHeaderListening(boolean listening) {
        if (mQsImpl != null) {
            mQsImpl.setHeaderListening(listening);
        }
    }

    @Override
    public void notifyCustomizeChanged() {
        if (mQsImpl != null) {
            mQsImpl.notifyCustomizeChanged();
        }
    }

    @Override
    public void setInSplitShade(boolean inSplitShade) {
        if (mQsImpl != null) {
            mQsImpl.setInSplitShade(inSplitShade);
        }
    }

    @Override
    public void setTransitionToFullShadeProgress(
            boolean isTransitioningToFullShade,
            @FloatRange(from = 0.0, to = 1.0) float qsTransitionFraction,
            @FloatRange(from = 0.0, to = 1.0) float qsSquishinessFraction) {
        if (mQsImpl != null) {
            mQsImpl.setTransitionToFullShadeProgress(isTransitioningToFullShade,
                    qsTransitionFraction, qsSquishinessFraction);
        }
    }

    @Override
    public void setOverScrollAmount(int overScrollAmount) {
        if (mQsImpl != null) {
            mQsImpl.setOverScrollAmount(overScrollAmount);
        }
    }

    @Override
    public int getHeightDiff() {
        if (mQsImpl != null) {
            return mQsImpl.getHeightDiff();
        } else {
            return 0;
        }
    }

    @Override
    public void setIsNotificationPanelFullWidth(boolean isFullWidth) {
        if (mQsImpl != null) {
            mQsImpl.setIsNotificationPanelFullWidth(isFullWidth);
        }
    }

    @Override
    public void setQsExpansion(float expansion, float panelExpansionFraction,
            float proposedTranslation, float squishinessFraction) {
        if (mQsImpl != null) {
            mQsImpl.setQsExpansion(expansion, panelExpansionFraction, proposedTranslation,
                    squishinessFraction);
        }
    }

    @Override
    public void animateHeaderSlidingOut() {
        if (mQsImpl != null) {
            mQsImpl.animateHeaderSlidingOut();
        }
    }

    @Override
    public void setCollapseExpandAction(Runnable action) {
        if (mQsImpl != null) {
            mQsImpl.setCollapseExpandAction(action);
        }
    }

    @Override
    public void closeDetail() {
        if (mQsImpl != null) {
            mQsImpl.closeDetail();
        }
    }

    @Override
    public void closeCustomizer() {
        if (mQsImpl != null) {
            mQsImpl.closeDetail();
        }
    }

    /**
     * The height this view wants to be. This is different from {@link View#getMeasuredHeight} such
     * that during closing the detail panel, this already returns the smaller height.
     */
    @Override
    public int getDesiredHeight() {
        if (mQsImpl != null) {
            return mQsImpl.getDesiredHeight();
        } else {
            return 0;
        }
    }

    @Override
    public void setHeightOverride(int desiredHeight) {
        if (mQsImpl != null) {
            mQsImpl.setHeightOverride(desiredHeight);
        }
    }

    @Override
    public int getQsMinExpansionHeight() {
        if (mQsImpl != null) {
            return mQsImpl.getQsMinExpansionHeight();
        } else {
            return 0;
        }
    }

    @Override
    public void hideImmediately() {
        if (mQsImpl != null) {
            mQsImpl.hideImmediately();
        }
    }
}
Loading