From 8b0657c4892d7a23cd043b2582728ac88a1b684b Mon Sep 17 00:00:00 2001 From: Evan Severson Date: Wed, 19 Jan 2022 11:24:23 -0800 Subject: [PATCH 1/2] Remove the foreground service manager tile Test: `atest SystemUITests` Play around with tiles Bug: 201579707 Change-Id: Ia6941648849e1d2ef9409be459aa00d023155530 --- packages/SystemUI/res/drawable/ic_list.xml | 42 -------- packages/SystemUI/res/values/config.xml | 2 +- .../res/values/tiles_states_strings.xml | 10 -- .../systemui/qs/tileimpl/QSFactoryImpl.java | 6 -- .../systemui/qs/tileimpl/QSTileViewImpl.kt | 1 - .../systemui/qs/tiles/FgsManagerTile.kt | 96 ------------------- .../systemui/qs/tileimpl/QSFactoryImplTest.kt | 4 - 7 files changed, 1 insertion(+), 160 deletions(-) delete mode 100644 packages/SystemUI/res/drawable/ic_list.xml delete mode 100644 packages/SystemUI/src/com/android/systemui/qs/tiles/FgsManagerTile.kt diff --git a/packages/SystemUI/res/drawable/ic_list.xml b/packages/SystemUI/res/drawable/ic_list.xml deleted file mode 100644 index 7ef52991234ae..0000000000000 --- a/packages/SystemUI/res/drawable/ic_list.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index 65f22b805d4e5..55a6ab3e2daf1 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -82,7 +82,7 @@ - internet,bt,flashlight,dnd,alarm,airplane,controls,wallet,rotation,battery,cast,screenrecord,mictoggle,cameratoggle,location,hotspot,inversion,saver,dark,work,night,reverse,reduce_brightness,qr_code_scanner,onehanded,fgsmanager,color_correction + internet,bt,flashlight,dnd,alarm,airplane,controls,wallet,rotation,battery,cast,screenrecord,mictoggle,cameratoggle,location,hotspot,inversion,saver,dark,work,night,reverse,reduce_brightness,qr_code_scanner,onehanded,color_correction diff --git a/packages/SystemUI/res/values/tiles_states_strings.xml b/packages/SystemUI/res/values/tiles_states_strings.xml index a610caafa6e1c..e2734164161f8 100644 --- a/packages/SystemUI/res/values/tiles_states_strings.xml +++ b/packages/SystemUI/res/values/tiles_states_strings.xml @@ -308,14 +308,4 @@ Off On - - - - Unavailable - Off - On - \ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java index 5e68f611293ed..86fc4de7825af 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java @@ -39,7 +39,6 @@ import com.android.systemui.qs.tiles.ColorInversionTile; import com.android.systemui.qs.tiles.DataSaverTile; import com.android.systemui.qs.tiles.DeviceControlsTile; import com.android.systemui.qs.tiles.DndTile; -import com.android.systemui.qs.tiles.FgsManagerTile; import com.android.systemui.qs.tiles.FlashlightTile; import com.android.systemui.qs.tiles.HotspotTile; import com.android.systemui.qs.tiles.InternetTile; @@ -99,7 +98,6 @@ public class QSFactoryImpl implements QSFactory { private final Provider mQuickAccessWalletTileProvider; private final Provider mQRCodeScannerTileProvider; private final Provider mOneHandedModeTileProvider; - private final Provider mFgsManagerTileProvider; private final Lazy mQsHostLazy; private final Provider mCustomTileBuilderProvider; @@ -137,7 +135,6 @@ public class QSFactoryImpl implements QSFactory { Provider quickAccessWalletTileProvider, Provider qrCodeScannerTileProvider, Provider oneHandedModeTileProvider, - Provider fgsManagerTileProvider, Provider colorCorrectionTileProvider) { mQsHostLazy = qsHostLazy; mCustomTileBuilderProvider = customTileBuilderProvider; @@ -171,7 +168,6 @@ public class QSFactoryImpl implements QSFactory { mQuickAccessWalletTileProvider = quickAccessWalletTileProvider; mQRCodeScannerTileProvider = qrCodeScannerTileProvider; mOneHandedModeTileProvider = oneHandedModeTileProvider; - mFgsManagerTileProvider = fgsManagerTileProvider; mColorCorrectionTileProvider = colorCorrectionTileProvider; } @@ -246,8 +242,6 @@ public class QSFactoryImpl implements QSFactory { return mQRCodeScannerTileProvider.get(); case "onehanded": return mOneHandedModeTileProvider.get(); - case "fgsmanager": - return mFgsManagerTileProvider.get(); case "color_correction": return mColorCorrectionTileProvider.get(); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt index 7efb983cc4bad..821dfa5fc902b 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt @@ -653,7 +653,6 @@ internal object SubtitleArrayMapping { "qr_code_scanner" to R.array.tile_states_qr_code_scanner, "alarm" to R.array.tile_states_alarm, "onehanded" to R.array.tile_states_onehanded, - "fgsmanager" to R.array.tile_states_fgsmanager, "color_correction" to R.array.tile_states_color_correction ) diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/FgsManagerTile.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/FgsManagerTile.kt deleted file mode 100644 index 939a29711f459..0000000000000 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/FgsManagerTile.kt +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (C) 2021 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.tiles - -import android.content.Intent -import android.os.Handler -import android.os.Looper -import android.provider.DeviceConfig -import android.view.View -import com.android.internal.config.sysui.SystemUiDeviceConfigFlags -import com.android.internal.logging.MetricsLogger -import com.android.systemui.DejankUtils -import com.android.systemui.R -import com.android.systemui.dagger.qualifiers.Background -import com.android.systemui.dagger.qualifiers.Main -import com.android.systemui.fgsmanager.FgsManagerDialogFactory -import com.android.systemui.plugins.ActivityStarter -import com.android.systemui.plugins.FalsingManager -import com.android.systemui.plugins.qs.QSTile -import com.android.systemui.plugins.statusbar.StatusBarStateController -import com.android.systemui.qs.QSHost -import com.android.systemui.qs.logging.QSLogger -import com.android.systemui.qs.tileimpl.QSTileImpl -import com.android.systemui.statusbar.policy.RunningFgsController -import com.android.systemui.statusbar.policy.RunningFgsController.UserPackageTime -import java.util.concurrent.Executor -import javax.inject.Inject - -/** - * Quicksettings tile for the foreground services manager (task manager) - */ -class FgsManagerTile @Inject constructor( - host: QSHost?, - @Background backgroundLooper: Looper?, - @Background private val backgroundExecutor: Executor?, - @Main mainHandler: Handler?, - falsingManager: FalsingManager?, - metricsLogger: MetricsLogger?, - statusBarStateController: StatusBarStateController?, - activityStarter: ActivityStarter?, - qsLogger: QSLogger?, - private val fgsManagerDialogFactory: FgsManagerDialogFactory, - private val runningFgsController: RunningFgsController -) : QSTileImpl(host, backgroundLooper, mainHandler, falsingManager, metricsLogger, - statusBarStateController, activityStarter, qsLogger), RunningFgsController.Callback { - - override fun handleInitialize() { - super.handleInitialize() - mUiHandler.post { runningFgsController.observe(lifecycle, this) } - } - - override fun isAvailable(): Boolean { - return DejankUtils.whitelistIpcs { - DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SYSTEMUI, - SystemUiDeviceConfigFlags.TASK_MANAGER_ENABLED, false) - } - } - - override fun newTileState(): QSTile.State { - return QSTile.State() - } - - override fun handleClick(view: View?) { - mUiHandler.post { fgsManagerDialogFactory.create(view) } - } - - override fun handleUpdateState(state: QSTile.State?, arg: Any?) { - state?.label = tileLabel - state?.secondaryLabel = runningFgsController.getPackagesWithFgs().size.toString() - state?.handlesLongClick = false - state?.icon = ResourceIcon.get(R.drawable.ic_list) - } - - override fun getMetricsCategory(): Int = 0 - - override fun getLongClickIntent(): Intent? = null - - // Inline the string so we don't waste translator time since this isn't used in the mocks. - // TODO If mocks change need to remember to move this to strings.xml - override fun getTileLabel(): CharSequence = "Active apps" - - override fun onFgsPackagesChanged(packages: List) = refreshState() -} \ No newline at end of file diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSFactoryImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSFactoryImplTest.kt index 968b12afa68f5..88b133ec56a8a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSFactoryImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSFactoryImplTest.kt @@ -34,7 +34,6 @@ import com.android.systemui.qs.tiles.ColorInversionTile import com.android.systemui.qs.tiles.DataSaverTile import com.android.systemui.qs.tiles.DeviceControlsTile import com.android.systemui.qs.tiles.DndTile -import com.android.systemui.qs.tiles.FgsManagerTile import com.android.systemui.qs.tiles.FlashlightTile import com.android.systemui.qs.tiles.HotspotTile import com.android.systemui.qs.tiles.InternetTile @@ -92,7 +91,6 @@ private val specMap = mapOf( "wallet" to QuickAccessWalletTile::class.java, "qr_code_scanner" to QRCodeScannerTile::class.java, "onehanded" to OneHandedModeTile::class.java, - "fgsmanager" to FgsManagerTile::class.java, "color_correction" to ColorCorrectionTile::class.java ) @@ -133,7 +131,6 @@ class QSFactoryImplTest : SysuiTestCase() { @Mock private lateinit var quickAccessWalletTile: QuickAccessWalletTile @Mock private lateinit var qrCodeScannerTile: QRCodeScannerTile @Mock private lateinit var oneHandedModeTile: OneHandedModeTile - @Mock private lateinit var fgsManagerTile: FgsManagerTile @Mock private lateinit var colorCorrectionTile: ColorCorrectionTile private lateinit var factory: QSFactoryImpl @@ -178,7 +175,6 @@ class QSFactoryImplTest : SysuiTestCase() { { quickAccessWalletTile }, { qrCodeScannerTile }, { oneHandedModeTile }, - { fgsManagerTile }, { colorCorrectionTile } ) // When adding/removing tiles, fix also [specMap] From 5e147cc42428797627fefe74c879518ac4e27ad3 Mon Sep 17 00:00:00 2001 From: Evan Severson Date: Wed, 19 Jan 2022 11:01:53 -0800 Subject: [PATCH 2/2] Create QS footer entry point for fgs manager Bug: 201579707 Test: `atest SystemUITests` Change-Id: If393e54f5b5ed24123365836f5c0554899730a31 --- packages/SystemUI/res/values/strings.xml | 5 + .../com/android/systemui/qs/QSAnimator.java | 7 +- .../systemui/qs/QSFgsManagerFooter.java | 117 ++++++++++++++++++ .../src/com/android/systemui/qs/QSPanel.java | 20 ++- .../systemui/qs/QSPanelController.java | 8 +- .../systemui/qs/dagger/QSFragmentModule.java | 12 ++ .../systemui/qs/QSPanelControllerTest.java | 6 +- 7 files changed, 170 insertions(+), 5 deletions(-) create mode 100644 packages/SystemUI/src/com/android/systemui/qs/QSFgsManagerFooter.java diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 08fb2c66e0437..a01625c3d63d1 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -2345,6 +2345,11 @@ Select user + + + %s app running in the background + %s apps running in the background + Apps running in the background diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java index 1dba536d52fd2..ded6ae0ac2ff6 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java @@ -85,6 +85,7 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha private final QSPanelController mQsPanelController; private final QuickQSPanelController mQuickQSPanelController; private final QuickStatusBarHeader mQuickStatusBarHeader; + private final QSFgsManagerFooter mFgsManagerFooter; private final QSSecurityFooter mSecurityFooter; private final QS mQs; private final View mQSFooterActions; @@ -151,7 +152,8 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha public QSAnimator(QS qs, QuickQSPanel quickPanel, QuickStatusBarHeader quickStatusBarHeader, QSPanelController qsPanelController, QuickQSPanelController quickQSPanelController, QSTileHost qsTileHost, - QSSecurityFooter securityFooter, @Main Executor executor, TunerService tunerService, + QSFgsManagerFooter fgsManagerFooter, QSSecurityFooter securityFooter, + @Main Executor executor, TunerService tunerService, QSExpansionPathInterpolator qsExpansionPathInterpolator, @Named(QS_FOOTER) FooterActionsView qsFooterActionsView, @Named(QQS_FOOTER) FooterActionsView qqsFooterActionsView) { @@ -162,6 +164,7 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha mQuickStatusBarHeader = quickStatusBarHeader; mQQSFooterActions = qqsFooterActionsView; mQSFooterActions = qsFooterActionsView; + mFgsManagerFooter = fgsManagerFooter; mSecurityFooter = securityFooter; mHost = qsTileHost; mExecutor = executor; @@ -481,6 +484,7 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha // Fade in the security footer and the divider as we reach the final position Builder builder = new Builder().setStartDelay(EXPANDED_TILE_DELAY); + builder.addFloat(mFgsManagerFooter.getView(), "alpha", 0, 1); builder.addFloat(mSecurityFooter.getView(), "alpha", 0, 1); if (mQsPanelController.shouldUseHorizontalLayout() && mQsPanelController.mMediaHost.hostView != null) { @@ -490,6 +494,7 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha mQsPanelController.mMediaHost.hostView.setAlpha(1.0f); } mAllPagesDelayedAnimator = builder.build(); + mAllViews.add(mFgsManagerFooter.getView()); mAllViews.add(mSecurityFooter.getView()); translationYBuilder.setInterpolator(mQSExpansionPathInterpolator.getYInterpolator()); qqsTranslationYBuilder.setInterpolator(mQSExpansionPathInterpolator.getYInterpolator()); diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFgsManagerFooter.java b/packages/SystemUI/src/com/android/systemui/qs/QSFgsManagerFooter.java new file mode 100644 index 0000000000000..082de1609423e --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFgsManagerFooter.java @@ -0,0 +1,117 @@ +/* + * Copyright (C) 2022 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 static android.provider.DeviceConfig.NAMESPACE_SYSTEMUI; + +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.TASK_MANAGER_ENABLED; +import static com.android.systemui.qs.dagger.QSFragmentModule.QS_FGS_MANAGER_FOOTER_VIEW; + +import android.content.Context; +import android.provider.DeviceConfig; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import com.android.systemui.R; +import com.android.systemui.dagger.qualifiers.Background; +import com.android.systemui.dagger.qualifiers.Main; +import com.android.systemui.fgsmanager.FgsManagerDialogFactory; +import com.android.systemui.statusbar.policy.RunningFgsController; + +import java.util.concurrent.Executor; + +import javax.inject.Inject; +import javax.inject.Named; + +/** + * Footer entry point for the foreground service manager + */ +public class QSFgsManagerFooter implements View.OnClickListener { + + private final View mRootView; + private final TextView mFooterText; + private final Context mContext; + private final Executor mMainExecutor; + private final Executor mExecutor; + private final RunningFgsController mRunningFgsController; + private final FgsManagerDialogFactory mFgsManagerDialogFactory; + + private boolean mIsInitialized = false; + private boolean mIsAvailable = false; + + @Inject + QSFgsManagerFooter(@Named(QS_FGS_MANAGER_FOOTER_VIEW) View rootView, + @Main Executor mainExecutor, RunningFgsController runningFgsController, + @Background Executor executor, + FgsManagerDialogFactory fgsManagerDialogFactory) { + mRootView = rootView; + mFooterText = mRootView.findViewById(R.id.footer_text); + ImageView icon = mRootView.findViewById(R.id.primary_footer_icon); + icon.setImageResource(R.drawable.ic_info_outline); + mContext = rootView.getContext(); + mMainExecutor = mainExecutor; + mExecutor = executor; + mRunningFgsController = runningFgsController; + mFgsManagerDialogFactory = fgsManagerDialogFactory; + } + + public void init() { + if (mIsInitialized) { + return; + } + + mRootView.setOnClickListener(this); + + mRunningFgsController.addCallback(packages -> refreshState()); + + DeviceConfig.addOnPropertiesChangedListener(NAMESPACE_SYSTEMUI, mExecutor, + (DeviceConfig.OnPropertiesChangedListener) properties -> { + mIsAvailable = properties.getBoolean(TASK_MANAGER_ENABLED, mIsAvailable); + }); + mIsAvailable = DeviceConfig.getBoolean(NAMESPACE_SYSTEMUI, TASK_MANAGER_ENABLED, false); + + mIsInitialized = true; + } + + @Override + public void onClick(View view) { + mFgsManagerDialogFactory.create(mRootView); + } + + public void refreshState() { + mExecutor.execute(this::handleRefreshState); + } + + public View getView() { + return mRootView; + } + + private boolean isAvailable() { + return mIsAvailable; + } + + public void handleRefreshState() { + int numPackages = mRunningFgsController.getPackagesWithFgs().size(); + mMainExecutor.execute(() -> { + mFooterText.setText(mContext.getResources().getQuantityString( + R.plurals.fgs_manager_footer_label, numPackages, numPackages)); + mRootView.setVisibility(numPackages > 0 && isAvailable() ? View.VISIBLE : View.GONE); + }); + } + +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java index 38061a85cc5ab..6b515c85dc9f2 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java @@ -85,6 +85,8 @@ public class QSPanel extends LinearLayout implements Tunable { private final List mOnConfigurationChangedListeners = new ArrayList<>(); + @Nullable + protected View mFgsManagerFooter; @Nullable protected View mSecurityFooter; @@ -448,7 +450,12 @@ public class QSPanel extends LinearLayout implements Tunable { switchToParent(mSecurityFooter, mHeaderContainer, 0); } else { // Add after the footer - int index = indexOfChild(mFooter); + int index; + if (mFgsManagerFooter != null) { + index = indexOfChild(mFgsManagerFooter); + } else { + index = indexOfChild(mFooter); + } switchToParent(mSecurityFooter, this, index + 1); } } @@ -722,6 +729,17 @@ public class QSPanel extends LinearLayout implements Tunable { switchSecurityFooter(shouldUseSplitNotificationShade); } + /** + * Set the fgs manager footer view and switch it into the right place + * @param view the view in question + */ + public void setFgsManagerFooter(View view) { + mFgsManagerFooter = view; + // Add after the footer + int index = indexOfChild(mFooter); + switchToParent(mFgsManagerFooter, this, index + 1); + } + protected void setPageMargin(int pageMargin) { if (mTileLayout instanceof PagedTileLayout) { ((PagedTileLayout) mTileLayout).setPageMargin(pageMargin); diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java index 001c740e310a1..cbfe944a2c230 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java @@ -57,6 +57,7 @@ import javax.inject.Named; public class QSPanelController extends QSPanelControllerBase { public static final String QS_REMOVE_LABELS = "sysui_remove_labels"; + private final QSFgsManagerFooter mQSFgsManagerFooter; private final QSSecurityFooter mQsSecurityFooter; private final TunerService mTunerService; private final QSCustomizerController mQsCustomizerController; @@ -94,7 +95,8 @@ public class QSPanelController extends QSPanelControllerBase { }; @Inject - QSPanelController(QSPanel view, QSSecurityFooter qsSecurityFooter, TunerService tunerService, + QSPanelController(QSPanel view, QSFgsManagerFooter qsFgsManagerFooter, + QSSecurityFooter qsSecurityFooter, TunerService tunerService, QSTileHost qstileHost, QSCustomizerController qsCustomizerController, @Named(QS_USING_MEDIA_PLAYER) boolean usingMediaPlayer, @Named(QS_PANEL) MediaHost mediaHost, @@ -105,6 +107,7 @@ public class QSPanelController extends QSPanelControllerBase { FalsingManager falsingManager, CommandQueue commandQueue) { super(view, qstileHost, qsCustomizerController, usingMediaPlayer, mediaHost, metricsLogger, uiEventLogger, qsLogger, dumpManager); + mQSFgsManagerFooter = qsFgsManagerFooter; mQsSecurityFooter = qsSecurityFooter; mTunerService = tunerService; mQsCustomizerController = qsCustomizerController; @@ -128,6 +131,7 @@ public class QSPanelController extends QSPanelControllerBase { mMediaHost.init(MediaHierarchyManager.LOCATION_QS); mQsCustomizerController.init(); mBrightnessSliderController.init(); + mQSFgsManagerFooter.init(); } private void updateMediaExpansion() { @@ -146,6 +150,7 @@ public class QSPanelController extends QSPanelControllerBase { refreshAllTiles(); } mView.addOnConfigurationChangedListener(mOnConfigurationChangedListener); + mView.setFgsManagerFooter(mQSFgsManagerFooter.getView()); mView.setSecurityFooter(mQsSecurityFooter.getView(), mShouldUseSplitNotificationShade); switchTileLayout(true); mBrightnessMirrorHandler.onQsPanelAttached(); @@ -230,6 +235,7 @@ public class QSPanelController extends QSPanelControllerBase { public void refreshAllTiles() { mBrightnessController.checkRestrictionAndSetEnabled(); super.refreshAllTiles(); + mQSFgsManagerFooter.refreshState(); mQsSecurityFooter.refreshState(); } 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 11e5b6e8934ea..1958cafb0fb9c 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentModule.java +++ b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentModule.java @@ -53,6 +53,7 @@ import dagger.Provides; */ @Module public interface QSFragmentModule { + String QS_FGS_MANAGER_FOOTER_VIEW = "qs_fgs_manager_footer"; String QS_SECURITY_FOOTER_VIEW = "qs_security_footer"; String QQS_FOOTER = "qqs_footer"; String QS_FOOTER = "qs_footer"; @@ -205,4 +206,15 @@ public interface QSFragmentModule { static StatusIconContainer providesStatusIconContainer(QuickStatusBarHeader qsHeader) { return qsHeader.findViewById(R.id.statusIcons); } + + /** */ + @Provides + @QSScope + @Named(QS_FGS_MANAGER_FOOTER_VIEW) + static View providesQSFgsManagerFooterView( + @QSThemedContext LayoutInflater layoutInflater, + QSPanel qsPanel + ) { + return layoutInflater.inflate(R.layout.quick_settings_security_footer, qsPanel, false); + } } \ No newline at end of file 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 3242adbcfad8d..b5ce7066f5529 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java @@ -80,6 +80,8 @@ public class QSPanelControllerTest extends SysuiTestCase { @Mock private TunerService mTunerService; @Mock + private QSFgsManagerFooter mQSFgsManagerFooter; + @Mock private QSSecurityFooter mQSSecurityFooter; @Mock private QSLogger mQSLogger; @@ -127,8 +129,8 @@ public class QSPanelControllerTest extends SysuiTestCase { .thenReturn(mQSTileRevealController); when(mMediaHost.getDisappearParameters()).thenReturn(new DisappearParameters()); - mController = new QSPanelController(mQSPanel, mQSSecurityFooter, mTunerService, - mQSTileHost, mQSCustomizerController, true, mMediaHost, + mController = new QSPanelController(mQSPanel, mQSFgsManagerFooter, mQSSecurityFooter, + mTunerService, mQSTileHost, mQSCustomizerController, true, mMediaHost, mQSTileRevealControllerFactory, mDumpManager, mMetricsLogger, mUiEventLogger, mQSLogger, mBrightnessControllerFactory, mToggleSliderViewControllerFactory, mFalsingManager, mCommandQueue