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:
@@ -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)
|
||||||
|
@@ -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);
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
@@ -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());
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user