From bce234f3df52e260ecbf017c7c23828203ddbed1 Mon Sep 17 00:00:00 2001 From: Michael Rosenfeld Date: Thu, 12 Nov 2020 21:54:29 +0000 Subject: [PATCH] Revert "Stop injecting QSPanel everywhere." This reverts commit 42bd3c0834fa439a579c90aa78db191cc5b65070. Reason for revert: Causing breakage in QSPanel and monitored tests. Change-Id: I99cd110f58eb8f4c5faa6f7bef41e820654ea9df --- .../com/android/systemui/qs/QSFragment.java | 1 + .../systemui/qs/QSPanelController.java | 16 ++-------- .../systemui/qs/QSPanelControllerBase.java | 17 +++++----- .../android/systemui/qs/QSSecurityFooter.java | 21 +++++-------- .../systemui/qs/QSTileRevealController.java | 19 ++++++------ .../com/android/systemui/qs/QuickQSPanel.java | 5 +++ .../systemui/qs/QuickQSPanelController.java | 4 ++- .../systemui/qs/QuickStatusBarHeader.java | 18 +++++++---- .../systemui/qs/dagger/QSFragmentModule.java | 15 +-------- .../qs/QSPanelControllerBaseTest.java | 31 +++++++------------ .../systemui/qs/QSPanelControllerTest.java | 3 +- .../systemui/qs/QSSecurityFooterTest.java | 30 ++++++++---------- 12 files changed, 75 insertions(+), 105 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java index c58febdcd5a6c..0fe018efb009e 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java @@ -261,6 +261,7 @@ 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 05b791e642d04..addaf7e456b84 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelController.java @@ -49,7 +49,6 @@ 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; @@ -78,11 +77,11 @@ public class QSPanelController extends QSPanelControllerBase { DumpManager dumpManager, MetricsLogger metricsLogger, UiEventLogger uiEventLogger, BrightnessController.Factory brightnessControllerFactory, BrightnessSlider.Factory brightnessSliderFactory) { - super(view, qstileHost, qsCustomizerController, metricsLogger, uiEventLogger, dumpManager); + super(view, qstileHost, qsCustomizerController, qsTileRevealControllerFactory, + metricsLogger, uiEventLogger, dumpManager); mQsSecurityFooter = qsSecurityFooter; mTunerService = tunerService; mQsCustomizerController = qsCustomizerController; - mQsTileRevealControllerFactory = qsTileRevealControllerFactory; mQsSecurityFooter.setHostEnvironment(qstileHost); mBrightnessSliderFactory = brightnessSliderFactory; @@ -114,12 +113,6 @@ public class QSPanelController extends QSPanelControllerBase { } } - @Override - protected QSTileRevealController createTileRevealController() { - return mQsTileRevealControllerFactory.create( - this, (PagedTileLayout) mView.createRegularTileLayout()); - } - @Override protected void onViewDetached() { mTunerService.removeTunable(mView); @@ -287,10 +280,5 @@ 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 d0a839b4613e1..a3daf0e3e5fee 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelControllerBase.java @@ -48,6 +48,7 @@ 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; @@ -74,10 +75,12 @@ 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; @@ -86,8 +89,10 @@ public abstract class QSPanelControllerBase extends ViewContr @Override protected void onViewAttached() { - mQsTileRevealController = createTileRevealController(); - if (mQsTileRevealController != null) { + QSPanel.QSTileLayout regularTileLayout = mView.createRegularTileLayout(); + if (regularTileLayout instanceof PagedTileLayout) { + mQsTileRevealController = mQsTileRevealControllerFactory.create( + (PagedTileLayout) regularTileLayout); mQsTileRevealController.setExpansion(mRevealExpansion); } @@ -114,10 +119,6 @@ public abstract class QSPanelControllerBase extends ViewContr mDumpManager.unregisterDumpable(mView.getDumpableTag()); } - protected QSTileRevealController createTileRevealController() { - return null; - } - /** */ public void setTiles() { setTiles(mHost.getTiles(), false); @@ -125,11 +126,9 @@ public abstract class QSPanelControllerBase extends ViewContr /** */ public void setTiles(Collection tiles, boolean collapsedView) { - // TODO(b/168904199): move this logic into QSPanelController. - if (!collapsedView && mQsTileRevealController != null) { + if (!collapsedView) { 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 478923994af85..270fcbffbd712 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSSecurityFooter.java @@ -15,8 +15,6 @@ */ 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; @@ -46,10 +44,9 @@ 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; @@ -57,7 +54,6 @@ 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 { @@ -85,19 +81,18 @@ class QSSecurityFooter implements OnClickListener, DialogInterface.OnClickListen private int mFooterIconId; @Inject - QSSecurityFooter(@Named(QS_SECURITY_FOOTER_VIEW) View rootView, Context context, - UserTracker userTracker, @Main Handler mainHandler, ActivityStarter activityStarter, - SecurityController securityController, @Background Looper bgLooper) { - mRootView = rootView; + public QSSecurityFooter(QSPanel qsPanel, Context context, UserTracker userTracker) { + mRootView = LayoutInflater.from(context) + .inflate(R.layout.quick_settings_footer, qsPanel, false); 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 = mainHandler; - mActivityStarter = activityStarter; - mSecurityController = securityController; - mHandler = new H(bgLooper); + mMainHandler = new Handler(Looper.myLooper()); + mActivityStarter = Dependency.get(ActivityStarter.class); + mSecurityController = Dependency.get(SecurityController.class); + mHandler = new H(Dependency.get(Dependency.BG_LOOPER)); 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 3f931088ec836..9414d0e3ed52d 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 QSPanelController mQSPanelController; + private final QSPanel mQSPanel; 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 (mQSPanelController.isExpanded()) { + if (mQSPanel.isExpanded()) { addTileSpecsToRevealed(mTilesToReveal); mTilesToReveal.clear(); } }); } }; - QSTileRevealController(Context context, QSPanelController qsPanelController, - PagedTileLayout pagedTileLayout, QSCustomizerController qsCustomizerController) { + QSTileRevealController(Context context, QSPanel qsPanel, PagedTileLayout pagedTileLayout, + QSCustomizerController qsCustomizerController) { mContext = context; - mQSPanelController = qsPanelController; + mQSPanel = qsPanel; mPagedTileLayout = pagedTileLayout; mQsCustomizerController = qsCustomizerController; } @@ -85,17 +85,18 @@ public class QSTileRevealController { @QSScope static class Factory { private final Context mContext; + private final QSPanel mQsPanel; private final QSCustomizerController mQsCustomizerController; @Inject - Factory(Context context, QSCustomizerController qsCustomizerController) { + Factory(Context context, QSPanel qsPanel, QSCustomizerController qsCustomizerController) { mContext = context; + mQsPanel = qsPanel; mQsCustomizerController = qsCustomizerController; } - QSTileRevealController create(QSPanelController qsPanelController, - PagedTileLayout pagedTileLayout) { - return new QSTileRevealController(mContext, qsPanelController, pagedTileLayout, + QSTileRevealController create(PagedTileLayout pagedTileLayout) { + return new QSTileRevealController(mContext, mQsPanel, 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 06e8634a0d1fa..ebe80ae961727 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java @@ -51,6 +51,7 @@ public class QuickQSPanel extends QSPanel { private boolean mDisabledByPolicy; private int mMaxTiles; + protected QSPanel mFullPanel; @Inject @@ -117,6 +118,10 @@ 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 078e0f9c359b1..54d3026878c8c 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanelController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanelController.java @@ -46,9 +46,11 @@ 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, metricsLogger, uiEventLogger, dumpManager); + super(view, qsTileHost, qsCustomizerController, qsTileRevealControllerFactory, + 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 027767bc0893e..5757602b9d0fd 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java @@ -153,12 +153,6 @@ 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) { @@ -445,6 +439,18 @@ 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 f3bf306642f6b..354b2c9442484 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentModule.java +++ b/packages/SystemUI/src/com/android/systemui/qs/dagger/QSFragmentModule.java @@ -16,7 +16,6 @@ package com.android.systemui.qs.dagger; -import android.view.LayoutInflater; import android.view.View; import com.android.systemui.R; @@ -32,8 +31,6 @@ 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; @@ -43,8 +40,6 @@ import dagger.Provides; */ @Module public interface QSFragmentModule { - String QS_SECURITY_FOOTER_VIEW = "qs_security_footer"; - /** */ @Provides @RootView @@ -100,12 +95,4 @@ 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 64c927ddd9dc0..9421cd0800ff5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerBaseTest.java @@ -86,16 +86,13 @@ public class QSPanelControllerBaseTest extends SysuiTestCase { private QSPanelControllerBase mController; /** Implementation needed to ensure we have a reflectively-available class name. */ - private class TestableQSPanelControllerBase extends QSPanelControllerBase { + private static class TestableQSPanelControllerBase extends QSPanelControllerBase { protected TestableQSPanelControllerBase(QSPanel view, QSTileHost host, - QSCustomizerController qsCustomizerController, MetricsLogger metricsLogger, - UiEventLogger uiEventLogger, DumpManager dumpManager) { - super(view, host, qsCustomizerController, metricsLogger, uiEventLogger, dumpManager); - } - - @Override - protected QSTileRevealController createTileRevealController() { - return mQSTileRevealController; + QSCustomizerController qsCustomizerController, + QSTileRevealController.Factory qsTileRevealControllerFactory, + MetricsLogger metricsLogger, UiEventLogger uiEventLogger, DumpManager dumpManager) { + super(view, host, qsCustomizerController, qsTileRevealControllerFactory, metricsLogger, + uiEventLogger, dumpManager); } } @@ -111,11 +108,10 @@ 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(), any())) - .thenReturn(mQSTileRevealController); + when(mQSTileRevealControllerFactory.create(any())).thenReturn(mQSTileRevealController); mController = new TestableQSPanelControllerBase(mQSPanel, mQSTileHost, - mQSCustomizerController, mMetricsLogger, + mQSCustomizerController, mQSTileRevealControllerFactory, mMetricsLogger, mUiEventLogger, mDumpManager); mController.init(); @@ -126,14 +122,9 @@ public class QSPanelControllerBaseTest extends SysuiTestCase { public void testSetRevealExpansion_preAttach() { mController.onViewDetached(); - QSPanelControllerBase controller = new QSPanelControllerBase( - mQSPanel, mQSTileHost, mQSCustomizerController, mMetricsLogger, mUiEventLogger, - mDumpManager) { - @Override - protected QSTileRevealController createTileRevealController() { - return mQSTileRevealController; - } - }; + QSPanelControllerBase controller = new TestableQSPanelControllerBase(mQSPanel, + mQSTileHost, mQSCustomizerController, mQSTileRevealControllerFactory, + mMetricsLogger, mUiEventLogger, mDumpManager); // 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 1a60e4fbf7b2b..f57e3c2892ea6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelControllerTest.java @@ -107,8 +107,7 @@ public class QSPanelControllerTest extends SysuiTestCase { .thenReturn(mBrightnessSlider); when(mBrightnessControllerFactory.create(any(ToggleSlider.class))) .thenReturn(mBrightnessController); - when(mQSTileRevealControllerFactory.create(any(), any())) - .thenReturn(mQSTileRevealController); + when(mQSTileRevealControllerFactory.create(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 6fa6f31984f2f..c82aee48ab913 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java @@ -23,9 +23,8 @@ 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; @@ -39,18 +38,16 @@ 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: @@ -76,23 +73,22 @@ public class QSSecurityFooterTest extends SysuiTestCase { private TextView mFooterText; private TestableImageView mFooterIcon; private QSSecurityFooter mFooter; - @Mock - private SecurityController mSecurityController; - @Mock + private SecurityController mSecurityController = mock(SecurityController.class); private UserTracker mUserTracker; - @Mock - private ActivityStarter mActivityStarter; @Before public void setUp() { - MockitoAnnotations.initMocks(this); - Looper looper = TestableLooper.get(this).getLooper(); + mDependency.injectTestDependency(SecurityController.class, mSecurityController); + mDependency.injectTestDependency(Dependency.BG_LOOPER, + TestableLooper.get(this).getLooper()); + mUserTracker = mock(UserTracker.class); when(mUserTracker.getUserInfo()).thenReturn(mock(UserInfo.class)); - 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); + mContext.addMockSystemService(Context.LAYOUT_INFLATER_SERVICE, + new LayoutInflaterBuilder(mContext) + .replace("ImageView", TestableImageView.class) + .build()); + mFooter = new QSSecurityFooter(null, mContext, mUserTracker); + mRootView = (ViewGroup) mFooter.getView(); mFooterText = mRootView.findViewById(R.id.footer_text); mFooterIcon = mRootView.findViewById(R.id.footer_icon); mFooter.setHostEnvironment(null);