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

Commit d820a388 authored by Fan Zhang's avatar Fan Zhang Committed by android-build-merger
Browse files

Merge "Log when settings slice is requested/updated." into pi-dev

am: 14007343

Change-Id: I1372aa2ad762593e0a499e96ce742bfccfdd9d0a
parents 5b5dfb94 14007343
Loading
Loading
Loading
Loading
+21 −2
Original line number Diff line number Diff line
@@ -32,10 +32,13 @@ import android.os.Handler;
import android.provider.SettingsSlicesContract;
import android.text.TextUtils;
import android.util.Log;
import android.util.Pair;

import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.core.SliderPreferenceController;
import com.android.settings.core.TogglePreferenceController;
import com.android.settings.overlay.FeatureFactory;

import androidx.slice.core.SliceHints;

@@ -92,7 +95,7 @@ public class SliceBroadcastReceiver extends BroadcastReceiver {
        }

        if (!controller.isAvailable()) {
            Log.d(TAG, "Can't update " + key + " since the setting is unavailable");
            Log.w(TAG, "Can't update " + key + " since the setting is unavailable");
            updateUri(context, key, isPlatformSlice);
        }

@@ -100,7 +103,9 @@ public class SliceBroadcastReceiver extends BroadcastReceiver {
        // so that it's automatically broadcast to any slice.
        final TogglePreferenceController toggleController = (TogglePreferenceController) controller;
        final boolean currentValue = toggleController.isChecked();
        toggleController.setChecked(!currentValue);
        final boolean newValue = !currentValue;
        toggleController.setChecked(newValue);
        logSliceValueChange(context, key, newValue ? 1 : 0);
        updateUri(context, key, isPlatformSlice);
    }

