Loading src/com/android/settings/core/InstrumentedPreferenceFragment.java +15 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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. Loading @@ -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()); Loading src/com/android/settings/core/TogglePreferenceController.java +13 −0 Original line number Diff line number Diff line Loading @@ -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. Loading Loading @@ -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) { Loading src/com/android/settings/widget/SettingsMainSwitchPreference.java +2 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); } /** Loading tests/robotests/src/com/android/settings/notification/BubbleNotificationPreferenceControllerTest.java +9 −2 Original line number Diff line number Diff line Loading @@ -31,9 +31,11 @@ import static org.mockito.Mockito.when; import android.app.ActivityManager; import android.content.Context; import android.provider.Settings; import android.widget.Switch; import androidx.preference.PreferenceScreen; import com.android.settingslib.testutils.shadow.ShadowInteractionJankMonitor; import com.android.settingslib.widget.MainSwitchPreference; import org.junit.Before; Loading @@ -44,16 +46,21 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import org.robolectric.shadow.api.Shadow; import org.robolectric.shadows.ShadowActivityManager; @RunWith(RobolectricTestRunner.class) @Config(shadows = {ShadowInteractionJankMonitor.class}) public class BubbleNotificationPreferenceControllerTest { private Context mContext; @Mock(answer = Answers.RETURNS_DEEP_STUBS) private PreferenceScreen mScreen; @Mock private Switch mSwitch; private BubbleNotificationPreferenceController mController; private MainSwitchPreference mPreference; Loading Loading @@ -102,7 +109,7 @@ public class BubbleNotificationPreferenceControllerTest { public void onSwitchChanged_true_settingIsOff_flagShouldOn() { Settings.Global.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, OFF); mController.onSwitchChanged(null, true); mController.onSwitchChanged(mSwitch, true); assertThat(Settings.Global.getInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, OFF)).isEqualTo(ON); Loading @@ -112,7 +119,7 @@ public class BubbleNotificationPreferenceControllerTest { public void onSwitchChanged_false_settingIsOn_flagShouldOff() { Settings.Global.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, ON); mController.onSwitchChanged(null, false); mController.onSwitchChanged(mSwitch, false); assertThat(Settings.Global.getInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, ON)).isEqualTo(OFF); Loading tests/robotests/src/com/android/settings/notification/app/BlockPreferenceControllerTest.java +3 −1 Original line number Diff line number Diff line Loading @@ -17,7 +17,6 @@ package com.android.settings.notification.app; import static android.app.NotificationChannel.DEFAULT_CHANNEL_ID; import static android.app.NotificationManager.IMPORTANCE_DEFAULT; import static android.app.NotificationManager.IMPORTANCE_HIGH; import static android.app.NotificationManager.IMPORTANCE_LOW; import static android.app.NotificationManager.IMPORTANCE_NONE; Loading Loading @@ -49,6 +48,7 @@ import androidx.preference.PreferenceViewHolder; import com.android.settings.notification.NotificationBackend; import com.android.settings.widget.SettingsMainSwitchPreference; import com.android.settingslib.testutils.shadow.ShadowInteractionJankMonitor; import org.junit.Before; import org.junit.Test; Loading @@ -57,11 +57,13 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowApplication; import java.util.ArrayList; @RunWith(RobolectricTestRunner.class) @Config(shadows = {ShadowInteractionJankMonitor.class}) public class BlockPreferenceControllerTest { private Context mContext; Loading Loading
src/com/android/settings/core/InstrumentedPreferenceFragment.java +15 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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. Loading @@ -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()); Loading
src/com/android/settings/core/TogglePreferenceController.java +13 −0 Original line number Diff line number Diff line Loading @@ -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. Loading Loading @@ -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) { Loading
src/com/android/settings/widget/SettingsMainSwitchPreference.java +2 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); } /** Loading
tests/robotests/src/com/android/settings/notification/BubbleNotificationPreferenceControllerTest.java +9 −2 Original line number Diff line number Diff line Loading @@ -31,9 +31,11 @@ import static org.mockito.Mockito.when; import android.app.ActivityManager; import android.content.Context; import android.provider.Settings; import android.widget.Switch; import androidx.preference.PreferenceScreen; import com.android.settingslib.testutils.shadow.ShadowInteractionJankMonitor; import com.android.settingslib.widget.MainSwitchPreference; import org.junit.Before; Loading @@ -44,16 +46,21 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import org.robolectric.shadow.api.Shadow; import org.robolectric.shadows.ShadowActivityManager; @RunWith(RobolectricTestRunner.class) @Config(shadows = {ShadowInteractionJankMonitor.class}) public class BubbleNotificationPreferenceControllerTest { private Context mContext; @Mock(answer = Answers.RETURNS_DEEP_STUBS) private PreferenceScreen mScreen; @Mock private Switch mSwitch; private BubbleNotificationPreferenceController mController; private MainSwitchPreference mPreference; Loading Loading @@ -102,7 +109,7 @@ public class BubbleNotificationPreferenceControllerTest { public void onSwitchChanged_true_settingIsOff_flagShouldOn() { Settings.Global.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, OFF); mController.onSwitchChanged(null, true); mController.onSwitchChanged(mSwitch, true); assertThat(Settings.Global.getInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, OFF)).isEqualTo(ON); Loading @@ -112,7 +119,7 @@ public class BubbleNotificationPreferenceControllerTest { public void onSwitchChanged_false_settingIsOn_flagShouldOff() { Settings.Global.putInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, ON); mController.onSwitchChanged(null, false); mController.onSwitchChanged(mSwitch, false); assertThat(Settings.Global.getInt(mContext.getContentResolver(), NOTIFICATION_BUBBLES, ON)).isEqualTo(OFF); Loading
tests/robotests/src/com/android/settings/notification/app/BlockPreferenceControllerTest.java +3 −1 Original line number Diff line number Diff line Loading @@ -17,7 +17,6 @@ package com.android.settings.notification.app; import static android.app.NotificationChannel.DEFAULT_CHANNEL_ID; import static android.app.NotificationManager.IMPORTANCE_DEFAULT; import static android.app.NotificationManager.IMPORTANCE_HIGH; import static android.app.NotificationManager.IMPORTANCE_LOW; import static android.app.NotificationManager.IMPORTANCE_NONE; Loading Loading @@ -49,6 +48,7 @@ import androidx.preference.PreferenceViewHolder; import com.android.settings.notification.NotificationBackend; import com.android.settings.widget.SettingsMainSwitchPreference; import com.android.settingslib.testutils.shadow.ShadowInteractionJankMonitor; import org.junit.Before; import org.junit.Test; Loading @@ -57,11 +57,13 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowApplication; import java.util.ArrayList; @RunWith(RobolectricTestRunner.class) @Config(shadows = {ShadowInteractionJankMonitor.class}) public class BlockPreferenceControllerTest { private Context mContext; Loading