Merge "Merge "Prevent bad intents from crashing sysui" into sc-v2-dev am: 08d6bcbd19" into sc-v2-dev-plus-aosp

This commit is contained in:
Automerger Merge Worker
2021-12-16 22:47:53 +00:00
committed by Android (Google) Code Review
3 changed files with 21 additions and 6 deletions

View File

@@ -20,9 +20,11 @@ import android.app.PendingIntent;
import android.app.smartspace.SmartspaceAction; import android.app.smartspace.SmartspaceAction;
import android.app.smartspace.SmartspaceTarget; import android.app.smartspace.SmartspaceTarget;
import android.app.smartspace.SmartspaceTargetEvent; import android.app.smartspace.SmartspaceTargetEvent;
import android.content.ActivityNotFoundException;
import android.content.Intent; import android.content.Intent;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.Parcelable; import android.os.Parcelable;
import android.util.Log;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@@ -39,6 +41,7 @@ import java.util.List;
public interface BcSmartspaceDataPlugin extends Plugin { public interface BcSmartspaceDataPlugin extends Plugin {
String ACTION = "com.android.systemui.action.PLUGIN_BC_SMARTSPACE_DATA"; String ACTION = "com.android.systemui.action.PLUGIN_BC_SMARTSPACE_DATA";
int VERSION = 1; int VERSION = 1;
String TAG = "BcSmartspaceDataPlugin";
/** Register a listener to get Smartspace data. */ /** Register a listener to get Smartspace data. */
void registerListener(SmartspaceTargetListener listener); void registerListener(SmartspaceTargetListener listener);
@@ -124,10 +127,14 @@ public interface BcSmartspaceDataPlugin extends Plugin {
/** Interface for launching Intents, which can differ on the lockscreen */ /** Interface for launching Intents, which can differ on the lockscreen */
interface IntentStarter { interface IntentStarter {
default void startFromAction(SmartspaceAction action, View v, boolean showOnLockscreen) { default void startFromAction(SmartspaceAction action, View v, boolean showOnLockscreen) {
if (action.getIntent() != null) { try {
startIntent(v, action.getIntent(), showOnLockscreen); if (action.getIntent() != null) {
} else if (action.getPendingIntent() != null) { startIntent(v, action.getIntent(), showOnLockscreen);
startPendingIntent(action.getPendingIntent(), showOnLockscreen); } else if (action.getPendingIntent() != null) {
startPendingIntent(action.getPendingIntent(), showOnLockscreen);
}
} catch (ActivityNotFoundException e) {
Log.w(TAG, "Could not launch intent for action: " + action, e);
} }
} }

View File

@@ -240,6 +240,10 @@ class LockscreenSmartspaceController @Inject constructor(
configurationController.addCallback(configChangeListener) configurationController.addCallback(configChangeListener)
statusBarStateController.addCallback(statusBarStateListener) statusBarStateController.addCallback(statusBarStateListener)
plugin.registerSmartspaceEventNotifier {
e -> session?.notifySmartspaceEvent(e)
}
reloadSmartspace() reloadSmartspace()
} }
@@ -265,6 +269,7 @@ class LockscreenSmartspaceController @Inject constructor(
statusBarStateController.removeCallback(statusBarStateListener) statusBarStateController.removeCallback(statusBarStateListener)
session = null session = null
plugin?.registerSmartspaceEventNotifier(null)
plugin?.onTargetsAvailable(emptyList()) plugin?.onTargetsAvailable(emptyList())
Log.d(TAG, "Ending smartspace session for lockscreen") Log.d(TAG, "Ending smartspace session for lockscreen")
} }

View File

@@ -213,6 +213,8 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() {
// THEN the session is created // THEN the session is created
verify(smartspaceManager).createSmartspaceSession(any()) verify(smartspaceManager).createSmartspaceSession(any())
// THEN an event notifier is registered
verify(plugin).registerSmartspaceEventNotifier(any())
} }
@Test @Test
@@ -240,7 +242,7 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() {
} }
@Test @Test
fun testEmptyListIsEmittedAfterDisconnect() { fun testEmptyListIsEmittedAndNotifierRemovedAfterDisconnect() {
// GIVEN a registered listener on an active session // GIVEN a registered listener on an active session
connectSession() connectSession()
clearInvocations(plugin) clearInvocations(plugin)
@@ -249,8 +251,9 @@ class LockscreenSmartspaceControllerTest : SysuiTestCase() {
controller.stateChangeListener.onViewDetachedFromWindow(smartspaceView as View) controller.stateChangeListener.onViewDetachedFromWindow(smartspaceView as View)
controller.disconnect() 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).onTargetsAvailable(emptyList())
verify(plugin).registerSmartspaceEventNotifier(null)
} }
@Test @Test