Loading src/com/android/settings/slices/SliceBroadcastReceiver.java +7 −7 Original line number Diff line number Diff line Loading @@ -59,10 +59,11 @@ public class SliceBroadcastReceiver extends BroadcastReceiver { switch (action) { case ACTION_TOGGLE_CHANGED: handleToggleAction(context, key, isPlatformSlice); final boolean isChecked = intent.getBooleanExtra(Slice.EXTRA_TOGGLE_STATE, false); handleToggleAction(context, key, isChecked, isPlatformSlice); break; case ACTION_SLIDER_CHANGED: int newPosition = intent.getIntExtra(Slice.EXTRA_RANGE_VALUE, -1); final int newPosition = intent.getIntExtra(Slice.EXTRA_RANGE_VALUE, -1); handleSliderAction(context, key, newPosition, isPlatformSlice); break; case ACTION_WIFI_CHANGED: Loading @@ -81,7 +82,8 @@ public class SliceBroadcastReceiver extends BroadcastReceiver { } } private void handleToggleAction(Context context, String key, boolean isPlatformSlice) { private void handleToggleAction(Context context, String key, boolean isChecked, boolean isPlatformSlice) { if (TextUtils.isEmpty(key)) { throw new IllegalStateException("No key passed to Intent for toggle controller"); } Loading @@ -101,10 +103,8 @@ public class SliceBroadcastReceiver extends BroadcastReceiver { // TODO post context.getContentResolver().notifyChanged(uri, null) in the Toggle controller // so that it's automatically broadcast to any slice. final TogglePreferenceController toggleController = (TogglePreferenceController) controller; final boolean currentValue = toggleController.isChecked(); final boolean newValue = !currentValue; toggleController.setChecked(newValue); logSliceValueChange(context, key, newValue ? 1 : 0); toggleController.setChecked(isChecked); logSliceValueChange(context, key, isChecked ? 1 : 0); updateUri(context, key, isPlatformSlice); } Loading src/com/android/settings/slices/SliceBuilderUtils.java +28 −25 Original line number Diff line number Diff line Loading @@ -16,8 +16,6 @@ package com.android.settings.slices; import static androidx.slice.builders.ListBuilder.ICON_IMAGE; import static com.android.settings.core.BasePreferenceController.AVAILABLE; import static com.android.settings.core.BasePreferenceController.DISABLED_DEPENDENT_SETTING; import static com.android.settings.core.BasePreferenceController.DISABLED_FOR_USER; Loading @@ -31,7 +29,6 @@ import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.drawable.Icon; import android.net.Uri; import android.provider.SettingsSlicesContract; import android.text.TextUtils; Loading Loading @@ -63,6 +60,9 @@ public class SliceBuilderUtils { private static final String TAG = "SliceBuilder"; // A Slice should not be store for longer than 60,000 milliseconds / 1 minute. public static final long SLICE_TTL_MILLIS = 60000; /** * Build a Slice from {@link SliceData}. * Loading Loading @@ -225,19 +225,19 @@ public class SliceBuilderUtils { private static Slice buildToggleSlice(Context context, SliceData sliceData, BasePreferenceController controller) { final PendingIntent contentIntent = getContentPendingIntent(context, sliceData); final Icon icon = Icon.createWithResource(context, sliceData.getIconResource()); final IconCompat icon = IconCompat.createWithResource(context, sliceData.getIconResource()); final CharSequence subtitleText = getSubtitleText(context, controller, sliceData); final TogglePreferenceController toggleController = (TogglePreferenceController) controller; final SliceAction sliceAction = getToggleAction(context, sliceData, toggleController.isChecked()); return new ListBuilder(context, sliceData.getUri()) return new ListBuilder(context, sliceData.getUri(), SLICE_TTL_MILLIS) .addRow(rowBuilder -> rowBuilder .setTitle(sliceData.getTitle()) .setTitleItem(icon, ICON_IMAGE) .setSubtitle(subtitleText) .setPrimaryAction(new SliceAction(contentIntent, (IconCompat) null, null)) .setPrimaryAction( new SliceAction(contentIntent, icon, sliceData.getTitle())) .addEndItem(sliceAction)) .build(); } Loading @@ -245,29 +245,34 @@ public class SliceBuilderUtils { private static Slice buildIntentSlice(Context context, SliceData sliceData, BasePreferenceController controller) { final PendingIntent contentIntent = getContentPendingIntent(context, sliceData); final Icon icon = Icon.createWithResource(context, sliceData.getIconResource()); final IconCompat icon = IconCompat.createWithResource(context, sliceData.getIconResource()); final CharSequence subtitleText = getSubtitleText(context, controller, sliceData); return new ListBuilder(context, sliceData.getUri()) return new ListBuilder(context, sliceData.getUri(), SLICE_TTL_MILLIS) .addRow(rowBuilder -> rowBuilder .setTitle(sliceData.getTitle()) .setTitleItem(icon, ICON_IMAGE) .setSubtitle(subtitleText) .setPrimaryAction(new SliceAction(contentIntent, (IconCompat) null, null))) .setPrimaryAction( new SliceAction(contentIntent, icon, sliceData.getTitle()))) .build(); } private static Slice buildSliderSlice(Context context, SliceData sliceData, BasePreferenceController controller) { final SliderPreferenceController sliderController = (SliderPreferenceController) controller; final SliderPreferenceController sliderController = (SliderPreferenceController) controller; final PendingIntent actionIntent = getSliderAction(context, sliceData); return new ListBuilder(context, sliceData.getUri()) final PendingIntent contentIntent = getContentPendingIntent(context, sliceData); final IconCompat icon = IconCompat.createWithResource(context, sliceData.getIconResource()); final SliceAction primaryAction = new SliceAction(contentIntent, icon, sliceData.getTitle()); return new ListBuilder(context, sliceData.getUri(), SLICE_TTL_MILLIS) .addInputRange(builder -> builder .setTitle(sliceData.getTitle()) .setMax(sliderController.getMaxSteps()) .setValue(sliderController.getSliderPosition()) .setAction(actionIntent)) .setInputAction(actionIntent) .setPrimaryAction(primaryAction)) .build(); } Loading Loading @@ -311,32 +316,30 @@ public class SliceBuilderUtils { final String title = data.getTitle(); final String summary; final SliceAction primaryAction; final IconCompat icon = IconCompat.createWithResource(context, data.getIconResource()); switch (controller.getAvailabilityStatus()) { case DISABLED_UNSUPPORTED: summary = context.getString(R.string.unsupported_setting_summary); primaryAction = new SliceAction(getSettingsIntent(context), (IconCompat) null /* actionIcon */, null /* actionTitle */); primaryAction = new SliceAction(getSettingsIntent(context), icon, title); break; case DISABLED_FOR_USER: summary = context.getString(R.string.disabled_for_user_setting_summary); primaryAction = new SliceAction(getContentPendingIntent(context, data), (IconCompat) null /* actionIcon */, null /* actionTitle */); primaryAction = new SliceAction(getContentPendingIntent(context, data), icon, title); break; case DISABLED_DEPENDENT_SETTING: summary = context.getString(R.string.disabled_dependent_setting_summary); primaryAction = new SliceAction(getContentPendingIntent(context, data), (IconCompat) null /* actionIcon */, null /* actionTitle */); primaryAction = new SliceAction(getContentPendingIntent(context, data), icon, title); break; case UNAVAILABLE_UNKNOWN: default: summary = context.getString(R.string.unknown_unavailability_setting_summary); primaryAction = new SliceAction(getSettingsIntent(context), (IconCompat) null /* actionIcon */, null /* actionTitle */); primaryAction = new SliceAction(getSettingsIntent(context), icon, title); } return new ListBuilder(context, data.getUri()) return new ListBuilder(context, data.getUri(), SLICE_TTL_MILLIS) .addRow(builder -> builder .setTitle(title) .setSubtitle(summary) Loading tests/robotests/src/com/android/settings/testutils/SliceTester.java +11 −6 Original line number Diff line number Diff line Loading @@ -115,8 +115,9 @@ public class SliceTester { sliceData.getIconResource()); // Check primary intent final SliceAction primaryAction = metadata.getPrimaryAction(); assertThat(primaryAction).isNull(); final PendingIntent primaryPendingIntent = metadata.getPrimaryAction().getAction(); assertThat(primaryPendingIntent).isEqualTo( SliceBuilderUtils.getContentPendingIntent(context, sliceData)); final List<SliceItem> sliceItems = slice.getItems(); assertTitle(sliceItems, sliceData.getTitle()); Loading Loading @@ -158,11 +159,15 @@ public class SliceTester { private static void assertTitle(List<SliceItem> sliceItems, String title) { boolean hasTitle = false; for (SliceItem item : sliceItems) { List<SliceItem> titles = SliceQuery.findAll(item, FORMAT_TEXT, HINT_TITLE, List<SliceItem> titleItems = SliceQuery.findAll(item, FORMAT_TEXT, HINT_TITLE, null /* non-hints */); if (titles != null & titles.size() == 1) { assertThat(titles.get(0).getText()).isEqualTo(title); if (titleItems == null) { continue; } hasTitle = true; for (SliceItem subTitleItem : titleItems) { assertThat(subTitleItem.getText()).isEqualTo(title); } } assertThat(hasTitle).isTrue(); Loading Loading
src/com/android/settings/slices/SliceBroadcastReceiver.java +7 −7 Original line number Diff line number Diff line Loading @@ -59,10 +59,11 @@ public class SliceBroadcastReceiver extends BroadcastReceiver { switch (action) { case ACTION_TOGGLE_CHANGED: handleToggleAction(context, key, isPlatformSlice); final boolean isChecked = intent.getBooleanExtra(Slice.EXTRA_TOGGLE_STATE, false); handleToggleAction(context, key, isChecked, isPlatformSlice); break; case ACTION_SLIDER_CHANGED: int newPosition = intent.getIntExtra(Slice.EXTRA_RANGE_VALUE, -1); final int newPosition = intent.getIntExtra(Slice.EXTRA_RANGE_VALUE, -1); handleSliderAction(context, key, newPosition, isPlatformSlice); break; case ACTION_WIFI_CHANGED: Loading @@ -81,7 +82,8 @@ public class SliceBroadcastReceiver extends BroadcastReceiver { } } private void handleToggleAction(Context context, String key, boolean isPlatformSlice) { private void handleToggleAction(Context context, String key, boolean isChecked, boolean isPlatformSlice) { if (TextUtils.isEmpty(key)) { throw new IllegalStateException("No key passed to Intent for toggle controller"); } Loading @@ -101,10 +103,8 @@ public class SliceBroadcastReceiver extends BroadcastReceiver { // TODO post context.getContentResolver().notifyChanged(uri, null) in the Toggle controller // so that it's automatically broadcast to any slice. final TogglePreferenceController toggleController = (TogglePreferenceController) controller; final boolean currentValue = toggleController.isChecked(); final boolean newValue = !currentValue; toggleController.setChecked(newValue); logSliceValueChange(context, key, newValue ? 1 : 0); toggleController.setChecked(isChecked); logSliceValueChange(context, key, isChecked ? 1 : 0); updateUri(context, key, isPlatformSlice); } Loading
src/com/android/settings/slices/SliceBuilderUtils.java +28 −25 Original line number Diff line number Diff line Loading @@ -16,8 +16,6 @@ package com.android.settings.slices; import static androidx.slice.builders.ListBuilder.ICON_IMAGE; import static com.android.settings.core.BasePreferenceController.AVAILABLE; import static com.android.settings.core.BasePreferenceController.DISABLED_DEPENDENT_SETTING; import static com.android.settings.core.BasePreferenceController.DISABLED_FOR_USER; Loading @@ -31,7 +29,6 @@ import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.drawable.Icon; import android.net.Uri; import android.provider.SettingsSlicesContract; import android.text.TextUtils; Loading Loading @@ -63,6 +60,9 @@ public class SliceBuilderUtils { private static final String TAG = "SliceBuilder"; // A Slice should not be store for longer than 60,000 milliseconds / 1 minute. public static final long SLICE_TTL_MILLIS = 60000; /** * Build a Slice from {@link SliceData}. * Loading Loading @@ -225,19 +225,19 @@ public class SliceBuilderUtils { private static Slice buildToggleSlice(Context context, SliceData sliceData, BasePreferenceController controller) { final PendingIntent contentIntent = getContentPendingIntent(context, sliceData); final Icon icon = Icon.createWithResource(context, sliceData.getIconResource()); final IconCompat icon = IconCompat.createWithResource(context, sliceData.getIconResource()); final CharSequence subtitleText = getSubtitleText(context, controller, sliceData); final TogglePreferenceController toggleController = (TogglePreferenceController) controller; final SliceAction sliceAction = getToggleAction(context, sliceData, toggleController.isChecked()); return new ListBuilder(context, sliceData.getUri()) return new ListBuilder(context, sliceData.getUri(), SLICE_TTL_MILLIS) .addRow(rowBuilder -> rowBuilder .setTitle(sliceData.getTitle()) .setTitleItem(icon, ICON_IMAGE) .setSubtitle(subtitleText) .setPrimaryAction(new SliceAction(contentIntent, (IconCompat) null, null)) .setPrimaryAction( new SliceAction(contentIntent, icon, sliceData.getTitle())) .addEndItem(sliceAction)) .build(); } Loading @@ -245,29 +245,34 @@ public class SliceBuilderUtils { private static Slice buildIntentSlice(Context context, SliceData sliceData, BasePreferenceController controller) { final PendingIntent contentIntent = getContentPendingIntent(context, sliceData); final Icon icon = Icon.createWithResource(context, sliceData.getIconResource()); final IconCompat icon = IconCompat.createWithResource(context, sliceData.getIconResource()); final CharSequence subtitleText = getSubtitleText(context, controller, sliceData); return new ListBuilder(context, sliceData.getUri()) return new ListBuilder(context, sliceData.getUri(), SLICE_TTL_MILLIS) .addRow(rowBuilder -> rowBuilder .setTitle(sliceData.getTitle()) .setTitleItem(icon, ICON_IMAGE) .setSubtitle(subtitleText) .setPrimaryAction(new SliceAction(contentIntent, (IconCompat) null, null))) .setPrimaryAction( new SliceAction(contentIntent, icon, sliceData.getTitle()))) .build(); } private static Slice buildSliderSlice(Context context, SliceData sliceData, BasePreferenceController controller) { final SliderPreferenceController sliderController = (SliderPreferenceController) controller; final SliderPreferenceController sliderController = (SliderPreferenceController) controller; final PendingIntent actionIntent = getSliderAction(context, sliceData); return new ListBuilder(context, sliceData.getUri()) final PendingIntent contentIntent = getContentPendingIntent(context, sliceData); final IconCompat icon = IconCompat.createWithResource(context, sliceData.getIconResource()); final SliceAction primaryAction = new SliceAction(contentIntent, icon, sliceData.getTitle()); return new ListBuilder(context, sliceData.getUri(), SLICE_TTL_MILLIS) .addInputRange(builder -> builder .setTitle(sliceData.getTitle()) .setMax(sliderController.getMaxSteps()) .setValue(sliderController.getSliderPosition()) .setAction(actionIntent)) .setInputAction(actionIntent) .setPrimaryAction(primaryAction)) .build(); } Loading Loading @@ -311,32 +316,30 @@ public class SliceBuilderUtils { final String title = data.getTitle(); final String summary; final SliceAction primaryAction; final IconCompat icon = IconCompat.createWithResource(context, data.getIconResource()); switch (controller.getAvailabilityStatus()) { case DISABLED_UNSUPPORTED: summary = context.getString(R.string.unsupported_setting_summary); primaryAction = new SliceAction(getSettingsIntent(context), (IconCompat) null /* actionIcon */, null /* actionTitle */); primaryAction = new SliceAction(getSettingsIntent(context), icon, title); break; case DISABLED_FOR_USER: summary = context.getString(R.string.disabled_for_user_setting_summary); primaryAction = new SliceAction(getContentPendingIntent(context, data), (IconCompat) null /* actionIcon */, null /* actionTitle */); primaryAction = new SliceAction(getContentPendingIntent(context, data), icon, title); break; case DISABLED_DEPENDENT_SETTING: summary = context.getString(R.string.disabled_dependent_setting_summary); primaryAction = new SliceAction(getContentPendingIntent(context, data), (IconCompat) null /* actionIcon */, null /* actionTitle */); primaryAction = new SliceAction(getContentPendingIntent(context, data), icon, title); break; case UNAVAILABLE_UNKNOWN: default: summary = context.getString(R.string.unknown_unavailability_setting_summary); primaryAction = new SliceAction(getSettingsIntent(context), (IconCompat) null /* actionIcon */, null /* actionTitle */); primaryAction = new SliceAction(getSettingsIntent(context), icon, title); } return new ListBuilder(context, data.getUri()) return new ListBuilder(context, data.getUri(), SLICE_TTL_MILLIS) .addRow(builder -> builder .setTitle(title) .setSubtitle(summary) Loading
tests/robotests/src/com/android/settings/testutils/SliceTester.java +11 −6 Original line number Diff line number Diff line Loading @@ -115,8 +115,9 @@ public class SliceTester { sliceData.getIconResource()); // Check primary intent final SliceAction primaryAction = metadata.getPrimaryAction(); assertThat(primaryAction).isNull(); final PendingIntent primaryPendingIntent = metadata.getPrimaryAction().getAction(); assertThat(primaryPendingIntent).isEqualTo( SliceBuilderUtils.getContentPendingIntent(context, sliceData)); final List<SliceItem> sliceItems = slice.getItems(); assertTitle(sliceItems, sliceData.getTitle()); Loading Loading @@ -158,11 +159,15 @@ public class SliceTester { private static void assertTitle(List<SliceItem> sliceItems, String title) { boolean hasTitle = false; for (SliceItem item : sliceItems) { List<SliceItem> titles = SliceQuery.findAll(item, FORMAT_TEXT, HINT_TITLE, List<SliceItem> titleItems = SliceQuery.findAll(item, FORMAT_TEXT, HINT_TITLE, null /* non-hints */); if (titles != null & titles.size() == 1) { assertThat(titles.get(0).getText()).isEqualTo(title); if (titleItems == null) { continue; } hasTitle = true; for (SliceItem subTitleItem : titleItems) { assertThat(subTitleItem.getText()).isEqualTo(title); } } assertThat(hasTitle).isTrue(); Loading