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

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

Fix DND crash from SpringboardActivity

Special case Uris need to explicitly add their intents.
This unfortunately duplicates a list of special-cased Slices,
but I have attached a bug with a plan to address this duplicity in Q.

Change-Id: I346915c32543713d33716422018d7c950cce323d
Fixes: 80065409
Test: atest SliceDeepLinkSpringBoardTest
parent 2e0709b3
Loading
Loading
Loading
Loading
+12 −9
Original line number Diff line number Diff line
@@ -100,6 +100,17 @@ public class BluetoothSliceBuilder {
                .build();
    }

    public static Intent getIntent(Context context) {
        final String screenTitle = context.getText(R.string.bluetooth_settings_title).toString();
        final Uri contentUri = new Uri.Builder().appendPath(
                SettingsSlicesContract.KEY_BLUETOOTH).build();
        return DatabaseIndexingUtils.buildSearchResultPageIntent(context,
                BluetoothDashboardFragment.class.getName(), null /* key */, screenTitle,
                MetricsProto.MetricsEvent.SETTINGS_CONNECTED_DEVICE_CATEGORY)
                .setClassName(context.getPackageName(), SubSettings.class.getName())
                .setData(contentUri);
    }

    /**
     * Update the current Bluetooth status to the boolean value keyed by
     * {@link android.app.slice.Slice#EXTRA_TOGGLE_STATE} on {@param intent}.
@@ -122,15 +133,7 @@ public class BluetoothSliceBuilder {
    }

    private static PendingIntent getPrimaryAction(Context context) {
        final String screenTitle = context.getText(R.string.bluetooth_settings_title).toString();
        final Uri contentUri = new Uri.Builder().appendPath(
                SettingsSlicesContract.KEY_BLUETOOTH).build();
        final Intent intent = DatabaseIndexingUtils.buildSearchResultPageIntent(context,
                BluetoothDashboardFragment.class.getName(), null /* key */, screenTitle,
                MetricsProto.MetricsEvent.SETTINGS_CONNECTED_DEVICE_CATEGORY)
                .setClassName(context.getPackageName(), SubSettings.class.getName())
                .setData(contentUri);

        final Intent intent = getIntent(context);
        return PendingIntent.getActivity(context, 0 /* requestCode */,
                intent, 0 /* flags */);
    }
