Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a47f9bb1 authored by Chaohui Wang's avatar Chaohui Wang Committed by Android (Google) Code Review
Browse files

Merge "Add the jank detection to Settings toggles" into tm-dev

parents 2b9dd10f 692068d5
Loading
Loading
Loading
Loading
+15 −1
Original line number Diff line number Diff line
@@ -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());
+13 −0
Original line number Diff line number Diff line
@@ -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) {
+2 −0
Original line number Diff line number Diff line
@@ -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);
    }

    /**
+9 −2
Original line number Diff line number Diff line
@@ -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;
@@ -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;

@@ -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);
@@ -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);
+3 −1
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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