diff options
78 files changed, 551 insertions, 490 deletions
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/interactor/FakeQSTile.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/interactor/FakeQSTile.kt index 7e0e7d1f46e8..302ac35f1a8a 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/interactor/FakeQSTile.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/domain/interactor/FakeQSTile.kt @@ -16,8 +16,8 @@ package com.android.systemui.qs.pipeline.domain.interactor -import android.view.View import com.android.internal.logging.InstanceId +import com.android.systemui.animation.Expandable import com.android.systemui.plugins.qs.QSTile class FakeQSTile( @@ -56,11 +56,11 @@ class FakeQSTile( callbacks.clear() } - override fun click(view: View?) {} + override fun click(expandable: Expandable?) {} - override fun secondaryClick(view: View?) {} + override fun secondaryClick(expandable: Expandable?) {} - override fun longClick(view: View?) {} + override fun longClick(expandable: Expandable?) {} override fun userSwitch(currentUser: Int) { user = currentUser diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/fontscaling/domain/interactor/FontScalingUserActionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/fontscaling/domain/interactor/FontScalingUserActionInteractorTest.kt index 182a6040b3b3..d3095542e90f 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/fontscaling/domain/interactor/FontScalingUserActionInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/fontscaling/domain/interactor/FontScalingUserActionInteractorTest.kt @@ -16,6 +16,7 @@ package com.android.systemui.qs.tiles.impl.fontscaling.domain.interactor +import android.content.Context import android.provider.Settings import android.view.View import androidx.test.ext.junit.runners.AndroidJUnit4 @@ -23,6 +24,8 @@ import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.accessibility.fontscaling.FontScalingDialogDelegate import com.android.systemui.animation.DialogTransitionAnimator +import com.android.systemui.animation.Expandable +import com.android.systemui.animation.LaunchableView import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.testScope import com.android.systemui.plugins.ActivityStarter @@ -36,7 +39,6 @@ import com.android.systemui.statusbar.phone.SystemUIDialog import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.eq import com.android.systemui.util.mockito.mock -import com.android.systemui.util.mockito.nullable import com.android.systemui.util.mockito.whenever import com.google.common.truth.Truth import kotlinx.coroutines.test.runTest @@ -63,6 +65,8 @@ class FontScalingUserActionInteractorTest : SysuiTestCase() { @Mock private lateinit var mDialogTransitionAnimator: DialogTransitionAnimator @Mock private lateinit var dialog: SystemUIDialog @Mock private lateinit var activityStarter: ActivityStarter + @Mock private lateinit var expandable: Expandable + @Mock private lateinit var controller: DialogTransitionAnimator.Controller @Captor private lateinit var argumentCaptor: ArgumentCaptor<Runnable> @@ -73,6 +77,9 @@ class FontScalingUserActionInteractorTest : SysuiTestCase() { dialog = mock<SystemUIDialog>() fontScalingDialogDelegate = mock<FontScalingDialogDelegate> { whenever(createDialog()).thenReturn(dialog) } + controller = mock<DialogTransitionAnimator.Controller>() + expandable = + mock<Expandable> { whenever(dialogTransitionController(any())).thenReturn(controller) } argumentCaptor = ArgumentCaptor.forClass(Runnable::class.java) underTest = @@ -90,9 +97,8 @@ class FontScalingUserActionInteractorTest : SysuiTestCase() { fun clickTile_screenUnlocked_showDialogAnimationFromView() = kosmos.testScope.runTest { keyguardStateController.isShowing = false - val testView = View(context) - underTest.handleInput(click(FontScalingTileModel, view = testView)) + underTest.handleInput(click(FontScalingTileModel, expandable = expandable)) verify(activityStarter) .executeRunnableDismissingKeyguard( @@ -103,17 +109,15 @@ class FontScalingUserActionInteractorTest : SysuiTestCase() { eq(false) ) argumentCaptor.value.run() - verify(mDialogTransitionAnimator) - .showFromView(any(), eq(testView), nullable(), anyBoolean()) + verify(mDialogTransitionAnimator).show(any(), any(), anyBoolean()) } @Test fun clickTile_onLockScreen_neverShowDialogAnimationFromView_butShowsDialog() = kosmos.testScope.runTest { keyguardStateController.isShowing = true - val testView = View(context) - underTest.handleInput(click(FontScalingTileModel, view = testView)) + underTest.handleInput(click(FontScalingTileModel, expandable = expandable)) verify(activityStarter) .executeRunnableDismissingKeyguard( @@ -124,8 +128,7 @@ class FontScalingUserActionInteractorTest : SysuiTestCase() { eq(false) ) argumentCaptor.value.run() - verify(mDialogTransitionAnimator, never()) - .showFromView(any(), eq(testView), nullable(), anyBoolean()) + verify(mDialogTransitionAnimator, never()).show(any(), any(), anyBoolean()) verify(dialog).show() } @@ -140,4 +143,8 @@ class FontScalingUserActionInteractorTest : SysuiTestCase() { val expectedIntentAction = Settings.ACTION_TEXT_READING_SETTINGS Truth.assertThat(actualIntentAction).isEqualTo(expectedIntentAction) } + + private class FontScalingTileTestView(context: Context) : View(context), LaunchableView { + override fun setShouldBlockVisibilityChanges(block: Boolean) {} + } } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/screenrecord/domain/interactor/ScreenRecordTileUserActionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/screenrecord/domain/interactor/ScreenRecordTileUserActionInteractorTest.kt index b9321d55e9dc..91f4ea8ffcc0 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/screenrecord/domain/interactor/ScreenRecordTileUserActionInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/screenrecord/domain/interactor/ScreenRecordTileUserActionInteractorTest.kt @@ -18,12 +18,11 @@ package com.android.systemui.qs.tiles.impl.screenrecord.domain.interactor import android.app.Dialog import android.os.UserHandle -import android.view.View import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.animation.DialogTransitionAnimator -import com.android.systemui.animation.dialogTransitionAnimator +import com.android.systemui.animation.Expandable import com.android.systemui.flags.featureFlagsClassic import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository import com.android.systemui.keyguard.domain.interactor.keyguardInteractor @@ -138,12 +137,17 @@ class ScreenRecordTileUserActionInteractorTest : SysuiTestCase() { */ @Test fun handleClickFromView_whenDoingNothing_whenKeyguardNotShowing_showDialogFromView() = runTest { - val view = mock<View>() + val expandable = mock<Expandable>() + val controller = mock<DialogTransitionAnimator.Controller>() + whenever(expandable.dialogTransitionController(any())).thenReturn(controller) + kosmos.fakeKeyguardRepository.setKeyguardShowing(false) val recordingModel = ScreenRecordTileModel.DoingNothing - underTest.handleInput(QSTileInputTestKtx.click(recordingModel, UserHandle.CURRENT, view)) + underTest.handleInput( + QSTileInputTestKtx.click(recordingModel, UserHandle.CURRENT, expandable) + ) val onStartRecordingClickedCaptor = argumentCaptor<Runnable>() verify(recordingController) .createScreenRecordDialog( @@ -158,6 +162,6 @@ class ScreenRecordTileUserActionInteractorTest : SysuiTestCase() { verify(keyguardDismissUtil) .executeWhenUnlocked(onDismissActionCaptor.capture(), eq(false), eq(true)) onDismissActionCaptor.value.onDismiss() - verify(dialogTransitionAnimator).showFromView(eq(dialog), eq(view), any(), eq(true)) + verify(dialogTransitionAnimator).show(eq(dialog), eq(controller), eq(true)) } } diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java index c9e298934acc..d13c75082790 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java @@ -21,11 +21,11 @@ import android.graphics.drawable.Drawable; import android.metrics.LogMaker; import android.service.quicksettings.Tile; import android.text.TextUtils; -import android.view.View; import androidx.annotation.Nullable; import com.android.internal.logging.InstanceId; +import com.android.systemui.animation.Expandable; import com.android.systemui.plugins.annotations.DependsOn; import com.android.systemui.plugins.annotations.ProvidesInterface; import com.android.systemui.plugins.qs.QSTile.Callback; @@ -58,23 +58,23 @@ public interface QSTile { /** * The tile was clicked. * - * @param view The view that was clicked. + * @param expandable {@link Expandable} that was clicked. */ - void click(@Nullable View view); + void click(@Nullable Expandable expandable); /** * The tile secondary click was triggered. * - * @param view The view that was clicked. + * @param expandable {@link Expandable} that was clicked. */ - void secondaryClick(@Nullable View view); + void secondaryClick(@Nullable Expandable expandable); /** * The tile was long clicked. * - * @param view The view that was clicked. + * @param expandable {@link Expandable} that was clicked. */ - void longClick(@Nullable View view); + void longClick(@Nullable Expandable expandable); void userSwitch(int currentUser); diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogManager.java b/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogManager.java index 623b40f144eb..14e5f3422a27 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogManager.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogManager.java @@ -18,7 +18,6 @@ package com.android.systemui.accessibility.hearingaid; import android.bluetooth.BluetoothDevice; import android.util.Log; -import android.view.View; import androidx.annotation.Nullable; @@ -26,6 +25,7 @@ import com.android.internal.jank.InteractionJankMonitor; import com.android.settingslib.bluetooth.LocalBluetoothManager; import com.android.systemui.animation.DialogCuj; import com.android.systemui.animation.DialogTransitionAnimator; +import com.android.systemui.animation.Expandable; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.statusbar.phone.SystemUIDialog; @@ -58,9 +58,9 @@ public class HearingDevicesDialogManager { /** * Shows the dialog. * - * @param view The view from which the dialog is shown. + * @param expandable {@link Expandable} from which the dialog is shown. */ - public void showDialog(View view) { + public void showDialog(Expandable expandable) { if (mDialog != null) { if (DEBUG) { Log.d(TAG, "HearingDevicesDialog already showing. Destroy it first."); @@ -70,13 +70,17 @@ public class HearingDevicesDialogManager { mDialog = mDialogFactory.create(!isAnyBondedHearingDevice()).createDialog(); - if (view != null) { - mDialogTransitionAnimator.showFromView(mDialog, view, + if (expandable != null) { + DialogTransitionAnimator.Controller controller = expandable.dialogTransitionController( new DialogCuj(InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN, - INTERACTION_JANK_TAG), /* animateBackgroundBoundsChange= */ true); - } else { - mDialog.show(); + INTERACTION_JANK_TAG)); + if (controller != null) { + mDialogTransitionAnimator.show(mDialog, + controller, /* animateBackgroundBoundsChange= */ true); + return; + } } + mDialog.show(); } private void destroyDialog() { diff --git a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogViewModel.kt b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogViewModel.kt index eb919e3ca36b..4369f3f64613 100644 --- a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogViewModel.kt @@ -32,6 +32,7 @@ import com.android.settingslib.bluetooth.BluetoothUtils import com.android.systemui.Prefs import com.android.systemui.animation.DialogCuj import com.android.systemui.animation.DialogTransitionAnimator +import com.android.systemui.animation.Expandable import com.android.systemui.bluetooth.qsdialog.BluetoothTileDialogDelegate.Companion.ACTION_AUDIO_SHARING import com.android.systemui.bluetooth.qsdialog.BluetoothTileDialogDelegate.Companion.ACTION_BLUETOOTH_DEVICE_DETAILS import com.android.systemui.bluetooth.qsdialog.BluetoothTileDialogDelegate.Companion.ACTION_PAIR_NEW_DEVICE @@ -82,7 +83,7 @@ constructor( * @param view The view from which the dialog is shown. */ @kotlinx.coroutines.ExperimentalCoroutinesApi - fun showDialog(view: View?) { + fun showDialog(expandable: Expandable?) { cancelJob() job = @@ -93,17 +94,15 @@ constructor( val dialog = dialogDelegate.createDialog() val context = dialog.context - view?.let { - dialogTransitionAnimator.showFromView( - dialog, - it, - animateBackgroundBoundsChange = true, - cuj = - DialogCuj( - InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN, - INTERACTION_JANK_TAG - ) + val controller = + expandable?.dialogTransitionController( + DialogCuj( + InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN, + INTERACTION_JANK_TAG + ) ) + controller?.let { + dialogTransitionAnimator.show(dialog, it, animateBackgroundBoundsChange = true) } ?: dialog.show() diff --git a/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java b/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java index d476e6302a3b..a14479bb848e 100644 --- a/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java +++ b/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java @@ -67,6 +67,7 @@ import com.android.settingslib.fuelgauge.BatterySaverUtils; import com.android.systemui.SystemUIApplication; import com.android.systemui.animation.DialogCuj; import com.android.systemui.animation.DialogTransitionAnimator; +import com.android.systemui.animation.Expandable; import com.android.systemui.broadcast.BroadcastSender; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.plugins.ActivityStarter; @@ -323,7 +324,7 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI { // remaining estimate is disabled if (!mCurrentBatterySnapshot.isHybrid() || mBucket < -1 || mCurrentBatterySnapshot.getTimeRemainingMillis() - < mCurrentBatterySnapshot.getSevereThresholdMillis()) { + < mCurrentBatterySnapshot.getSevereThresholdMillis()) { nb.setColor(Utils.getColorAttrDefaultColor(mContext, android.R.attr.colorError)); } @@ -703,17 +704,23 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI { mSaverConfirmation = null; logEvent(BatteryWarningEvents.LowBatteryWarningEvent.SAVER_CONFIRM_DISMISS); }); - WeakReference<View> ref = mBatteryControllerLazy.get().getLastPowerSaverStartView(); - if (ref != null && ref.get() != null && ref.get().isAggregatedVisible()) { - mDialogTransitionAnimator.showFromView(d, ref.get(), + WeakReference<Expandable> ref = + mBatteryControllerLazy.get().getLastPowerSaverStartExpandable(); + if (ref != null && ref.get() != null) { + DialogTransitionAnimator.Controller controller = ref.get().dialogTransitionController( new DialogCuj(InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN, INTERACTION_JANK_TAG)); + if (controller != null) { + mDialogTransitionAnimator.show(d, controller); + } else { + d.show(); + } } else { d.show(); } logEvent(BatteryWarningEvents.LowBatteryWarningEvent.SAVER_CONFIRM_DIALOG); mSaverConfirmation = d; - mBatteryControllerLazy.get().clearLastPowerSaverStartView(); + mBatteryControllerLazy.get().clearLastPowerSaverStartExpandable(); } @VisibleForTesting @@ -873,4 +880,4 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI { } } } -} +}
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java b/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java index b53c2450f4c7..d26ae0a4dac8 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java @@ -41,7 +41,6 @@ import android.service.quicksettings.TileService; import android.text.format.DateUtils; import android.util.Log; import android.view.IWindowManager; -import android.view.View; import android.view.WindowManagerGlobal; import android.widget.Switch; @@ -52,6 +51,7 @@ import com.android.internal.jank.InteractionJankMonitor; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.systemui.animation.ActivityTransitionAnimator; +import com.android.systemui.animation.Expandable; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.ActivityStarter; @@ -99,7 +99,7 @@ public class CustomTile extends QSTileImpl<State> implements TileChangeListener, @Nullable private CharSequence mDefaultLabel; @Nullable - private View mViewClicked; + private Expandable mExpandableClicked; private final Context mUserContext; @@ -347,7 +347,7 @@ public class CustomTile extends QSTileImpl<State> implements TileChangeListener, mService.onStartListening(); } } else { - mViewClicked = null; + mExpandableClicked = null; mService.onStopListening(); if (mIsTokenGranted && !mIsShowingDialog) { try { @@ -409,11 +409,11 @@ public class CustomTile extends QSTileImpl<State> implements TileChangeListener, } @Override - protected void handleClick(@Nullable View view) { + protected void handleClick(@Nullable Expandable expandable) { if (mTile.getState() == Tile.STATE_UNAVAILABLE) { return; } - mViewClicked = view; + mExpandableClicked = expandable; try { if (DEBUG) Log.d(TAG, "Adding token"); mWindowManager.addWindowToken(mToken, TYPE_QS_DIALOG, @@ -541,11 +541,9 @@ public class CustomTile extends QSTileImpl<State> implements TileChangeListener, Log.i(TAG, "The activity is starting"); ActivityTransitionAnimator.Controller controller = - mViewClicked == null ? null : - ActivityTransitionAnimator.Controller.fromView( - mViewClicked, - InteractionJankMonitor.CUJ_SHADE_APP_LAUNCH_FROM_QS_TILE - ); + mExpandableClicked == null ? null : + mExpandableClicked.activityTransitionController( + InteractionJankMonitor.CUJ_SHADE_APP_LAUNCH_FROM_QS_TILE); mActivityStarter.startPendingIntentMaybeDismissingKeyguard( pendingIntent, /* intentSentUiThreadCallback= */ null, diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/TileViewModel.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/TileViewModel.kt index 8fc66d37ef86..a6cfa75a7583 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/TileViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/TileViewModel.kt @@ -16,8 +16,7 @@ package com.android.systemui.qs.panels.ui.viewmodel -import android.view.View -import android.view.View.OnLongClickListener +import com.android.systemui.animation.Expandable import com.android.systemui.plugins.qs.QSTile import com.android.systemui.qs.pipeline.shared.TileSpec import com.android.systemui.utils.coroutines.flow.conflatedCallbackFlow @@ -26,8 +25,7 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.onStart -class TileViewModel(private val tile: QSTile, val spec: TileSpec) : - OnLongClickListener, View.OnClickListener { +class TileViewModel(private val tile: QSTile, val spec: TileSpec) { val state: Flow<QSTile.State> = conflatedCallbackFlow { val callback = QSTile.Callback { trySend(it.copy()) } @@ -42,13 +40,12 @@ class TileViewModel(private val tile: QSTile, val spec: TileSpec) : val currentState: QSTile.State get() = tile.state - override fun onClick(view: View?) { - tile.click(view) + fun onClick(expandable: Expandable?) { + tile.click(expandable) } - override fun onLongClick(view: View?): Boolean { - tile.longClick(view) - return true + fun onLongClick(expandable: Expandable?) { + tile.longClick(expandable) } fun startListening(token: Any) = tile.setListening(token, true) diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java index 145674747bb6..c24113f14f00 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java @@ -42,7 +42,6 @@ import android.text.format.DateUtils; import android.util.ArraySet; import android.util.Log; import android.util.SparseArray; -import android.view.View; import androidx.annotation.Nullable; import androidx.lifecycle.Lifecycle; @@ -58,6 +57,7 @@ import com.android.settingslib.RestrictedLockUtils; import com.android.settingslib.RestrictedLockUtilsInternal; import com.android.systemui.Dumpable; import com.android.systemui.animation.ActivityTransitionAnimator; +import com.android.systemui.animation.Expandable; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.qs.QSTile; @@ -137,9 +137,9 @@ public abstract class QSTileImpl<TState extends State> implements QSTile, Lifecy * * Calls to the controller should be made here to set the new state of the device. * - * @param view The view that was clicked. + * @param expandable {@link Expandable} that was clicked. */ - protected abstract void handleClick(@Nullable View view); + protected abstract void handleClick(@Nullable Expandable expandable); /** * Update state of the tile based on device state @@ -282,7 +282,8 @@ public abstract class QSTileImpl<TState extends State> implements QSTile, Lifecy mHandler.sendEmptyMessage(H.REMOVE_CALLBACKS); } - public void click(@Nullable View view) { + @Override + public void click(@Nullable Expandable expandable) { mMetricsLogger.write(populate(new LogMaker(ACTION_QS_CLICK).setType(TYPE_ACTION) .addTaggedData(FIELD_STATUS_BAR_STATE, mStatusBarStateController.getState()))); @@ -292,11 +293,12 @@ public abstract class QSTileImpl<TState extends State> implements QSTile, Lifecy mQSLogger.logTileClick(mTileSpec, mStatusBarStateController.getState(), mState.state, eventId); if (!mFalsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) { - mHandler.obtainMessage(H.CLICK, eventId, 0, view).sendToTarget(); + mHandler.obtainMessage(H.CLICK, eventId, 0, expandable).sendToTarget(); } } - public void secondaryClick(@Nullable View view) { + @Override + public void secondaryClick(@Nullable Expandable expandable) { mMetricsLogger.write(populate(new LogMaker(ACTION_QS_SECONDARY_CLICK).setType(TYPE_ACTION) .addTaggedData(FIELD_STATUS_BAR_STATE, mStatusBarStateController.getState()))); @@ -305,11 +307,11 @@ public abstract class QSTileImpl<TState extends State> implements QSTile, Lifecy final int eventId = mClickEventId++; mQSLogger.logTileSecondaryClick(mTileSpec, mStatusBarStateController.getState(), mState.state, eventId); - mHandler.obtainMessage(H.SECONDARY_CLICK, eventId, 0, view).sendToTarget(); + mHandler.obtainMessage(H.SECONDARY_CLICK, eventId, 0, expandable).sendToTarget(); } @Override - public void longClick(@Nullable View view) { + public void longClick(@Nullable Expandable expandable) { mMetricsLogger.write(populate(new LogMaker(ACTION_QS_LONG_PRESS).setType(TYPE_ACTION) .addTaggedData(FIELD_STATUS_BAR_STATE, mStatusBarStateController.getState()))); @@ -319,7 +321,7 @@ public abstract class QSTileImpl<TState extends State> implements QSTile, Lifecy mQSLogger.logTileLongClick(mTileSpec, mStatusBarStateController.getState(), mState.state, eventId); if (!mFalsingManager.isFalseLongTap(FalsingManager.LOW_PENALTY)) { - mHandler.obtainMessage(H.LONG_CLICK, eventId, 0, view).sendToTarget(); + mHandler.obtainMessage(H.LONG_CLICK, eventId, 0, expandable).sendToTarget(); } } @@ -397,22 +399,22 @@ public abstract class QSTileImpl<TState extends State> implements QSTile, Lifecy * * Defaults to {@link QSTileImpl#handleClick} * - * @param view The view that was clicked. + * @param expandable {@link Expandable} that was clicked. */ - protected void handleSecondaryClick(@Nullable View view) { + protected void handleSecondaryClick(@Nullable Expandable expandable) { // Default to normal click. - handleClick(view); + handleClick(expandable); } /** * Handles long click on the tile by launching the {@link Intent} defined in * {@link QSTileImpl#getLongClickIntent}. * - * @param view The view from which the opening window will be animated. + * @param expandable {@link Expandable} from which the opening window will be animated. */ - protected void handleLongClick(@Nullable View view) { + protected void handleLongClick(@Nullable Expandable expandable) { ActivityTransitionAnimator.Controller animationController = - view != null ? ActivityTransitionAnimator.Controller.fromView(view, + expandable != null ? expandable.activityTransitionController( InteractionJankMonitor.CUJ_SHADE_APP_LAUNCH_FROM_QS_TILE) : null; mActivityStarter.postStartActivityDismissingKeyguard(getLongClickIntent(), 0, animationController); @@ -591,16 +593,16 @@ public abstract class QSTileImpl<TState extends State> implements QSTile, Lifecy mActivityStarter.postStartActivityDismissingKeyguard(intent, 0); } else { mQSLogger.logHandleClick(mTileSpec, msg.arg1); - handleClick((View) msg.obj); + handleClick((Expandable) msg.obj); } } else if (msg.what == SECONDARY_CLICK) { name = "handleSecondaryClick"; mQSLogger.logHandleSecondaryClick(mTileSpec, msg.arg1); - handleSecondaryClick((View) msg.obj); + handleSecondaryClick((Expandable) msg.obj); } else if (msg.what == LONG_CLICK) { name = "handleLongClick"; mQSLogger.logHandleLongClick(mTileSpec, msg.arg1); - handleLongClick((View) msg.obj); + handleLongClick((Expandable) msg.obj); } else if (msg.what == REFRESH_STATE) { name = "handleRefreshState"; handleRefreshState(msg.obj); 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 ca5b77108505..f3852a275209 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt @@ -53,6 +53,7 @@ import com.android.settingslib.Utils import com.android.systemui.Flags import com.android.systemui.Flags.quickSettingsVisualHapticsLongpress import com.android.systemui.FontSizeUtils +import com.android.systemui.animation.Expandable import com.android.systemui.animation.LaunchableView import com.android.systemui.animation.LaunchableViewDelegate import com.android.systemui.haptics.qs.QSLongPressEffect @@ -364,10 +365,11 @@ open class QSTileViewImpl @JvmOverloads constructor( } override fun init(tile: QSTile) { + val expandable = Expandable.fromView(this) init( - { v: View? -> tile.click(this) }, - { view: View? -> - tile.longClick(this) + { _: View? -> tile.click(expandable) }, + { _: View? -> + tile.longClick(expandable) true } ) diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java index 17251c37473f..206879905782 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java @@ -29,13 +29,13 @@ import android.provider.Settings.Global; import android.service.quicksettings.Tile; import android.sysprop.TelephonyProperties; import android.telephony.TelephonyManager; -import android.view.View; import android.widget.Switch; import androidx.annotation.Nullable; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; +import com.android.systemui.animation.Expandable; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; @@ -103,7 +103,7 @@ public class AirplaneModeTile extends QSTileImpl<BooleanState> { } @Override - public void handleClick(@Nullable View view) { + public void handleClick(@Nullable Expandable expandable) { boolean airplaneModeEnabled = mState.value; MetricsLogger.action(mContext, getMetricsCategory(), !airplaneModeEnabled); if (!airplaneModeEnabled && TelephonyProperties.in_ecm_mode().orElse(false)) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/AlarmTile.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/AlarmTile.kt index 688f3ca38087..73d991f6efe7 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/AlarmTile.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/AlarmTile.kt @@ -9,12 +9,10 @@ import android.provider.AlarmClock import android.service.quicksettings.Tile import android.text.TextUtils import android.text.format.DateFormat -import android.view.View import androidx.annotation.VisibleForTesting import com.android.internal.jank.InteractionJankMonitor import com.android.internal.logging.MetricsLogger -import com.android.systemui.res.R -import com.android.systemui.animation.ActivityTransitionAnimator +import com.android.systemui.animation.Expandable import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.plugins.ActivityStarter @@ -25,12 +23,15 @@ import com.android.systemui.qs.QSHost import com.android.systemui.qs.QsEventLogger import com.android.systemui.qs.logging.QSLogger import com.android.systemui.qs.tileimpl.QSTileImpl +import com.android.systemui.res.R import com.android.systemui.settings.UserTracker import com.android.systemui.statusbar.policy.NextAlarmController import java.util.Locale import javax.inject.Inject -class AlarmTile @Inject constructor( +class AlarmTile +@Inject +constructor( host: QSHost, uiEventLogger: QsEventLogger, @Background backgroundLooper: Looper, @@ -56,8 +57,7 @@ class AlarmTile @Inject constructor( private var lastAlarmInfo: AlarmManager.AlarmClockInfo? = null private val icon = ResourceIcon.get(R.drawable.ic_alarm) - @VisibleForTesting - internal val defaultIntent = Intent(AlarmClock.ACTION_SHOW_ALARMS) + @VisibleForTesting internal val defaultIntent = Intent(AlarmClock.ACTION_SHOW_ALARMS) private val callback = NextAlarmController.NextAlarmChangeCallback { nextAlarm -> lastAlarmInfo = nextAlarm refreshState() @@ -73,11 +73,11 @@ class AlarmTile @Inject constructor( } } - override fun handleClick(view: View?) { - val animationController = view?.let { - ActivityTransitionAnimator.Controller.fromView( - it, InteractionJankMonitor.CUJ_SHADE_APP_LAUNCH_FROM_QS_TILE) - } + override fun handleClick(expandable: Expandable?) { + val animationController = + expandable?.activityTransitionController( + InteractionJankMonitor.CUJ_SHADE_APP_LAUNCH_FROM_QS_TILE + ) val pendingIntent = lastAlarmInfo?.showIntent if (pendingIntent != null) { mActivityStarter.postStartActivityDismissingKeyguard(pendingIntent, animationController) diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/BatterySaverTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/BatterySaverTile.java index 426aa553f082..7c0ce4cc75a9 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/BatterySaverTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/BatterySaverTile.java @@ -21,7 +21,6 @@ import android.os.Looper; import android.provider.Settings; import android.provider.Settings.Secure; import android.service.quicksettings.Tile; -import android.view.View; import android.widget.Switch; import androidx.annotation.Nullable; @@ -29,6 +28,7 @@ import androidx.annotation.Nullable; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; +import com.android.systemui.animation.Expandable; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.ActivityStarter; @@ -121,7 +121,7 @@ public class BatterySaverTile extends QSTileImpl<BooleanState> implements if (!listening) { // If we stopped listening, it means that the tile is not visible. In that case, we // don't need to save the view anymore - mBatteryController.clearLastPowerSaverStartView(); + mBatteryController.clearLastPowerSaverStartExpandable(); } } @@ -131,11 +131,11 @@ public class BatterySaverTile extends QSTileImpl<BooleanState> implements } @Override - protected void handleClick(@Nullable View view) { + protected void handleClick(@Nullable Expandable expandable) { if (getState().state == Tile.STATE_UNAVAILABLE) { return; } - mBatteryController.setPowerSaveMode(!mPowerSave, view); + mBatteryController.setPowerSaveMode(!mPowerSave, expandable); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java index 6eae32a0ffd6..9af34f6c9918 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java @@ -31,7 +31,6 @@ import android.provider.Settings; import android.service.quicksettings.Tile; import android.text.TextUtils; import android.util.Log; -import android.view.View; import android.widget.Switch; import com.android.internal.logging.MetricsLogger; @@ -39,6 +38,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settingslib.Utils; import com.android.settingslib.bluetooth.BluetoothUtils; import com.android.settingslib.bluetooth.CachedBluetoothDevice; +import com.android.systemui.animation.Expandable; import com.android.systemui.bluetooth.qsdialog.BluetoothTileDialogViewModel; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; @@ -109,9 +109,9 @@ public class BluetoothTile extends QSTileImpl<BooleanState> { } @Override - protected void handleClick(@Nullable View view) { + protected void handleClick(@Nullable Expandable expandable) { if (mFeatureFlags.isEnabled(Flags.BLUETOOTH_QS_TILE_DIALOG)) { - mDialogViewModel.showDialog(view); + mDialogViewModel.showDialog(expandable); } else { // Secondary clicks are header clicks, just toggle. final boolean isEnabled = mState.value; @@ -127,7 +127,7 @@ public class BluetoothTile extends QSTileImpl<BooleanState> { } @Override - protected void handleSecondaryClick(@Nullable View view) { + protected void handleSecondaryClick(@Nullable Expandable expandable) { if (!mController.canConfigBluetooth()) { mActivityStarter.postStartActivityDismissingKeyguard( new Intent(Settings.ACTION_BLUETOOTH_SETTINGS), 0); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java index b27b974dc972..169cdc17c2c0 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java @@ -29,7 +29,6 @@ import android.os.Looper; import android.provider.Settings; import android.service.quicksettings.Tile; import android.util.Log; -import android.view.View; import android.widget.Button; import androidx.annotation.Nullable; @@ -41,6 +40,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.systemui.animation.ActivityTransitionAnimator; import com.android.systemui.animation.DialogCuj; import com.android.systemui.animation.DialogTransitionAnimator; +import com.android.systemui.animation.Expandable; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.flags.FeatureFlags; @@ -161,12 +161,12 @@ public class CastTile extends QSTileImpl<BooleanState> { } @Override - protected void handleLongClick(@Nullable View view) { - handleClick(view); + protected void handleLongClick(@Nullable Expandable expandable) { + handleClick(expandable); } @Override - protected void handleClick(@Nullable View view) { + protected void handleClick(@Nullable Expandable expandable) { if (getState().state == Tile.STATE_UNAVAILABLE) { return; } @@ -174,7 +174,7 @@ public class CastTile extends QSTileImpl<BooleanState> { List<CastDevice> activeDevices = getActiveDevices(); if (willPopDialog()) { if (!mKeyguard.isShowing()) { - showDialog(view); + showDialog(expandable); } else { mActivityStarter.postQSRunnableDismissingKeyguard(() -> { // Dismissing the keyguard will collapse the shade, so we don't animate from the @@ -216,7 +216,7 @@ public class CastTile extends QSTileImpl<BooleanState> { } } - private void showDialog(@Nullable View view) { + private void showDialog(@Nullable Expandable expandable) { mUiHandler.post(() -> { final DialogHolder holder = new DialogHolder(); final Dialog dialog = MediaRouteDialogPresenter.createDialog( @@ -241,17 +241,21 @@ public class CastTile extends QSTileImpl<BooleanState> { SystemUIDialog.setDialogSize(dialog); mUiHandler.post(() -> { - if (view != null) { - mDialogTransitionAnimator.showFromView(dialog, view, - new DialogCuj(InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN, - INTERACTION_JANK_TAG)); - } else { - if (dialog.getWindow() != null) { - DialogKt.registerAnimationOnBackInvoked(dialog, - dialog.getWindow().getDecorView()); + if (expandable != null) { + DialogTransitionAnimator.Controller controller = + expandable.dialogTransitionController( + new DialogCuj(InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN, + INTERACTION_JANK_TAG)); + if (controller != null) { + mDialogTransitionAnimator.show(dialog, controller); + return; } - dialog.show(); } + if (dialog.getWindow() != null) { + DialogKt.registerAnimationOnBackInvoked(dialog, + dialog.getWindow().getDecorView()); + } + dialog.show(); }); }); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorCorrectionTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorCorrectionTile.java index c8adbfcf5487..871973dfcb7f 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorCorrectionTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorCorrectionTile.java @@ -22,12 +22,12 @@ import android.os.Looper; import android.provider.Settings; import android.provider.Settings.Secure; import android.service.quicksettings.Tile; -import android.view.View; import android.widget.Switch; import androidx.annotation.Nullable; import com.android.internal.logging.MetricsLogger; +import com.android.systemui.animation.Expandable; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.ActivityStarter; @@ -109,7 +109,7 @@ public class ColorCorrectionTile extends QSTileImpl<BooleanState> { } @Override - protected void handleClick(@Nullable View view) { + protected void handleClick(@Nullable Expandable expandable) { mSetting.setValue(mState.value ? 0 : 1); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java index c34a5842c1e3..58969107ad22 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java @@ -22,13 +22,13 @@ import android.os.Looper; import android.provider.Settings; import android.provider.Settings.Secure; import android.service.quicksettings.Tile; -import android.view.View; import android.widget.Switch; import androidx.annotation.Nullable; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; +import com.android.systemui.animation.Expandable; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.ActivityStarter; @@ -108,7 +108,7 @@ public class ColorInversionTile extends QSTileImpl<BooleanState> { } @Override - protected void handleClick(@Nullable View view) { + protected void handleClick(@Nullable Expandable expandable) { mSetting.setValue(mState.value ? 0 : 1); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DataSaverTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DataSaverTile.java index 58630a0b6b99..7760943476bf 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DataSaverTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DataSaverTile.java @@ -19,7 +19,6 @@ import android.os.Handler; import android.os.Looper; import android.provider.Settings; import android.service.quicksettings.Tile; -import android.view.View; import android.widget.Switch; import androidx.annotation.Nullable; @@ -30,6 +29,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.systemui.Prefs; import com.android.systemui.animation.DialogCuj; import com.android.systemui.animation.DialogTransitionAnimator; +import com.android.systemui.animation.Expandable; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.ActivityStarter; @@ -47,7 +47,7 @@ import com.android.systemui.statusbar.policy.DataSaverController; import javax.inject.Inject; public class DataSaverTile extends QSTileImpl<BooleanState> implements - DataSaverController.Listener{ + DataSaverController.Listener { public static final String TILE_SPEC = "saver"; @@ -89,8 +89,9 @@ public class DataSaverTile extends QSTileImpl<BooleanState> implements public Intent getLongClickIntent() { return new Intent(Settings.ACTION_DATA_SAVER_SETTINGS); } + @Override - protected void handleClick(@Nullable View view) { + protected void handleClick(@Nullable Expandable expandable) { if (mState.value || Prefs.getBoolean(mContext, Prefs.Key.QS_DATA_SAVER_DIALOG_SHOWN, false)) { // Do it right away. @@ -112,10 +113,16 @@ public class DataSaverTile extends QSTileImpl<BooleanState> implements dialog.setNeutralButton(com.android.internal.R.string.cancel, null); dialog.setShowForAllUsers(true); - if (view != null) { - mDialogTransitionAnimator.showFromView(dialog, view, new DialogCuj( - InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN, - INTERACTION_JANK_TAG)); + if (expandable != null) { + DialogTransitionAnimator.Controller controller = + expandable.dialogTransitionController(new DialogCuj( + InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN, + INTERACTION_JANK_TAG)); + if (controller != null) { + mDialogTransitionAnimator.show(dialog, controller); + } else { + dialog.show(); + } } else { dialog.show(); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DeviceControlsTile.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/DeviceControlsTile.kt index bb175e2a8534..cc8a73423174 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DeviceControlsTile.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DeviceControlsTile.kt @@ -1,3 +1,4 @@ + /* * Copyright (C) 2021 The Android Open Source Project * @@ -21,12 +22,11 @@ import android.content.Intent import android.os.Handler import android.os.Looper import android.service.quicksettings.Tile -import android.view.View import androidx.annotation.VisibleForTesting import com.android.internal.jank.InteractionJankMonitor import com.android.internal.logging.MetricsLogger import com.android.systemui.res.R -import com.android.systemui.animation.ActivityTransitionAnimator +import com.android.systemui.animation.Expandable import com.android.systemui.controls.ControlsServiceInfo import com.android.systemui.controls.dagger.ControlsComponent import com.android.systemui.controls.dagger.ControlsComponent.Visibility.AVAILABLE @@ -100,26 +100,30 @@ class DeviceControlsTile @Inject constructor( } } - override fun handleClick(view: View?) { + override fun handleClick(expandable: Expandable?) { if (state.state == Tile.STATE_UNAVAILABLE) { return } val intent = Intent().apply { component = ComponentName(mContext, controlsComponent.getControlsUiController().get() - .resolveActivity()) + .resolveActivity()) addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK) putExtra(ControlsUiController.EXTRA_ANIMATE, true) } - val animationController = view?.let { - ActivityTransitionAnimator.Controller.fromView( - it, InteractionJankMonitor.CUJ_SHADE_APP_LAUNCH_FROM_QS_TILE) - } + val animationController = + expandable?.activityTransitionController( + InteractionJankMonitor.CUJ_SHADE_APP_LAUNCH_FROM_QS_TILE + ) mUiHandler.post { val showOverLockscreenWhenLocked = state.state == Tile.STATE_ACTIVE mActivityStarter.startActivity( - intent, true /* dismissShade */, animationController, showOverLockscreenWhenLocked) + intent, + true /* dismissShade */, + animationController, + showOverLockscreenWhenLocked, + ) } } @@ -130,7 +134,7 @@ class DeviceControlsTile @Inject constructor( if (controlsComponent.isEnabled() && hasControlsApps.get()) { if (controlsComponent.getVisibility() == AVAILABLE) { val selection = controlsComponent - .getControlsController().get().getPreferredSelection() + .getControlsController().get().getPreferredSelection() state.state = if (selection is SelectedItem.StructureItem && selection.structure.controls.isEmpty()) { Tile.STATE_INACTIVE @@ -157,7 +161,7 @@ class DeviceControlsTile @Inject constructor( return null } - override fun handleLongClick(view: View?) {} + override fun handleLongClick(expandable: Expandable?) {} override fun getTileLabel(): CharSequence { return mContext.getText(controlsComponent.getTileTitleId()) @@ -166,4 +170,4 @@ class DeviceControlsTile @Inject constructor( companion object { const val TILE_SPEC = "controls" } -} +}
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java index f62b60bd887f..4ebebeade1f4 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java @@ -35,7 +35,6 @@ import android.service.notification.ZenModeConfig; import android.service.quicksettings.Tile; import android.text.TextUtils; import android.util.Log; -import android.view.View; import android.widget.Switch; import androidx.annotation.Nullable; @@ -47,6 +46,7 @@ import com.android.settingslib.notification.EnableZenModeDialog; import com.android.systemui.Prefs; import com.android.systemui.animation.DialogCuj; import com.android.systemui.animation.DialogTransitionAnimator; +import com.android.systemui.animation.Expandable; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.ActivityStarter; @@ -147,12 +147,12 @@ public class DndTile extends QSTileImpl<BooleanState> { } @Override - protected void handleClick(@Nullable View view) { + protected void handleClick(@Nullable Expandable expandable) { // Zen is currently on if (mState.value) { mController.setZen(ZEN_MODE_OFF, null, TAG); } else { - enableZenMode(view); + enableZenMode(expandable); } } @@ -162,7 +162,7 @@ public class DndTile extends QSTileImpl<BooleanState> { mSettingZenDuration.setUserId(newUserId); } - private void enableZenMode(@Nullable View view) { + private void enableZenMode(@Nullable Expandable expandable) { int zenDuration = mSettingZenDuration.getValue(); boolean showOnboarding = Settings.Secure.getInt(mContext.getContentResolver(), Settings.Secure.SHOW_ZEN_UPGRADE_NOTIFICATION, 0) != 0 @@ -183,11 +183,17 @@ public class DndTile extends QSTileImpl<BooleanState> { case Settings.Secure.ZEN_DURATION_PROMPT: mUiHandler.post(() -> { Dialog dialog = makeZenModeDialog(); - if (view != null) { - mDialogTransitionAnimator.showFromView(dialog, view, new DialogCuj( + if (expandable != null) { + DialogTransitionAnimator.Controller controller = + expandable.dialogTransitionController(new DialogCuj( InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN, - INTERACTION_JANK_TAG), - /* animateBackgroundBoundsChange= */ false); + INTERACTION_JANK_TAG)); + if (controller != null) { + mDialogTransitionAnimator.show(dialog, + controller, /* animateBackgroundBoundsChange= */ false); + } else { + dialog.show(); + } } else { dialog.show(); } @@ -217,8 +223,8 @@ public class DndTile extends QSTileImpl<BooleanState> { } @Override - protected void handleSecondaryClick(@Nullable View view) { - handleLongClick(view); + protected void handleSecondaryClick(@Nullable Expandable expandable) { + handleLongClick(expandable); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DreamTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DreamTile.java index 4f0a63b667f3..0d3d980f71f4 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DreamTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DreamTile.java @@ -32,12 +32,12 @@ import android.service.dreams.IDreamManager; import android.service.quicksettings.Tile; import android.text.TextUtils; import android.util.Log; -import android.view.View; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import com.android.internal.logging.MetricsLogger; +import com.android.systemui.animation.Expandable; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; @@ -153,7 +153,7 @@ public class DreamTile extends QSTileImpl<QSTile.BooleanState> { } @Override - protected void handleClick(@Nullable View view) { + protected void handleClick(@Nullable Expandable expandable) { try { if (mDreamManager.isDreaming()) { mDreamManager.awaken(); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java index f022981bd8db..848ff3c533ba 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java @@ -22,13 +22,13 @@ import android.os.Handler; import android.os.Looper; import android.provider.MediaStore; import android.service.quicksettings.Tile; -import android.view.View; import android.widget.Switch; import androidx.annotation.Nullable; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; +import com.android.systemui.animation.Expandable; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.ActivityStarter; @@ -99,7 +99,7 @@ public class FlashlightTile extends QSTileImpl<BooleanState> implements } @Override - protected void handleClick(@Nullable View view) { + protected void handleClick(@Nullable Expandable expandable) { if (ActivityManager.isUserAMonkey()) { return; } @@ -114,8 +114,8 @@ public class FlashlightTile extends QSTileImpl<BooleanState> implements } @Override - protected void handleLongClick(@Nullable View view) { - handleClick(view); + protected void handleLongClick(@Nullable Expandable expandable) { + handleClick(expandable); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/FontScalingTile.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/FontScalingTile.kt index f5018a2868c0..078698c2872d 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/FontScalingTile.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/FontScalingTile.kt @@ -19,12 +19,12 @@ import android.content.Intent import android.os.Handler import android.os.Looper import android.provider.Settings -import android.view.View import com.android.internal.jank.InteractionJankMonitor import com.android.internal.logging.MetricsLogger import com.android.systemui.accessibility.fontscaling.FontScalingDialogDelegate import com.android.systemui.animation.DialogCuj import com.android.systemui.animation.DialogTransitionAnimator +import com.android.systemui.animation.Expandable import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.plugins.ActivityStarter @@ -74,18 +74,23 @@ constructor( return QSTile.State() } - override fun handleClick(view: View?) { + override fun handleClick(expandable: Expandable?) { // We animate from the touched view only if we are not on the keyguard - val animateFromView: Boolean = view != null && !keyguardStateController.isShowing + val animateFromExpandable: Boolean = + expandable != null && !keyguardStateController.isShowing val runnable = Runnable { val dialog: SystemUIDialog = fontScalingDialogDelegateProvider.get().createDialog() - if (animateFromView) { - dialogTransitionAnimator.showFromView( - dialog, - view!!, - DialogCuj(InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN, INTERACTION_JANK_TAG) - ) + if (animateFromExpandable) { + val controller = + expandable?.dialogTransitionController( + DialogCuj( + InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN, + INTERACTION_JANK_TAG + ) + ) + controller?.let { dialogTransitionAnimator.show(dialog, controller) } + ?: dialog.show() } else { dialog.show() } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/HearingDevicesTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/HearingDevicesTile.java index 81a20260792a..183c1a4a7ce7 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/HearingDevicesTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/HearingDevicesTile.java @@ -20,13 +20,13 @@ import android.content.Intent; import android.os.Handler; import android.os.Looper; import android.provider.Settings; -import android.view.View; import androidx.annotation.Nullable; import com.android.internal.logging.MetricsLogger; import com.android.systemui.Flags; import com.android.systemui.accessibility.hearingaid.HearingDevicesDialogManager; +import com.android.systemui.animation.Expandable; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.ActivityStarter; @@ -72,8 +72,8 @@ public class HearingDevicesTile extends QSTileImpl<State> { } @Override - protected void handleClick(@Nullable View view) { - mUiHandler.post(() -> mDialogManager.showDialog(view)); + protected void handleClick(@Nullable Expandable expandable) { + mUiHandler.post(() -> mDialogManager.showDialog(expandable)); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java index 4d0404dd007e..ea3993ea88a9 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java @@ -25,7 +25,6 @@ import android.os.UserManager; import android.provider.Settings; import android.service.quicksettings.Tile; import android.util.Log; -import android.view.View; import android.widget.Switch; import androidx.annotation.Nullable; @@ -33,6 +32,7 @@ import androidx.annotation.Nullable; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settingslib.wifi.WifiEnterpriseRestrictionUtils; +import com.android.systemui.animation.Expandable; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.ActivityStarter; @@ -112,7 +112,7 @@ public class HotspotTile extends QSTileImpl<BooleanState> { } @Override - protected void handleClick(@Nullable View view) { + protected void handleClick(@Nullable Expandable expandable) { final boolean isEnabled = mState.value; if (!isEnabled && mDataSaverController.isDataSaverEnabled()) { return; diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTile.java index 0f260e3dc296..6d98da4bac61 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTile.java @@ -30,7 +30,6 @@ import android.service.quicksettings.Tile; import android.text.Html; import android.text.TextUtils; import android.util.Log; -import android.view.View; import android.widget.Switch; import androidx.annotation.Nullable; @@ -41,6 +40,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settingslib.graph.SignalDrawable; import com.android.settingslib.mobile.TelephonyIcons; import com.android.settingslib.net.DataUsageController; +import com.android.systemui.animation.Expandable; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.ActivityStarter; @@ -124,10 +124,10 @@ public class InternetTile extends QSTileImpl<QSTile.BooleanState> { } @Override - protected void handleClick(@Nullable View view) { + protected void handleClick(@Nullable Expandable expandable) { mHandler.post(() -> mInternetDialogManager.create(true, mAccessPointController.canConfigMobileData(), - mAccessPointController.canConfigWifi(), view)); + mAccessPointController.canConfigWifi(), expandable)); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTileNewImpl.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTileNewImpl.kt index 357743bc2bd7..932dec5af950 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTileNewImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTileNewImpl.kt @@ -20,9 +20,9 @@ import android.content.Intent import android.os.Handler import android.os.Looper import android.provider.Settings -import android.view.View import android.widget.Switch import com.android.internal.logging.MetricsLogger +import com.android.systemui.animation.Expandable import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.plugins.ActivityStarter @@ -44,18 +44,18 @@ import javax.inject.Inject class InternetTileNewImpl @Inject constructor( - host: QSHost, - uiEventLogger: QsEventLogger, - @Background backgroundLooper: Looper, - @Main private val mainHandler: Handler, - falsingManager: FalsingManager, - metricsLogger: MetricsLogger, - statusBarStateController: StatusBarStateController, - activityStarter: ActivityStarter, - qsLogger: QSLogger, - viewModel: InternetTileViewModel, - private val internetDialogManager: InternetDialogManager, - private val accessPointController: AccessPointController, + host: QSHost, + uiEventLogger: QsEventLogger, + @Background backgroundLooper: Looper, + @Main private val mainHandler: Handler, + falsingManager: FalsingManager, + metricsLogger: MetricsLogger, + statusBarStateController: StatusBarStateController, + activityStarter: ActivityStarter, + qsLogger: QSLogger, + viewModel: InternetTileViewModel, + private val internetDialogManager: InternetDialogManager, + private val accessPointController: AccessPointController, ) : QSTileImpl<QSTile.BooleanState>( host, @@ -84,13 +84,13 @@ constructor( return QSTile.BooleanState().also { it.forceExpandIcon = true } } - override fun handleClick(view: View?) { + override fun handleClick(expandable: Expandable?) { mainHandler.post { internetDialogManager.create( aboveStatusBar = true, accessPointController.canConfigMobileData(), accessPointController.canConfigWifi(), - view, + expandable, ) } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/LocationTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/LocationTile.java index b3f0d8bfbba8..cad5c0d12d1d 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/LocationTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/LocationTile.java @@ -22,13 +22,13 @@ import android.os.Looper; import android.os.UserManager; import android.provider.Settings; import android.service.quicksettings.Tile; -import android.view.View; import android.widget.Switch; import androidx.annotation.Nullable; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; +import com.android.systemui.animation.Expandable; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.ActivityStarter; @@ -92,7 +92,7 @@ public class LocationTile extends QSTileImpl<BooleanState> { } @Override - protected void handleClick(@Nullable View view) { + protected void handleClick(@Nullable Expandable expandable) { if (mKeyguard.isMethodSecure() && mKeyguard.isShowing()) { mActivityStarter.postQSRunnableDismissingKeyguard(() -> { final boolean wasEnabled = mState.value; diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/NfcTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/NfcTile.java index d650f73bc92b..136eea8331df 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/NfcTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/NfcTile.java @@ -27,13 +27,13 @@ import android.os.Handler; import android.os.Looper; import android.provider.Settings; import android.service.quicksettings.Tile; -import android.view.View; import android.widget.Switch; import androidx.annotation.Nullable; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; +import com.android.systemui.animation.Expandable; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; @@ -119,7 +119,7 @@ public class NfcTile extends QSTileImpl<BooleanState> { } @Override - protected void handleClick(@Nullable View view) { + protected void handleClick(@Nullable Expandable expandable) { if (getAdapter() == null) { return; } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java index a1ea46d9d69b..ac762de6d544 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java @@ -28,7 +28,6 @@ import android.provider.Settings; import android.service.quicksettings.Tile; import android.text.TextUtils; import android.util.Log; -import android.view.View; import android.widget.Switch; import androidx.annotation.Nullable; @@ -36,6 +35,7 @@ import androidx.annotation.StringRes; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; +import com.android.systemui.animation.Expandable; import com.android.systemui.dagger.NightDisplayListenerModule; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; @@ -112,7 +112,7 @@ public class NightDisplayTile extends QSTileImpl<BooleanState> implements } @Override - protected void handleClick(@Nullable View view) { + protected void handleClick(@Nullable Expandable expandable) { // Enroll in forced auto mode if eligible. if ("1".equals(Settings.Global.getString(mContext.getContentResolver(), Settings.Global.NIGHT_DISPLAY_FORCED_AUTO_MODE_AVAILABLE)) diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/OneHandedModeTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/OneHandedModeTile.java index b08e6a5580a2..450c95411c3f 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/OneHandedModeTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/OneHandedModeTile.java @@ -21,13 +21,13 @@ import android.os.Handler; import android.os.Looper; import android.provider.Settings; import android.service.quicksettings.Tile; -import android.view.View; import android.widget.Switch; import androidx.annotation.Nullable; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.MetricsLogger; +import com.android.systemui.animation.Expandable; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.ActivityStarter; @@ -114,7 +114,7 @@ public class OneHandedModeTile extends QSTileImpl<BooleanState> { } @Override - protected void handleClick(@Nullable View view) { + protected void handleClick(@Nullable Expandable expandable) { mSetting.setValue(mState.value ? 0 : 1); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/QRCodeScannerTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/QRCodeScannerTile.java index de9a08e1cda8..9766fac7965e 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/QRCodeScannerTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/QRCodeScannerTile.java @@ -21,13 +21,13 @@ import android.os.Handler; import android.os.Looper; import android.service.quicksettings.Tile; import android.util.Log; -import android.view.View; import androidx.annotation.Nullable; import com.android.internal.jank.InteractionJankMonitor; import com.android.internal.logging.MetricsLogger; import com.android.systemui.animation.ActivityTransitionAnimator; +import com.android.systemui.animation.Expandable; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.ActivityStarter; @@ -99,7 +99,7 @@ public class QRCodeScannerTile extends QSTileImpl<QSTile.State> { } @Override - protected void handleClick(@Nullable View view) { + protected void handleClick(@Nullable Expandable expandable) { Intent intent = mQRCodeScannerController.getIntent(); if (intent == null) { // This should never happen as the fact that we are handling clicks means that the @@ -109,7 +109,7 @@ public class QRCodeScannerTile extends QSTileImpl<QSTile.State> { } ActivityTransitionAnimator.Controller animationController = - view == null ? null : ActivityTransitionAnimator.Controller.fromView(view, + expandable == null ? null : expandable.activityTransitionController( InteractionJankMonitor.CUJ_SHADE_APP_LAUNCH_FROM_QS_TILE); mActivityStarter.startActivity(intent, true /* dismissShade */, animationController, true /* showOverLockscreenWhenLocked */); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java index e1b742e1e7f0..76aa146d0531 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java @@ -35,7 +35,6 @@ import android.service.quickaccesswallet.QuickAccessWalletClient; import android.service.quickaccesswallet.WalletCard; import android.service.quicksettings.Tile; import android.util.Log; -import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -44,6 +43,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.jank.InteractionJankMonitor; import com.android.internal.logging.MetricsLogger; import com.android.systemui.animation.ActivityTransitionAnimator; +import com.android.systemui.animation.Expandable; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.ActivityStarter; @@ -131,9 +131,9 @@ public class QuickAccessWalletTile extends QSTileImpl<QSTile.State> { } @Override - protected void handleClick(@Nullable View view) { + protected void handleClick(@Nullable Expandable expandable) { ActivityTransitionAnimator.Controller animationController = - view == null ? null : ActivityTransitionAnimator.Controller.fromView(view, + expandable == null ? null : expandable.activityTransitionController( InteractionJankMonitor.CUJ_SHADE_APP_LAUNCH_FROM_QS_TILE); mUiHandler.post( diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/RecordIssueTile.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/RecordIssueTile.kt index b418a174d84e..9937ea468fa8 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/RecordIssueTile.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/RecordIssueTile.kt @@ -24,7 +24,6 @@ import android.os.Handler import android.os.Looper import android.service.quicksettings.Tile import android.text.TextUtils -import android.view.View import android.widget.Switch import androidx.annotation.VisibleForTesting import com.android.internal.jank.InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN @@ -32,6 +31,7 @@ import com.android.internal.logging.MetricsLogger import com.android.systemui.Flags.recordIssueQsTile import com.android.systemui.animation.DialogCuj import com.android.systemui.animation.DialogTransitionAnimator +import com.android.systemui.animation.Expandable import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.plugins.ActivityStarter @@ -113,11 +113,11 @@ constructor( } @VisibleForTesting - public override fun handleClick(view: View?) { + public override fun handleClick(expandable: Expandable?) { if (issueRecordingState.isRecording) { stopIssueRecordingService() } else { - mUiHandler.post { showPrompt(view) } + mUiHandler.post { showPrompt(expandable) } } } @@ -143,7 +143,7 @@ constructor( ) .send(BroadcastOptions.makeBasic().apply { isInteractive = true }.toBundle()) - private fun showPrompt(view: View?) { + private fun showPrompt(expandable: Expandable?) { val dialog: AlertDialog = delegateFactory .create { @@ -156,12 +156,11 @@ constructor( ActivityStarter.OnDismissAction { // We animate from the touched view only if we are not on the keyguard, given // that if we are we will dismiss it which will also collapse the shade. - if (view != null && !keyguardStateController.isShowing) { - dialogTransitionAnimator.showFromView( - dialog, - view, - DialogCuj(CUJ_SHADE_DIALOG_OPEN, TILE_SPEC) - ) + if (expandable != null && !keyguardStateController.isShowing) { + expandable + .dialogTransitionController(DialogCuj(CUJ_SHADE_DIALOG_OPEN, TILE_SPEC)) + ?.let { dialogTransitionAnimator.show(dialog, it) } + ?: dialog.show() } else { dialog.show() } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/ReduceBrightColorsTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/ReduceBrightColorsTile.java index 76ada102f26a..34723523b84f 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/ReduceBrightColorsTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/ReduceBrightColorsTile.java @@ -23,13 +23,13 @@ import android.os.Handler; import android.os.Looper; import android.provider.Settings; import android.service.quicksettings.Tile; -import android.view.View; import android.widget.Switch; import androidx.annotation.Nullable; import com.android.internal.R; import com.android.internal.logging.MetricsLogger; +import com.android.systemui.animation.Expandable; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.ActivityStarter; @@ -97,7 +97,7 @@ public class ReduceBrightColorsTile extends QSTileImpl<QSTile.BooleanState> } @Override - protected void handleClick(@Nullable View view) { + protected void handleClick(@Nullable Expandable expandable) { mReduceBrightColorsController.setReduceBrightColorsActivated(!mState.value); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/RotationLockTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/RotationLockTile.java index f1d8f9f25286..35e43b6fed9e 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/RotationLockTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/RotationLockTile.java @@ -29,13 +29,13 @@ import android.os.Looper; import android.provider.Settings; import android.provider.Settings.Secure; import android.service.quicksettings.Tile; -import android.view.View; import android.widget.Switch; import androidx.annotation.Nullable; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; +import com.android.systemui.animation.Expandable; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.ActivityStarter; @@ -131,7 +131,7 @@ public class RotationLockTile extends QSTileImpl<BooleanState> implements } @Override - protected void handleClick(@Nullable View view) { + protected void handleClick(@Nullable Expandable expandable) { final boolean newState = !mState.value; mController.setRotationLocked(!newState, /* caller= */ "RotationLockTile#handleClick"); refreshState(newState); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/ScreenRecordTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/ScreenRecordTile.java index 1a90d439c6d8..4715230a0958 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/ScreenRecordTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/ScreenRecordTile.java @@ -23,7 +23,6 @@ import android.os.Looper; import android.service.quicksettings.Tile; import android.text.TextUtils; import android.util.Log; -import android.view.View; import android.widget.Switch; import androidx.annotation.Nullable; @@ -32,6 +31,7 @@ import com.android.internal.jank.InteractionJankMonitor; import com.android.internal.logging.MetricsLogger; import com.android.systemui.animation.DialogCuj; import com.android.systemui.animation.DialogTransitionAnimator; +import com.android.systemui.animation.Expandable; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.flags.FeatureFlags; @@ -118,13 +118,13 @@ public class ScreenRecordTile extends QSTileImpl<QSTile.BooleanState> } @Override - protected void handleClick(@Nullable View view) { + protected void handleClick(@Nullable Expandable expandable) { if (mController.isStarting()) { cancelCountdown(); } else if (mController.isRecording()) { stopRecording(); } else { - mUiHandler.post(() -> showPrompt(view)); + mUiHandler.post(() -> showPrompt(expandable)); } refreshState(); } @@ -174,10 +174,11 @@ public class ScreenRecordTile extends QSTileImpl<QSTile.BooleanState> return mContext.getString(R.string.quick_settings_screen_record_label); } - private void showPrompt(@Nullable View view) { + private void showPrompt(@Nullable Expandable expandable) { // We animate from the touched view only if we are not on the keyguard, given that if we // are we will dismiss it which will also collapse the shade. - boolean shouldAnimateFromView = view != null && !mKeyguardStateController.isShowing(); + boolean shouldAnimateFromExpandable = + expandable != null && !mKeyguardStateController.isShowing(); // Create the recording dialog that will collapse the shade only if we start the recording. Runnable onStartRecordingClicked = () -> { @@ -192,10 +193,17 @@ public class ScreenRecordTile extends QSTileImpl<QSTile.BooleanState> mDialogTransitionAnimator, mActivityStarter, onStartRecordingClicked); ActivityStarter.OnDismissAction dismissAction = () -> { - if (shouldAnimateFromView) { - mDialogTransitionAnimator.showFromView(dialog, view, new DialogCuj( - InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN, INTERACTION_JANK_TAG), - /* animateBackgroundBoundsChange= */ true); + if (shouldAnimateFromExpandable) { + DialogTransitionAnimator.Controller controller = + expandable.dialogTransitionController(new DialogCuj( + InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN, + INTERACTION_JANK_TAG)); + if (controller != null) { + mDialogTransitionAnimator.show(dialog, + controller, /* animateBackgroundBoundsChange= */ true); + } else { + dialog.show(); + } } else { dialog.show(); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/SensorPrivacyToggleTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/SensorPrivacyToggleTile.java index 3eeb2a3303be..036ce080c543 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/SensorPrivacyToggleTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/SensorPrivacyToggleTile.java @@ -26,13 +26,13 @@ import android.provider.Settings; import android.safetycenter.SafetyCenterManager; import android.service.quicksettings.Tile; import android.text.TextUtils; -import android.view.View; import android.widget.Switch; import androidx.annotation.DrawableRes; import androidx.annotation.Nullable; import com.android.internal.logging.MetricsLogger; +import com.android.systemui.animation.Expandable; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.ActivityStarter; @@ -100,7 +100,7 @@ public abstract class SensorPrivacyToggleTile extends QSTileImpl<QSTile.BooleanS } @Override - protected void handleClick(@Nullable View view) { + protected void handleClick(@Nullable Expandable expandable) { boolean blocked = mSensorPrivacyController.isSensorBlocked(getSensorId()); if (mSensorPrivacyController.requiresAuthentication() && mKeyguard.isMethodSecure() diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/UiModeNightTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/UiModeNightTile.java index d92873adafd8..bec6581e54c9 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/UiModeNightTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/UiModeNightTile.java @@ -24,13 +24,13 @@ import android.os.Looper; import android.provider.Settings; import android.service.quicksettings.Tile; import android.text.TextUtils; -import android.view.View; import android.widget.Switch; import androidx.annotation.Nullable; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto; +import com.android.systemui.animation.Expandable; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.ActivityStarter; @@ -107,7 +107,7 @@ public class UiModeNightTile extends QSTileImpl<QSTile.BooleanState> implements } @Override - protected void handleClick(@Nullable View view) { + protected void handleClick(@Nullable Expandable expandable) { if (getState().state == Tile.STATE_UNAVAILABLE) { return; } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/WorkModeTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/WorkModeTile.java index abc481277e61..d9546ec6ac51 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/WorkModeTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/WorkModeTile.java @@ -24,7 +24,6 @@ import android.os.Handler; import android.os.Looper; import android.provider.Settings; import android.service.quicksettings.Tile; -import android.view.View; import android.widget.Switch; import androidx.annotation.MainThread; @@ -32,6 +31,7 @@ import androidx.annotation.Nullable; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; +import com.android.systemui.animation.Expandable; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.ActivityStarter; @@ -88,7 +88,7 @@ public class WorkModeTile extends QSTileImpl<BooleanState> implements } @Override - public void handleClick(@Nullable View view) { + public void handleClick(@Nullable Expandable expandable) { mProfileController.setWorkModeEnabled(!mState.value); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/base/actions/QSTileIntentUserInputHandler.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/base/actions/QSTileIntentUserInputHandler.kt index 7192f58218a4..2d3120a1dcce 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/base/actions/QSTileIntentUserInputHandler.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/base/actions/QSTileIntentUserInputHandler.kt @@ -20,9 +20,9 @@ import android.app.PendingIntent import android.content.Intent import android.content.pm.PackageManager import android.os.UserHandle -import android.view.View import com.android.internal.jank.InteractionJankMonitor import com.android.systemui.animation.ActivityTransitionAnimator +import com.android.systemui.animation.Expandable import com.android.systemui.dagger.SysUISingleton import com.android.systemui.plugins.ActivityStarter import javax.inject.Inject @@ -33,11 +33,11 @@ import javax.inject.Inject */ interface QSTileIntentUserInputHandler { - fun handle(view: View?, intent: Intent) + fun handle(expandable: Expandable?, intent: Intent) /** @param requestLaunchingDefaultActivity used in case !pendingIndent.isActivity */ fun handle( - view: View?, + expandable: Expandable?, pendingIntent: PendingIntent, requestLaunchingDefaultActivity: Boolean = false ) @@ -52,31 +52,25 @@ constructor( private val userHandle: UserHandle, ) : QSTileIntentUserInputHandler { - override fun handle(view: View?, intent: Intent) { + override fun handle(expandable: Expandable?, intent: Intent) { val animationController: ActivityTransitionAnimator.Controller? = - view?.let { - ActivityTransitionAnimator.Controller.fromView( - it, - InteractionJankMonitor.CUJ_SHADE_APP_LAUNCH_FROM_QS_TILE, - ) - } + expandable?.activityTransitionController( + InteractionJankMonitor.CUJ_SHADE_APP_LAUNCH_FROM_QS_TILE + ) activityStarter.postStartActivityDismissingKeyguard(intent, 0, animationController) } // TODO(b/249804373): make sure to allow showing activities over the lockscreen. See b/292112939 override fun handle( - view: View?, + expandable: Expandable?, pendingIntent: PendingIntent, requestLaunchingDefaultActivity: Boolean ) { if (pendingIntent.isActivity) { val animationController: ActivityTransitionAnimator.Controller? = - view?.let { - ActivityTransitionAnimator.Controller.fromView( - it, - InteractionJankMonitor.CUJ_SHADE_APP_LAUNCH_FROM_QS_TILE, - ) - } + expandable?.activityTransitionController( + InteractionJankMonitor.CUJ_SHADE_APP_LAUNCH_FROM_QS_TILE + ) activityStarter.postStartActivityDismissingKeyguard(pendingIntent, animationController) } else if (requestLaunchingDefaultActivity) { val intent = @@ -97,7 +91,7 @@ constructor( ?.let { resolved -> intent.setPackage(null) intent.setComponent(resolved.activityInfo.componentName) - handle(view, intent) + handle(expandable, intent) } } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogManager.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogManager.kt index 5aef950b6a19..246fe3883e19 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogManager.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogManager.kt @@ -16,10 +16,10 @@ package com.android.systemui.qs.tiles.dialog import android.util.Log -import android.view.View import com.android.internal.jank.InteractionJankMonitor import com.android.systemui.animation.DialogCuj import com.android.systemui.animation.DialogTransitionAnimator +import com.android.systemui.animation.Expandable import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.statusbar.phone.SystemUIDialog @@ -47,14 +47,14 @@ constructor( } /** - * Creates a [InternetDialogDelegate]. The dialog will be animated from [view] if it is not - * null. + * Creates a [InternetDialogDelegate]. The dialog will be animated from [expandable] if it is + * not null. */ fun create( aboveStatusBar: Boolean, canConfigMobileData: Boolean, canConfigWifi: Boolean, - view: View? + expandable: Expandable? ) { if (dialog != null) { if (DEBUG) { @@ -67,20 +67,18 @@ constructor( dialogFactory .create(aboveStatusBar, canConfigMobileData, canConfigWifi, coroutineScope) .createDialog() - if (view != null) { - dialogTransitionAnimator.showFromView( + val controller = + expandable?.dialogTransitionController( + DialogCuj(InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN, INTERACTION_JANK_TAG) + ) + controller?.let { + dialogTransitionAnimator.show( dialog!!, - view, - animateBackgroundBoundsChange = true, - cuj = - DialogCuj( - InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN, - INTERACTION_JANK_TAG - ) + controller, + animateBackgroundBoundsChange = true ) - } else { - dialog!!.show() } + ?: dialog?.show() } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/airplane/domain/interactor/AirplaneModeTileUserActionInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/airplane/domain/interactor/AirplaneModeTileUserActionInteractor.kt index 9e13a56c49a1..bf0f8f6577de 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/airplane/domain/interactor/AirplaneModeTileUserActionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/airplane/domain/interactor/AirplaneModeTileUserActionInteractor.kt @@ -45,7 +45,7 @@ constructor( } AirplaneModeInteractor.SetResult.BLOCKED_BY_ECM -> { qsTileIntentUserActionHandler.handle( - action.view, + action.expandable, Intent(TelephonyManager.ACTION_SHOW_NOTICE_ECM_BLOCK_OTHERS), ) } @@ -53,7 +53,7 @@ constructor( } is QSTileUserAction.LongClick -> { qsTileIntentUserActionHandler.handle( - action.view, + action.expandable, Intent(Settings.ACTION_AIRPLANE_MODE_SETTINGS) ) } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/alarm/domain/interactor/AlarmTileUserActionInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/alarm/domain/interactor/AlarmTileUserActionInteractor.kt index 0ad520bd31ee..14fc57c0f83f 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/alarm/domain/interactor/AlarmTileUserActionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/alarm/domain/interactor/AlarmTileUserActionInteractor.kt @@ -40,9 +40,12 @@ constructor( data.alarmClockInfo.showIntent != null ) { val pendingIndent = data.alarmClockInfo.showIntent - inputHandler.handle(action.view, pendingIndent, true) + inputHandler.handle(action.expandable, pendingIndent, true) } else { - inputHandler.handle(action.view, Intent(AlarmClock.ACTION_SHOW_ALARMS)) + inputHandler.handle( + action.expandable, + Intent(AlarmClock.ACTION_SHOW_ALARMS) + ) } } is QSTileUserAction.LongClick -> {} diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/battery/domain/interactor/BatterySaverTileUserActionInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/battery/domain/interactor/BatterySaverTileUserActionInteractor.kt index 1e4eb38008bd..d4b4fe06ded8 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/battery/domain/interactor/BatterySaverTileUserActionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/battery/domain/interactor/BatterySaverTileUserActionInteractor.kt @@ -39,12 +39,12 @@ constructor( when (action) { is QSTileUserAction.Click -> { if (!data.isPluggedIn) { - batteryController.setPowerSaveMode(!data.isPowerSaving, action.view) + batteryController.setPowerSaveMode(!data.isPowerSaving, action.expandable) } } is QSTileUserAction.LongClick -> { qsTileIntentUserActionHandler.handle( - action.view, + action.expandable, Intent(Settings.ACTION_BATTERY_SAVER_SETTINGS) ) } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/colorcorrection/domain/interactor/ColorCorrectionUserActionInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/colorcorrection/domain/interactor/ColorCorrectionUserActionInteractor.kt index d1838029db4e..534bd734f5bd 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/colorcorrection/domain/interactor/ColorCorrectionUserActionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/colorcorrection/domain/interactor/ColorCorrectionUserActionInteractor.kt @@ -45,7 +45,7 @@ constructor( } is QSTileUserAction.LongClick -> { qsTileIntentUserActionHandler.handle( - action.view, + action.expandable, Intent(Settings.ACTION_COLOR_CORRECTION_SETTINGS) ) } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/custom/domain/interactor/CustomTileUserActionInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/custom/domain/interactor/CustomTileUserActionInteractor.kt index a16ac360e7e4..9bdf6316b069 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/custom/domain/interactor/CustomTileUserActionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/custom/domain/interactor/CustomTileUserActionInteractor.kt @@ -29,9 +29,9 @@ import android.os.UserHandle import android.provider.Settings import android.service.quicksettings.TileService import android.view.IWindowManager -import android.view.View import android.view.WindowManager import androidx.annotation.GuardedBy +import com.android.systemui.animation.Expandable import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.qs.pipeline.shared.TileSpec import com.android.systemui.qs.tiles.base.actions.QSTileIntentUserInputHandler @@ -65,20 +65,21 @@ constructor( @GuardedBy("token") private var isTokenGranted: Boolean = false @GuardedBy("token") private var isShowingDialog: Boolean = false - private val lastClickedView: AtomicReference<View> = AtomicReference<View>() + private val lastClickedExpandable: AtomicReference<Expandable> = AtomicReference<Expandable>() override suspend fun handleInput(input: QSTileInput<CustomTileDataModel>) = with(input) { when (action) { - is QSTileUserAction.Click -> click(action.view, data.tile.activityLaunchForClick) + is QSTileUserAction.Click -> + click(action.expandable, data.tile.activityLaunchForClick) is QSTileUserAction.LongClick -> - longClick(user, action.view, data.componentName, data.tile.state) + longClick(user, action.expandable, data.componentName, data.tile.state) } qsTileLogger.logCustomTileUserActionDelivered(tileSpec) } private suspend fun click( - view: View?, + expandable: Expandable?, activityLaunchForClick: PendingIntent?, ) { grantToken() @@ -86,10 +87,10 @@ constructor( // Bind active tile to deliver user action serviceInteractor.bindOnClick() if (activityLaunchForClick == null) { - lastClickedView.set(view) + lastClickedExpandable.set(expandable) serviceInteractor.onClick(token) } else { - qsTileIntentUserInputHandler.handle(view, activityLaunchForClick) + qsTileIntentUserInputHandler.handle(expandable, activityLaunchForClick) } } catch (e: RemoteException) { qsTileLogger.logError(tileSpec, "Failed to deliver click", e) @@ -117,10 +118,10 @@ constructor( if (!isTokenGranted) { return } - qsTileIntentUserInputHandler.handle(lastClickedView.getAndSet(null), pendingIntent) + qsTileIntentUserInputHandler.handle(lastClickedExpandable.getAndSet(null), pendingIntent) } - fun clearLastClickedView() = lastClickedView.set(null) + fun clearLastClickedView() = lastClickedExpandable.set(null) private fun grantToken() { synchronized(token) { @@ -142,7 +143,7 @@ constructor( private suspend fun longClick( user: UserHandle, - view: View?, + expandable: Expandable?, componentName: ComponentName, state: Int ) { @@ -159,14 +160,14 @@ constructor( } if (resolvedIntent == null) { qsTileIntentUserInputHandler.handle( - view, + expandable, Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) .setData( Uri.fromParts(IntentFilter.SCHEME_PACKAGE, componentName.packageName, null) ) ) } else { - qsTileIntentUserInputHandler.handle(view, resolvedIntent) + qsTileIntentUserInputHandler.handle(expandable, resolvedIntent) } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/fontscaling/domain/interactor/FontScalingTileUserActionInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/fontscaling/domain/interactor/FontScalingTileUserActionInteractor.kt index db8b1a5a5d47..d308ec889136 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/fontscaling/domain/interactor/FontScalingTileUserActionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/fontscaling/domain/interactor/FontScalingTileUserActionInteractor.kt @@ -52,21 +52,22 @@ constructor( with(input) { when (action) { is QSTileUserAction.Click -> { - // We animate from the touched view only if we are not on the keyguard - val animateFromView: Boolean = - action.view != null && !keyguardStateController.isShowing + // We animate from the touched expandable only if we are not on the keyguard + val animateFromExpandable: Boolean = + action.expandable != null && !keyguardStateController.isShowing val runnable = Runnable { val dialog: SystemUIDialog = fontScalingDialogDelegateProvider.get().createDialog() - if (animateFromView) { - dialogTransitionAnimator.showFromView( - dialog, - action.view!!, - DialogCuj( - InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN, - INTERACTION_JANK_TAG + if (animateFromExpandable) { + action.expandable + ?.dialogTransitionController( + DialogCuj( + InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN, + INTERACTION_JANK_TAG + ) ) - ) + ?.let { dialogTransitionAnimator.show(dialog, it) } + ?: dialog.show() } else { dialog.show() } @@ -84,7 +85,7 @@ constructor( } is QSTileUserAction.LongClick -> { qsTileIntentUserActionHandler.handle( - action.view, + action.expandable, Intent(Settings.ACTION_TEXT_READING_SETTINGS) ) } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/internet/domain/interactor/InternetTileUserActionInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/internet/domain/interactor/InternetTileUserActionInteractor.kt index 2620cd555d8e..c0b089d84dc8 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/internet/domain/interactor/InternetTileUserActionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/internet/domain/interactor/InternetTileUserActionInteractor.kt @@ -49,13 +49,13 @@ constructor( aboveStatusBar = true, accessPointController.canConfigMobileData(), accessPointController.canConfigWifi(), - action.view, + action.expandable, ) } } is QSTileUserAction.LongClick -> { qsTileIntentUserActionHandler.handle( - action.view, + action.expandable, Intent(Settings.ACTION_WIFI_SETTINGS) ) } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/inversion/domain/interactor/ColorInversionUserActionInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/inversion/domain/interactor/ColorInversionUserActionInteractor.kt index 43b58c83f7ef..d64327333cb6 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/inversion/domain/interactor/ColorInversionUserActionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/inversion/domain/interactor/ColorInversionUserActionInteractor.kt @@ -45,7 +45,7 @@ constructor( } is QSTileUserAction.LongClick -> { qsTileIntentUserActionHandler.handle( - action.view, + action.expandable, Intent(Settings.ACTION_COLOR_INVERSION_SETTINGS) ) } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/location/domain/interactor/LocationTileUserActionInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/location/domain/interactor/LocationTileUserActionInteractor.kt index 66705ead3cf0..77404aa82606 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/location/domain/interactor/LocationTileUserActionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/location/domain/interactor/LocationTileUserActionInteractor.kt @@ -64,7 +64,7 @@ constructor( } is QSTileUserAction.LongClick -> { qsTileIntentUserActionHandler.handle( - action.view, + action.expandable, Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS) ) } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/reducebrightness/domain/interactor/ReduceBrightColorsTileUserActionInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/reducebrightness/domain/interactor/ReduceBrightColorsTileUserActionInteractor.kt index 762f8635c562..14dbe0e8a69a 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/reducebrightness/domain/interactor/ReduceBrightColorsTileUserActionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/reducebrightness/domain/interactor/ReduceBrightColorsTileUserActionInteractor.kt @@ -44,7 +44,7 @@ constructor( } is QSTileUserAction.LongClick -> { qsTileIntentUserActionHandler.handle( - action.view, + action.expandable, Intent(Settings.ACTION_REDUCE_BRIGHT_COLORS_SETTINGS) ) } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/rotation/domain/interactor/RotationLockTileUserActionInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/rotation/domain/interactor/RotationLockTileUserActionInteractor.kt index 8530926e68e0..34385ea815eb 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/rotation/domain/interactor/RotationLockTileUserActionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/rotation/domain/interactor/RotationLockTileUserActionInteractor.kt @@ -42,7 +42,7 @@ constructor( } is QSTileUserAction.LongClick -> { qsTileIntentUserActionHandler.handle( - action.view, + action.expandable, Intent(Settings.ACTION_AUTO_ROTATE_SETTINGS) ) } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/saver/domain/interactor/DataSaverTileUserActionInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/saver/domain/interactor/DataSaverTileUserActionInteractor.kt index 861faf5a0e4f..a5dc66c901f1 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/saver/domain/interactor/DataSaverTileUserActionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/saver/domain/interactor/DataSaverTileUserActionInteractor.kt @@ -75,34 +75,32 @@ constructor( // must be created and shown on the main thread, so we post it to the UI // handler withContext(coroutineContext) { - val dialogContext = action.view?.context ?: context val dialogDelegate = DataSaverDialogDelegate( systemUIDialogFactory, - dialogContext, + context, backgroundContext, dataSaverController, sharedPreferences ) - val dialog = systemUIDialogFactory.create(dialogDelegate, dialogContext) + val dialog = systemUIDialogFactory.create(dialogDelegate, context) - if (action.view != null) { - dialogTransitionAnimator.showFromView( - dialog, - action.view!!, + action.expandable + ?.dialogTransitionController( DialogCuj( InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN, INTERACTION_JANK_TAG ) ) - } else { - dialog.show() - } + ?.let { controller -> + dialogTransitionAnimator.show(dialog, controller) + } + ?: dialog.show() } } is QSTileUserAction.LongClick -> { qsTileIntentUserActionHandler.handle( - action.view, + action.expandable, Intent(Settings.ACTION_DATA_SAVER_SETTINGS) ) } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/screenrecord/domain/interactor/ScreenRecordTileUserActionInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/screenrecord/domain/interactor/ScreenRecordTileUserActionInteractor.kt index d2bd09fe0ea3..79766d6642b3 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/screenrecord/domain/interactor/ScreenRecordTileUserActionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/screenrecord/domain/interactor/ScreenRecordTileUserActionInteractor.kt @@ -18,10 +18,10 @@ package com.android.systemui.qs.tiles.impl.screenrecord.domain.interactor import android.content.Context import android.util.Log -import android.view.View import com.android.internal.jank.InteractionJankMonitor import com.android.systemui.animation.DialogCuj import com.android.systemui.animation.DialogTransitionAnimator +import com.android.systemui.animation.Expandable import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.dagger.qualifiers.Main @@ -68,14 +68,16 @@ constructor( is ScreenRecordTileModel.Recording -> withContext(backgroundContext) { recordingController.stopRecording() } is ScreenRecordTileModel.DoingNothing -> - withContext(mainContext) { showPrompt(action.view, user.identifier) } + withContext(mainContext) { + showPrompt(action.expandable, user.identifier) + } } } is QSTileUserAction.LongClick -> {} // no-op } } - private fun showPrompt(view: View?, userId: Int) { + private fun showPrompt(expandable: Expandable?, userId: Int) { // Create the recording dialog that will collapse the shade only if we start the recording. val onStartRecordingClicked = Runnable { // We dismiss the shade. Since starting the recording will also dismiss the dialog, we @@ -99,21 +101,29 @@ constructor( return } - // We animate from the touched view only if we are not on the keyguard, given that if we + // We animate from the touched expandable only if we are not on the keyguard, given that if + // we // are we will dismiss it which will also collapse the shade. - val shouldAnimateFromView = view != null && !keyguardInteractor.isKeyguardShowing() + val shouldAnimateFromExpandable = + expandable != null && !keyguardInteractor.isKeyguardShowing() val dismissAction = ActivityStarter.OnDismissAction { - if (shouldAnimateFromView) { - dialogTransitionAnimator.showFromView( - dialog, - view!!, - DialogCuj( - InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN, - INTERACTION_JANK_TAG - ), - animateBackgroundBoundsChange = true - ) + if (shouldAnimateFromExpandable) { + val controller = + expandable?.dialogTransitionController( + DialogCuj( + InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN, + INTERACTION_JANK_TAG + ) + ) + controller?.let { + dialogTransitionAnimator.show( + dialog, + controller, + animateBackgroundBoundsChange = true, + ) + } + ?: dialog.show() } else { dialog.show() } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/sensorprivacy/domain/SensorPrivacyToggleTileUserActionInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/sensorprivacy/domain/SensorPrivacyToggleTileUserActionInteractor.kt index 9711cb81e2c0..f22a4269b3f5 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/sensorprivacy/domain/SensorPrivacyToggleTileUserActionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/sensorprivacy/domain/SensorPrivacyToggleTileUserActionInteractor.kt @@ -80,7 +80,7 @@ constructor( } ) } - qsTileIntentUserActionHandler.handle(action.view, longClickIntent) + qsTileIntentUserActionHandler.handle(action.expandable, longClickIntent) } } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/uimodenight/domain/interactor/UiModeNightTileUserActionInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/uimodenight/domain/interactor/UiModeNightTileUserActionInteractor.kt index 00d7a629f5be..f8dd1730cc10 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/uimodenight/domain/interactor/UiModeNightTileUserActionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/uimodenight/domain/interactor/UiModeNightTileUserActionInteractor.kt @@ -50,7 +50,7 @@ constructor( } is QSTileUserAction.LongClick -> { qsTileIntentUserActionHandler.handle( - action.view, + action.expandable, Intent(Settings.ACTION_DARK_THEME_SETTINGS) ) } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/work/domain/interactor/WorkModeTileUserActionInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/work/domain/interactor/WorkModeTileUserActionInteractor.kt index f765f8b3ac77..031e4d978739 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/work/domain/interactor/WorkModeTileUserActionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/work/domain/interactor/WorkModeTileUserActionInteractor.kt @@ -44,7 +44,7 @@ constructor( is QSTileUserAction.LongClick -> { if (data is WorkModeTileModel.HasActiveProfile) { qsTileIntentUserActionHandler.handle( - action.view, + action.expandable, Intent(Settings.ACTION_MANAGED_PROFILE_SETTINGS) ) } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/viewmodel/QSTileUserAction.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/viewmodel/QSTileUserAction.kt index a1450420131b..acb29362681b 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/viewmodel/QSTileUserAction.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/viewmodel/QSTileUserAction.kt @@ -16,12 +16,12 @@ package com.android.systemui.qs.tiles.viewmodel -import android.view.View +import com.android.systemui.animation.Expandable sealed interface QSTileUserAction { - val view: View? + val expandable: Expandable? - class Click(override val view: View?) : QSTileUserAction - class LongClick(override val view: View?) : QSTileUserAction + class Click(override val expandable: Expandable?) : QSTileUserAction + class LongClick(override val expandable: Expandable?) : QSTileUserAction } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelAdapter.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelAdapter.kt index 5a389f3fe701..b88c1e566c4a 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelAdapter.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelAdapter.kt @@ -19,10 +19,10 @@ package com.android.systemui.qs.tiles.viewmodel import android.content.Context import android.os.UserHandle import android.util.Log -import android.view.View import androidx.annotation.GuardedBy import com.android.internal.logging.InstanceId import com.android.systemui.Dumpable +import com.android.systemui.animation.Expandable import com.android.systemui.common.shared.model.Icon import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.plugins.qs.QSTile @@ -126,21 +126,21 @@ constructor( synchronized(callbacks) { callbacks.clear() } } - override fun click(view: View?) { + override fun click(expandable: Expandable?) { if (isActionSupported(QSTileState.UserAction.CLICK)) { - qsTileViewModel.onActionPerformed(QSTileUserAction.Click(view)) + qsTileViewModel.onActionPerformed(QSTileUserAction.Click(expandable)) } } - override fun secondaryClick(view: View?) { + override fun secondaryClick(expandable: Expandable?) { if (isActionSupported(QSTileState.UserAction.CLICK)) { - qsTileViewModel.onActionPerformed(QSTileUserAction.Click(view)) + qsTileViewModel.onActionPerformed(QSTileUserAction.Click(expandable)) } } - override fun longClick(view: View?) { + override fun longClick(expandable: Expandable?) { if (isActionSupported(QSTileState.UserAction.LONG_CLICK)) { - qsTileViewModel.onActionPerformed(QSTileUserAction.LongClick(view)) + qsTileViewModel.onActionPerformed(QSTileUserAction.LongClick(expandable)) } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java index 37eda6490ec2..92731037dc64 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java @@ -17,11 +17,11 @@ package com.android.systemui.statusbar.policy; import android.annotation.Nullable; -import android.view.View; import androidx.annotation.NonNull; import com.android.systemui.Dumpable; +import com.android.systemui.animation.Expandable; import com.android.systemui.demomode.DemoMode; import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback; @@ -51,23 +51,23 @@ public interface BatteryController extends DemoMode, * * Can pass the view that triggered the request. */ - void setPowerSaveMode(boolean powerSave, @Nullable View view); + void setPowerSaveMode(boolean powerSave, @Nullable Expandable expandable); /** * Gets a reference to the last view used when called {@link #setPowerSaveMode}. */ @Nullable - default WeakReference<View> getLastPowerSaverStartView() { + default WeakReference<Expandable> getLastPowerSaverStartExpandable() { return null; } /** * Clears the last view used when called {@link #setPowerSaveMode}. * - * Immediately after calling this, a call to {@link #getLastPowerSaverStartView()} should return - * {@code null}. + * Immediately after calling this, a call to {@link #getLastPowerSaverStartExpandable()} should + * return {@code null}. */ - default void clearLastPowerSaverStartView() {} + default void clearLastPowerSaverStartExpandable() {} /** * Returns {@code true} if the device is currently plugged in. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java index dab27bbf6b4b..6012ecd5a7f7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryControllerImpl.java @@ -37,7 +37,6 @@ import android.os.Handler; import android.os.PowerManager; import android.os.PowerSaveState; import android.util.IndentingPrintWriter; -import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -48,6 +47,7 @@ import com.android.settingslib.fuelgauge.BatterySaverUtils; import com.android.settingslib.fuelgauge.Estimate; import com.android.settingslib.utils.PowerUtil; import com.android.systemui.Dumpable; +import com.android.systemui.animation.Expandable; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; @@ -110,9 +110,10 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC private boolean mFetchingEstimate = false; // Use AtomicReference because we may request it from a different thread - // Use WeakReference because we are keeping a reference to a View that's not as long lived - // as this controller. - private AtomicReference<WeakReference<View>> mPowerSaverStartView = new AtomicReference<>(); + // Use WeakReference because we are keeping a reference to an Expandable that's not as long + // lived as this controller. + private AtomicReference<WeakReference<Expandable>> mPowerSaverStartExpandable = + new AtomicReference<>(); @VisibleForTesting public BatteryControllerImpl( @@ -196,20 +197,20 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC } @Override - public void setPowerSaveMode(boolean powerSave, View view) { - if (powerSave) mPowerSaverStartView.set(new WeakReference<>(view)); + public void setPowerSaveMode(boolean powerSave, Expandable expandable) { + if (powerSave) mPowerSaverStartExpandable.set(new WeakReference<>(expandable)); BatterySaverUtils.setPowerSaveMode(mContext, powerSave, /*needFirstTimeWarning*/ true, SAVER_ENABLED_QS); } @Override - public WeakReference<View> getLastPowerSaverStartView() { - return mPowerSaverStartView.get(); + public WeakReference<Expandable> getLastPowerSaverStartExpandable() { + return mPowerSaverStartExpandable.get(); } @Override - public void clearLastPowerSaverStartView() { - mPowerSaverStartView.set(null); + public void clearLastPowerSaverStartExpandable() { + mPowerSaverStartExpandable.set(null); } @Override @@ -543,4 +544,4 @@ public class BatteryControllerImpl extends BroadcastReceiver implements BatteryC public boolean isChargingSourceDock() { return mPluggedChargingSource == BatteryManager.BATTERY_PLUGGED_DOCK; } -} +}
\ No newline at end of file diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogManagerTest.java index abc12ede0a67..e9c742d63d81 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/hearingaid/HearingDevicesDialogManagerTest.java @@ -24,7 +24,6 @@ import static org.mockito.Mockito.when; import android.bluetooth.BluetoothDevice; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; -import android.view.View; import androidx.test.filters.SmallTest; @@ -34,6 +33,7 @@ import com.android.settingslib.bluetooth.LocalBluetoothAdapter; import com.android.settingslib.bluetooth.LocalBluetoothManager; import com.android.systemui.SysuiTestCase; import com.android.systemui.animation.DialogTransitionAnimator; +import com.android.systemui.animation.Expandable; import com.android.systemui.statusbar.phone.SystemUIDialog; import org.junit.Before; @@ -56,9 +56,10 @@ public class HearingDevicesDialogManagerTest extends SysuiTestCase { @Rule public MockitoRule mockito = MockitoJUnit.rule(); - private final View mView = new View(mContext); private final List<CachedBluetoothDevice> mCachedDevices = new ArrayList<>(); @Mock + private Expandable mExpandable; + @Mock private DialogTransitionAnimator mDialogTransitionAnimator; @Mock private HearingDevicesDialogDelegate.Factory mDialogFactory; @@ -97,7 +98,7 @@ public class HearingDevicesDialogManagerTest extends SysuiTestCase { public void showDialog_bluetoothDisable_showPairNewDeviceTrue() { when(mLocalBluetoothAdapter.isEnabled()).thenReturn(false); - mManager.showDialog(mView); + mManager.showDialog(mExpandable); verify(mDialogFactory).create(eq(true)); } @@ -109,7 +110,7 @@ public class HearingDevicesDialogManagerTest extends SysuiTestCase { when(mCachedDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); mCachedDevices.add(mCachedDevice); - mManager.showDialog(mView); + mManager.showDialog(mExpandable); verify(mDialogFactory).create(eq(false)); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogViewModelTest.kt index b05d9591d8a8..af1d31528675 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogViewModelTest.kt @@ -22,7 +22,6 @@ import android.testing.TestableLooper import android.view.View import android.view.View.GONE import android.view.View.VISIBLE -import android.widget.LinearLayout import androidx.test.filters.SmallTest import com.android.internal.logging.UiEventLogger import com.android.settingslib.bluetooth.CachedBluetoothDevice @@ -30,6 +29,7 @@ import com.android.settingslib.bluetooth.LocalBluetoothManager import com.android.settingslib.flags.Flags import com.android.systemui.SysuiTestCase import com.android.systemui.animation.DialogTransitionAnimator +import com.android.systemui.animation.Expandable import com.android.systemui.plugins.ActivityStarter import com.android.systemui.statusbar.phone.SystemUIDialog import com.android.systemui.util.FakeSharedPreferences @@ -100,6 +100,8 @@ class BluetoothTileDialogViewModelTest : SysuiTestCase() { @Mock private lateinit var bluetoothTileDialogDelegate: BluetoothTileDialogDelegate @Mock private lateinit var sysuiDialog: SystemUIDialog + @Mock private lateinit var expandable: Expandable + @Mock private lateinit var controller: DialogTransitionAnimator.Controller private val sharedPreferences = FakeSharedPreferences() @@ -157,6 +159,7 @@ class BluetoothTileDialogViewModelTest : SysuiTestCase() { .thenReturn(getMutableStateFlow(false)) whenever(audioSharingInteractor.audioSharingButtonStateUpdate) .thenReturn(getMutableStateFlow(AudioSharingButtonState.Gone)) + whenever(expandable.dialogTransitionController(any())).thenReturn(controller) } @Test @@ -164,16 +167,16 @@ class BluetoothTileDialogViewModelTest : SysuiTestCase() { testScope.runTest { bluetoothTileDialogViewModel.showDialog(null) - verify(mDialogTransitionAnimator, never()).showFromView(any(), any(), any(), any()) + verify(mDialogTransitionAnimator, never()).show(any(), any(), any()) } } @Test fun testShowDialog_animated() { testScope.runTest { - bluetoothTileDialogViewModel.showDialog(LinearLayout(mContext)) + bluetoothTileDialogViewModel.showDialog(expandable) - verify(mDialogTransitionAnimator).showFromView(any(), any(), nullable(), anyBoolean()) + verify(mDialogTransitionAnimator).show(any(), any(), anyBoolean()) } } @@ -181,10 +184,9 @@ class BluetoothTileDialogViewModelTest : SysuiTestCase() { fun testShowDialog_animated_callInBackgroundThread() { testScope.runTest { backgroundExecutor.execute { - bluetoothTileDialogViewModel.showDialog(LinearLayout(mContext)) + bluetoothTileDialogViewModel.showDialog(expandable) - verify(mDialogTransitionAnimator) - .showFromView(any(), any(), nullable(), anyBoolean()) + verify(mDialogTransitionAnimator).show(any(), any(), anyBoolean()) } } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/power/PowerNotificationWarningsTest.java b/packages/SystemUI/tests/src/com/android/systemui/power/PowerNotificationWarningsTest.java index 9429725718db..b95d3aaef32f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/power/PowerNotificationWarningsTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/power/PowerNotificationWarningsTest.java @@ -44,7 +44,6 @@ import android.os.Handler; import android.os.UserHandle; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; -import android.view.View; import androidx.test.filters.SmallTest; @@ -53,6 +52,7 @@ import com.android.internal.messages.nano.SystemMessageProto.SystemMessage; import com.android.settingslib.fuelgauge.BatterySaverUtils; import com.android.systemui.SysuiTestCase; import com.android.systemui.animation.DialogTransitionAnimator; +import com.android.systemui.animation.Expandable; import com.android.systemui.broadcast.BroadcastSender; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.settings.UserTracker; @@ -88,7 +88,9 @@ public class PowerNotificationWarningsTest extends SysuiTestCase { @Mock private UserTracker mUserTracker; @Mock - private View mView; + private Expandable mExpandable; + @Mock + private DialogTransitionAnimator.Controller mController; @Mock private SystemUIDialog.Factory mSystemUIDialogFactory; @Mock @@ -234,32 +236,31 @@ public class PowerNotificationWarningsTest extends SysuiTestCase { @Test public void testDialogStartedFromLauncher_viewVisible() { - when(mBatteryController.getLastPowerSaverStartView()) - .thenReturn(new WeakReference<>(mView)); - when(mView.isAggregatedVisible()).thenReturn(true); + when(mBatteryController.getLastPowerSaverStartExpandable()) + .thenReturn(new WeakReference<>(mExpandable)); + when(mExpandable.dialogTransitionController(any())).thenReturn(mController); Intent intent = new Intent(BatterySaverUtils.ACTION_SHOW_START_SAVER_CONFIRMATION); intent.putExtras(new Bundle()); mReceiver.onReceive(mContext, intent); - verify(mDialogTransitionAnimator).showFromView(any(), eq(mView), any()); + verify(mDialogTransitionAnimator).show(any(), eq(mController)); mPowerNotificationWarnings.getSaverConfirmationDialog().dismiss(); } @Test public void testDialogStartedNotFromLauncher_viewNotVisible() { - when(mBatteryController.getLastPowerSaverStartView()) - .thenReturn(new WeakReference<>(mView)); - when(mView.isAggregatedVisible()).thenReturn(false); + when(mBatteryController.getLastPowerSaverStartExpandable()) + .thenReturn(new WeakReference<>(mExpandable)); Intent intent = new Intent(BatterySaverUtils.ACTION_SHOW_START_SAVER_CONFIRMATION); intent.putExtras(new Bundle()); mReceiver.onReceive(mContext, intent); - verify(mDialogTransitionAnimator, never()).showFromView(any(), any()); + verify(mDialogTransitionAnimator, never()).show(any(), any()); verify(mPowerNotificationWarnings.getSaverConfirmationDialog()).show(); mPowerNotificationWarnings.getSaverConfirmationDialog().dismiss(); @@ -267,7 +268,7 @@ public class PowerNotificationWarningsTest extends SysuiTestCase { @Test public void testDialogShownNotFromLauncher() { - when(mBatteryController.getLastPowerSaverStartView()).thenReturn(null); + when(mBatteryController.getLastPowerSaverStartExpandable()).thenReturn(null); Intent intent = new Intent(BatterySaverUtils.ACTION_SHOW_START_SAVER_CONFIRMATION); intent.putExtras(new Bundle()); diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java index ef7798e545d3..5e14b1a60ddb 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java @@ -43,7 +43,6 @@ import android.os.Looper; import android.os.UserHandle; import android.testing.AndroidTestingRunner; import android.util.SparseArray; -import android.view.View; import androidx.annotation.Nullable; import androidx.test.filters.SmallTest; @@ -51,6 +50,7 @@ import androidx.test.filters.SmallTest; import com.android.internal.logging.MetricsLogger; import com.android.internal.util.CollectionUtils; import com.android.systemui.SysuiTestCase; +import com.android.systemui.animation.Expandable; import com.android.systemui.classifier.FalsingManagerFake; import com.android.systemui.dump.nano.SystemUIProtoDump; import com.android.systemui.flags.FakeFeatureFlags; @@ -734,7 +734,7 @@ public class QSTileHostTest extends SysuiTestCase { } @Override - protected void handleClick(@Nullable View view) {} + protected void handleClick(@Nullable Expandable expandable) {} @Override protected void handleUpdateState(State state, Object arg) {} diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java index df0ab341b5d4..8bf743884359 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java @@ -44,13 +44,13 @@ import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.text.TextUtils; import android.util.ArraySet; -import android.view.View; import androidx.annotation.Nullable; import androidx.test.filters.SmallTest; import com.android.internal.logging.InstanceId; import com.android.systemui.SysuiTestCase; +import com.android.systemui.animation.Expandable; import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.qs.QSHost; import com.android.systemui.res.R; @@ -395,13 +395,13 @@ public class TileQueryHelperTest extends SysuiTestCase { } @Override - public void click(@Nullable View view) {} + public void click(@Nullable Expandable expandable) {} @Override - public void secondaryClick(@Nullable View view) {} + public void secondaryClick(@Nullable Expandable expandable) {} @Override - public void longClick(@Nullable View view) {} + public void longClick(@Nullable Expandable expandable) {} @Override public void userSwitch(int currentUser) {} diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/external/CustomTileTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/external/CustomTileTest.kt index ef979d2d0cac..a8e9db5d527c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/external/CustomTileTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/external/CustomTileTest.kt @@ -35,11 +35,10 @@ import androidx.test.filters.SmallTest import android.testing.AndroidTestingRunner import android.testing.TestableLooper import android.view.IWindowManager -import android.view.View import com.android.internal.logging.MetricsLogger import com.android.systemui.SysuiTestCase import com.android.systemui.animation.ActivityTransitionAnimator -import com.android.systemui.animation.view.LaunchableFrameLayout +import com.android.systemui.animation.Expandable import com.android.systemui.classifier.FalsingManagerFake import com.android.systemui.plugins.ActivityStarter import com.android.systemui.plugins.qs.QSTile @@ -339,7 +338,7 @@ class CustomTileTest : SysuiTestCase() { tile.qsTile.activityLaunchForClick = pi } - tile.handleClick(mock(View::class.java)) + tile.handleClick(mock(Expandable::class.java)) testableLooper.processAllMessages() verify(activityStarter, never()) @@ -366,7 +365,7 @@ class CustomTileTest : SysuiTestCase() { val tile = CustomTile.create(customTileFactory, TILE_SPEC, mContext) tile.qsTile.activityLaunchForClick = pi - tile.handleClick(mock(LaunchableFrameLayout::class.java)) + tile.handleClick(mock(Expandable::class.java)) testableLooper.processAllMessages() diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java index 22b1c7b58ab3..c70624411c37 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java @@ -51,7 +51,6 @@ import android.service.quicksettings.Tile; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.testing.TestableLooper.RunWithLooper; -import android.view.View; import androidx.annotation.Nullable; import androidx.test.filters.SmallTest; @@ -63,6 +62,7 @@ import com.android.internal.logging.testing.UiEventLoggerFake; import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; import com.android.systemui.InstanceIdSequenceFake; import com.android.systemui.SysuiTestCase; +import com.android.systemui.animation.Expandable; import com.android.systemui.classifier.FalsingManagerFake; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.FalsingManager; @@ -148,7 +148,7 @@ public class QSTileImplTest extends SysuiTestCase { @Test public void testClick_Metrics() { - mTile.click(null /* view */); + mTile.click(null /* expandable */); verify(mMetricsLogger).write(argThat(new TileLogMatcher(ACTION_QS_CLICK))); assertEquals(1, mUiEventLoggerFake.numLogs()); UiEventLoggerFake.FakeUiEvent event = mUiEventLoggerFake.get(0); @@ -159,7 +159,7 @@ public class QSTileImplTest extends SysuiTestCase { public void testClick_log() { when(mStatusBarStateController.getState()).thenReturn(StatusBarState.SHADE); - mTile.click(null /* view */); + mTile.click(null /* expandable */); verify(mQsLogger).logTileClick(eq(SPEC), eq(StatusBarState.SHADE), eq(Tile.STATE_ACTIVE), anyInt()); } @@ -184,7 +184,7 @@ public class QSTileImplTest extends SysuiTestCase { @Test public void testClick_Metrics_Status_Bar_Status() { when(mStatusBarStateController.getState()).thenReturn(StatusBarState.SHADE); - mTile.click(null /* view */); + mTile.click(null /* expandable */); verify(mMetricsLogger).write(mLogCaptor.capture()); assertEquals(StatusBarState.SHADE, mLogCaptor.getValue() .getTaggedData(FIELD_STATUS_BAR_STATE)); @@ -193,12 +193,12 @@ public class QSTileImplTest extends SysuiTestCase { @Test public void testClick_falsing() { mFalsingManager.setFalseTap(true); - mTile.click(null /* view */); + mTile.click(null /* expandable */); mTestableLooper.processAllMessages(); assertThat(mTile.mClicked).isFalse(); mFalsingManager.setFalseTap(false); - mTile.click(null /* view */); + mTile.click(null /* expandable */); mTestableLooper.processAllMessages(); assertThat(mTile.mClicked).isTrue(); } @@ -206,19 +206,19 @@ public class QSTileImplTest extends SysuiTestCase { @Test public void testLongClick_falsing() { mFalsingManager.setFalseLongTap(true); - mTile.longClick(null /* view */); + mTile.longClick(null /* expandable */); mTestableLooper.processAllMessages(); assertThat(mTile.mLongClicked).isFalse(); mFalsingManager.setFalseLongTap(false); - mTile.longClick(null /* view */); + mTile.longClick(null /* expandable */); mTestableLooper.processAllMessages(); assertThat(mTile.mLongClicked).isTrue(); } @Test public void testSecondaryClick_Metrics() { - mTile.secondaryClick(null /* view */); + mTile.secondaryClick(null /* expandable */); verify(mMetricsLogger).write(argThat(new TileLogMatcher(ACTION_QS_SECONDARY_CLICK))); assertEquals(1, mUiEventLoggerFake.numLogs()); UiEventLoggerFake.FakeUiEvent event = mUiEventLoggerFake.get(0); @@ -229,7 +229,7 @@ public class QSTileImplTest extends SysuiTestCase { public void testSecondaryClick_log() { when(mStatusBarStateController.getState()).thenReturn(StatusBarState.SHADE); - mTile.secondaryClick(null /* view */); + mTile.secondaryClick(null /* expandable */); verify(mQsLogger).logTileSecondaryClick(eq(SPEC), eq(StatusBarState.SHADE), eq(Tile.STATE_ACTIVE), anyInt()); } @@ -254,7 +254,7 @@ public class QSTileImplTest extends SysuiTestCase { @Test public void testSecondaryClick_Metrics_Status_Bar_Status() { when(mStatusBarStateController.getState()).thenReturn(StatusBarState.KEYGUARD); - mTile.secondaryClick(null /* view */); + mTile.secondaryClick(null /* expandable */); verify(mMetricsLogger).write(mLogCaptor.capture()); assertEquals(StatusBarState.KEYGUARD, mLogCaptor.getValue() .getTaggedData(FIELD_STATUS_BAR_STATE)); @@ -262,7 +262,7 @@ public class QSTileImplTest extends SysuiTestCase { @Test public void testLongClick_Metrics() { - mTile.longClick(null /* view */); + mTile.longClick(null /* expandable */); verify(mMetricsLogger).write(argThat(new TileLogMatcher(ACTION_QS_LONG_PRESS))); assertEquals(1, mUiEventLoggerFake.numLogs()); UiEventLoggerFake.FakeUiEvent event = mUiEventLoggerFake.get(0); @@ -274,7 +274,7 @@ public class QSTileImplTest extends SysuiTestCase { public void testLongClick_log() { when(mStatusBarStateController.getState()).thenReturn(StatusBarState.SHADE); - mTile.longClick(null /* view */); + mTile.longClick(null /* expandable */); verify(mQsLogger).logTileLongClick(eq(SPEC), eq(StatusBarState.SHADE), eq(Tile.STATE_ACTIVE), anyInt()); } @@ -299,7 +299,7 @@ public class QSTileImplTest extends SysuiTestCase { @Test public void testLongClick_Metrics_Status_Bar_Status() { when(mStatusBarStateController.getState()).thenReturn(StatusBarState.SHADE_LOCKED); - mTile.click(null /* view */); + mTile.click(null /* expandable */); verify(mMetricsLogger).write(mLogCaptor.capture()); assertEquals(StatusBarState.SHADE_LOCKED, mLogCaptor.getValue() .getTaggedData(FIELD_STATUS_BAR_STATE)); @@ -560,12 +560,12 @@ public class QSTileImplTest extends SysuiTestCase { } @Override - protected void handleClick(@Nullable View view) { + protected void handleClick(@Nullable Expandable expandable) { mClicked = true; } @Override - protected void handleLongClick(@Nullable View view) { + protected void handleLongClick(@Nullable Expandable expandable) { mLongClicked = true; } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/BatterySaverTileTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/BatterySaverTileTest.kt index 605dc1402fc3..2c49e925edd6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/BatterySaverTileTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/BatterySaverTileTest.kt @@ -21,11 +21,10 @@ import android.os.Handler import android.testing.AndroidTestingRunner import android.testing.TestableLooper import android.testing.TestableLooper.RunWithLooper -import android.view.View import androidx.test.filters.SmallTest import com.android.internal.logging.MetricsLogger -import com.android.systemui.res.R import com.android.systemui.SysuiTestCase +import com.android.systemui.animation.Expandable import com.android.systemui.classifier.FalsingManagerFake import com.android.systemui.plugins.ActivityStarter import com.android.systemui.plugins.qs.QSTile @@ -34,6 +33,7 @@ import com.android.systemui.qs.QSHost import com.android.systemui.qs.QsEventLogger import com.android.systemui.qs.logging.QSLogger import com.android.systemui.qs.tileimpl.QSTileImpl +import com.android.systemui.res.R import com.android.systemui.statusbar.policy.BatteryController import com.android.systemui.util.settings.FakeSettings import com.android.systemui.util.settings.SecureSettings @@ -59,24 +59,15 @@ class BatterySaverTileTest : SysuiTestCase() { private const val USER = 10 } - @Mock - private lateinit var userContext: Context - @Mock - private lateinit var qsHost: QSHost - @Mock - private lateinit var uiEventLogger: QsEventLogger - @Mock - private lateinit var metricsLogger: MetricsLogger - @Mock - private lateinit var statusBarStateController: StatusBarStateController - @Mock - private lateinit var activityStarter: ActivityStarter - @Mock - private lateinit var qsLogger: QSLogger - @Mock - private lateinit var batteryController: BatteryController - @Mock - private lateinit var view: View + @Mock private lateinit var userContext: Context + @Mock private lateinit var qsHost: QSHost + @Mock private lateinit var uiEventLogger: QsEventLogger + @Mock private lateinit var metricsLogger: MetricsLogger + @Mock private lateinit var statusBarStateController: StatusBarStateController + @Mock private lateinit var activityStarter: ActivityStarter + @Mock private lateinit var qsLogger: QSLogger + @Mock private lateinit var batteryController: BatteryController + @Mock private lateinit var expandable: Expandable private lateinit var secureSettings: SecureSettings private lateinit var testableLooper: TestableLooper private lateinit var tile: BatterySaverTile @@ -91,7 +82,8 @@ class BatterySaverTileTest : SysuiTestCase() { secureSettings = FakeSettings() - tile = BatterySaverTile( + tile = + BatterySaverTile( qsHost, uiEventLogger, testableLooper.looper, @@ -102,7 +94,8 @@ class BatterySaverTileTest : SysuiTestCase() { activityStarter, qsLogger, batteryController, - secureSettings) + secureSettings + ) tile.initialize() testableLooper.processAllMessages() @@ -131,23 +124,23 @@ class BatterySaverTileTest : SysuiTestCase() { @Test fun testClickingPowerSavePassesView() { tile.onPowerSaveChanged(true) - tile.handleClick(view) + tile.handleClick(expandable) tile.onPowerSaveChanged(false) - tile.handleClick(view) + tile.handleClick(expandable) - verify(batteryController).setPowerSaveMode(true, view) - verify(batteryController).setPowerSaveMode(false, view) + verify(batteryController).setPowerSaveMode(true, expandable) + verify(batteryController).setPowerSaveMode(false, expandable) } @Test fun testStopListeningClearsViewInController() { clearInvocations(batteryController) tile.handleSetListening(true) - verify(batteryController, never()).clearLastPowerSaverStartView() + verify(batteryController, never()).clearLastPowerSaverStartExpandable() tile.handleSetListening(false) - verify(batteryController).clearLastPowerSaverStartView() + verify(batteryController).clearLastPowerSaverStartExpandable() } @Test @@ -158,7 +151,7 @@ class BatterySaverTileTest : SysuiTestCase() { tile.handleUpdateState(state, /* arg= */ null) assertThat(state.icon) - .isEqualTo(QSTileImpl.ResourceIcon.get(R.drawable.qs_battery_saver_icon_off)) + .isEqualTo(QSTileImpl.ResourceIcon.get(R.drawable.qs_battery_saver_icon_off)) } @Test @@ -169,6 +162,6 @@ class BatterySaverTileTest : SysuiTestCase() { tile.handleUpdateState(state, /* arg= */ null) assertThat(state.icon) - .isEqualTo(QSTileImpl.ResourceIcon.get(R.drawable.qs_battery_saver_icon_on)) + .isEqualTo(QSTileImpl.ResourceIcon.get(R.drawable.qs_battery_saver_icon_on)) } -}
\ No newline at end of file +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DndTileTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DndTileTest.kt index cca1344424ac..1173fa31fbb4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DndTileTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DndTileTest.kt @@ -26,12 +26,12 @@ import android.provider.Settings.Global.ZEN_MODE_OFF import android.testing.AndroidTestingRunner import android.testing.TestableLooper import android.view.ContextThemeWrapper -import android.view.View import androidx.test.filters.SmallTest import com.android.internal.logging.MetricsLogger import com.android.systemui.res.R import com.android.systemui.SysuiTestCase import com.android.systemui.animation.DialogTransitionAnimator +import com.android.systemui.animation.Expandable import com.android.systemui.classifier.FalsingManagerFake import com.android.systemui.plugins.ActivityStarter import com.android.systemui.plugins.qs.QSTile @@ -42,7 +42,6 @@ import com.android.systemui.qs.logging.QSLogger import com.android.systemui.qs.tileimpl.QSTileImpl import com.android.systemui.statusbar.policy.ZenModeController import com.android.systemui.util.mockito.any -import com.android.systemui.util.mockito.eq import com.android.systemui.util.mockito.nullable import com.android.systemui.util.settings.FakeSettings import com.android.systemui.util.settings.SecureSettings @@ -99,6 +98,12 @@ class DndTileTest : SysuiTestCase() { @Mock private lateinit var hostDialog: Dialog + @Mock + private lateinit var expandable: Expandable + + @Mock + private lateinit var controller: DialogTransitionAnimator.Controller + private lateinit var secureSettings: SecureSettings private lateinit var testableLooper: TestableLooper private lateinit var tile: DndTile @@ -119,6 +124,7 @@ class DndTileTest : SysuiTestCase() { } } whenever(qsHost.context).thenReturn(wrappedContext) + whenever(expandable.dialogTransitionController(any())).thenReturn(controller) tile = DndTile( qsHost, @@ -187,11 +193,10 @@ class DndTileTest : SysuiTestCase() { secureSettings.putIntForUser(KEY, Settings.Secure.ZEN_DURATION_PROMPT, DEFAULT_USER) testableLooper.processAllMessages() - val view = View(context) - tile.handleClick(view) + tile.handleClick(expandable) testableLooper.processAllMessages() - verify(mDialogTransitionAnimator).showFromView(any(), eq(view), nullable(), anyBoolean()) + verify(mDialogTransitionAnimator).show(any(), any(), anyBoolean()) } @Test @@ -201,8 +206,7 @@ class DndTileTest : SysuiTestCase() { secureSettings.putIntForUser(KEY, 60, DEFAULT_USER) testableLooper.processAllMessages() - val view = View(context) - tile.handleClick(view) + tile.handleClick(expandable) testableLooper.processAllMessages() verify(mDialogTransitionAnimator, never()) diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/FontScalingTileTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/FontScalingTileTest.kt index 1f5ebfec1a56..1c42dd15ce3b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/FontScalingTileTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/FontScalingTileTest.kt @@ -20,12 +20,12 @@ import android.os.Handler import android.provider.Settings import android.testing.AndroidTestingRunner import android.testing.TestableLooper -import android.view.View import androidx.test.filters.SmallTest import com.android.internal.logging.MetricsLogger import com.android.systemui.SysuiTestCase import com.android.systemui.accessibility.fontscaling.FontScalingDialogDelegate import com.android.systemui.animation.DialogTransitionAnimator +import com.android.systemui.animation.Expandable import com.android.systemui.classifier.FalsingManagerFake import com.android.systemui.plugins.ActivityStarter import com.android.systemui.plugins.statusbar.StatusBarStateController @@ -37,7 +37,6 @@ import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.util.concurrency.FakeExecutor import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.eq -import com.android.systemui.util.mockito.nullable import com.android.systemui.util.time.FakeSystemClock import com.google.common.truth.Truth.assertThat import org.junit.After @@ -67,6 +66,8 @@ class FontScalingTileTest : SysuiTestCase() { @Mock private lateinit var keyguardStateController: KeyguardStateController @Mock private lateinit var fontScalingDialogDelegate: FontScalingDialogDelegate @Mock private lateinit var dialog: SystemUIDialog + @Mock private lateinit var expandable: Expandable + @Mock private lateinit var controller: DialogTransitionAnimator.Controller private lateinit var testableLooper: TestableLooper private lateinit var systemClock: FakeSystemClock @@ -81,6 +82,7 @@ class FontScalingTileTest : SysuiTestCase() { testableLooper = TestableLooper.get(this) `when`(qsHost.getContext()).thenReturn(mContext) `when`(fontScalingDialogDelegate.createDialog()).thenReturn(dialog) + `when`(expandable.dialogTransitionController(any())).thenReturn(controller) systemClock = FakeSystemClock() backgroundDelayableExecutor = FakeExecutor(systemClock) @@ -119,8 +121,7 @@ class FontScalingTileTest : SysuiTestCase() { @Test fun clickTile_screenUnlocked_showDialogAnimationFromView() { `when`(keyguardStateController.isShowing).thenReturn(false) - val view = View(context) - fontScalingTile.click(view) + fontScalingTile.click(expandable) testableLooper.processAllMessages() verify(activityStarter) @@ -132,14 +133,13 @@ class FontScalingTileTest : SysuiTestCase() { eq(false) ) argumentCaptor.value.run() - verify(mDialogTransitionAnimator).showFromView(any(), eq(view), nullable(), anyBoolean()) + verify(mDialogTransitionAnimator).show(any(), any(), anyBoolean()) } @Test fun clickTile_onLockScreen_neverShowDialogAnimationFromView() { `when`(keyguardStateController.isShowing).thenReturn(true) - val view = View(context) - fontScalingTile.click(view) + fontScalingTile.click(expandable) testableLooper.processAllMessages() verify(activityStarter) @@ -151,8 +151,7 @@ class FontScalingTileTest : SysuiTestCase() { eq(false) ) argumentCaptor.value.run() - verify(mDialogTransitionAnimator, never()) - .showFromView(any(), eq(view), nullable(), anyBoolean()) + verify(mDialogTransitionAnimator, never()).show(any(), any(), anyBoolean()) } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/HearingDevicesTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/HearingDevicesTileTest.java index 73aa54cef66a..56671bf357ba 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/HearingDevicesTileTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/HearingDevicesTileTest.java @@ -38,6 +38,7 @@ import com.android.internal.logging.MetricsLogger; import com.android.systemui.Flags; import com.android.systemui.SysuiTestCase; import com.android.systemui.accessibility.hearingaid.HearingDevicesDialogManager; +import com.android.systemui.animation.Expandable; import com.android.systemui.classifier.FalsingManagerFake; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.statusbar.StatusBarStateController; @@ -135,10 +136,10 @@ public class HearingDevicesTileTest extends SysuiTestCase { @Test public void handleClick_dialogShown() { - View view = new View(mContext); - mTile.handleClick(view); + Expandable expandable = Expandable.fromView(new View(mContext)); + mTile.handleClick(expandable); mTestableLooper.processAllMessages(); - verify(mHearingDevicesDialogManager).showDialog(view); + verify(mHearingDevicesDialogManager).showDialog(expandable); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerTest.java index 9d4f1fc04594..ed8843b1d9f4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryControllerTest.java @@ -38,13 +38,13 @@ import android.os.PowerManager; import android.os.PowerSaveState; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; -import android.view.View; import androidx.test.filters.SmallTest; import com.android.dx.mockito.inline.extended.StaticInOrder; import com.android.settingslib.fuelgauge.BatterySaverUtils; import com.android.systemui.SysuiTestCase; +import com.android.systemui.animation.Expandable; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.demomode.DemoModeController; import com.android.systemui.dump.DumpManager; @@ -72,7 +72,7 @@ public class BatteryControllerTest extends SysuiTestCase { @Mock private PowerManager mPowerManager; @Mock private BroadcastDispatcher mBroadcastDispatcher; @Mock private DemoModeController mDemoModeController; - @Mock private View mView; + @Mock private Expandable mExpandable; @Mock private UsbPort mUsbPort; @Mock private UsbManager mUsbManager; @Mock private UsbPortStatus mUsbPortStatus; @@ -175,8 +175,8 @@ public class BatteryControllerTest extends SysuiTestCase { @Test public void testBatteryUtilsCalledOnSetPowerSaveMode() { - mBatteryController.setPowerSaveMode(true, mView); - mBatteryController.setPowerSaveMode(false, mView); + mBatteryController.setPowerSaveMode(true, mExpandable); + mBatteryController.setPowerSaveMode(false, mExpandable); StaticInOrder inOrder = inOrder(staticMockMarker(BatterySaverUtils.class)); inOrder.verify(() -> BatterySaverUtils.setPowerSaveMode(getContext(), true, true, @@ -187,21 +187,21 @@ public class BatteryControllerTest extends SysuiTestCase { @Test public void testSaveViewReferenceWhenSettingPowerSaveMode() { - mBatteryController.setPowerSaveMode(false, mView); + mBatteryController.setPowerSaveMode(false, mExpandable); - Assert.assertNull(mBatteryController.getLastPowerSaverStartView()); + Assert.assertNull(mBatteryController.getLastPowerSaverStartExpandable()); - mBatteryController.setPowerSaveMode(true, mView); + mBatteryController.setPowerSaveMode(true, mExpandable); - Assert.assertSame(mView, mBatteryController.getLastPowerSaverStartView().get()); + Assert.assertSame(mExpandable, mBatteryController.getLastPowerSaverStartExpandable().get()); } @Test public void testClearViewReference() { - mBatteryController.setPowerSaveMode(true, mView); - mBatteryController.clearLastPowerSaverStartView(); + mBatteryController.setPowerSaveMode(true, mExpandable); + mBatteryController.clearLastPowerSaverStartExpandable(); - Assert.assertNull(mBatteryController.getLastPowerSaverStartView()); + Assert.assertNull(mBatteryController.getLastPowerSaverStartExpandable()); } @Test diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/tiles/base/actions/FakeQSTileIntentUserInputHandler.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/tiles/base/actions/FakeQSTileIntentUserInputHandler.kt index 0307c414351f..c4bf8ff12817 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/tiles/base/actions/FakeQSTileIntentUserInputHandler.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/tiles/base/actions/FakeQSTileIntentUserInputHandler.kt @@ -18,7 +18,7 @@ package com.android.systemui.qs.tiles.base.actions import android.app.PendingIntent import android.content.Intent -import android.view.View +import com.android.systemui.animation.Expandable /** * Fake implementation of [QSTileIntentUserInputHandler] interface. Consider using this alongside @@ -31,22 +31,24 @@ class FakeQSTileIntentUserInputHandler : QSTileIntentUserInputHandler { private val mutableInputs = mutableListOf<Input>() - override fun handle(view: View?, intent: Intent) { - mutableInputs.add(Input.Intent(view, intent)) + override fun handle(expandable: Expandable?, intent: Intent) { + mutableInputs.add(Input.Intent(expandable, intent)) } override fun handle( - view: View?, + expandable: Expandable?, pendingIntent: PendingIntent, requestLaunchingDefaultActivity: Boolean ) { - mutableInputs.add(Input.PendingIntent(view, pendingIntent, requestLaunchingDefaultActivity)) + mutableInputs.add( + Input.PendingIntent(expandable, pendingIntent, requestLaunchingDefaultActivity) + ) } sealed interface Input { - data class Intent(val view: View?, val intent: android.content.Intent) : Input + data class Intent(val expandable: Expandable?, val intent: android.content.Intent) : Input data class PendingIntent( - val view: View?, + val expandable: Expandable?, val pendingIntent: android.app.PendingIntent, val requestLaunchingDefaultActivity: Boolean ) : Input diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/tiles/base/interactor/QSTileInputTestKtx.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/tiles/base/interactor/QSTileInputTestKtx.kt index 832b07a0763b..9cb76bb412f9 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/tiles/base/interactor/QSTileInputTestKtx.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/tiles/base/interactor/QSTileInputTestKtx.kt @@ -17,7 +17,7 @@ package com.android.systemui.qs.tiles.base.interactor import android.os.UserHandle -import android.view.View +import com.android.systemui.animation.Expandable import com.android.systemui.qs.tiles.viewmodel.QSTileUserAction object QSTileInputTestKtx { @@ -25,12 +25,12 @@ object QSTileInputTestKtx { fun <T> click( data: T, user: UserHandle = UserHandle.CURRENT, - view: View? = null, - ): QSTileInput<T> = QSTileInput(user, QSTileUserAction.Click(view), data) + expandable: Expandable? = null, + ): QSTileInput<T> = QSTileInput(user, QSTileUserAction.Click(expandable), data) fun <T> longClick( data: T, user: UserHandle = UserHandle.CURRENT, - view: View? = null, - ): QSTileInput<T> = QSTileInput(user, QSTileUserAction.LongClick(view), data) + expandable: Expandable? = null, + ): QSTileInput<T> = QSTileInput(user, QSTileUserAction.LongClick(expandable), data) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/utils/leaks/FakeBatteryController.java b/packages/SystemUI/tests/utils/src/com/android/systemui/utils/leaks/FakeBatteryController.java index d798b3b13341..0364e0595999 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/utils/leaks/FakeBatteryController.java +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/utils/leaks/FakeBatteryController.java @@ -16,8 +16,8 @@ package com.android.systemui.utils.leaks; import android.os.Bundle; import android.testing.LeakCheck; -import android.view.View; +import com.android.systemui.animation.Expandable; import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback; @@ -61,7 +61,7 @@ public class FakeBatteryController extends BaseLeakChecker<BatteryStateChangeCal * Note: this method ignores the View argument */ @Override - public void setPowerSaveMode(boolean powerSave, View view) { + public void setPowerSaveMode(boolean powerSave, Expandable expandable) { setPowerSaveMode(powerSave); } |