+5 −2
Original line number Diff line number Diff line
@@ -79,15 +79,18 @@ public class LocationSliceBuilder {
                .build();
    }

    private static PendingIntent getPrimaryAction(Context context) {
    public static Intent getIntent(Context context) {
        final String screenTitle = context.getText(R.string.location_settings_title).toString();
        final Uri contentUri = new Uri.Builder().appendPath(KEY_LOCATION).build();
        final Intent intent = DatabaseIndexingUtils.buildSearchResultPageIntent(context,
        return DatabaseIndexingUtils.buildSearchResultPageIntent(context,
                LocationSettings.class.getName(), KEY_LOCATION, screenTitle,
                MetricsEvent.LOCATION)
                .setClassName(context.getPackageName(), SubSettings.class.getName())
                .setData(contentUri);
    }

    private static PendingIntent getPrimaryAction(Context context) {
        final Intent intent = getIntent(context);
        return PendingIntent.getActivity(context, 0 /* requestCode */,
                intent, 0 /* flags */);
    }
+12 −10
Original line number Diff line number Diff line
@@ -123,6 +123,16 @@ public class ZenModeSliceBuilder {
        // handle it.
    }

    public static Intent getIntent(Context context) {
        final Uri contentUri = new Uri.Builder().appendPath(ZEN_MODE_KEY).build();
        final String screenTitle = context.getText(R.string.zen_mode_settings_title).toString();
        return DatabaseIndexingUtils.buildSearchResultPageIntent(context,
                ZenModeSettings.class.getName(), ZEN_MODE_KEY, screenTitle,
                MetricsEvent.NOTIFICATION_ZEN_MODE)
                .setClassName(context.getPackageName(), SubSettings.class.getName())
                .setData(contentUri);
    }

    private static boolean isZenModeEnabled(Context context) {
        final NotificationManager manager = context.getSystemService(NotificationManager.class);
        final int zenMode = manager.getZenMode();
@@ -139,16 +149,8 @@ public class ZenModeSliceBuilder {
    }

    private static PendingIntent getPrimaryAction(Context context) {
        final String screenTitle = context.getText(R.string.zen_mode_settings_title).toString();
        final Uri contentUri = new Uri.Builder().appendPath(ZEN_MODE_KEY).build();
        final Intent intent = DatabaseIndexingUtils.buildSearchResultPageIntent(context,
                ZenModeSettings.class.getName(), ZEN_MODE_KEY, screenTitle,
                MetricsEvent.NOTIFICATION_ZEN_MODE)
                .setClassName(context.getPackageName(), SubSettings.class.getName())
                .setData(contentUri);

        return PendingIntent.getActivity(context, 0 /* requestCode */,
                intent, 0 /* flags */);
        final Intent intent = getIntent(context);
        return PendingIntent.getActivity(context, 0 /* requestCode */, intent, 0 /* flags */);
    }

    private static PendingIntent getBroadcastIntent(Context context) {
+32 −5
Original line number Diff line number Diff line
@@ -18,8 +18,16 @@ import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;

import com.android.settings.bluetooth.BluetoothSliceBuilder;
import com.android.settings.location.LocationSliceBuilder;
import com.android.settings.notification.ZenModeSliceBuilder;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.wifi.WifiSliceBuilder;
import com.android.settings.wifi.calling.WifiCallingSliceHelper;

import java.net.URISyntaxException;

public class SliceDeepLinkSpringBoard extends Activity {
@@ -44,11 +52,26 @@ public class SliceDeepLinkSpringBoard extends Activity {
            if (ACTION_VIEW_SLICE.equals(intent.getAction())) {
                // This shouldn't matter since the slice is shown instead of the device
                // index caring about the launch uri.
                Uri slice = Uri.parse(intent.getStringExtra(EXTRA_SLICE));
                SlicesDatabaseAccessor slicesDatabaseAccessor = new SlicesDatabaseAccessor(this);
                final Uri slice = Uri.parse(intent.getStringExtra(EXTRA_SLICE));
                final Intent launchIntent;

                // TODO (b/80263568) Avoid duplicating this list of Slice Uris.
                if (WifiSliceBuilder.WIFI_URI.equals(slice)) {
                    launchIntent = WifiSliceBuilder.getIntent(this /* context */);
                } else if (ZenModeSliceBuilder.ZEN_MODE_URI.equals(slice)) {
                    launchIntent = ZenModeSliceBuilder.getIntent(this /* context */);
                } else if (BluetoothSliceBuilder.BLUETOOTH_URI.equals(slice)) {
                    launchIntent = BluetoothSliceBuilder.getIntent(this /* context */);
                } else if (LocationSliceBuilder.LOCATION_URI.equals(slice)) {
                    launchIntent = LocationSliceBuilder.getIntent(this /* context */);
                } else {
                    final SlicesDatabaseAccessor slicesDatabaseAccessor =
                            new SlicesDatabaseAccessor(this /* context */);
                    // Sadly have to block here because we don't know where to go.
                    final SliceData sliceData = slicesDatabaseAccessor.getSliceDataFromUri(slice);
                Intent launchIntent = SliceBuilderUtils.getContentIntent(this, sliceData);
                    launchIntent = SliceBuilderUtils.getContentIntent(this, sliceData);
                }

                startActivity(launchIntent);
            } else {
                startActivity(intent);
@@ -57,6 +80,10 @@ public class SliceDeepLinkSpringBoard extends Activity {
        } catch (URISyntaxException e) {
            Log.e(TAG, "Error decoding uri", e);
            finish();
        } catch (IllegalStateException e) {
            Log.w(TAG, "Couldn't launch Slice intent", e);
            startActivity(new Intent(Settings.ACTION_SETTINGS));
            finish();
        }
    }

+13 −8
Original line number Diff line number Diff line
@@ -121,6 +121,18 @@ public class WifiSliceBuilder {
        // handle it.
    }

    public static Intent getIntent(Context context) {
        final String screenTitle = context.getText(R.string.wifi_settings).toString();
        final Uri contentUri = new Uri.Builder().appendPath(KEY_WIFI).build();
        final Intent intent = DatabaseIndexingUtils.buildSearchResultPageIntent(context,
                WifiSettings.class.getName(), KEY_WIFI, screenTitle,
                MetricsEvent.DIALOG_WIFI_AP_EDIT)
                .setClassName(context.getPackageName(), SubSettings.class.getName())
                .setData(contentUri);

        return intent;
    }

    private static boolean isWifiEnabled(Context context) {
        final WifiManager wifiManager = context.getSystemService(WifiManager.class);

@@ -159,14 +171,7 @@ public class WifiSliceBuilder {
    }

    private static PendingIntent getPrimaryAction(Context context) {
        final String screenTitle = context.getText(R.string.wifi_settings).toString();
        final Uri contentUri = new Uri.Builder().appendPath(KEY_WIFI).build();
        final Intent intent = DatabaseIndexingUtils.buildSearchResultPageIntent(context,
                WifiSettings.class.getName(), KEY_WIFI, screenTitle,
                MetricsEvent.DIALOG_WIFI_AP_EDIT);
        intent.setClassName(context.getPackageName(), SubSettings.class.getName());
        intent.setData(contentUri);

        final Intent intent = getIntent(context);
        return PendingIntent.getActivity(context, 0 /* requestCode */,
                intent, 0 /* flags */);
    }
Loading