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

Commit 41769302 authored by Matthew Fritze's avatar Matthew Fritze
Browse files

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
parent c4a3393b
Loading
Loading
Loading
Loading
+12 −35
Original line number Diff line number Diff line
@@ -86,8 +86,13 @@ public class SliceBuilderUtils {
        FeatureFactory.getFactory(context).getMetricsFeatureProvider()
                .action(context, MetricsEvent.ACTION_SETTINGS_SLICE_REQUESTED, sliceNamePair);

        if (controller.getAvailabilityStatus() != AVAILABLE) {
            return buildUnavailableSlice(context, sliceData, controller);
        if (!controller.isAvailable()) {
            // 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()) {
@@ -176,14 +181,6 @@ public class SliceBuilderUtils {
        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}.
     */
@@ -355,40 +352,20 @@ public class SliceBuilderUtils {
        return keywords;
    }

    private static Slice buildUnavailableSlice(Context context, SliceData data,
            BasePreferenceController controller) {
    private static Slice buildUnavailableSlice(Context context, SliceData data) {
        final String title = data.getTitle();
        final List<String> keywords = buildSliceKeywords(data);
        @ColorInt final int color = Utils.getColorAccentDefaultColor(context);
        final String summary;
        final SliceAction primaryAction;
        final CharSequence summary = context.getText(R.string.disabled_dependent_setting_summary);
        final IconCompat icon = IconCompat.createWithResource(context, data.getIconResource());

        switch (controller.getAvailabilityStatus()) {
            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);
        }
        final SliceAction primaryAction = new SliceAction(getContentPendingIntent(context, data),
                icon, title);

        return new ListBuilder(context, data.getUri(), ListBuilder.INFINITY)
                .setAccentColor(color)
                .addRow(builder -> builder
                        .setTitle(title)
                        .setTitleItem(icon)
                        .setSubtitle(summary)
                        .setPrimaryAction(primaryAction))
                .setKeywords(keywords)
+12 −3
Original line number Diff line number Diff line
@@ -25,13 +25,14 @@ import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.PersistableBundle;
import androidx.core.graphics.drawable.IconCompat;
import android.provider.Settings;
import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.Log;

import androidx.core.graphics.drawable.IconCompat;
import androidx.slice.Slice;
import androidx.slice.builders.ListBuilder;
import androidx.slice.builders.SliceAction;
@@ -121,7 +122,7 @@ public class WifiCallingSliceHelper {
            return getNonActionableWifiCallingSlice(
                    mContext.getString(R.string.wifi_calling_settings_title),
                    mContext.getString(R.string.wifi_calling_not_supported, carrierName),
                    sliceUri, SliceBuilderUtils.getSettingsIntent(mContext));
                    sliceUri, getSettingsIntent(mContext));
        }

        final ImsManager imsManager = getImsManager(subId);
@@ -132,7 +133,7 @@ public class WifiCallingSliceHelper {
            return getNonActionableWifiCallingSlice(
                    mContext.getString(R.string.wifi_calling_settings_title),
                    mContext.getString(R.string.wifi_calling_not_supported, carrierName),
                    sliceUri, SliceBuilderUtils.getSettingsIntent(mContext));
                    sliceUri, getSettingsIntent(mContext));
        }

        try {
@@ -338,6 +339,14 @@ public class WifiCallingSliceHelper {
        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) {
        final Intent intent = new Intent(action);
        intent.setClass(mContext, SliceBroadcastReceiver.class);
+3 −13
Original line number Diff line number Diff line
@@ -336,7 +336,7 @@ public class SliceBuilderUtilsTest {

        final Slice slice = SliceBuilderUtils.buildSlice(mContext, data);

        SliceTester.testSettingsUnavailableSlice(mContext, slice, data);
        assertThat(slice).isNull();
    }

    @Test
@@ -349,7 +349,7 @@ public class SliceBuilderUtilsTest {

        final Slice slice = SliceBuilderUtils.buildSlice(mContext, data);

        SliceTester.testSettingsUnavailableSlice(mContext, slice, data);
        assertThat(slice).isNull();
    }

    @Test
@@ -394,7 +394,7 @@ public class SliceBuilderUtilsTest {
                .isEqualTo(MetricsEvent.FIELD_SETTINGS_PREFERENCE_CHANGE_NAME);
        assertThat(capturedLoggingPair.second)
                .isEqualTo(data.getKey());
        SliceTester.testSettingsUnavailableSlice(mContext, slice, data);
        assertThat(slice).isNull();
    }

    @Test
@@ -408,16 +408,6 @@ public class SliceBuilderUtilsTest {
        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() {
        return getDummyData(TOGGLE_CONTROLLER, SUMMARY, SliceData.SliceType.SWITCH, SCREEN_TITLE);
    }
+2 −14
Original line number Diff line number Diff line
@@ -191,20 +191,8 @@ public class SliceTester {
        assertThat(toggles).isEmpty();

        final PendingIntent primaryPendingIntent = metadata.getPrimaryAction().getAction();
        final int availabilityStatus = SliceBuilderUtils.getPreferenceController(context,
                sliceData).getAvailabilityStatus();
        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;
        }
        assertThat(primaryPendingIntent).isEqualTo(SliceBuilderUtils.getContentPendingIntent(
                context, sliceData));

        final List<SliceItem> sliceItems = slice.getItems();
        assertTitle(sliceItems, sliceData.getTitle());
+2 −2
Original line number Diff line number Diff line
@@ -114,7 +114,7 @@ public class WifiCallingSliceHelperTest {
        final Slice slice = mWfcSliceHelper.createWifiCallingSlice(mWfcURI);

        testWifiCallingSettingsUnavailableSlice(slice, null,
                SliceBuilderUtils.getSettingsIntent(mContext));
                WifiCallingSliceHelper.getSettingsIntent(mContext));
    }

    @Test
@@ -125,7 +125,7 @@ public class WifiCallingSliceHelperTest {

        assertThat(mWfcSliceHelper.getDefaultVoiceSubId()).isEqualTo(1);
        testWifiCallingSettingsUnavailableSlice(slice, null,
                SliceBuilderUtils.getSettingsIntent(mContext));
                WifiCallingSliceHelper.getSettingsIntent(mContext));
    }

    @Test