OSDN Git Service

Use explicit intent to broadcast grayscale state changed
authorMill Chen <millchen@google.com>
Wed, 27 Mar 2019 21:27:50 +0000 (14:27 -0700)
committerMill Chen <millchen@google.com>
Thu, 28 Mar 2019 01:47:19 +0000 (18:47 -0700)
Query PackageManager for receivers that can handle the intent and send
an explicit intent to these receivers.

Change-Id: I06f500c20ae0a20d689cf0805b6a82247ea55e73
Fix: 118387886
Test: robotests

src/com/android/settings/homepage/contextualcards/conditional/GrayscaleConditionController.java
tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/GrayscaleConditionControllerTest.java

index 341e061..61b24df 100644 (file)
@@ -22,21 +22,27 @@ import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
 import android.hardware.display.ColorDisplayManager;
 import android.util.Log;
 
+import androidx.annotation.VisibleForTesting;
+
 import com.android.settings.R;
 import com.android.settings.homepage.contextualcards.ContextualCard;
 
 import java.net.URISyntaxException;
+import java.util.List;
 import java.util.Objects;
 
 public class GrayscaleConditionController implements ConditionalCardController {
     static final int ID = Objects.hash("GrayscaleConditionController");
 
+    @VisibleForTesting
+    static final String ACTION_GRAYSCALE_CHANGED = "android.settings.action.GRAYSCALE_CHANGED";
+
     private static final String TAG = "GrayscaleCondition";
-    private static final String ACTION_GRAYSCALE_CHANGED =
-            "android.settings.action.GRAYSCALE_CHANGED";
     private static final IntentFilter GRAYSCALE_CHANGED_FILTER = new IntentFilter(
             ACTION_GRAYSCALE_CHANGED);
 
@@ -113,9 +119,13 @@ public class GrayscaleConditionController implements ConditionalCardController {
     }
 
     private void sendBroadcast() {
-        final Intent intent = new Intent();
-        intent.setAction(ACTION_GRAYSCALE_CHANGED);
-        mAppContext.sendBroadcast(intent, Manifest.permission.CONTROL_DISPLAY_COLOR_TRANSFORMS);
+        final PackageManager pm = mAppContext.getPackageManager();
+        final Intent intent = new Intent(ACTION_GRAYSCALE_CHANGED);
+        final List<ResolveInfo> receivers = pm.queryBroadcastReceivers(intent, 0 /* flags */);
+        for (ResolveInfo receiver : receivers) {
+            intent.setPackage(receiver.activityInfo.packageName);
+            mAppContext.sendBroadcast(intent);
+        }
     }
 
     public class Receiver extends BroadcastReceiver {
index 2fe4697..11e76b5 100644 (file)
@@ -25,6 +25,8 @@ import static org.mockito.Mockito.verify;
 
 import android.content.Context;
 import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.pm.ResolveInfo;
 import android.hardware.display.ColorDisplayManager;
 
 import org.junit.Before;
@@ -34,7 +36,9 @@ import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowPackageManager;
 
 @RunWith(RobolectricTestRunner.class)
 public class GrayscaleConditionControllerTest {
@@ -45,6 +49,7 @@ public class GrayscaleConditionControllerTest {
     private ColorDisplayManager mColorDisplayManager;
     private Context mContext;
     private GrayscaleConditionController mController;
+    private ShadowPackageManager mPackageManager;
 
     @Before
     public void setUp() {
@@ -53,6 +58,7 @@ public class GrayscaleConditionControllerTest {
         mColorDisplayManager = spy(mContext.getSystemService(ColorDisplayManager.class));
         doReturn(mColorDisplayManager).when(mContext).getSystemService(ColorDisplayManager.class);
         mController = new GrayscaleConditionController(mContext, mConditionManager);
+        mPackageManager = Shadows.shadowOf(mContext.getPackageManager());
     }
 
     @Test
@@ -85,8 +91,13 @@ public class GrayscaleConditionControllerTest {
 
     @Test
     public void onActionClick_shouldSendBroadcast() {
+        final Intent intent = new Intent(GrayscaleConditionController.ACTION_GRAYSCALE_CHANGED);
+        final ResolveInfo info = new ResolveInfo();
+        info.activityInfo = new ActivityInfo();
+        mPackageManager.addResolveInfoForIntent(intent, info);
+
         mController.onActionClick();
 
-        verify(mContext).sendBroadcast(any(Intent.class), any(String.class));
+        verify(mContext).sendBroadcast(any(Intent.class));
     }
 }