Jank-Instrument all dialogs opened from the shade
Bug: 232908404 Test: Took traces of interactions Change-Id: I087d3b2b2718ceaf994e3b0615e2aaa384f6796a
This commit is contained in:
@@ -99,6 +99,7 @@ import com.android.internal.R;
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
import com.android.internal.colorextraction.ColorExtractor;
|
||||
import com.android.internal.colorextraction.ColorExtractor.GradientColors;
|
||||
import com.android.internal.jank.InteractionJankMonitor;
|
||||
import com.android.internal.logging.MetricsLogger;
|
||||
import com.android.internal.logging.UiEvent;
|
||||
import com.android.internal.logging.UiEventLogger;
|
||||
@@ -110,6 +111,7 @@ import com.android.internal.widget.LockPatternUtils;
|
||||
import com.android.keyguard.KeyguardUpdateMonitor;
|
||||
import com.android.systemui.MultiListLayout;
|
||||
import com.android.systemui.MultiListLayout.MultiListAdapter;
|
||||
import com.android.systemui.animation.DialogCuj;
|
||||
import com.android.systemui.animation.DialogLaunchAnimator;
|
||||
import com.android.systemui.animation.Interpolators;
|
||||
import com.android.systemui.broadcast.BroadcastDispatcher;
|
||||
@@ -154,6 +156,8 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
|
||||
|
||||
private static final String TAG = "GlobalActionsDialogLite";
|
||||
|
||||
private static final String INTERACTION_JANK_TAG = "global_actions";
|
||||
|
||||
private static final boolean SHOW_SILENT_TOGGLE = true;
|
||||
|
||||
/* Valid settings for global actions keys.
|
||||
@@ -499,7 +503,9 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
|
||||
mDialog.getWindow().addFlags(FLAG_ALT_FOCUSABLE_IM);
|
||||
|
||||
if (view != null) {
|
||||
mDialogLaunchAnimator.showFromView(mDialog, view);
|
||||
mDialogLaunchAnimator.showFromView(mDialog, view,
|
||||
new DialogCuj(InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN,
|
||||
INTERACTION_JANK_TAG));
|
||||
} else {
|
||||
mDialog.show();
|
||||
}
|
||||
|
||||
@@ -20,8 +20,10 @@ import android.content.Context
|
||||
import android.media.AudioManager
|
||||
import android.media.session.MediaSessionManager
|
||||
import android.view.View
|
||||
import com.android.internal.jank.InteractionJankMonitor
|
||||
import com.android.internal.logging.UiEventLogger
|
||||
import com.android.settingslib.bluetooth.LocalBluetoothManager
|
||||
import com.android.systemui.animation.DialogCuj
|
||||
import com.android.systemui.animation.DialogLaunchAnimator
|
||||
import com.android.systemui.broadcast.BroadcastSender
|
||||
import com.android.systemui.media.nearby.NearbyMediaDevicesManager
|
||||
@@ -46,6 +48,7 @@ class MediaOutputDialogFactory @Inject constructor(
|
||||
private val audioManager: AudioManager
|
||||
) {
|
||||
companion object {
|
||||
private const val INTERACTION_JANK_TAG = "media_output"
|
||||
var mediaOutputDialog: MediaOutputDialog? = null
|
||||
}
|
||||
|
||||
@@ -54,16 +57,24 @@ class MediaOutputDialogFactory @Inject constructor(
|
||||
// Dismiss the previous dialog, if any.
|
||||
mediaOutputDialog?.dismiss()
|
||||
|
||||
val controller = MediaOutputController(context, packageName,
|
||||
mediaSessionManager, lbm, starter, notifCollection,
|
||||
dialogLaunchAnimator, nearbyMediaDevicesManagerOptional, audioManager)
|
||||
val controller = MediaOutputController(
|
||||
context, packageName,
|
||||
mediaSessionManager, lbm, starter, notifCollection,
|
||||
dialogLaunchAnimator, nearbyMediaDevicesManagerOptional, audioManager
|
||||
)
|
||||
val dialog =
|
||||
MediaOutputDialog(context, aboveStatusBar, broadcastSender, controller, uiEventLogger)
|
||||
mediaOutputDialog = dialog
|
||||
|
||||
// Show the dialog.
|
||||
if (view != null) {
|
||||
dialogLaunchAnimator.showFromView(dialog, view)
|
||||
dialogLaunchAnimator.showFromView(
|
||||
dialog, view,
|
||||
cuj = DialogCuj(
|
||||
InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN,
|
||||
INTERACTION_JANK_TAG
|
||||
)
|
||||
)
|
||||
} else {
|
||||
dialog.show()
|
||||
}
|
||||
|
||||
@@ -55,6 +55,7 @@ import android.view.WindowManager;
|
||||
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
|
||||
import com.android.internal.jank.InteractionJankMonitor;
|
||||
import com.android.internal.logging.UiEventLogger;
|
||||
import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
|
||||
import com.android.settingslib.Utils;
|
||||
@@ -62,6 +63,7 @@ import com.android.settingslib.fuelgauge.BatterySaverUtils;
|
||||
import com.android.settingslib.utils.PowerUtil;
|
||||
import com.android.systemui.R;
|
||||
import com.android.systemui.SystemUIApplication;
|
||||
import com.android.systemui.animation.DialogCuj;
|
||||
import com.android.systemui.animation.DialogLaunchAnimator;
|
||||
import com.android.systemui.broadcast.BroadcastSender;
|
||||
import com.android.systemui.dagger.SysUISingleton;
|
||||
@@ -93,6 +95,8 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI {
|
||||
private static final String TAG_TEMPERATURE = "high_temp";
|
||||
private static final String TAG_AUTO_SAVER = "auto_saver";
|
||||
|
||||
private static final String INTERACTION_JANK_TAG = "start_power_saver";
|
||||
|
||||
private static final int SHOWING_NOTHING = 0;
|
||||
private static final int SHOWING_WARNING = 1;
|
||||
private static final int SHOWING_INVALID_CHARGER = 3;
|
||||
@@ -707,7 +711,9 @@ public class PowerNotificationWarnings implements PowerUI.WarningsUI {
|
||||
});
|
||||
WeakReference<View> ref = mBatteryControllerLazy.get().getLastPowerSaverStartView();
|
||||
if (ref != null && ref.get() != null && ref.get().isAggregatedVisible()) {
|
||||
mDialogLaunchAnimator.showFromView(d, ref.get());
|
||||
mDialogLaunchAnimator.showFromView(d, ref.get(),
|
||||
new DialogCuj(InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN,
|
||||
INTERACTION_JANK_TAG));
|
||||
} else {
|
||||
d.show();
|
||||
}
|
||||
|
||||
@@ -45,8 +45,10 @@ import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.android.internal.config.sysui.SystemUiDeviceConfigFlags.TASK_MANAGER_ENABLED
|
||||
import com.android.internal.config.sysui.SystemUiDeviceConfigFlags.TASK_MANAGER_SHOW_FOOTER_DOT
|
||||
import com.android.internal.jank.InteractionJankMonitor
|
||||
import com.android.systemui.Dumpable
|
||||
import com.android.systemui.R
|
||||
import com.android.systemui.animation.DialogCuj
|
||||
import com.android.systemui.animation.DialogLaunchAnimator
|
||||
import com.android.systemui.broadcast.BroadcastDispatcher
|
||||
import com.android.systemui.dagger.SysUISingleton
|
||||
@@ -81,6 +83,7 @@ class FgsManagerController @Inject constructor(
|
||||
) : IForegroundServiceObserver.Stub(), Dumpable {
|
||||
|
||||
companion object {
|
||||
private const val INTERACTION_JANK_TAG = "active_background_apps"
|
||||
private val LOG_TAG = FgsManagerController::class.java.simpleName
|
||||
private const val DEFAULT_TASK_MANAGER_ENABLED = true
|
||||
private const val DEFAULT_TASK_MANAGER_SHOW_FOOTER_DOT = false
|
||||
@@ -311,7 +314,15 @@ class FgsManagerController @Inject constructor(
|
||||
|
||||
mainExecutor.execute {
|
||||
viewLaunchedFrom
|
||||
?.let { dialogLaunchAnimator.showFromView(dialog, it) } ?: dialog.show()
|
||||
?.let {
|
||||
dialogLaunchAnimator.showFromView(
|
||||
dialog, it,
|
||||
cuj = DialogCuj(
|
||||
InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN,
|
||||
INTERACTION_JANK_TAG
|
||||
)
|
||||
)
|
||||
} ?: dialog.show()
|
||||
}
|
||||
|
||||
backgroundExecutor.execute {
|
||||
|
||||
@@ -80,9 +80,11 @@ import android.widget.TextView;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
|
||||
import com.android.internal.jank.InteractionJankMonitor;
|
||||
import com.android.internal.util.FrameworkStatsLog;
|
||||
import com.android.systemui.FontSizeUtils;
|
||||
import com.android.systemui.R;
|
||||
import com.android.systemui.animation.DialogCuj;
|
||||
import com.android.systemui.animation.DialogLaunchAnimator;
|
||||
import com.android.systemui.broadcast.BroadcastDispatcher;
|
||||
import com.android.systemui.dagger.qualifiers.Background;
|
||||
@@ -108,6 +110,8 @@ class QSSecurityFooter extends ViewController<View>
|
||||
protected static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
|
||||
private static final boolean DEBUG_FORCE_VISIBLE = false;
|
||||
|
||||
private static final String INTERACTION_JANK_TAG = "managed_device_info";
|
||||
|
||||
private final TextView mFooterText;
|
||||
private final ImageView mPrimaryFooterIcon;
|
||||
private Context mContext;
|
||||
@@ -557,7 +561,8 @@ class QSSecurityFooter extends ViewController<View>
|
||||
|
||||
mDialog.setView(view);
|
||||
if (mView.isAggregatedVisible()) {
|
||||
mDialogLaunchAnimator.showFromView(mDialog, mView);
|
||||
mDialogLaunchAnimator.showFromView(mDialog, mView, new DialogCuj(
|
||||
InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN, INTERACTION_JANK_TAG));
|
||||
} else {
|
||||
mDialog.show();
|
||||
}
|
||||
|
||||
@@ -33,10 +33,12 @@ import android.widget.Button;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.android.internal.app.MediaRouteDialogPresenter;
|
||||
import com.android.internal.jank.InteractionJankMonitor;
|
||||
import com.android.internal.logging.MetricsLogger;
|
||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||
import com.android.systemui.R;
|
||||
import com.android.systemui.animation.ActivityLaunchAnimator;
|
||||
import com.android.systemui.animation.DialogCuj;
|
||||
import com.android.systemui.animation.DialogLaunchAnimator;
|
||||
import com.android.systemui.dagger.qualifiers.Background;
|
||||
import com.android.systemui.dagger.qualifiers.Main;
|
||||
@@ -63,6 +65,9 @@ import javax.inject.Inject;
|
||||
|
||||
/** Quick settings tile: Cast **/
|
||||
public class CastTile extends QSTileImpl<BooleanState> {
|
||||
|
||||
private static final String INTERACTION_JANK_TAG = "cast";
|
||||
|
||||
private static final Intent CAST_SETTINGS =
|
||||
new Intent(Settings.ACTION_CAST_SETTINGS);
|
||||
|
||||
@@ -211,7 +216,9 @@ public class CastTile extends QSTileImpl<BooleanState> {
|
||||
|
||||
mUiHandler.post(() -> {
|
||||
if (view != null) {
|
||||
mDialogLaunchAnimator.showFromView(dialog, view);
|
||||
mDialogLaunchAnimator.showFromView(dialog, view,
|
||||
new DialogCuj(InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN,
|
||||
INTERACTION_JANK_TAG));
|
||||
} else {
|
||||
dialog.show();
|
||||
}
|
||||
|
||||
@@ -24,10 +24,12 @@ import android.widget.Switch;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.android.internal.jank.InteractionJankMonitor;
|
||||
import com.android.internal.logging.MetricsLogger;
|
||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||
import com.android.systemui.Prefs;
|
||||
import com.android.systemui.R;
|
||||
import com.android.systemui.animation.DialogCuj;
|
||||
import com.android.systemui.animation.DialogLaunchAnimator;
|
||||
import com.android.systemui.dagger.qualifiers.Background;
|
||||
import com.android.systemui.dagger.qualifiers.Main;
|
||||
@@ -46,6 +48,8 @@ import javax.inject.Inject;
|
||||
public class DataSaverTile extends QSTileImpl<BooleanState> implements
|
||||
DataSaverController.Listener{
|
||||
|
||||
private static final String INTERACTION_JANK_TAG = "start_data_saver";
|
||||
|
||||
private final DataSaverController mDataSaverController;
|
||||
private final DialogLaunchAnimator mDialogLaunchAnimator;
|
||||
|
||||
@@ -102,7 +106,9 @@ public class DataSaverTile extends QSTileImpl<BooleanState> implements
|
||||
dialog.setShowForAllUsers(true);
|
||||
|
||||
if (view != null) {
|
||||
mDialogLaunchAnimator.showFromView(dialog, view);
|
||||
mDialogLaunchAnimator.showFromView(dialog, view, new DialogCuj(
|
||||
InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN,
|
||||
INTERACTION_JANK_TAG));
|
||||
} else {
|
||||
dialog.show();
|
||||
}
|
||||
|
||||
@@ -39,11 +39,13 @@ import android.widget.Switch;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.android.internal.jank.InteractionJankMonitor;
|
||||
import com.android.internal.logging.MetricsLogger;
|
||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||
import com.android.settingslib.notification.EnableZenModeDialog;
|
||||
import com.android.systemui.Prefs;
|
||||
import com.android.systemui.R;
|
||||
import com.android.systemui.animation.DialogCuj;
|
||||
import com.android.systemui.animation.DialogLaunchAnimator;
|
||||
import com.android.systemui.dagger.qualifiers.Background;
|
||||
import com.android.systemui.dagger.qualifiers.Main;
|
||||
@@ -71,6 +73,8 @@ public class DndTile extends QSTileImpl<BooleanState> {
|
||||
private static final Intent ZEN_PRIORITY_SETTINGS =
|
||||
new Intent(Settings.ACTION_ZEN_MODE_PRIORITY_SETTINGS);
|
||||
|
||||
private static final String INTERACTION_JANK_TAG = "start_zen_mode";
|
||||
|
||||
private final ZenModeController mController;
|
||||
private final SharedPreferences mSharedPreferences;
|
||||
private final SettingObserver mSettingZenDuration;
|
||||
@@ -175,8 +179,9 @@ public class DndTile extends QSTileImpl<BooleanState> {
|
||||
mUiHandler.post(() -> {
|
||||
Dialog dialog = makeZenModeDialog();
|
||||
if (view != null) {
|
||||
mDialogLaunchAnimator.showFromView(dialog, view,
|
||||
/* cuj= */ null,
|
||||
mDialogLaunchAnimator.showFromView(dialog, view, new DialogCuj(
|
||||
InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN,
|
||||
INTERACTION_JANK_TAG),
|
||||
/* animateBackgroundBoundsChange= */ false);
|
||||
} else {
|
||||
dialog.show();
|
||||
|
||||
@@ -27,8 +27,10 @@ import android.widget.Switch;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.android.internal.jank.InteractionJankMonitor;
|
||||
import com.android.internal.logging.MetricsLogger;
|
||||
import com.android.systemui.R;
|
||||
import com.android.systemui.animation.DialogCuj;
|
||||
import com.android.systemui.animation.DialogLaunchAnimator;
|
||||
import com.android.systemui.dagger.qualifiers.Background;
|
||||
import com.android.systemui.dagger.qualifiers.Main;
|
||||
@@ -52,6 +54,8 @@ import javax.inject.Inject;
|
||||
public class ScreenRecordTile extends QSTileImpl<QSTile.BooleanState>
|
||||
implements RecordingController.RecordingStateChangeCallback {
|
||||
private static final String TAG = "ScreenRecordTile";
|
||||
private static final String INTERACTION_JANK_TAG = "screen_record";
|
||||
|
||||
private final RecordingController mController;
|
||||
private final KeyguardDismissUtil mKeyguardDismissUtil;
|
||||
private final KeyguardStateController mKeyguardStateController;
|
||||
@@ -165,7 +169,8 @@ public class ScreenRecordTile extends QSTileImpl<QSTile.BooleanState>
|
||||
|
||||
ActivityStarter.OnDismissAction dismissAction = () -> {
|
||||
if (shouldAnimateFromView) {
|
||||
mDialogLaunchAnimator.showFromView(dialog, view);
|
||||
mDialogLaunchAnimator.showFromView(dialog, view, new DialogCuj(
|
||||
InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN, INTERACTION_JANK_TAG));
|
||||
} else {
|
||||
dialog.show();
|
||||
}
|
||||
|
||||
@@ -25,8 +25,10 @@ import android.provider.Settings
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import androidx.annotation.VisibleForTesting
|
||||
import com.android.internal.jank.InteractionJankMonitor
|
||||
import com.android.internal.logging.UiEventLogger
|
||||
import com.android.systemui.R
|
||||
import com.android.systemui.animation.DialogCuj
|
||||
import com.android.systemui.animation.DialogLaunchAnimator
|
||||
import com.android.systemui.dagger.SysUISingleton
|
||||
import com.android.systemui.plugins.ActivityStarter
|
||||
@@ -67,6 +69,7 @@ class UserSwitchDialogController @VisibleForTesting constructor(
|
||||
)
|
||||
|
||||
companion object {
|
||||
private const val INTERACTION_JANK_TAG = "switch_user"
|
||||
private val USER_SETTINGS_INTENT = Intent(Settings.ACTION_USER_SETTINGS)
|
||||
}
|
||||
|
||||
@@ -89,14 +92,16 @@ class UserSwitchDialogController @VisibleForTesting constructor(
|
||||
if (!falsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) {
|
||||
uiEventLogger.log(QSUserSwitcherEvent.QS_USER_MORE_SETTINGS)
|
||||
val controller = dialogLaunchAnimator.createActivityLaunchController(
|
||||
getButton(BUTTON_NEUTRAL))
|
||||
getButton(BUTTON_NEUTRAL)
|
||||
)
|
||||
|
||||
if (controller == null) {
|
||||
dismiss()
|
||||
}
|
||||
|
||||
activityStarter.postStartActivityDismissingKeyguard(
|
||||
USER_SETTINGS_INTENT, 0, controller)
|
||||
USER_SETTINGS_INTENT, 0, controller
|
||||
)
|
||||
}
|
||||
}, false /* dismissOnClick */)
|
||||
val gridFrame = LayoutInflater.from(this.context)
|
||||
@@ -107,7 +112,13 @@ class UserSwitchDialogController @VisibleForTesting constructor(
|
||||
|
||||
adapter.linkToViewGroup(gridFrame.findViewById(R.id.grid))
|
||||
|
||||
dialogLaunchAnimator.showFromView(this, view)
|
||||
dialogLaunchAnimator.showFromView(
|
||||
this, view,
|
||||
cuj = DialogCuj(
|
||||
InteractionJankMonitor.CUJ_SHADE_DIALOG_OPEN,
|
||||
INTERACTION_JANK_TAG
|
||||
)
|
||||
)
|
||||
uiEventLogger.log(QSUserSwitcherEvent.QS_USER_DETAIL_OPEN)
|
||||
adapter.injectDialogShower(DialogShowerImpl(this, dialogLaunchAnimator))
|
||||
}
|
||||
@@ -128,4 +139,4 @@ class UserSwitchDialogController @VisibleForTesting constructor(
|
||||
interface DialogShower : DialogInterface {
|
||||
fun showDialog(dialog: Dialog)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -222,7 +222,7 @@ public class PowerNotificationWarningsTest extends SysuiTestCase {
|
||||
|
||||
mReceiver.onReceive(mContext, intent);
|
||||
|
||||
verify(mDialogLaunchAnimator).showFromView(any(), eq(mView));
|
||||
verify(mDialogLaunchAnimator).showFromView(any(), eq(mView), any());
|
||||
|
||||
mPowerNotificationWarnings.getSaverConfirmationDialog().dismiss();
|
||||
}
|
||||
|
||||
@@ -731,7 +731,7 @@ public class QSSecurityFooterTest extends SysuiTestCase {
|
||||
|
||||
mTestableLooper.processAllMessages();
|
||||
|
||||
verify(mDialogLaunchAnimator).showFromView(any(), eq(mRootView));
|
||||
verify(mDialogLaunchAnimator).showFromView(any(), eq(mRootView), any());
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -768,7 +768,7 @@ public class QSSecurityFooterTest extends SysuiTestCase {
|
||||
ArgumentCaptor<AlertDialog> dialogCaptor = ArgumentCaptor.forClass(AlertDialog.class);
|
||||
|
||||
mTestableLooper.processAllMessages();
|
||||
verify(mDialogLaunchAnimator).showFromView(dialogCaptor.capture(), any());
|
||||
verify(mDialogLaunchAnimator).showFromView(dialogCaptor.capture(), any(), any());
|
||||
|
||||
AlertDialog dialog = dialogCaptor.getValue();
|
||||
dialog.create();
|
||||
|
||||
@@ -42,6 +42,7 @@ import org.mockito.ArgumentCaptor
|
||||
import org.mockito.ArgumentMatcher
|
||||
import org.mockito.Captor
|
||||
import org.mockito.Mock
|
||||
import org.mockito.Mockito.anyBoolean
|
||||
import org.mockito.Mockito.anyInt
|
||||
import org.mockito.Mockito.argThat
|
||||
import org.mockito.Mockito.never
|
||||
@@ -94,7 +95,7 @@ class UserSwitchDialogControllerTest : SysuiTestCase() {
|
||||
@Test
|
||||
fun showDialog_callsDialogShow() {
|
||||
controller.showDialog(launchView)
|
||||
verify(dialogLaunchAnimator).showFromView(dialog, launchView)
|
||||
verify(dialogLaunchAnimator).showFromView(eq(dialog), eq(launchView), any(), anyBoolean())
|
||||
verify(uiEventLogger).log(QSUserSwitcherEvent.QS_USER_DETAIL_OPEN)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user