Return null when setting can't be changed.

If a Slice cannot be changed, return null instead of
an error slice.

Bug: 80155832
Test: robotestst
Change-Id: Ib94136c449c6d9c1911f89833bba62fd2263daa4
This commit is contained in:
Matthew Fritze
2018-05-22 18:24:06 -07:00
parent c4a3393b45
commit 417693021e
5 changed files with 31 additions and 67 deletions

View File

@@ -86,8 +86,13 @@ public class SliceBuilderUtils {
FeatureFactory.getFactory(context).getMetricsFeatureProvider() FeatureFactory.getFactory(context).getMetricsFeatureProvider()
.action(context, MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED, sliceNamePair); .action(context, MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED, sliceNamePair);
if (controller.getAvailabilityStatus() != AVAILABLE) { if (!controller.isAvailable()) {
return buildUnavailableSlice(context, sliceData, controller); // Cannot guarantee setting page is accessible, let the presenter handle error case.
return null;
}
if (controller.getAvailabilityStatus() == DISABLED_DEPENDENT_SETTING) {
return buildUnavailableSlice(context, sliceData);
} }
switch (sliceData.getSliceType()) { switch (sliceData.getSliceType()) {
@@ -176,14 +181,6 @@ public class SliceBuilderUtils {
return PendingIntent.getActivity(context, 0 /* requestCode */, intent, 0 /* flags */); return PendingIntent.getActivity(context, 0 /* requestCode */, intent, 0 /* flags */);
} }
/**
* @return {@link PendingIntent} to the Settings home page.
*/
public static PendingIntent getSettingsIntent(Context context) {
final Intent intent = new Intent(Settings.ACTION_SETTINGS);
return PendingIntent.getActivity(context, 0 /* requestCode */, intent, 0 /* flags */);
}
/** /**
* @return the summary text for a {@link Slice} built for {@param sliceData}. * @return the summary text for a {@link Slice} built for {@param sliceData}.
*/ */
@@ -355,40 +352,20 @@ public class SliceBuilderUtils {
return keywords; return keywords;
} }
private static Slice buildUnavailableSlice(Context context, SliceData data, private static Slice buildUnavailableSlice(Context context, SliceData data) {
BasePreferenceController controller) {
final String title = data.getTitle(); final String title = data.getTitle();
final List<String> keywords = buildSliceKeywords(data); final List<String> keywords = buildSliceKeywords(data);
@ColorInt final int color = Utils.getColorAccentDefaultColor(context); @ColorInt final int color = Utils.getColorAccentDefaultColor(context);
final String summary; final CharSequence summary = context.getText(R.string.disabled_dependent_setting_summary);
final SliceAction primaryAction;
final IconCompat icon = IconCompat.createWithResource(context, data.getIconResource()); final IconCompat icon = IconCompat.createWithResource(context, data.getIconResource());
final SliceAction primaryAction = new SliceAction(getContentPendingIntent(context, data),
switch (controller.getAvailabilityStatus()) { icon, title);
case UNSUPPORTED_ON_DEVICE:
summary = context.getString(R.string.unsupported_setting_summary);
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), icon,
title);
break;
case DISABLED_DEPENDENT_SETTING:
summary = context.getString(R.string.disabled_dependent_setting_summary);
primaryAction = new SliceAction(getContentPendingIntent(context, data), icon,
title);
break;
case CONDITIONALLY_UNAVAILABLE:
default:
summary = context.getString(R.string.unknown_unavailability_setting_summary);
primaryAction = new SliceAction(getSettingsIntent(context), icon, title);
}
return new ListBuilder(context, data.getUri(), ListBuilder.INFINITY) return new ListBuilder(context, data.getUri(), ListBuilder.INFINITY)
.setAccentColor(color) .setAccentColor(color)
.addRow(builder -> builder .addRow(builder -> builder
.setTitle(title) .setTitle(title)
.setTitleItem(icon)
.setSubtitle(summary) .setSubtitle(summary)
.setPrimaryAction(primaryAction)) .setPrimaryAction(primaryAction))
.setKeywords(keywords) .setKeywords(keywords)

View File

@@ -25,13 +25,14 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.net.Uri; import android.net.Uri;
import android.os.PersistableBundle; import android.os.PersistableBundle;
import androidx.core.graphics.drawable.IconCompat; import android.provider.Settings;
import android.telephony.CarrierConfigManager; import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import androidx.core.graphics.drawable.IconCompat;
import androidx.slice.Slice; import androidx.slice.Slice;
import androidx.slice.builders.ListBuilder; import androidx.slice.builders.ListBuilder;
import androidx.slice.builders.SliceAction; import androidx.slice.builders.SliceAction;
@@ -121,7 +122,7 @@ public class WifiCallingSliceHelper {
return getNonActionableWifiCallingSlice( return getNonActionableWifiCallingSlice(
mContext.getString(R.string.wifi_calling_settings_title), mContext.getString(R.string.wifi_calling_settings_title),
mContext.getString(R.string.wifi_calling_not_supported, carrierName), mContext.getString(R.string.wifi_calling_not_supported, carrierName),
sliceUri, SliceBuilderUtils.getSettingsIntent(mContext)); sliceUri, getSettingsIntent(mContext));
} }
final ImsManager imsManager = getImsManager(subId); final ImsManager imsManager = getImsManager(subId);
@@ -132,7 +133,7 @@ public class WifiCallingSliceHelper {
return getNonActionableWifiCallingSlice( return getNonActionableWifiCallingSlice(
mContext.getString(R.string.wifi_calling_settings_title), mContext.getString(R.string.wifi_calling_settings_title),
mContext.getString(R.string.wifi_calling_not_supported, carrierName), mContext.getString(R.string.wifi_calling_not_supported, carrierName),
sliceUri, SliceBuilderUtils.getSettingsIntent(mContext)); sliceUri, getSettingsIntent(mContext));
} }
try { try {
@@ -338,6 +339,14 @@ public class WifiCallingSliceHelper {
return intent; return intent;
} }
/**
* @return {@link PendingIntent} to the Settings home page.
*/
public static PendingIntent getSettingsIntent(Context context) {
final Intent intent = new Intent(Settings.ACTION_SETTINGS);
return PendingIntent.getActivity(context, 0 /* requestCode */, intent, 0 /* flags */);
}
private PendingIntent getBroadcastIntent(String action) { private PendingIntent getBroadcastIntent(String action) {
final Intent intent = new Intent(action); final Intent intent = new Intent(action);
intent.setClass(mContext, SliceBroadcastReceiver.class); intent.setClass(mContext, SliceBroadcastReceiver.class);

View File

@@ -336,7 +336,7 @@ public class SliceBuilderUtilsTest {
final Slice slice = SliceBuilderUtils.buildSlice(mContext, data); final Slice slice = SliceBuilderUtils.buildSlice(mContext, data);
SliceTester.testSettingsUnavailableSlice(mContext, slice, data); assertThat(slice).isNull();
} }
@Test @Test
@@ -349,7 +349,7 @@ public class SliceBuilderUtilsTest {
final Slice slice = SliceBuilderUtils.buildSlice(mContext, data); final Slice slice = SliceBuilderUtils.buildSlice(mContext, data);
SliceTester.testSettingsUnavailableSlice(mContext, slice, data); assertThat(slice).isNull();
} }
@Test @Test
@@ -394,7 +394,7 @@ public class SliceBuilderUtilsTest {
.isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME); .isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME);
assertThat(capturedLoggingPair.second) assertThat(capturedLoggingPair.second)
.isEqualTo(data.getKey()); .isEqualTo(data.getKey());
SliceTester.testSettingsUnavailableSlice(mContext, slice, data); assertThat(slice).isNull();
} }
@Test @Test
@@ -408,16 +408,6 @@ public class SliceBuilderUtilsTest {
assertThat(intentData).isEqualTo(expectedUri); assertThat(intentData).isEqualTo(expectedUri);
} }
@Test
public void getSettingsIntent_createsIntentToSettings() {
final Intent intent = new Intent(Settings.ACTION_SETTINGS);
final PendingIntent expectedIntent = PendingIntent.getActivity(mContext, 0, intent, 0);
final PendingIntent settingsIntent = SliceBuilderUtils.getSettingsIntent(mContext);
assertThat(expectedIntent).isEqualTo(settingsIntent);
}
private SliceData getDummyData() { private SliceData getDummyData() {
return getDummyData(TOGGLE_CONTROLLER, SUMMARY, SliceData.SliceType.SWITCH, SCREEN_TITLE); return getDummyData(TOGGLE_CONTROLLER, SUMMARY, SliceData.SliceType.SWITCH, SCREEN_TITLE);
} }

