diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java b/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java index bcce87a51097d..1d6c7c94dcc33 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSDetail.java @@ -44,6 +44,7 @@ import com.android.systemui.Dependency; import com.android.systemui.FontSizeUtils; import com.android.systemui.R; import com.android.systemui.plugins.ActivityStarter; +import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.qs.DetailAdapter; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.phone.NotificationsQuickSettingsContainer; @@ -57,6 +58,7 @@ public class QSDetail extends LinearLayout { private final UiEventLogger mUiEventLogger = QSEvents.INSTANCE.getQsUiEventsLogger(); private ViewGroup mDetailContent; + private FalsingManager mFalsingManager; protected TextView mDetailSettingsButton; protected TextView mDetailDoneButton; @VisibleForTesting @@ -124,12 +126,13 @@ public class QSDetail extends LinearLayout { /** */ public void setQsPanel(QSPanelController panelController, QuickStatusBarHeader header, - QSFooter footer) { + QSFooter footer, FalsingManager falsingManager) { mQsPanelController = panelController; mHeader = header; mFooter = footer; mHeader.setCallback(mQsPanelCallback); mQsPanelController.setCallback(mQsPanelCallback); + mFalsingManager = falsingManager; } public void setHost(QSTileHost host) { @@ -273,6 +276,9 @@ public class QSDetail extends LinearLayout { final Intent settingsIntent = adapter.getSettingsIntent(); mDetailSettingsButton.setVisibility(settingsIntent != null ? VISIBLE : GONE); mDetailSettingsButton.setOnClickListener(v -> { + if (mFalsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) { + return; + } Dependency.get(MetricsLogger.class).action(ACTION_QS_MORE_SETTINGS, adapter.getMetricsCategory()); mUiEventLogger.log(adapter.moreSettingsEvent()); @@ -280,6 +286,9 @@ public class QSDetail extends LinearLayout { .postStartActivityDismissingKeyguard(settingsIntent, 0); }); mDetailDoneButton.setOnClickListener(v -> { + if (mFalsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) { + return; + } announceForAccessibility( mContext.getString(R.string.accessibility_desc_quick_settings)); if (!adapter.onDoneButtonClicked()) { @@ -301,13 +310,13 @@ public class QSDetail extends LinearLayout { mQsDetailHeaderSwitch.setVisibility(VISIBLE); handleToggleStateChanged(toggleState, adapter.getToggleEnabled()); mQsDetailHeader.setClickable(true); - mQsDetailHeader.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - boolean checked = !mQsDetailHeaderSwitch.isChecked(); - mQsDetailHeaderSwitch.setChecked(checked); - adapter.setToggleState(checked); + mQsDetailHeader.setOnClickListener(v -> { + if (mFalsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) { + return; } + boolean checked = !mQsDetailHeaderSwitch.isChecked(); + mQsDetailHeaderSwitch.setChecked(checked); + adapter.setToggleState(checked); }); } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java index 0d91f29b5b2e7..9b2eebf33f86a 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java @@ -39,6 +39,7 @@ import androidx.annotation.VisibleForTesting; import com.android.systemui.R; import com.android.systemui.animation.Interpolators; import com.android.systemui.media.MediaHost; +import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.qs.QS; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.qs.customize.QSCustomizerController; @@ -67,6 +68,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca private final Rect mQsBounds = new Rect(); private final StatusBarStateController mStatusBarStateController; + private final FalsingManager mFalsingManager; private boolean mQsExpanded; private boolean mHeaderAnimating; private boolean mStackScrollerOverscrolling; @@ -133,7 +135,8 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca StatusBarStateController statusBarStateController, CommandQueue commandQueue, QSDetailDisplayer qsDetailDisplayer, @Named(QS_PANEL) MediaHost qsMediaHost, @Named(QUICK_QS_PANEL) MediaHost qqsMediaHost, - QSFragmentComponent.Factory qsComponentFactory, FeatureFlags featureFlags) { + QSFragmentComponent.Factory qsComponentFactory, FeatureFlags featureFlags, + FalsingManager falsingManager) { mRemoteInputQuickSettingsDisabler = remoteInputQsDisabler; mInjectionInflater = injectionInflater; mCommandQueue = commandQueue; @@ -144,6 +147,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca commandQueue.observe(getLifecycle(), this); mHost = qsTileHost; mFeatureFlags = featureFlags; + mFalsingManager = falsingManager; mStatusBarStateController = statusBarStateController; } @@ -190,7 +194,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca mQSContainerImplController.init(); mContainer = mQSContainerImplController.getView(); - mQSDetail.setQsPanel(mQSPanelController, mHeader, mFooter); + mQSDetail.setQsPanel(mQSPanelController, mHeader, mFooter, mFalsingManager); mQSAnimator = qsFragmentComponent.getQSAnimator(); mQSCustomizerController = qsFragmentComponent.getQSCustomizerController(); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailView.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailView.java index a9723341e7870..04437ea14bb3a 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailView.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailView.java @@ -146,7 +146,7 @@ public class UserDetailView extends PseudoGridView { @Override public void onClick(View view) { - if (mFalsingManager.isFalseTap(FalsingManager.MODERATE_PENALTY)) { + if (mFalsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) { return; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java index e2b6895e7039a..4e921a036b367 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java @@ -67,6 +67,7 @@ import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dagger.qualifiers.UiBackground; import com.android.systemui.plugins.ActivityStarter; +import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.qs.DetailAdapter; import com.android.systemui.qs.QSUserSwitcherEvent; import com.android.systemui.qs.tiles.UserDetailView; @@ -131,6 +132,7 @@ public class UserSwitcherController implements Dumpable { private final Executor mUiBgExecutor; private final boolean mGuestUserAutoCreated; private final AtomicBoolean mGuestCreationScheduled; + private FalsingManager mFalsingManager; @Inject public UserSwitcherController(Context context, @@ -139,6 +141,7 @@ public class UserSwitcherController implements Dumpable { ActivityStarter activityStarter, BroadcastDispatcher broadcastDispatcher, UiEventLogger uiEventLogger, + FalsingManager falsingManager, TelephonyListenerManager telephonyListenerManager, IActivityTaskManager activityTaskManager, UserDetailAdapter userDetailAdapter, @@ -148,6 +151,7 @@ public class UserSwitcherController implements Dumpable { mTelephonyListenerManager = telephonyListenerManager; mActivityTaskManager = activityTaskManager; mUiEventLogger = uiEventLogger; + mFalsingManager = falsingManager; mGuestResumeSessionReceiver = new GuestResumeSessionReceiver(this, mUiEventLogger); mUserDetailAdapter = userDetailAdapter; mUiBgExecutor = uiBgExecutor; @@ -1031,6 +1035,11 @@ public class UserSwitcherController implements Dumpable { @Override public void onClick(DialogInterface dialog, int which) { + int penalty = which == BUTTON_NEGATIVE ? FalsingManager.NO_PENALTY + : FalsingManager.HIGH_PENALTY; + if (mFalsingManager.isFalseTap(penalty)) { + return; + } if (which == BUTTON_NEGATIVE) { cancel(); } else { @@ -1057,6 +1066,11 @@ public class UserSwitcherController implements Dumpable { @Override public void onClick(DialogInterface dialog, int which) { + int penalty = which == BUTTON_NEGATIVE ? FalsingManager.NO_PENALTY + : FalsingManager.MODERATE_PENALTY; + if (mFalsingManager.isFalseTap(penalty)) { + return; + } if (which == BUTTON_NEGATIVE) { cancel(); } else { diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSDetailTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSDetailTest.java index 75cf8550518b5..c2bd024f0375e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSDetailTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSDetailTest.java @@ -41,6 +41,7 @@ import com.android.internal.logging.testing.UiEventLoggerFake; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.ActivityStarter; +import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.qs.DetailAdapter; import org.junit.After; @@ -76,7 +77,8 @@ public class QSDetailTest extends SysuiTestCase { mQsPanelController = mock(QSPanelController.class); mQuickHeader = mock(QuickStatusBarHeader.class); - mQsDetail.setQsPanel(mQsPanelController, mQuickHeader, mock(QSFooter.class)); + mQsDetail.setQsPanel(mQsPanelController, mQuickHeader, mock(QSFooter.class), + mock(FalsingManager.class)); mQsDetail.mClipper = mock(QSDetailClipper.class); mMockDetailAdapter = mock(DetailAdapter.class); diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java index 2ae4cbe17ac6d..c40977b31e731 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java @@ -44,6 +44,7 @@ import com.android.systemui.SysuiBaseFragmentTest; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dump.DumpManager; import com.android.systemui.media.MediaHost; +import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.qs.dagger.QSFragmentComponent; import com.android.systemui.qs.external.CustomTileStatePersister; @@ -92,6 +93,8 @@ public class QSFragmentTest extends SysuiBaseFragmentTest { private MediaHost mQQSMediaHost; @Mock private FeatureFlags mFeatureFlags; + @Mock + private FalsingManager mFalsingManager; public QSFragmentTest() { super(QSFragment.class); @@ -182,6 +185,7 @@ public class QSFragmentTest extends SysuiBaseFragmentTest { mQSMediaHost, mQQSMediaHost, mQsComponentFactory, - mFeatureFlags); + mFeatureFlags, + mFalsingManager); } }