Add the jank detection to Settings toggles

Add jank detection when click the following preferences,
 - SwitchPreference
   Single target, detect click in InstrumentedPreferenceFragment
 - PrimarySwitchPreference
   Two target, only detect click switch in switch's onClick()
 - MainSwitchPreference
   Single target, detect click in TogglePreferenceController
 - SettingsMainSwitchPreference
   Single target, detect click in its onSwitchChanged()

Bug: 230285829
Test: manual & robo tests
Change-Id: I97a13e05a601237b16cd2d903ba2fb6ec4a69a74
This commit is contained in:
Chaohui Wang
2022-05-06 01:17:20 +08:00
parent 72642fa03d
commit 692068d535
6 changed files with 46 additions and 4 deletions

View File

@@ -27,6 +27,7 @@ import android.util.Log;
import androidx.annotation.XmlRes;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import androidx.preference.SwitchPreference;
import androidx.recyclerview.widget.RecyclerView;
import com.android.internal.jank.InteractionJankMonitor;
@@ -34,6 +35,7 @@ import com.android.settings.overlay.FeatureFactory;
import com.android.settings.survey.SurveyMixin;
import com.android.settingslib.core.instrumentation.Instrumentable;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.core.instrumentation.SettingsJankMonitor;
import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin;
import com.android.settingslib.core.lifecycle.ObservablePreferenceFragment;
@@ -45,7 +47,6 @@ public abstract class InstrumentedPreferenceFragment extends ObservablePreferenc
private static final String TAG = "InstrumentedPrefFrag";
protected MetricsFeatureProvider mMetricsFeatureProvider;
// metrics placeholder value. Only use this for development.
@@ -65,6 +66,19 @@ public abstract class InstrumentedPreferenceFragment extends ObservablePreferenc
super.onAttach(context);
}
@Override
public void onStart() {
super.onStart();
// Override the OnPreferenceTreeClickListener in super.onStart() to inject jank detection.
getPreferenceManager().setOnPreferenceTreeClickListener((preference) -> {
if (preference instanceof SwitchPreference) {
SettingsJankMonitor.detectSwitchPreferenceClickJank(
getListView(), (SwitchPreference) preference);
}
return onPreferenceTreeClick(preference);
});
}
@Override
public void onResume() {
mVisibilityLoggerMixin.setSourceMetricsCategory(getActivity());

View File

@@ -16,12 +16,15 @@ package com.android.settings.core;
import android.content.Context;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import androidx.preference.TwoStatePreference;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.slices.SliceData;
import com.android.settings.widget.TwoStateButtonPreference;
import com.android.settingslib.PrimarySwitchPreference;
import com.android.settingslib.core.instrumentation.SettingsJankMonitor;
import com.android.settingslib.widget.MainSwitchPreference;
/**
* Abstract class that consolidates logic for updating toggle controllers.
@@ -50,6 +53,16 @@ public abstract class TogglePreferenceController extends BasePreferenceControlle
*/
public abstract boolean setChecked(boolean isChecked);
@Override
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
Preference preference = screen.findPreference(getPreferenceKey());
if (preference instanceof MainSwitchPreference) {
((MainSwitchPreference) preference).addOnSwitchChangeListener((switchView, isChecked) ->
SettingsJankMonitor.detectToggleJank(getPreferenceKey(), switchView));
}
}
@Override
public void updateState(Preference preference) {
if (preference instanceof TwoStatePreference) {

View File

@@ -32,6 +32,7 @@ import androidx.preference.TwoStatePreference;
import com.android.settings.R;
import com.android.settings.widget.SettingsMainSwitchBar.OnBeforeCheckedChangeListener;
import com.android.settingslib.RestrictedPreferenceHelper;
import com.android.settingslib.core.instrumentation.SettingsJankMonitor;
import com.android.settingslib.widget.OnMainSwitchChangeListener;
import com.google.android.setupdesign.util.LayoutStyler;
@@ -153,6 +154,7 @@ public class SettingsMainSwitchPreference extends TwoStatePreference implements
@Override
public void onSwitchChanged(Switch switchView, boolean isChecked) {
super.setChecked(isChecked);
SettingsJankMonitor.detectToggleJank(getKey(), switchView);
}
/**