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

Commit 51f8e62e authored by Matt Pietal's avatar Matt Pietal
Browse files

Prevent bad intents from crashing sysui

Smartspace could potentially send Intents that don't resolve, which
will crash sysui. Log a warning. Also register an event notifier to
let the SmartspaceSession know of a user action.

Bug: 208350043
Test: atest LockscreenSmartspaceControllerTest + manual (use new
smartspace flashlight off content)

Change-Id: Ife517864c6933bc2d6ef01c28ec97363d9ebfbd7
parent 6dbbb855
Loading
Loading
Loading
Loading
+11 −4
Original line number Diff line number Diff line
@@ -20,9 +20,11 @@ import android.app.PendingIntent;
import android.app.smartspace.SmartspaceAction;
import android.app.smartspace.SmartspaceTarget;
import android.app.smartspace.SmartspaceTargetEvent;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.os.Parcelable;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;

@@ -39,6 +41,7 @@ import java.util.List;
public interface BcSmartspaceDataPlugin extends Plugin {
    String ACTION = "com.android.systemui.action.PLUGIN_BC_SMARTSPACE_DATA";
    int VERSION = 1;
    String TAG = "BcSmartspaceDataPlugin";

    /** Register a listener to get Smartspace data. */
    void registerListener(SmartspaceTargetListener listener);
@@ -124,11 +127,15 @@ public interface BcSmartspaceDataPlugin extends Plugin {
    /** Interface for launching Intents, which can differ on the lockscreen */
    interface IntentStarter {
        default void startFromAction(SmartspaceAction action, View v, boolean showOnLockscreen) {
            try {
                if (action.getIntent() != null) {
                    startIntent(v, action.getIntent(), showOnLockscreen);
                } else if (action.getPendingIntent() != null) {
                    startPendingIntent(action.getPendingIntent(), showOnLockscreen);
                }
            } catch (ActivityNotFoundException e) {
                Log.w(TAG, "Could not launch intent for action: " + action, e);
            }
        }

        /** Start the intent */
+5 −0
Original line number Diff line number Diff line
@@ -240,6 +240,10 @@ class LockscreenSmartspaceController @Inject constructor(
        configurationController.addCallback(configChangeListener)
        statusBarStateController.addCallback(statusBarStateListener)

        plugin.registerSmartspaceEventNotifier {
                e -> session?.notifySmartspaceEvent(e)
        }

        reloadSmartspace()
    }

@@ -265,6 +269,7 @@ class LockscreenSmartspaceController @Inject constructor(
        statusBarStateController.removeCallback(statusBarStateListener)
        session = null

        plugin?.registerSmartspaceEventNotifier(null)
        plugin?.onTargetsAvailable(emptyList())
        Log.d(TAG, "Ending smartspace session for lockscreen")
    }
+5 −2
Original line number Diff line number Diff line
@@ -213,6 +213,8 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() {

        // THEN the session is created
        verify(smartspaceManager).createSmartspaceSession(any())
        // THEN an event notifier is registered
        verify(plugin).registerSmartspaceEventNotifier(any())
    }

    @Test
@@ -240,7 +242,7 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() {
    }

    @Test
    fun testEmptyListIsEmittedAfterDisconnect() {
    fun testEmptyListIsEmittedAndNotifierRemovedAfterDisconnect() {
        // GIVEN a registered listener on an active session
        connectSession()
        clearInvocations(plugin)
@@ -249,8 +251,9 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() {
        controller.stateChangeListener.onViewDetachedFromWindow(smartspaceView as View)
        controller.disconnect()

        // THEN the listener receives an empty list of targets
        // THEN the listener receives an empty list of targets and unregisters the notifier
        verify(plugin).onTargetsAvailable(emptyList())
        verify(plugin).registerSmartspaceEventNotifier(null)
    }

    @Test