Merge changes from topic "unlock_jank_instrument" into sc-dev
* changes: Instrument jank and latency of the unlock animation of lockscreen Support configuration as parameter while beginning the instrumentation
This commit is contained in:
@@ -208,7 +208,6 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener
|
|||||||
*/
|
*/
|
||||||
public synchronized void begin() {
|
public synchronized void begin() {
|
||||||
mBeginVsyncId = mChoreographer.getVsyncId() + 1;
|
mBeginVsyncId = mChoreographer.getVsyncId() + 1;
|
||||||
mSession.setTimeStamp(System.nanoTime());
|
|
||||||
if (mSurfaceControl != null) {
|
if (mSurfaceControl != null) {
|
||||||
postTraceStartMarker();
|
postTraceStartMarker();
|
||||||
}
|
}
|
||||||
@@ -224,7 +223,11 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void postTraceStartMarker() {
|
/**
|
||||||
|
* Start trace section at appropriate time.
|
||||||
|
*/
|
||||||
|
@VisibleForTesting
|
||||||
|
public void postTraceStartMarker() {
|
||||||
mChoreographer.mChoreographer.postCallback(Choreographer.CALLBACK_INPUT, () -> {
|
mChoreographer.mChoreographer.postCallback(Choreographer.CALLBACK_INPUT, () -> {
|
||||||
synchronized (FrameTracker.this) {
|
synchronized (FrameTracker.this) {
|
||||||
if (mCancelled || mEndVsyncId != INVALID_ID) {
|
if (mCancelled || mEndVsyncId != INVALID_ID) {
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_IN
|
|||||||
import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LOCKSCREEN_PIN_DISAPPEAR;
|
import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LOCKSCREEN_PIN_DISAPPEAR;
|
||||||
import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LOCKSCREEN_TRANSITION_FROM_AOD;
|
import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LOCKSCREEN_TRANSITION_FROM_AOD;
|
||||||
import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LOCKSCREEN_TRANSITION_TO_AOD;
|
import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LOCKSCREEN_TRANSITION_TO_AOD;
|
||||||
|
import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LOCKSCREEN_UNLOCK_ANIMATION;
|
||||||
import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__NOTIFICATION_SHADE_SWIPE;
|
import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__NOTIFICATION_SHADE_SWIPE;
|
||||||
import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SETTINGS_PAGE_SCROLL;
|
import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SETTINGS_PAGE_SCROLL;
|
||||||
import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SHADE_APP_LAUNCH;
|
import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SHADE_APP_LAUNCH;
|
||||||
@@ -62,6 +63,7 @@ import android.os.HandlerExecutor;
|
|||||||
import android.os.HandlerThread;
|
import android.os.HandlerThread;
|
||||||
import android.os.SystemProperties;
|
import android.os.SystemProperties;
|
||||||
import android.provider.DeviceConfig;
|
import android.provider.DeviceConfig;
|
||||||
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.util.SparseArray;
|
import android.util.SparseArray;
|
||||||
import android.view.Choreographer;
|
import android.view.Choreographer;
|
||||||
@@ -91,6 +93,7 @@ import java.util.concurrent.TimeUnit;
|
|||||||
*/
|
*/
|
||||||
public class InteractionJankMonitor {
|
public class InteractionJankMonitor {
|
||||||
private static final String TAG = InteractionJankMonitor.class.getSimpleName();
|
private static final String TAG = InteractionJankMonitor.class.getSimpleName();
|
||||||
|
private static final boolean DEBUG = false;
|
||||||
private static final String ACTION_PREFIX = InteractionJankMonitor.class.getCanonicalName();
|
private static final String ACTION_PREFIX = InteractionJankMonitor.class.getCanonicalName();
|
||||||
|
|
||||||
private static final String DEFAULT_WORKER_NAME = TAG + "-Worker";
|
private static final String DEFAULT_WORKER_NAME = TAG + "-Worker";
|
||||||
@@ -148,6 +151,7 @@ public class InteractionJankMonitor {
|
|||||||
public static final int CUJ_LAUNCHER_ALL_APPS_SCROLL = 26;
|
public static final int CUJ_LAUNCHER_ALL_APPS_SCROLL = 26;
|
||||||
public static final int CUJ_LAUNCHER_APP_LAUNCH_FROM_WIDGET = 27;
|
public static final int CUJ_LAUNCHER_APP_LAUNCH_FROM_WIDGET = 27;
|
||||||
public static final int CUJ_SETTINGS_PAGE_SCROLL = 28;
|
public static final int CUJ_SETTINGS_PAGE_SCROLL = 28;
|
||||||
|
public static final int CUJ_LOCKSCREEN_UNLOCK_ANIMATION = 29;
|
||||||
|
|
||||||
private static final int NO_STATSD_LOGGING = -1;
|
private static final int NO_STATSD_LOGGING = -1;
|
||||||
|
|
||||||
@@ -185,6 +189,7 @@ public class InteractionJankMonitor {
|
|||||||
UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LAUNCHER_ALL_APPS_SCROLL,
|
UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LAUNCHER_ALL_APPS_SCROLL,
|
||||||
UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LAUNCHER_APP_LAUNCH_FROM_WIDGET,
|
UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LAUNCHER_APP_LAUNCH_FROM_WIDGET,
|
||||||
UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SETTINGS_PAGE_SCROLL,
|
UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SETTINGS_PAGE_SCROLL,
|
||||||
|
UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LOCKSCREEN_UNLOCK_ANIMATION,
|
||||||
};
|
};
|
||||||
|
|
||||||
private static volatile InteractionJankMonitor sInstance;
|
private static volatile InteractionJankMonitor sInstance;
|
||||||
@@ -233,6 +238,7 @@ public class InteractionJankMonitor {
|
|||||||
CUJ_LAUNCHER_ALL_APPS_SCROLL,
|
CUJ_LAUNCHER_ALL_APPS_SCROLL,
|
||||||
CUJ_LAUNCHER_APP_LAUNCH_FROM_WIDGET,
|
CUJ_LAUNCHER_APP_LAUNCH_FROM_WIDGET,
|
||||||
CUJ_SETTINGS_PAGE_SCROLL,
|
CUJ_SETTINGS_PAGE_SCROLL,
|
||||||
|
CUJ_LOCKSCREEN_UNLOCK_ANIMATION,
|
||||||
})
|
})
|
||||||
@Retention(RetentionPolicy.SOURCE)
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
public @interface CujType {
|
public @interface CujType {
|
||||||
@@ -289,14 +295,17 @@ public class InteractionJankMonitor {
|
|||||||
* @return instance of the FrameTracker
|
* @return instance of the FrameTracker
|
||||||
*/
|
*/
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
public FrameTracker createFrameTracker(View v, Session session) {
|
public FrameTracker createFrameTracker(Configuration conf, Session session) {
|
||||||
|
final View v = conf.mView;
|
||||||
final Context c = v.getContext().getApplicationContext();
|
final Context c = v.getContext().getApplicationContext();
|
||||||
|
final ThreadedRendererWrapper r = new ThreadedRendererWrapper(v.getThreadedRenderer());
|
||||||
|
final ViewRootWrapper vr = new ViewRootWrapper(v.getViewRootImpl());
|
||||||
|
final SurfaceControlWrapper sc = new SurfaceControlWrapper();
|
||||||
|
final ChoreographerWrapper cg = new ChoreographerWrapper(Choreographer.getInstance());
|
||||||
|
|
||||||
synchronized (this) {
|
synchronized (this) {
|
||||||
FrameTrackerListener eventsListener = (s, act) -> handleCujEvents(c, act, s);
|
FrameTrackerListener eventsListener = (s, act) -> handleCujEvents(c, act, s);
|
||||||
return new FrameTracker(session, mWorker.getThreadHandler(),
|
return new FrameTracker(session, mWorker.getThreadHandler(), r, vr, sc, cg, mMetrics,
|
||||||
new ThreadedRendererWrapper(v.getThreadedRenderer()),
|
|
||||||
new ViewRootWrapper(v.getViewRootImpl()), new SurfaceControlWrapper(),
|
|
||||||
new ChoreographerWrapper(Choreographer.getInstance()), mMetrics,
|
|
||||||
mTraceThresholdMissedFrames, mTraceThresholdFrameTimeMillis, eventsListener);
|
mTraceThresholdMissedFrames, mTraceThresholdFrameTimeMillis, eventsListener);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -348,30 +357,47 @@ public class InteractionJankMonitor {
|
|||||||
/**
|
/**
|
||||||
* Begin a trace session.
|
* Begin a trace session.
|
||||||
*
|
*
|
||||||
|
* @param v an attached view.
|
||||||
* @param cujType the specific {@link InteractionJankMonitor.CujType}.
|
* @param cujType the specific {@link InteractionJankMonitor.CujType}.
|
||||||
* @return boolean true if the tracker is started successfully, false otherwise.
|
* @return boolean true if the tracker is started successfully, false otherwise.
|
||||||
*/
|
*/
|
||||||
public boolean begin(View v, @CujType int cujType) {
|
public boolean begin(View v, @CujType int cujType) {
|
||||||
synchronized (this) {
|
try {
|
||||||
return begin(v, cujType, DEFAULT_TIMEOUT_MS);
|
return beginInternal(
|
||||||
|
new Configuration.Builder(cujType)
|
||||||
|
.setView(v)
|
||||||
|
.build());
|
||||||
|
} catch (IllegalArgumentException ex) {
|
||||||
|
Log.d(TAG, "Build configuration failed!", ex);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Begin a trace session.
|
* Begin a trace session.
|
||||||
*
|
*
|
||||||
* @param cujType the specific {@link InteractionJankMonitor.CujType}.
|
* @param builder the builder of the configurations for instrumenting the CUJ.
|
||||||
* @param timeout the elapsed time in ms until firing the timeout action.
|
|
||||||
* @return boolean true if the tracker is started successfully, false otherwise.
|
* @return boolean true if the tracker is started successfully, false otherwise.
|
||||||
*/
|
*/
|
||||||
public boolean begin(View v, @CujType int cujType, long timeout) {
|
public boolean begin(@NonNull Configuration.Builder builder) {
|
||||||
|
try {
|
||||||
|
return beginInternal(builder.build());
|
||||||
|
} catch (IllegalArgumentException ex) {
|
||||||
|
Log.d(TAG, "Build configuration failed!", ex);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean beginInternal(@NonNull Configuration conf) {
|
||||||
synchronized (this) {
|
synchronized (this) {
|
||||||
if (!v.isAttachedToWindow()) {
|
int cujType = conf.mCujType;
|
||||||
Log.d(TAG, "View not attached!", new Throwable());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
boolean shouldSample = ThreadLocalRandom.current().nextInt() % mSamplingInterval == 0;
|
boolean shouldSample = ThreadLocalRandom.current().nextInt() % mSamplingInterval == 0;
|
||||||
if (!mEnabled || !shouldSample) {
|
if (!mEnabled || !shouldSample) {
|
||||||
|
if (DEBUG) {
|
||||||
|
Log.d(TAG, "Skip monitoring cuj: " + getNameOfCuj(cujType)
|
||||||
|
+ ", enable=" + mEnabled + ", debuggable=" + DEFAULT_ENABLED
|
||||||
|
+ ", sample=" + shouldSample + ", interval=" + mSamplingInterval);
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
FrameTracker tracker = getTracker(cujType);
|
FrameTracker tracker = getTracker(cujType);
|
||||||
@@ -379,14 +405,14 @@ public class InteractionJankMonitor {
|
|||||||
if (tracker != null) return false;
|
if (tracker != null) return false;
|
||||||
|
|
||||||
// begin a new trace session.
|
// begin a new trace session.
|
||||||
tracker = createFrameTracker(v, new Session(cujType));
|
tracker = createFrameTracker(conf, new Session(cujType, conf.mTag));
|
||||||
mRunningTrackers.put(cujType, tracker);
|
mRunningTrackers.put(cujType, tracker);
|
||||||
tracker.begin();
|
tracker.begin();
|
||||||
|
|
||||||
// Cancel the trace if we don't get an end() call in specified duration.
|
// Cancel the trace if we don't get an end() call in specified duration.
|
||||||
Runnable timeoutAction = () -> cancel(cujType);
|
Runnable timeoutAction = () -> cancel(cujType);
|
||||||
mTimeoutActions.put(cujType, timeoutAction);
|
mTimeoutActions.put(cujType, timeoutAction);
|
||||||
mWorker.getThreadHandler().postDelayed(timeoutAction, timeout);
|
mWorker.getThreadHandler().postDelayed(timeoutAction, conf.mTimeout);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -526,47 +552,150 @@ public class InteractionJankMonitor {
|
|||||||
case CUJ_NOTIFICATION_APP_START:
|
case CUJ_NOTIFICATION_APP_START:
|
||||||
return "NOTIFICATION_APP_START";
|
return "NOTIFICATION_APP_START";
|
||||||
case CUJ_LOCKSCREEN_PASSWORD_APPEAR:
|
case CUJ_LOCKSCREEN_PASSWORD_APPEAR:
|
||||||
return "CUJ_LOCKSCREEN_PASSWORD_APPEAR";
|
return "LOCKSCREEN_PASSWORD_APPEAR";
|
||||||
case CUJ_LOCKSCREEN_PATTERN_APPEAR:
|
case CUJ_LOCKSCREEN_PATTERN_APPEAR:
|
||||||
return "CUJ_LOCKSCREEN_PATTERN_APPEAR";
|
return "LOCKSCREEN_PATTERN_APPEAR";
|
||||||
case CUJ_LOCKSCREEN_PIN_APPEAR:
|
case CUJ_LOCKSCREEN_PIN_APPEAR:
|
||||||
return "CUJ_LOCKSCREEN_PIN_APPEAR";
|
return "LOCKSCREEN_PIN_APPEAR";
|
||||||
case CUJ_LOCKSCREEN_PASSWORD_DISAPPEAR:
|
case CUJ_LOCKSCREEN_PASSWORD_DISAPPEAR:
|
||||||
return "CUJ_LOCKSCREEN_PASSWORD_DISAPPEAR";
|
return "LOCKSCREEN_PASSWORD_DISAPPEAR";
|
||||||
case CUJ_LOCKSCREEN_PATTERN_DISAPPEAR:
|
case CUJ_LOCKSCREEN_PATTERN_DISAPPEAR:
|
||||||
return "CUJ_LOCKSCREEN_PATTERN_DISAPPEAR";
|
return "LOCKSCREEN_PATTERN_DISAPPEAR";
|
||||||
case CUJ_LOCKSCREEN_PIN_DISAPPEAR:
|
case CUJ_LOCKSCREEN_PIN_DISAPPEAR:
|
||||||
return "CUJ_LOCKSCREEN_PIN_DISAPPEAR";
|
return "LOCKSCREEN_PIN_DISAPPEAR";
|
||||||
case CUJ_LOCKSCREEN_TRANSITION_FROM_AOD:
|
case CUJ_LOCKSCREEN_TRANSITION_FROM_AOD:
|
||||||
return "CUJ_LOCKSCREEN_TRANSITION_FROM_AOD";
|
return "LOCKSCREEN_TRANSITION_FROM_AOD";
|
||||||
case CUJ_LOCKSCREEN_TRANSITION_TO_AOD:
|
case CUJ_LOCKSCREEN_TRANSITION_TO_AOD:
|
||||||
return "CUJ_LOCKSCREEN_TRANSITION_TO_AOD";
|
return "LOCKSCREEN_TRANSITION_TO_AOD";
|
||||||
case CUJ_LAUNCHER_OPEN_ALL_APPS :
|
case CUJ_LAUNCHER_OPEN_ALL_APPS :
|
||||||
return "CUJ_LAUNCHER_OPEN_ALL_APPS";
|
return "LAUNCHER_OPEN_ALL_APPS";
|
||||||
case CUJ_LAUNCHER_ALL_APPS_SCROLL:
|
case CUJ_LAUNCHER_ALL_APPS_SCROLL:
|
||||||
return "CUJ_LAUNCHER_ALL_APPS_SCROLL";
|
return "LAUNCHER_ALL_APPS_SCROLL";
|
||||||
case CUJ_LAUNCHER_APP_LAUNCH_FROM_WIDGET:
|
case CUJ_LAUNCHER_APP_LAUNCH_FROM_WIDGET:
|
||||||
return "LAUNCHER_APP_LAUNCH_FROM_WIDGET";
|
return "LAUNCHER_APP_LAUNCH_FROM_WIDGET";
|
||||||
case CUJ_SETTINGS_PAGE_SCROLL:
|
case CUJ_SETTINGS_PAGE_SCROLL:
|
||||||
return "SETTINGS_PAGE_SCROLL";
|
return "SETTINGS_PAGE_SCROLL";
|
||||||
|
case CUJ_LOCKSCREEN_UNLOCK_ANIMATION:
|
||||||
|
return "LOCKSCREEN_UNLOCK_ANIMATION";
|
||||||
}
|
}
|
||||||
return "UNKNOWN";
|
return "UNKNOWN";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configurations used while instrumenting the CUJ. <br/>
|
||||||
|
* <b>It may refer to an attached view, don't use static reference for any purpose.</b>
|
||||||
|
*/
|
||||||
|
public static class Configuration {
|
||||||
|
private final View mView;
|
||||||
|
private final long mTimeout;
|
||||||
|
private final String mTag;
|
||||||
|
private final @CujType int mCujType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A builder for building Configuration. <br/>
|
||||||
|
* <b>It may refer to an attached view, don't use static reference for any purpose.</b>
|
||||||
|
*/
|
||||||
|
public static class Builder {
|
||||||
|
private View mAttrView = null;
|
||||||
|
private long mAttrTimeout = DEFAULT_TIMEOUT_MS;
|
||||||
|
private String mAttrTag = "";
|
||||||
|
private @CujType int mAttrCujType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param cuj The enum defined in {@link InteractionJankMonitor.CujType}.
|
||||||
|
*/
|
||||||
|
public Builder(@CujType int cuj) {
|
||||||
|
mAttrCujType = cuj;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param view an attached view
|
||||||
|
* @return builder
|
||||||
|
*/
|
||||||
|
public Builder setView(@NonNull View view) {
|
||||||
|
mAttrView = view;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param timeout duration to cancel the instrumentation in ms
|
||||||
|
* @return builder
|
||||||
|
*/
|
||||||
|
public Builder setTimeout(long timeout) {
|
||||||
|
mAttrTimeout = timeout;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param tag The postfix of the CUJ in the output trace.
|
||||||
|
* It provides a brief description for the CUJ like the concrete class
|
||||||
|
* who is dealing with the CUJ or the important state with the CUJ, etc.
|
||||||
|
* @return builder
|
||||||
|
*/
|
||||||
|
public Builder setTag(@NonNull String tag) {
|
||||||
|
mAttrTag = tag;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build the {@link Configuration} instance
|
||||||
|
* @return the instance of {@link Configuration}
|
||||||
|
* @throws IllegalArgumentException if any invalid attribute is set
|
||||||
|
*/
|
||||||
|
public Configuration build() throws IllegalArgumentException {
|
||||||
|
return new Configuration(mAttrCujType, mAttrView, mAttrTag, mAttrTimeout);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Configuration(@CujType int cuj, View view, String tag, long timeout) {
|
||||||
|
mCujType = cuj;
|
||||||
|
mTag = tag;
|
||||||
|
mTimeout = timeout;
|
||||||
|
mView = view;
|
||||||
|
validate();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void validate() {
|
||||||
|
boolean shouldThrow = false;
|
||||||
|
final StringBuilder msg = new StringBuilder();
|
||||||
|
|
||||||
|
if (mTag == null) {
|
||||||
|
shouldThrow = true;
|
||||||
|
msg.append("Invalid tag; ");
|
||||||
|
}
|
||||||
|
if (mTimeout < 0) {
|
||||||
|
shouldThrow = true;
|
||||||
|
msg.append("Invalid timeout value; ");
|
||||||
|
}
|
||||||
|
if (mView == null || !mView.isAttachedToWindow()) {
|
||||||
|
shouldThrow = true;
|
||||||
|
msg.append("Null view or view is not attached yet; ");
|
||||||
|
}
|
||||||
|
if (shouldThrow) {
|
||||||
|
throw new IllegalArgumentException(msg.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A class to represent a session.
|
* A class to represent a session.
|
||||||
*/
|
*/
|
||||||
public static class Session {
|
public static class Session {
|
||||||
@CujType
|
@CujType
|
||||||
private int mCujType;
|
private final int mCujType;
|
||||||
private long mTimeStamp;
|
private final long mTimeStamp;
|
||||||
@FrameTracker.Reasons
|
@FrameTracker.Reasons
|
||||||
private int mReason = FrameTracker.REASON_END_UNKNOWN;
|
private int mReason = FrameTracker.REASON_END_UNKNOWN;
|
||||||
private boolean mShouldNotify;
|
private final boolean mShouldNotify;
|
||||||
|
private final String mName;
|
||||||
|
|
||||||
public Session(@CujType int cujType) {
|
public Session(@CujType int cujType, @NonNull String postfix) {
|
||||||
mCujType = cujType;
|
mCujType = cujType;
|
||||||
|
mTimeStamp = System.nanoTime();
|
||||||
mShouldNotify = SystemProperties.getBoolean(PROP_NOTIFY_CUJ_EVENT, false);
|
mShouldNotify = SystemProperties.getBoolean(PROP_NOTIFY_CUJ_EVENT, false);
|
||||||
|
mName = TextUtils.isEmpty(postfix)
|
||||||
|
? String.format("J<%s>", getNameOfCuj(mCujType))
|
||||||
|
: String.format("J<%s::%s>", getNameOfCuj(mCujType), postfix);
|
||||||
}
|
}
|
||||||
|
|
||||||
@CujType
|
@CujType
|
||||||
@@ -588,11 +717,7 @@ public class InteractionJankMonitor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return "J<" + getNameOfCuj(mCujType) + ">";
|
return mName;
|
||||||
}
|
|
||||||
|
|
||||||
public void setTimeStamp(long timeStamp) {
|
|
||||||
mTimeStamp = timeStamp;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getTimeStamp() {
|
public long getTimeStamp() {
|
||||||
|
|||||||
@@ -105,6 +105,11 @@ public class LatencyTracker {
|
|||||||
*/
|
*/
|
||||||
public static final int ACTION_ROTATE_SCREEN_CAMERA_CHECK = 10;
|
public static final int ACTION_ROTATE_SCREEN_CAMERA_CHECK = 10;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Time it takes to start unlock animation .
|
||||||
|
*/
|
||||||
|
public static final int ACTION_LOCKSCREEN_UNLOCK = 11;
|
||||||
|
|
||||||
private static final int[] ACTIONS_ALL = {
|
private static final int[] ACTIONS_ALL = {
|
||||||
ACTION_EXPAND_PANEL,
|
ACTION_EXPAND_PANEL,
|
||||||
ACTION_TOGGLE_RECENTS,
|
ACTION_TOGGLE_RECENTS,
|
||||||
@@ -116,7 +121,8 @@ public class LatencyTracker {
|
|||||||
ACTION_FACE_WAKE_AND_UNLOCK,
|
ACTION_FACE_WAKE_AND_UNLOCK,
|
||||||
ACTION_START_RECENTS_ANIMATION,
|
ACTION_START_RECENTS_ANIMATION,
|
||||||
ACTION_ROTATE_SCREEN_SENSOR,
|
ACTION_ROTATE_SCREEN_SENSOR,
|
||||||
ACTION_ROTATE_SCREEN_CAMERA_CHECK
|
ACTION_ROTATE_SCREEN_CAMERA_CHECK,
|
||||||
|
ACTION_LOCKSCREEN_UNLOCK
|
||||||
};
|
};
|
||||||
|
|
||||||
/** @hide */
|
/** @hide */
|
||||||
@@ -131,7 +137,8 @@ public class LatencyTracker {
|
|||||||
ACTION_FACE_WAKE_AND_UNLOCK,
|
ACTION_FACE_WAKE_AND_UNLOCK,
|
||||||
ACTION_START_RECENTS_ANIMATION,
|
ACTION_START_RECENTS_ANIMATION,
|
||||||
ACTION_ROTATE_SCREEN_SENSOR,
|
ACTION_ROTATE_SCREEN_SENSOR,
|
||||||
ACTION_ROTATE_SCREEN_CAMERA_CHECK
|
ACTION_ROTATE_SCREEN_CAMERA_CHECK,
|
||||||
|
ACTION_LOCKSCREEN_UNLOCK
|
||||||
})
|
})
|
||||||
@Retention(RetentionPolicy.SOURCE)
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
public @interface Action {
|
public @interface Action {
|
||||||
@@ -148,7 +155,8 @@ public class LatencyTracker {
|
|||||||
FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_FACE_WAKE_AND_UNLOCK,
|
FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_FACE_WAKE_AND_UNLOCK,
|
||||||
FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_START_RECENTS_ANIMATION,
|
FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_START_RECENTS_ANIMATION,
|
||||||
FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_ROTATE_SCREEN_SENSOR,
|
FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_ROTATE_SCREEN_SENSOR,
|
||||||
FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_ROTATE_SCREEN_CAMERA_CHECK
|
FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_ROTATE_SCREEN_CAMERA_CHECK,
|
||||||
|
FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_LOCKSCREEN_UNLOCK
|
||||||
};
|
};
|
||||||
|
|
||||||
private static LatencyTracker sLatencyTracker;
|
private static LatencyTracker sLatencyTracker;
|
||||||
@@ -229,6 +237,8 @@ public class LatencyTracker {
|
|||||||
return "ACTION_ROTATE_SCREEN_CAMERA_CHECK";
|
return "ACTION_ROTATE_SCREEN_CAMERA_CHECK";
|
||||||
case 11:
|
case 11:
|
||||||
return "ACTION_ROTATE_SCREEN_SENSOR";
|
return "ACTION_ROTATE_SCREEN_SENSOR";
|
||||||
|
case 12:
|
||||||
|
return "ACTION_LOCKSCREEN_UNLOCK";
|
||||||
default:
|
default:
|
||||||
throw new IllegalArgumentException("Invalid action");
|
throw new IllegalArgumentException("Invalid action");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,6 +62,7 @@ import java.util.concurrent.TimeUnit;
|
|||||||
|
|
||||||
@SmallTest
|
@SmallTest
|
||||||
public class FrameTrackerTest {
|
public class FrameTrackerTest {
|
||||||
|
private static final String CUJ_POSTFIX = "";
|
||||||
private ViewAttachTestActivity mActivity;
|
private ViewAttachTestActivity mActivity;
|
||||||
|
|
||||||
@Rule
|
@Rule
|
||||||
@@ -100,15 +101,17 @@ public class FrameTrackerTest {
|
|||||||
mListenerCapture.capture(), any());
|
mListenerCapture.capture(), any());
|
||||||
doNothing().when(mSurfaceControlWrapper).removeJankStatsListener(
|
doNothing().when(mSurfaceControlWrapper).removeJankStatsListener(
|
||||||
mListenerCapture.capture());
|
mListenerCapture.capture());
|
||||||
|
|
||||||
mChoreographer = mock(ChoreographerWrapper.class);
|
mChoreographer = mock(ChoreographerWrapper.class);
|
||||||
|
|
||||||
Session session = new Session(CUJ_NOTIFICATION_SHADE_EXPAND_COLLAPSE);
|
Session session = new Session(CUJ_NOTIFICATION_SHADE_EXPAND_COLLAPSE, CUJ_POSTFIX);
|
||||||
mTracker = Mockito.spy(
|
mTracker = Mockito.spy(
|
||||||
new FrameTracker(session, handler, mRenderer, mViewRootWrapper,
|
new FrameTracker(session, handler, mRenderer, mViewRootWrapper,
|
||||||
mSurfaceControlWrapper, mChoreographer, mWrapper,
|
mSurfaceControlWrapper, mChoreographer, mWrapper,
|
||||||
/*traceThresholdMissedFrames=*/ 1, /*traceThresholdFrameTimeMillis=*/ -1,
|
/*traceThresholdMissedFrames=*/ 1, /*traceThresholdFrameTimeMillis=*/ -1,
|
||||||
null));
|
null));
|
||||||
doNothing().when(mTracker).triggerPerfetto();
|
doNothing().when(mTracker).triggerPerfetto();
|
||||||
|
doNothing().when(mTracker).postTraceStartMarker();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
@@ -62,6 +62,7 @@ import java.util.stream.Collectors;
|
|||||||
|
|
||||||
@SmallTest
|
@SmallTest
|
||||||
public class InteractionJankMonitorTest {
|
public class InteractionJankMonitorTest {
|
||||||
|
private static final String CUJ_POSTFIX = "";
|
||||||
private ViewAttachTestActivity mActivity;
|
private ViewAttachTestActivity mActivity;
|
||||||
private View mView;
|
private View mView;
|
||||||
private HandlerThread mWorker;
|
private HandlerThread mWorker;
|
||||||
@@ -90,7 +91,7 @@ public class InteractionJankMonitorTest {
|
|||||||
InteractionJankMonitor monitor = spy(new InteractionJankMonitor(mWorker));
|
InteractionJankMonitor monitor = spy(new InteractionJankMonitor(mWorker));
|
||||||
verify(mWorker).start();
|
verify(mWorker).start();
|
||||||
|
|
||||||
Session session = new Session(CUJ_NOTIFICATION_SHADE_EXPAND_COLLAPSE);
|
Session session = new Session(CUJ_NOTIFICATION_SHADE_EXPAND_COLLAPSE, CUJ_POSTFIX);
|
||||||
FrameTracker tracker = spy(new FrameTracker(session, mWorker.getThreadHandler(),
|
FrameTracker tracker = spy(new FrameTracker(session, mWorker.getThreadHandler(),
|
||||||
new ThreadedRendererWrapper(mView.getThreadedRenderer()),
|
new ThreadedRendererWrapper(mView.getThreadedRenderer()),
|
||||||
new ViewRootWrapper(mView.getViewRootImpl()), new SurfaceControlWrapper(),
|
new ViewRootWrapper(mView.getViewRootImpl()), new SurfaceControlWrapper(),
|
||||||
@@ -137,7 +138,7 @@ public class InteractionJankMonitorTest {
|
|||||||
|
|
||||||
ArgumentCaptor<Message> captor = ArgumentCaptor.forClass(Message.class);
|
ArgumentCaptor<Message> captor = ArgumentCaptor.forClass(Message.class);
|
||||||
|
|
||||||
Session session = new Session(CUJ_NOTIFICATION_SHADE_EXPAND_COLLAPSE);
|
Session session = new Session(CUJ_NOTIFICATION_SHADE_EXPAND_COLLAPSE, CUJ_POSTFIX);
|
||||||
FrameTracker tracker = spy(new FrameTracker(session, mWorker.getThreadHandler(),
|
FrameTracker tracker = spy(new FrameTracker(session, mWorker.getThreadHandler(),
|
||||||
new ThreadedRendererWrapper(mView.getThreadedRenderer()),
|
new ThreadedRendererWrapper(mView.getThreadedRenderer()),
|
||||||
new ViewRootWrapper(mView.getViewRootImpl()), new SurfaceControlWrapper(),
|
new ViewRootWrapper(mView.getViewRootImpl()), new SurfaceControlWrapper(),
|
||||||
|
|||||||
@@ -20,11 +20,14 @@ import android.annotation.IntDef;
|
|||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
|
||||||
import com.android.internal.jank.InteractionJankMonitor;
|
import com.android.internal.jank.InteractionJankMonitor;
|
||||||
|
import com.android.internal.jank.InteractionJankMonitor.Configuration;
|
||||||
|
|
||||||
import java.lang.annotation.Retention;
|
import java.lang.annotation.Retention;
|
||||||
import java.lang.annotation.RetentionPolicy;
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
|
||||||
public final class InteractionJankMonitorWrapper {
|
public final class InteractionJankMonitorWrapper {
|
||||||
|
private static final String TAG = "JankMonitorWrapper";
|
||||||
|
|
||||||
// Launcher journeys.
|
// Launcher journeys.
|
||||||
public static final int CUJ_APP_LAUNCH_FROM_RECENTS =
|
public static final int CUJ_APP_LAUNCH_FROM_RECENTS =
|
||||||
InteractionJankMonitor.CUJ_LAUNCHER_APP_LAUNCH_FROM_RECENTS;
|
InteractionJankMonitor.CUJ_LAUNCHER_APP_LAUNCH_FROM_RECENTS;
|
||||||
@@ -60,7 +63,11 @@ public final class InteractionJankMonitorWrapper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static boolean begin(View v, @CujType int cujType, long timeout) {
|
public static boolean begin(View v, @CujType int cujType, long timeout) {
|
||||||
return InteractionJankMonitor.getInstance().begin(v, cujType, timeout);
|
Configuration.Builder builder =
|
||||||
|
new Configuration.Builder(cujType)
|
||||||
|
.setView(v)
|
||||||
|
.setTimeout(timeout);
|
||||||
|
return InteractionJankMonitor.getInstance().begin(builder);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean end(@CujType int cujType) {
|
public static boolean end(@CujType int cujType) {
|
||||||
|
|||||||
@@ -172,6 +172,7 @@ public abstract class KeyguardAbsKeyInputViewController<T extends KeyguardAbsKey
|
|||||||
getKeyguardSecurityCallback().reportUnlockAttempt(userId, true, 0);
|
getKeyguardSecurityCallback().reportUnlockAttempt(userId, true, 0);
|
||||||
if (dismissKeyguard) {
|
if (dismissKeyguard) {
|
||||||
mDismissing = true;
|
mDismissing = true;
|
||||||
|
mLatencyTracker.onActionStart(LatencyTracker.ACTION_LOCKSCREEN_UNLOCK);
|
||||||
getKeyguardSecurityCallback().dismiss(true, userId);
|
getKeyguardSecurityCallback().dismiss(true, userId);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -163,6 +163,7 @@ public class KeyguardPatternViewController
|
|||||||
getKeyguardSecurityCallback().reportUnlockAttempt(userId, true, 0);
|
getKeyguardSecurityCallback().reportUnlockAttempt(userId, true, 0);
|
||||||
if (dismissKeyguard) {
|
if (dismissKeyguard) {
|
||||||
mLockPatternView.setDisplayMode(LockPatternView.DisplayMode.Correct);
|
mLockPatternView.setDisplayMode(LockPatternView.DisplayMode.Correct);
|
||||||
|
mLatencyTracker.onActionStart(LatencyTracker.ACTION_LOCKSCREEN_UNLOCK);
|
||||||
getKeyguardSecurityCallback().dismiss(true, userId);
|
getKeyguardSecurityCallback().dismiss(true, userId);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;
|
|||||||
import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_WITH_WALLPAPER;
|
import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_WITH_WALLPAPER;
|
||||||
|
|
||||||
import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.NAV_BAR_HANDLE_SHOW_OVER_LOCKSCREEN;
|
import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.NAV_BAR_HANDLE_SHOW_OVER_LOCKSCREEN;
|
||||||
|
import static com.android.internal.jank.InteractionJankMonitor.CUJ_LOCKSCREEN_UNLOCK_ANIMATION;
|
||||||
import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.SOME_AUTH_REQUIRED_AFTER_USER_REQUEST;
|
import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.SOME_AUTH_REQUIRED_AFTER_USER_REQUEST;
|
||||||
import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_DPM_LOCK_NOW;
|
import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_DPM_LOCK_NOW;
|
||||||
import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_LOCKOUT;
|
import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_LOCKOUT;
|
||||||
@@ -82,6 +83,8 @@ import android.view.WindowManagerPolicyConstants;
|
|||||||
import android.view.animation.Animation;
|
import android.view.animation.Animation;
|
||||||
import android.view.animation.AnimationUtils;
|
import android.view.animation.AnimationUtils;
|
||||||
|
|
||||||
|
import com.android.internal.jank.InteractionJankMonitor;
|
||||||
|
import com.android.internal.jank.InteractionJankMonitor.Configuration;
|
||||||
import com.android.internal.policy.IKeyguardDismissCallback;
|
import com.android.internal.policy.IKeyguardDismissCallback;
|
||||||
import com.android.internal.policy.IKeyguardDrawnCallback;
|
import com.android.internal.policy.IKeyguardDrawnCallback;
|
||||||
import com.android.internal.policy.IKeyguardExitCallback;
|
import com.android.internal.policy.IKeyguardExitCallback;
|
||||||
@@ -2154,6 +2157,9 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable,
|
|||||||
playSounds(false);
|
playSounds(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LatencyTracker.getInstance(mContext)
|
||||||
|
.onActionEnd(LatencyTracker.ACTION_LOCKSCREEN_UNLOCK);
|
||||||
|
|
||||||
IRemoteAnimationRunner runner = mKeyguardExitAnimationRunner;
|
IRemoteAnimationRunner runner = mKeyguardExitAnimationRunner;
|
||||||
mKeyguardExitAnimationRunner = null;
|
mKeyguardExitAnimationRunner = null;
|
||||||
|
|
||||||
@@ -2168,6 +2174,8 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable,
|
|||||||
onKeyguardExitFinished();
|
onKeyguardExitFinished();
|
||||||
mKeyguardViewControllerLazy.get().hide(0 /* startTime */,
|
mKeyguardViewControllerLazy.get().hide(0 /* startTime */,
|
||||||
0 /* fadeoutDuration */);
|
0 /* fadeoutDuration */);
|
||||||
|
InteractionJankMonitor.getInstance()
|
||||||
|
.end(CUJ_LOCKSCREEN_UNLOCK_ANIMATION);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -2176,6 +2184,8 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable,
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
try {
|
try {
|
||||||
|
InteractionJankMonitor.getInstance().begin(
|
||||||
|
createInteractionJankMonitorConf("RunRemoteAnimation"));
|
||||||
runner.onAnimationStart(WindowManager.TRANSIT_KEYGUARD_GOING_AWAY, apps,
|
runner.onAnimationStart(WindowManager.TRANSIT_KEYGUARD_GOING_AWAY, apps,
|
||||||
wallpapers, nonApps, callback);
|
wallpapers, nonApps, callback);
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
@@ -2190,10 +2200,16 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable,
|
|||||||
mSurfaceBehindRemoteAnimationFinishedCallback = finishedCallback;
|
mSurfaceBehindRemoteAnimationFinishedCallback = finishedCallback;
|
||||||
mSurfaceBehindRemoteAnimationRunning = true;
|
mSurfaceBehindRemoteAnimationRunning = true;
|
||||||
|
|
||||||
|
InteractionJankMonitor.getInstance().begin(
|
||||||
|
createInteractionJankMonitorConf("DismissPanel"));
|
||||||
|
|
||||||
// Pass the surface and metadata to the unlock animation controller.
|
// Pass the surface and metadata to the unlock animation controller.
|
||||||
mKeyguardUnlockAnimationControllerLazy.get().notifyStartKeyguardExitAnimation(
|
mKeyguardUnlockAnimationControllerLazy.get().notifyStartKeyguardExitAnimation(
|
||||||
apps[0], startTime, mSurfaceBehindRemoteAnimationRequested);
|
apps[0], startTime, mSurfaceBehindRemoteAnimationRequested);
|
||||||
} else {
|
} else {
|
||||||
|
InteractionJankMonitor.getInstance().begin(
|
||||||
|
createInteractionJankMonitorConf("RemoteAnimationDisabled"));
|
||||||
|
|
||||||
mKeyguardViewControllerLazy.get().hide(startTime, fadeoutDuration);
|
mKeyguardViewControllerLazy.get().hide(startTime, fadeoutDuration);
|
||||||
|
|
||||||
// TODO(bc-animation): When remote animation is enabled for keyguard exit animation,
|
// TODO(bc-animation): When remote animation is enabled for keyguard exit animation,
|
||||||
@@ -2201,6 +2217,7 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable,
|
|||||||
// supported, so it's always null.
|
// supported, so it's always null.
|
||||||
mContext.getMainExecutor().execute(() -> {
|
mContext.getMainExecutor().execute(() -> {
|
||||||
if (finishedCallback == null) {
|
if (finishedCallback == null) {
|
||||||
|
InteractionJankMonitor.getInstance().end(CUJ_LOCKSCREEN_UNLOCK_ANIMATION);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2227,6 +2244,9 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable,
|
|||||||
finishedCallback.onAnimationFinished();
|
finishedCallback.onAnimationFinished();
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
Slog.e(TAG, "RemoteException");
|
Slog.e(TAG, "RemoteException");
|
||||||
|
} finally {
|
||||||
|
InteractionJankMonitor.getInstance()
|
||||||
|
.end(CUJ_LOCKSCREEN_UNLOCK_ANIMATION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2236,6 +2256,9 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable,
|
|||||||
finishedCallback.onAnimationFinished();
|
finishedCallback.onAnimationFinished();
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
Slog.e(TAG, "RemoteException");
|
Slog.e(TAG, "RemoteException");
|
||||||
|
} finally {
|
||||||
|
InteractionJankMonitor.getInstance()
|
||||||
|
.cancel(CUJ_LOCKSCREEN_UNLOCK_ANIMATION);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -2259,6 +2282,12 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable,
|
|||||||
sendUserPresentBroadcast();
|
sendUserPresentBroadcast();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Configuration.Builder createInteractionJankMonitorConf(String tag) {
|
||||||
|
return new Configuration.Builder(CUJ_LOCKSCREEN_UNLOCK_ANIMATION)
|
||||||
|
.setView(mKeyguardViewControllerLazy.get().getViewRootImpl().getView())
|
||||||
|
.setTag(tag);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether we're currently animating between the keyguard and the app/launcher surface behind
|
* Whether we're currently animating between the keyguard and the app/launcher surface behind
|
||||||
* it, or will be shortly (which happens if we started a fling to dismiss the keyguard).
|
* it, or will be shortly (which happens if we started a fling to dismiss the keyguard).
|
||||||
@@ -2304,6 +2333,7 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable,
|
|||||||
finishSurfaceBehindRemoteAnimation();
|
finishSurfaceBehindRemoteAnimation();
|
||||||
mSurfaceBehindRemoteAnimationRequested = false;
|
mSurfaceBehindRemoteAnimationRequested = false;
|
||||||
mKeyguardUnlockAnimationControllerLazy.get().notifyFinishedKeyguardExitAnimation();
|
mKeyguardUnlockAnimationControllerLazy.get().notifyFinishedKeyguardExitAnimation();
|
||||||
|
InteractionJankMonitor.getInstance().end(CUJ_LOCKSCREEN_UNLOCK_ANIMATION);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ import android.view.animation.Interpolator;
|
|||||||
import android.view.animation.PathInterpolator;
|
import android.view.animation.PathInterpolator;
|
||||||
|
|
||||||
import com.android.internal.jank.InteractionJankMonitor;
|
import com.android.internal.jank.InteractionJankMonitor;
|
||||||
|
import com.android.internal.jank.InteractionJankMonitor.Configuration;
|
||||||
import com.android.settingslib.Utils;
|
import com.android.settingslib.Utils;
|
||||||
import com.android.systemui.Gefingerpoken;
|
import com.android.systemui.Gefingerpoken;
|
||||||
import com.android.systemui.R;
|
import com.android.systemui.R;
|
||||||
@@ -542,8 +543,9 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView
|
|||||||
@Override
|
@Override
|
||||||
public void onAnimationStart(Animator animation) {
|
public void onAnimationStart(Animator animation) {
|
||||||
mWasCancelled = false;
|
mWasCancelled = false;
|
||||||
InteractionJankMonitor.getInstance().begin(ActivatableNotificationView.this,
|
Configuration.Builder builder = new Configuration.Builder(getCujType(isAppearing))
|
||||||
getCujType(isAppearing));
|
.setView(ActivatableNotificationView.this);
|
||||||
|
InteractionJankMonitor.getInstance().begin(builder);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ import static java.lang.Float.isNaN;
|
|||||||
|
|
||||||
import android.animation.Animator;
|
import android.animation.Animator;
|
||||||
import android.animation.AnimatorListenerAdapter;
|
import android.animation.AnimatorListenerAdapter;
|
||||||
import android.animation.ObjectAnimator;
|
|
||||||
import android.animation.ValueAnimator;
|
import android.animation.ValueAnimator;
|
||||||
import android.content.res.Configuration;
|
import android.content.res.Configuration;
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
@@ -42,7 +41,6 @@ import android.view.ViewConfiguration;
|
|||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.view.ViewTreeObserver;
|
import android.view.ViewTreeObserver;
|
||||||
import android.view.animation.Interpolator;
|
import android.view.animation.Interpolator;
|
||||||
import android.view.animation.PathInterpolator;
|
|
||||||
|
|
||||||
import com.android.internal.jank.InteractionJankMonitor;
|
import com.android.internal.jank.InteractionJankMonitor;
|
||||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||||
@@ -336,8 +334,7 @@ public abstract class PanelViewController {
|
|||||||
protected void startExpandMotion(float newX, float newY, boolean startTracking,
|
protected void startExpandMotion(float newX, float newY, boolean startTracking,
|
||||||
float expandedHeight) {
|
float expandedHeight) {
|
||||||
if (!mHandlingPointerUp) {
|
if (!mHandlingPointerUp) {
|
||||||
InteractionJankMonitor.getInstance().begin(mView,
|
beginJankMonitoring(CUJ_NOTIFICATION_SHADE_EXPAND_COLLAPSE);
|
||||||
CUJ_NOTIFICATION_SHADE_EXPAND_COLLAPSE);
|
|
||||||
}
|
}
|
||||||
mInitialOffsetOnTouch = expandedHeight;
|
mInitialOffsetOnTouch = expandedHeight;
|
||||||
mInitialTouchY = newY;
|
mInitialTouchY = newY;
|
||||||
@@ -533,7 +530,7 @@ public abstract class PanelViewController {
|
|||||||
protected void flingToHeight(float vel, boolean expand, float target,
|
protected void flingToHeight(float vel, boolean expand, float target,
|
||||||
float collapseSpeedUpFactor, boolean expandBecauseOfFalsing) {
|
float collapseSpeedUpFactor, boolean expandBecauseOfFalsing) {
|
||||||
if (target == mExpandedHeight || getOverExpansionAmount() > 0f && expand) {
|
if (target == mExpandedHeight || getOverExpansionAmount() > 0f && expand) {
|
||||||
InteractionJankMonitor.getInstance().end(CUJ_NOTIFICATION_SHADE_EXPAND_COLLAPSE);
|
endJankMonitoring(CUJ_NOTIFICATION_SHADE_EXPAND_COLLAPSE);
|
||||||
mKeyguardStateController.notifyPanelFlingEnd();
|
mKeyguardStateController.notifyPanelFlingEnd();
|
||||||
notifyExpandingFinished();
|
notifyExpandingFinished();
|
||||||
return;
|
return;
|
||||||
@@ -579,8 +576,7 @@ public abstract class PanelViewController {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onAnimationStart(Animator animation) {
|
public void onAnimationStart(Animator animation) {
|
||||||
InteractionJankMonitor.getInstance()
|
beginJankMonitoring(CUJ_NOTIFICATION_SHADE_EXPAND_COLLAPSE);
|
||||||
.begin(mView, CUJ_NOTIFICATION_SHADE_EXPAND_COLLAPSE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -632,12 +628,10 @@ public abstract class PanelViewController {
|
|||||||
setAnimator(null);
|
setAnimator(null);
|
||||||
mKeyguardStateController.notifyPanelFlingEnd();
|
mKeyguardStateController.notifyPanelFlingEnd();
|
||||||
if (!cancelled) {
|
if (!cancelled) {
|
||||||
InteractionJankMonitor.getInstance()
|
endJankMonitoring(CUJ_NOTIFICATION_SHADE_EXPAND_COLLAPSE);
|
||||||
.end(CUJ_NOTIFICATION_SHADE_EXPAND_COLLAPSE);
|
|
||||||
notifyExpandingFinished();
|
notifyExpandingFinished();
|
||||||
} else {
|
} else {
|
||||||
InteractionJankMonitor.getInstance()
|
cancelJankMonitoring(CUJ_NOTIFICATION_SHADE_EXPAND_COLLAPSE);
|
||||||
.cancel(CUJ_NOTIFICATION_SHADE_EXPAND_COLLAPSE);
|
|
||||||
}
|
}
|
||||||
notifyBarPanelExpansionChanged();
|
notifyBarPanelExpansionChanged();
|
||||||
}
|
}
|
||||||
@@ -847,8 +841,7 @@ public abstract class PanelViewController {
|
|||||||
mView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
|
mView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
|
||||||
if (mAnimateAfterExpanding) {
|
if (mAnimateAfterExpanding) {
|
||||||
notifyExpandingStarted();
|
notifyExpandingStarted();
|
||||||
InteractionJankMonitor.getInstance().begin(mView,
|
beginJankMonitoring(CUJ_NOTIFICATION_SHADE_EXPAND_COLLAPSE);
|
||||||
CUJ_NOTIFICATION_SHADE_EXPAND_COLLAPSE);
|
|
||||||
fling(0, true /* expand */);
|
fling(0, true /* expand */);
|
||||||
} else {
|
} else {
|
||||||
setExpandedFraction(1f);
|
setExpandedFraction(1f);
|
||||||
@@ -1304,11 +1297,10 @@ public abstract class PanelViewController {
|
|||||||
endMotionEvent(event, x, y, false /* forceCancel */);
|
endMotionEvent(event, x, y, false /* forceCancel */);
|
||||||
// mHeightAnimator is null, there is no remaining frame, ends instrumenting.
|
// mHeightAnimator is null, there is no remaining frame, ends instrumenting.
|
||||||
if (mHeightAnimator == null) {
|
if (mHeightAnimator == null) {
|
||||||
InteractionJankMonitor monitor = InteractionJankMonitor.getInstance();
|
|
||||||
if (event.getActionMasked() == MotionEvent.ACTION_UP) {
|
if (event.getActionMasked() == MotionEvent.ACTION_UP) {
|
||||||
monitor.end(CUJ_NOTIFICATION_SHADE_EXPAND_COLLAPSE);
|
endJankMonitoring(CUJ_NOTIFICATION_SHADE_EXPAND_COLLAPSE);
|
||||||
} else {
|
} else {
|
||||||
monitor.cancel(CUJ_NOTIFICATION_SHADE_EXPAND_COLLAPSE);
|
cancelJankMonitoring(CUJ_NOTIFICATION_SHADE_EXPAND_COLLAPSE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -1338,4 +1330,20 @@ public abstract class PanelViewController {
|
|||||||
loadDimens();
|
loadDimens();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void beginJankMonitoring(int cuj) {
|
||||||
|
InteractionJankMonitor.Configuration.Builder builder =
|
||||||
|
new InteractionJankMonitor.Configuration.Builder(cuj)
|
||||||
|
.setView(mView)
|
||||||
|
.setTag(isFullyCollapsed() ? "Expand" : "Collapse");
|
||||||
|
InteractionJankMonitor.getInstance().begin(builder);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void endJankMonitoring(int cuj) {
|
||||||
|
InteractionJankMonitor.getInstance().end(cuj);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void cancelJankMonitoring(int cuj) {
|
||||||
|
InteractionJankMonitor.getInstance().cancel(cuj);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user