Use explicit intent to broadcast grayscale state changed

Query PackageManager for receivers that can handle the intent and send
an explicit intent to these receivers.

Change-Id: I06f500c20ae0a20d689cf0805b6a82247ea55e73
Fix: 118387886
Test: robotests
This commit is contained in:
Mill Chen
2019-03-27 14:27:50 -07:00
parent 6d90cdfea7
commit 2ef3dacad8
2 changed files with 27 additions and 6 deletions

View 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 {

View 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));
}
}