View File

@@ -191,20 +191,8 @@ public class SliceTester {
assertThat(toggles).isEmpty(); assertThat(toggles).isEmpty();
final PendingIntent primaryPendingIntent = metadata.getPrimaryAction().getAction(); final PendingIntent primaryPendingIntent = metadata.getPrimaryAction().getAction();
final int availabilityStatus = SliceBuilderUtils.getPreferenceController(context, assertThat(primaryPendingIntent).isEqualTo(SliceBuilderUtils.getContentPendingIntent(
sliceData).getAvailabilityStatus(); context, sliceData));
switch (availabilityStatus) {
case UNSUPPORTED_ON_DEVICE:
case CONDITIONALLY_UNAVAILABLE:
assertThat(primaryPendingIntent).isEqualTo(
SliceBuilderUtils.getSettingsIntent(context));
break;
case DISABLED_FOR_USER:
case DISABLED_DEPENDENT_SETTING:
assertThat(primaryPendingIntent).isEqualTo(
SliceBuilderUtils.getContentPendingIntent(context, sliceData));
break;
}
final List<SliceItem> sliceItems = slice.getItems(); final List<SliceItem> sliceItems = slice.getItems();
assertTitle(sliceItems, sliceData.getTitle()); assertTitle(sliceItems, sliceData.getTitle());

View File

@@ -114,7 +114,7 @@ public class WifiCallingSliceHelperTest {
final Slice slice = mWfcSliceHelper.createWifiCallingSlice(mWfcURI); final Slice slice = mWfcSliceHelper.createWifiCallingSlice(mWfcURI);
testWifiCallingSettingsUnavailableSlice(slice, null, testWifiCallingSettingsUnavailableSlice(slice, null,
SliceBuilderUtils.getSettingsIntent(mContext)); WifiCallingSliceHelper.getSettingsIntent(mContext));
} }
@Test @Test
@@ -125,7 +125,7 @@ public class WifiCallingSliceHelperTest {
assertThat(mWfcSliceHelper.getDefaultVoiceSubId()).isEqualTo(1); assertThat(mWfcSliceHelper.getDefaultVoiceSubId()).isEqualTo(1);
testWifiCallingSettingsUnavailableSlice(slice, null, testWifiCallingSettingsUnavailableSlice(slice, null,
SliceBuilderUtils.getSettingsIntent(mContext)); WifiCallingSliceHelper.getSettingsIntent(mContext));
} }
@Test @Test