diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java index 0fe018efb009e..c58febdcd5a6c 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java @@ -261,7 +261,6 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca } public void setHost(QSTileHost qsh) { - mHeader.setQSPanel(mQSPanelController.getView()); mQSDetail.setHost(qsh); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java index addaf7e456b84..05b791e642d04 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java @@ -49,6 +49,7 @@ public class QSPanelController extends QSPanelControllerBase { private final QSSecurityFooter mQsSecurityFooter; private final TunerService mTunerService; private final QSCustomizerController mQsCustomizerController; + private final QSTileRevealController.Factory mQsTileRevealControllerFactory; private final BrightnessController mBrightnessController; private final BrightnessSlider.Factory mBrightnessSliderFactory; private final BrightnessSlider mBrightnessSlider; @@ -77,11 +78,11 @@ public class QSPanelController extends QSPanelControllerBase { DumpManager dumpManager, MetricsLogger metricsLogger, UiEventLogger uiEventLogger, BrightnessController.Factory brightnessControllerFactory, BrightnessSlider.Factory brightnessSliderFactory) { - super(view, qstileHost, qsCustomizerController, qsTileRevealControllerFactory, - metricsLogger, uiEventLogger, dumpManager); + super(view, qstileHost, qsCustomizerController, metricsLogger, uiEventLogger, dumpManager); mQsSecurityFooter = qsSecurityFooter; mTunerService = tunerService; mQsCustomizerController = qsCustomizerController; + mQsTileRevealControllerFactory = qsTileRevealControllerFactory; mQsSecurityFooter.setHostEnvironment(qstileHost); mBrightnessSliderFactory = brightnessSliderFactory; @@ -113,6 +114,12 @@ public class QSPanelController extends QSPanelControllerBase { } } + @Override + protected QSTileRevealController createTileRevealController() { + return mQsTileRevealControllerFactory.create( + this, (PagedTileLayout) mView.createRegularTileLayout()); + } + @Override protected void onViewDetached() { mTunerService.removeTunable(mView); @@ -280,5 +287,10 @@ public class QSPanelController extends QSPanelControllerBase { public void setFooterPageIndicator(PageIndicator pageIndicator) { mView.setFooterPageIndicator(pageIndicator); } + + /** */ + public boolean isExpanded() { + return mView.isExpanded(); + } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java index a3daf0e3e5fee..d0a839b4613e1 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java @@ -48,7 +48,6 @@ public abstract class QSPanelControllerBase extends ViewContr implements Dumpable{ protected final QSTileHost mHost; private final QSCustomizerController mQsCustomizerController; - private final QSTileRevealController.Factory mQsTileRevealControllerFactory; private final MediaHost mMediaHost; private final MetricsLogger mMetricsLogger; private final UiEventLogger mUiEventLogger; @@ -75,12 +74,10 @@ public abstract class QSPanelControllerBase extends ViewContr protected QSPanelControllerBase(T view, QSTileHost host, QSCustomizerController qsCustomizerController, - QSTileRevealController.Factory qsTileRevealControllerFactory, MetricsLogger metricsLogger, UiEventLogger uiEventLogger, DumpManager dumpManager) { super(view); mHost = host; mQsCustomizerController = qsCustomizerController; - mQsTileRevealControllerFactory = qsTileRevealControllerFactory; mMediaHost = mView.getMediaHost(); mMetricsLogger = metricsLogger; mUiEventLogger = uiEventLogger; @@ -89,10 +86,8 @@ public abstract class QSPanelControllerBase extends ViewContr @Override protected void onViewAttached() { - QSPanel.QSTileLayout regularTileLayout = mView.createRegularTileLayout(); - if (regularTileLayout instanceof PagedTileLayout) { - mQsTileRevealController = mQsTileRevealControllerFactory.create( - (PagedTileLayout) regularTileLayout); + mQsTileRevealController = createTileRevealController(); + if (mQsTileRevealController != null) { mQsTileRevealController.setExpansion(mRevealExpansion); } @@ -119,6 +114,10 @@ public abstract class QSPanelControllerBase extends ViewContr mDumpManager.unregisterDumpable(mView.getDumpableTag()); } + protected QSTileRevealController createTileRevealController() { + return null; + } + /** */ public void setTiles() { setTiles(mHost.getTiles(), false); @@ -126,9 +125,11 @@ public abstract class QSPanelControllerBase extends ViewContr /** */ public void setTiles(Collection tiles, boolean collapsedView) { - if (!collapsedView) { + // TODO(b/168904199): move this logic into QSPanelController. + if (!collapsedView && mQsTileRevealController != null) { mQsTileRevealController.updateRevealedTiles(tiles); } + for (QSPanelControllerBase.TileRecord record : mRecords) { mView.removeTile(record); record.tile.removeCallback(record.callback); diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java b/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java index 270fcbffbd712..478923994af85 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java @@ -15,6 +15,8 @@ */ package com.android.systemui.qs; +import static com.android.systemui.qs.dagger.QSFragmentModule.QS_SECURITY_FOOTER_VIEW; + import android.app.AlertDialog; import android.app.admin.DeviceAdminInfo; import android.app.admin.DevicePolicyEventLogger; @@ -44,9 +46,10 @@ import android.widget.TextView; import androidx.annotation.VisibleForTesting; import com.android.internal.util.FrameworkStatsLog; -import com.android.systemui.Dependency; import com.android.systemui.FontSizeUtils; import com.android.systemui.R; +import com.android.systemui.dagger.qualifiers.Background; +import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.qs.dagger.QSScope; import com.android.systemui.settings.UserTracker; @@ -54,6 +57,7 @@ import com.android.systemui.statusbar.phone.SystemUIDialog; import com.android.systemui.statusbar.policy.SecurityController; import javax.inject.Inject; +import javax.inject.Named; @QSScope class QSSecurityFooter implements OnClickListener, DialogInterface.OnClickListener { @@ -81,18 +85,19 @@ class QSSecurityFooter implements OnClickListener, DialogInterface.OnClickListen private int mFooterIconId; @Inject - public QSSecurityFooter(QSPanel qsPanel, Context context, UserTracker userTracker) { - mRootView = LayoutInflater.from(context) - .inflate(R.layout.quick_settings_footer, qsPanel, false); + QSSecurityFooter(@Named(QS_SECURITY_FOOTER_VIEW) View rootView, Context context, + UserTracker userTracker, @Main Handler mainHandler, ActivityStarter activityStarter, + SecurityController securityController, @Background Looper bgLooper) { + mRootView = rootView; mRootView.setOnClickListener(this); mFooterText = mRootView.findViewById(R.id.footer_text); mFooterIcon = mRootView.findViewById(R.id.footer_icon); mFooterIconId = R.drawable.ic_info_outline; mContext = context; - mMainHandler = new Handler(Looper.myLooper()); - mActivityStarter = Dependency.get(ActivityStarter.class); - mSecurityController = Dependency.get(SecurityController.class); - mHandler = new H(Dependency.get(Dependency.BG_LOOPER)); + mMainHandler = mainHandler; + mActivityStarter = activityStarter; + mSecurityController = securityController; + mHandler = new H(bgLooper); mUserTracker = userTracker; } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTileRevealController.java b/packages/SystemUI/src/com/android/systemui/qs/QSTileRevealController.java index 9414d0e3ed52d..3f931088ec836 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSTileRevealController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSTileRevealController.java @@ -22,7 +22,7 @@ public class QSTileRevealController { private static final long QS_REVEAL_TILES_DELAY = 500L; private final Context mContext; - private final QSPanel mQSPanel; + private final QSPanelController mQSPanelController; private final PagedTileLayout mPagedTileLayout; private final QSCustomizerController mQsCustomizerController; private final ArraySet mTilesToReveal = new ArraySet<>(); @@ -32,17 +32,17 @@ public class QSTileRevealController { @Override public void run() { mPagedTileLayout.startTileReveal(mTilesToReveal, () -> { - if (mQSPanel.isExpanded()) { + if (mQSPanelController.isExpanded()) { addTileSpecsToRevealed(mTilesToReveal); mTilesToReveal.clear(); } }); } }; - QSTileRevealController(Context context, QSPanel qsPanel, PagedTileLayout pagedTileLayout, - QSCustomizerController qsCustomizerController) { + QSTileRevealController(Context context, QSPanelController qsPanelController, + PagedTileLayout pagedTileLayout, QSCustomizerController qsCustomizerController) { mContext = context; - mQSPanel = qsPanel; + mQSPanelController = qsPanelController; mPagedTileLayout = pagedTileLayout; mQsCustomizerController = qsCustomizerController; } @@ -85,18 +85,17 @@ public class QSTileRevealController { @QSScope static class Factory { private final Context mContext; - private final QSPanel mQsPanel; private final QSCustomizerController mQsCustomizerController; @Inject - Factory(Context context, QSPanel qsPanel, QSCustomizerController qsCustomizerController) { + Factory(Context context, QSCustomizerController qsCustomizerController) { mContext = context; - mQsPanel = qsPanel; mQsCustomizerController = qsCustomizerController; } - QSTileRevealController create(PagedTileLayout pagedTileLayout) { - return new QSTileRevealController(mContext, mQsPanel, pagedTileLayout, + QSTileRevealController create(QSPanelController qsPanelController, + PagedTileLayout pagedTileLayout) { + return new QSTileRevealController(mContext, qsPanelController, pagedTileLayout, mQsCustomizerController); } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java index ebe80ae961727..06e8634a0d1fa 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java @@ -51,7 +51,6 @@ public class QuickQSPanel extends QSPanel { private boolean mDisabledByPolicy; private int mMaxTiles; - protected QSPanel mFullPanel; @Inject @@ -118,10 +117,6 @@ public class QuickQSPanel extends QSPanel { return TAG; } - public void setQSPanelAndHeader(QSPanel fullPanel, View header) { - mFullPanel = fullPanel; - } - @Override protected boolean shouldShowDetail() { return !mExpanded; diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanelController.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanelController.java index 54d3026878c8c..078e0f9c359b1 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanelController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanelController.java @@ -46,11 +46,9 @@ public class QuickQSPanelController extends QSPanelControllerBase @Inject QuickQSPanelController(QuickQSPanel view, QSTileHost qsTileHost, QSCustomizerController qsCustomizerController, - QSTileRevealController.Factory qsTileRevealControllerFactory, MetricsLogger metricsLogger, UiEventLogger uiEventLogger, DumpManager dumpManager) { - super(view, qsTileHost, qsCustomizerController, qsTileRevealControllerFactory, - metricsLogger, uiEventLogger, dumpManager); + super(view, qsTileHost, qsCustomizerController, metricsLogger, uiEventLogger, dumpManager); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java index 5757602b9d0fd..027767bc0893e 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java @@ -153,6 +153,12 @@ public class QuickStatusBarHeader extends RelativeLayout implements LifecycleOwn mBatteryRemainingIcon.setPercentShowMode(BatteryMeterView.MODE_ESTIMATE); mRingerModeTextView.setSelected(true); mNextAlarmTextView.setSelected(true); + + int colorForeground = Utils.getColorAttrDefaultColor(getContext(), + android.R.attr.colorForeground); + float intensity = getColorIntensity(colorForeground); + int fillColor = mDualToneHandler.getSingleColor(intensity); + mBatteryRemainingIcon.onDarkChanged(tintArea, intensity, fillColor); } void onAttach(TintedIconManager iconManager) { @@ -439,18 +445,6 @@ public class QuickStatusBarHeader extends RelativeLayout implements LifecycleOwn post(() -> setClickable(!mExpanded)); } - public void setQSPanel(final QSPanel qsPanel) { - //host.setHeaderView(mExpandIndicator); - mHeaderQsPanel.setQSPanelAndHeader(qsPanel, this); - - Rect tintArea = new Rect(0, 0, 0, 0); - int colorForeground = Utils.getColorAttrDefaultColor(getContext(), - android.R.attr.colorForeground); - float intensity = getColorIntensity(colorForeground); - int fillColor = mDualToneHandler.getSingleColor(intensity); - mBatteryRemainingIcon.onDarkChanged(tintArea, intensity, fillColor); - } - public void setCallback(Callback qsPanelCallback) { mHeaderQsPanel.setCallback(qsPanelCallback); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentModule.java b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentModule.java index 354b2c9442484..f3bf306642f6b 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentModule.java +++ b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentModule.java @@ -16,6 +16,7 @@ package com.android.systemui.qs.dagger; +import android.view.LayoutInflater; import android.view.View; import com.android.systemui.R; @@ -31,6 +32,8 @@ import com.android.systemui.qs.QuickQSPanel; import com.android.systemui.qs.QuickStatusBarHeader; import com.android.systemui.qs.customize.QSCustomizer; +import javax.inject.Named; + import dagger.Binds; import dagger.Module; import dagger.Provides; @@ -40,6 +43,8 @@ import dagger.Provides; */ @Module public interface QSFragmentModule { + String QS_SECURITY_FOOTER_VIEW = "qs_security_footer"; + /** */ @Provides @RootView @@ -95,4 +100,12 @@ public interface QSFragmentModule { static QSCustomizer providesQSCutomizer(@RootView View view) { return view.findViewById(R.id.qs_customize); } -} + + /** */ + @Provides + @QSScope + @Named(QS_SECURITY_FOOTER_VIEW) + static View providesQSSecurityFooterView(LayoutInflater layoutInflater, QSPanel qsPanel) { + return layoutInflater.inflate(R.layout.quick_settings_footer, qsPanel, false); + } +} \ No newline at end of file diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java index 9421cd0800ff5..64c927ddd9dc0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java @@ -86,13 +86,16 @@ public class QSPanelControllerBaseTest extends SysuiTestCase { private QSPanelControllerBase mController; /** Implementation needed to ensure we have a reflectively-available class name. */ - private static class TestableQSPanelControllerBase extends QSPanelControllerBase { + private class TestableQSPanelControllerBase extends QSPanelControllerBase { protected TestableQSPanelControllerBase(QSPanel view, QSTileHost host, - QSCustomizerController qsCustomizerController, - QSTileRevealController.Factory qsTileRevealControllerFactory, - MetricsLogger metricsLogger, UiEventLogger uiEventLogger, DumpManager dumpManager) { - super(view, host, qsCustomizerController, qsTileRevealControllerFactory, metricsLogger, - uiEventLogger, dumpManager); + QSCustomizerController qsCustomizerController, MetricsLogger metricsLogger, + UiEventLogger uiEventLogger, DumpManager dumpManager) { + super(view, host, qsCustomizerController, metricsLogger, uiEventLogger, dumpManager); + } + + @Override + protected QSTileRevealController createTileRevealController() { + return mQSTileRevealController; } } @@ -108,10 +111,11 @@ public class QSPanelControllerBaseTest extends SysuiTestCase { when(mQSPanel.createRegularTileLayout()).thenReturn(mPagedTileLayout); when(mQSTileHost.getTiles()).thenReturn(Collections.singleton(mQSTile)); when(mQSTileHost.createTileView(eq(mQSTile), anyBoolean())).thenReturn(mQSTileView); - when(mQSTileRevealControllerFactory.create(any())).thenReturn(mQSTileRevealController); + when(mQSTileRevealControllerFactory.create(any(), any())) + .thenReturn(mQSTileRevealController); mController = new TestableQSPanelControllerBase(mQSPanel, mQSTileHost, - mQSCustomizerController, mQSTileRevealControllerFactory, mMetricsLogger, + mQSCustomizerController, mMetricsLogger, mUiEventLogger, mDumpManager); mController.init(); @@ -122,9 +126,14 @@ public class QSPanelControllerBaseTest extends SysuiTestCase { public void testSetRevealExpansion_preAttach() { mController.onViewDetached(); - QSPanelControllerBase controller = new TestableQSPanelControllerBase(mQSPanel, - mQSTileHost, mQSCustomizerController, mQSTileRevealControllerFactory, - mMetricsLogger, mUiEventLogger, mDumpManager); + QSPanelControllerBase controller = new QSPanelControllerBase( + mQSPanel, mQSTileHost, mQSCustomizerController, mMetricsLogger, mUiEventLogger, + mDumpManager) { + @Override + protected QSTileRevealController createTileRevealController() { + return mQSTileRevealController; + } + }; // Nothing happens until attached controller.setRevealExpansion(0); diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java index f57e3c2892ea6..1a60e4fbf7b2b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java @@ -107,7 +107,8 @@ public class QSPanelControllerTest extends SysuiTestCase { .thenReturn(mBrightnessSlider); when(mBrightnessControllerFactory.create(any(ToggleSlider.class))) .thenReturn(mBrightnessController); - when(mQSTileRevealControllerFactory.create(any())).thenReturn(mQSTileRevealController); + when(mQSTileRevealControllerFactory.create(any(), any())) + .thenReturn(mQSTileRevealController); mController = new QSPanelController(mQSPanel, mQSSecurityFooter, mTunerService, mQSTileHost, mQSCustomizerController, mQSTileRevealControllerFactory, mDumpManager, diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java index c82aee48ab913..6fa6f31984f2f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java @@ -23,8 +23,9 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import android.content.Context; import android.content.pm.UserInfo; +import android.os.Handler; +import android.os.Looper; import android.provider.Settings; import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; @@ -38,16 +39,18 @@ import android.view.View; import android.view.ViewGroup; import android.widget.TextView; -import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; +import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.policy.SecurityController; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; /* * Compile and run the whole SystemUI test suite: @@ -73,22 +76,23 @@ public class QSSecurityFooterTest extends SysuiTestCase { private TextView mFooterText; private TestableImageView mFooterIcon; private QSSecurityFooter mFooter; - private SecurityController mSecurityController = mock(SecurityController.class); + @Mock + private SecurityController mSecurityController; + @Mock private UserTracker mUserTracker; + @Mock + private ActivityStarter mActivityStarter; @Before public void setUp() { - mDependency.injectTestDependency(SecurityController.class, mSecurityController); - mDependency.injectTestDependency(Dependency.BG_LOOPER, - TestableLooper.get(this).getLooper()); - mUserTracker = mock(UserTracker.class); + MockitoAnnotations.initMocks(this); + Looper looper = TestableLooper.get(this).getLooper(); when(mUserTracker.getUserInfo()).thenReturn(mock(UserInfo.class)); - mContext.addMockSystemService(Context.LAYOUT_INFLATER_SERVICE, - new LayoutInflaterBuilder(mContext) - .replace("ImageView", TestableImageView.class) - .build()); - mFooter = new QSSecurityFooter(null, mContext, mUserTracker); - mRootView = (ViewGroup) mFooter.getView(); + mRootView = (ViewGroup) new LayoutInflaterBuilder(mContext) + .replace("ImageView", TestableImageView.class) + .build().inflate(R.layout.quick_settings_footer, null, false); + mFooter = new QSSecurityFooter(mRootView, mContext, mUserTracker, new Handler(looper), + mActivityStarter, mSecurityController, looper); mFooterText = mRootView.findViewById(R.id.footer_text); mFooterIcon = mRootView.findViewById(R.id.footer_icon); mFooter.setHostEnvironment(null);