Merge "Monitor the page scrolling jank for app list pages"
diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java
index fe7f996..a41230a 100644
--- a/src/com/android/settings/applications/manageapplications/ManageApplications.java
+++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java
@@ -19,6 +19,7 @@
 import static androidx.recyclerview.widget.RecyclerView.SCROLL_STATE_DRAGGING;
 import static androidx.recyclerview.widget.RecyclerView.SCROLL_STATE_IDLE;
 
+import static com.android.internal.jank.InteractionJankMonitor.CUJ_SETTINGS_PAGE_SCROLL;
 import static com.android.settings.ChangeIds.CHANGE_RESTRICT_SAW_INTENT;
 import static com.android.settings.applications.manageapplications.AppFilterRegistry.FILTER_APPS_ALL;
 import static com.android.settings.applications.manageapplications.AppFilterRegistry.FILTER_APPS_BATTERY_OPTIMIZED;
@@ -86,6 +87,7 @@
 import androidx.recyclerview.widget.RecyclerView;
 
 import com.android.internal.compat.IPlatformCompat;
+import com.android.internal.jank.InteractionJankMonitor;
 import com.android.settings.R;
 import com.android.settings.Settings.AlarmsAndRemindersActivity;
 import com.android.settings.Settings.AppBatteryUsageActivity;
@@ -1242,8 +1244,10 @@
         @Override
         public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
             super.onAttachedToRecyclerView(recyclerView);
+            final String className =
+                    mManageApplications.getClass().getName() + "_" + mManageApplications.mListType;
             mRecyclerView = recyclerView;
-            mOnScrollListener = new OnScrollListener(this);
+            mOnScrollListener = new OnScrollListener(this, className);
             mRecyclerView.addOnScrollListener(mOnScrollListener);
         }
 
@@ -1803,11 +1807,15 @@
             private boolean mDelayNotifyDataChange;
             private ApplicationsAdapter mAdapter;
             private InputMethodManager mInputMethodManager;
+            private InteractionJankMonitor mMonitor;
+            private String mClassName;
 
-            public OnScrollListener(ApplicationsAdapter adapter) {
+            public OnScrollListener(ApplicationsAdapter adapter, String className) {
                 mAdapter = adapter;
                 mInputMethodManager = mAdapter.mContext.getSystemService(
                         InputMethodManager.class);
+                mMonitor = InteractionJankMonitor.getInstance();
+                mClassName = className;
             }
 
             @Override
@@ -1822,6 +1830,15 @@
                         mInputMethodManager.hideSoftInputFromWindow(recyclerView.getWindowToken(),
                                 0);
                     }
+                    // Start jank monitoring during page scrolling.
+                    final InteractionJankMonitor.Configuration.Builder builder =
+                            InteractionJankMonitor.Configuration.Builder.withView(
+                                            CUJ_SETTINGS_PAGE_SCROLL, recyclerView)
+                                    .setTag(mClassName);
+                    mMonitor.begin(builder);
+                } else if (mScrollState == SCROLL_STATE_IDLE) {
+                    // Stop jank monitoring on page scrolling.
+                    mMonitor.end(CUJ_SETTINGS_PAGE_SCROLL);
                 }
             }
 
diff --git a/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java b/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java
index da17f11..910fbed 100644
--- a/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java
+++ b/tests/robotests/src/com/android/settings/applications/manageapplications/ManageApplicationsTest.java
@@ -60,6 +60,7 @@
 import com.android.settingslib.applications.ApplicationsState;
 import com.android.settingslib.applications.ApplicationsState.AppEntry;
 import com.android.settingslib.applications.ApplicationsState.AppFilter;
+import com.android.settingslib.testutils.shadow.ShadowInteractionJankMonitor;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -75,7 +76,8 @@
 import java.util.ArrayList;
 
 @RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowUserManager.class, ShadowAppUtils.class})
+@Config(shadows = {ShadowUserManager.class, ShadowAppUtils.class,
+        ShadowInteractionJankMonitor.class})
 public class ManageApplicationsTest {
 
     @Mock