Loading src/com/android/settings/slices/SliceBroadcastReceiver.java +21 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); } Loading @@ -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); } Loading Loading @@ -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) { Loading src/com/android/settings/slices/SliceBuilderUtils.java +10 −4 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; /** Loading @@ -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); } Loading tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java +50 −13 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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() { Loading @@ -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 Loading @@ -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 Loading @@ -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(); Loading @@ -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); Loading @@ -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); Loading @@ -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); } Loading tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java +83 −45 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
src/com/android/settings/slices/SliceBroadcastReceiver.java +21 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); } Loading @@ -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); } Loading Loading @@ -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) { Loading
src/com/android/settings/slices/SliceBuilderUtils.java +10 −4 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; /** Loading @@ -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); } Loading
tests/robotests/src/com/android/settings/slices/SliceBroadcastReceiverTest.java +50 −13 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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() { Loading @@ -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 Loading @@ -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 Loading @@ -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(); Loading @@ -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); Loading @@ -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); Loading @@ -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); } Loading
tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java +83 −45 File changed.Preview size limit exceeded, changes collapsed. Show changes