@@ -129,6 +134,20 @@ public class SliceBroadcastReceiver extends BroadcastReceiver {
        }

        sliderController.setSliderPosition(newPosition);
        logSliceValueChange(context, key, newPosition);
    }

    /**
     * Log Slice value update events into MetricsFeatureProvider. The logging schema generally
     * follows the pattern in SharedPreferenceLogger.
     */
    private void logSliceValueChange(Context context, String sliceKey, int newValue) {
        final Pair<Integer, Object> namePair = Pair.create(
                MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME, sliceKey);
        final Pair<Integer, Object> valuePair = Pair.create(
                MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_INT_VALUE, newValue);
        FeatureFactory.getFactory(context).getMetricsFeatureProvider()
                .action(context, MetricsEvent.ACTION_SETTINGS_SLICE_CHANGED, namePair, valuePair);
    }

    private BasePreferenceController getPreferenceController(Context context, String key) {
+10 −4
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.settings.slices;

import static androidx.slice.builders.ListBuilder.ICON_IMAGE;
import static com.android.settings.core.BasePreferenceController.DISABLED_DEPENDENT_SETTING;
import static com.android.settings.core.BasePreferenceController.DISABLED_FOR_USER;
import static com.android.settings.core.BasePreferenceController.DISABLED_UNSUPPORTED;
@@ -23,8 +24,6 @@ import static com.android.settings.core.BasePreferenceController.UNAVAILABLE_UNK
import static com.android.settings.slices.SettingsSliceProvider.EXTRA_SLICE_KEY;
import static com.android.settings.slices.SettingsSliceProvider.EXTRA_SLICE_PLATFORM_DEFINED;

import static androidx.slice.builders.ListBuilder.ICON_IMAGE;

import android.app.PendingIntent;
import android.content.ContentResolver;
import android.content.Context;
@@ -37,17 +36,19 @@ import android.text.TextUtils;
import android.util.Pair;

import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
import com.android.settings.SubSettings;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.core.SliderPreferenceController;
import com.android.settings.core.TogglePreferenceController;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.search.DatabaseIndexingUtils;
import com.android.settingslib.core.AbstractPreferenceController;

import androidx.slice.Slice;
import androidx.slice.builders.SliceAction;
import androidx.slice.builders.ListBuilder;
import androidx.slice.builders.SliceAction;


/**
@@ -67,7 +68,12 @@ public class SliceBuilderUtils {
     */
    public static Slice buildSlice(Context context, SliceData sliceData) {
        final BasePreferenceController controller = getPreferenceController(context, sliceData);

        final Pair<Integer, Object> sliceNamePair =
                Pair.create(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME, sliceData.getKey());
        // Log Slice requests using the same schema as SharedPreferenceLogger (but with a different
        // action name).
        FeatureFactory.getFactory(context).getMetricsFeatureProvider()
                .action(context, MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED, sliceNamePair);
        if (!controller.isAvailable()) {
            return buildUnavailableSlice(context, sliceData, controller);
        }
+50 −13
Original line number Diff line number Diff line
@@ -18,12 +18,16 @@
package com.android.settings.slices;

import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verify;

import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.util.Pair;

import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.search.FakeIndexProvider;
import com.android.settings.search.SearchFeatureProvider;
import com.android.settings.search.SearchFeatureProviderImpl;
@@ -37,6 +41,7 @@ import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.robolectric.RuntimeEnvironment;

import androidx.slice.core.SliceHints;
@@ -56,6 +61,8 @@ public class SliceBroadcastReceiverTest {
    private SliceBroadcastReceiver mReceiver;
    private SearchFeatureProvider mSearchFeatureProvider;
    private FakeFeatureFactory mFakeFeatureFactory;
    private ArgumentCaptor<Pair<Integer, Object>> mLoggingNameArgumentCatpor;
    private ArgumentCaptor<Pair<Integer, Object>> mLoggingValueArgumentCatpor;

    @Before
    public void setUp() {
@@ -67,6 +74,8 @@ public class SliceBroadcastReceiverTest {
        mSearchFeatureProvider = new SearchFeatureProviderImpl();
        mFakeFeatureFactory = FakeFeatureFactory.setupForTest();
        mFakeFeatureFactory.searchFeatureProvider = mSearchFeatureProvider;
        mLoggingNameArgumentCatpor = ArgumentCaptor.forClass(Pair.class);
        mLoggingValueArgumentCatpor = ArgumentCaptor.forClass(Pair.class);
    }

    @After
@@ -75,8 +84,8 @@ public class SliceBroadcastReceiverTest {
    }

    @Test
    public void testOnReceive_toggleChanged() {
        String key = "key";
    public void onReceive_toggleChanged() {
        final String key = "key";
        mSearchFeatureProvider.getSearchIndexableResources().getProviderValues().clear();
        insertSpecialCase(key);
        // Turn on toggle setting
@@ -91,11 +100,25 @@ public class SliceBroadcastReceiverTest {
        mReceiver.onReceive(mContext, intent);

        assertThat(fakeToggleController.isChecked()).isFalse();
        verify(mFakeFeatureFactory.metricsFeatureProvider)
                .action(eq(mContext),
                        eq(MetricsEvent.ACTION_SETTINGS_SLICE_CHANGED),
                        mLoggingNameArgumentCatpor.capture(),
                        mLoggingValueArgumentCatpor.capture());

        final Pair<Integer, Object> namePair = mLoggingNameArgumentCatpor.getValue();
        final Pair<Integer, Object> valuePair = mLoggingValueArgumentCatpor.getValue();
        assertThat(namePair.first).isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME);
        assertThat(namePair.second).isEqualTo(fakeToggleController.getPreferenceKey());

        assertThat(valuePair.first)
                .isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_INT_VALUE);
        assertThat(valuePair.second).isEqualTo(0);
    }

    @Test
    public void testOnReceive_sliderChanged() {
        String key = "key";
    public void onReceive_sliderChanged() {
        final String key = "key";
        final int position = FakeSliderController.MAX_STEPS - 1;
        final int oldPosition = FakeSliderController.MAX_STEPS;
        mSearchFeatureProvider.getSearchIndexableResources().getProviderValues().clear();
@@ -115,11 +138,25 @@ public class SliceBroadcastReceiverTest {
        mReceiver.onReceive(mContext, intent);

        assertThat(fakeSliderController.getSliderPosition()).isEqualTo(position);
        verify(mFakeFeatureFactory.metricsFeatureProvider)
                .action(eq(mContext),
                        eq(MetricsEvent.ACTION_SETTINGS_SLICE_CHANGED),
                        mLoggingNameArgumentCatpor.capture(),
                        mLoggingValueArgumentCatpor.capture());

        final Pair<Integer, Object> namePair = mLoggingNameArgumentCatpor.getValue();
        final Pair<Integer, Object> valuePair = mLoggingValueArgumentCatpor.getValue();
        assertThat(namePair.first).isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME);
        assertThat(namePair.second).isEqualTo(key);

        assertThat(valuePair.first)
                .isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_INT_VALUE);
        assertThat(valuePair.second).isEqualTo(position);
    }

    @Test(expected = IllegalArgumentException.class)
    public void testOnReceive_invalidController_throwsException() {
        String key = "key";
    public void onReceive_invalidController_throwsException() {
        final String key = "key";
        final int position = 0;
        mSearchFeatureProvider.getSearchIndexableResources().getProviderValues().clear();
        insertSpecialCase(FakeToggleController.class, key);
@@ -136,8 +173,8 @@ public class SliceBroadcastReceiverTest {
    @Test(expected = IllegalArgumentException.class)
    public void sliderOnReceive_noKey_throwsException() {
        // Build action
        Intent intent = new Intent(SettingsSliceProvider.ACTION_SLIDER_CHANGED);
        intent.putExtra(SliceHints.EXTRA_RANGE_VALUE, 0);
        final Intent intent = new Intent(SettingsSliceProvider.ACTION_SLIDER_CHANGED)
                .putExtra(SliceHints.EXTRA_RANGE_VALUE, 0);

        // Trigger the exception.
        mReceiver.onReceive(mContext, intent);
@@ -145,14 +182,14 @@ public class SliceBroadcastReceiverTest {

    @Test(expected = IllegalStateException.class)
    public void toggleOnReceive_noExtra_illegalStateException() {
        Intent intent = new Intent(SettingsSliceProvider.ACTION_TOGGLE_CHANGED);
        final Intent intent = new Intent(SettingsSliceProvider.ACTION_TOGGLE_CHANGED);
        mReceiver.onReceive(mContext, intent);
    }

    @Test(expected = IllegalStateException.class)
    public void toggleOnReceive_emptyKey_throwsIllegalStateException() {
        Intent intent = new Intent(SettingsSliceProvider.ACTION_TOGGLE_CHANGED);
        intent.putExtra(SettingsSliceProvider.EXTRA_SLICE_KEY, (String) null);
        final Intent intent = new Intent(SettingsSliceProvider.ACTION_TOGGLE_CHANGED)
                .putExtra(SettingsSliceProvider.EXTRA_SLICE_KEY, (String) null);
        mReceiver.onReceive(mContext, intent);
    }

+83 −45

File changed.

Preview size limit exceeded, changes collapsed.