Merge "Fix crash when there is no emergencybroadcast app on device" into oc-dev

This commit is contained in:
TreeHugger Robot
2017-05-06 02:42:37 +00:00
committed by Android (Google) Code Review
4 changed files with 36 additions and 22 deletions

View File

@@ -23,6 +23,7 @@ import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.core.PreferenceController; import com.android.settings.core.PreferenceController;
import com.android.settings.dashboard.DashboardFragment; import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.notification.EmergencyBroadcastPreferenceController;
import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.BaseSearchIndexProvider;
import java.util.ArrayList; import java.util.ArrayList;
@@ -61,6 +62,8 @@ public class AppAndNotificationDashboardFragment extends DashboardFragment {
private static List<PreferenceController> buildPreferenceControllers(Context context) { private static List<PreferenceController> buildPreferenceControllers(Context context) {
final List<PreferenceController> controllers = new ArrayList<>(); final List<PreferenceController> controllers = new ArrayList<>();
controllers.add(new EmergencyBroadcastPreferenceController(context,
"app_and_notif_cell_broadcast_settings"));
controllers.add(new SpecialAppAccessPreferenceController(context)); controllers.add(new SpecialAppAccessPreferenceController(context));
return controllers; return controllers;
} }

View File

@@ -20,9 +20,9 @@ import android.content.Context;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.os.UserHandle; import android.os.UserHandle;
import android.os.UserManager; import android.os.UserManager;
import android.support.annotation.VisibleForTesting;
import android.support.v7.preference.Preference; import android.support.v7.preference.Preference;
import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.accounts.AccountRestrictionHelper; import com.android.settings.accounts.AccountRestrictionHelper;
import com.android.settings.core.PreferenceController; import com.android.settings.core.PreferenceController;
import com.android.settingslib.RestrictedPreference; import com.android.settingslib.RestrictedPreference;
@@ -33,20 +33,22 @@ import com.android.settingslib.RestrictedPreference;
*/ */
public class EmergencyBroadcastPreferenceController extends PreferenceController { public class EmergencyBroadcastPreferenceController extends PreferenceController {
private static final String KEY_CELL_BROADCAST_SETTINGS = "cell_broadcast_settings"; private final String mPrefKey;
private AccountRestrictionHelper mHelper; private AccountRestrictionHelper mHelper;
private UserManager mUserManager; private UserManager mUserManager;
private PackageManager mPm; private PackageManager mPm;
private boolean mCellBroadcastAppLinkEnabled; private boolean mCellBroadcastAppLinkEnabled;
public EmergencyBroadcastPreferenceController(Context context) { public EmergencyBroadcastPreferenceController(Context context, String prefKey) {
this(context, new AccountRestrictionHelper(context)); this(context, new AccountRestrictionHelper(context), prefKey);
} }
@VisibleForTesting @VisibleForTesting(otherwise = VisibleForTesting.NONE)
EmergencyBroadcastPreferenceController(Context context, AccountRestrictionHelper helper) { EmergencyBroadcastPreferenceController(Context context, AccountRestrictionHelper helper,
String prefKey) {
super(context); super(context);
mPrefKey = prefKey;
mHelper = helper; mHelper = helper;
mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE); mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
mPm = mContext.getPackageManager(); mPm = mContext.getPackageManager();
@@ -60,7 +62,7 @@ public class EmergencyBroadcastPreferenceController extends PreferenceController
return; return;
} }
((RestrictedPreference) preference).checkRestrictionAndSetDisabled( ((RestrictedPreference) preference).checkRestrictionAndSetDisabled(
UserManager.DISALLOW_CONFIG_CELL_BROADCASTS); UserManager.DISALLOW_CONFIG_CELL_BROADCASTS);
} }
@Override @Override
@@ -70,23 +72,23 @@ public class EmergencyBroadcastPreferenceController extends PreferenceController
@Override @Override
public String getPreferenceKey() { public String getPreferenceKey() {
return KEY_CELL_BROADCAST_SETTINGS; return mPrefKey;
} }
@Override @Override
public boolean isAvailable() { public boolean isAvailable() {
return mUserManager.isAdminUser() && mCellBroadcastAppLinkEnabled return mUserManager.isAdminUser() && mCellBroadcastAppLinkEnabled
&& !mHelper.hasBaseUserRestriction( && !mHelper.hasBaseUserRestriction(
UserManager.DISALLOW_CONFIG_CELL_BROADCASTS, UserHandle.myUserId()); UserManager.DISALLOW_CONFIG_CELL_BROADCASTS, UserHandle.myUserId());
} }
private boolean isCellBroadcastAppLinkEnabled() { private boolean isCellBroadcastAppLinkEnabled() {
boolean enabled = mContext.getResources().getBoolean( boolean enabled = mContext.getResources().getBoolean(
com.android.internal.R.bool.config_cellBroadcastAppLinks); com.android.internal.R.bool.config_cellBroadcastAppLinks);
if (enabled) { if (enabled) {
try { try {
if (mPm.getApplicationEnabledSetting("com.android.cellbroadcastreceiver") if (mPm.getApplicationEnabledSetting("com.android.cellbroadcastreceiver")
== PackageManager.COMPONENT_ENABLED_STATE_DISABLED) { == PackageManager.COMPONENT_ENABLED_STATE_DISABLED) {
enabled = false; // CMAS app disabled enabled = false; // CMAS app disabled
} }
} catch (IllegalArgumentException ignored) { } catch (IllegalArgumentException ignored) {

View File

@@ -186,7 +186,8 @@ public class SoundSettings extends DashboardFragment {
Lifecycle lifecycle) { Lifecycle lifecycle) {
final List<PreferenceController> controllers = new ArrayList<>(); final List<PreferenceController> controllers = new ArrayList<>();
controllers.add(new ZenModePreferenceController(context)); controllers.add(new ZenModePreferenceController(context));
controllers.add(new EmergencyBroadcastPreferenceController(context)); controllers.add(new EmergencyBroadcastPreferenceController(
context, "cell_broadcast_settings"));
controllers.add(new VibrateWhenRingPreferenceController(context)); controllers.add(new VibrateWhenRingPreferenceController(context));
// === Volumes === // === Volumes ===

View File

@@ -44,6 +44,8 @@ import static org.mockito.Mockito.when;
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class EmergencyBroadcastPreferenceControllerTest { public class EmergencyBroadcastPreferenceControllerTest {
private static final String PREF_TEST_KEY = "test_key";
@Mock(answer = Answers.RETURNS_DEEP_STUBS) @Mock(answer = Answers.RETURNS_DEEP_STUBS)
private Context mContext; private Context mContext;
@Mock @Mock
@@ -62,7 +64,8 @@ public class EmergencyBroadcastPreferenceControllerTest {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager); when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
when(mContext.getPackageManager()).thenReturn(mPackageManager); when(mContext.getPackageManager()).thenReturn(mPackageManager);
mController = new EmergencyBroadcastPreferenceController(mContext, mAccountHelper); mController = new EmergencyBroadcastPreferenceController(mContext, mAccountHelper,
PREF_TEST_KEY);
} }
@Test @Test
@@ -72,13 +75,18 @@ public class EmergencyBroadcastPreferenceControllerTest {
verify(mPreference).checkRestrictionAndSetDisabled(anyString()); verify(mPreference).checkRestrictionAndSetDisabled(anyString());
} }
@Test
public void getPreferenceKey_shouldReturnKeyDefinedInConstructor() {
assertThat(mController.getPreferenceKey()).isEqualTo(PREF_TEST_KEY);
}
@Test @Test
public void isAvailable_notAdminUser_shouldReturnFalse() { public void isAvailable_notAdminUser_shouldReturnFalse() {
when(mUserManager.isAdminUser()).thenReturn(false); when(mUserManager.isAdminUser()).thenReturn(false);
when(mContext.getResources().getBoolean( when(mContext.getResources().getBoolean(
com.android.internal.R.bool.config_cellBroadcastAppLinks)).thenReturn(true); com.android.internal.R.bool.config_cellBroadcastAppLinks)).thenReturn(true);
when(mPackageManager.getApplicationEnabledSetting(anyString())) when(mPackageManager.getApplicationEnabledSetting(anyString()))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_ENABLED); .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
when(mAccountHelper.hasBaseUserRestriction(anyString(), anyInt())).thenReturn(false); when(mAccountHelper.hasBaseUserRestriction(anyString(), anyInt())).thenReturn(false);
assertThat(mController.isAvailable()).isFalse(); assertThat(mController.isAvailable()).isFalse();
@@ -88,11 +96,11 @@ public class EmergencyBroadcastPreferenceControllerTest {
public void isAvailable_hasConfigCellBroadcastRestriction_shouldReturnFalse() { public void isAvailable_hasConfigCellBroadcastRestriction_shouldReturnFalse() {
when(mUserManager.isAdminUser()).thenReturn(true); when(mUserManager.isAdminUser()).thenReturn(true);
when(mContext.getResources().getBoolean( when(mContext.getResources().getBoolean(
com.android.internal.R.bool.config_cellBroadcastAppLinks)).thenReturn(true); com.android.internal.R.bool.config_cellBroadcastAppLinks)).thenReturn(true);
when(mPackageManager.getApplicationEnabledSetting(anyString())) when(mPackageManager.getApplicationEnabledSetting(anyString()))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_ENABLED); .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
when(mAccountHelper.hasBaseUserRestriction( when(mAccountHelper.hasBaseUserRestriction(
eq(UserManager.DISALLOW_CONFIG_CELL_BROADCASTS), anyInt())).thenReturn(true); eq(UserManager.DISALLOW_CONFIG_CELL_BROADCASTS), anyInt())).thenReturn(true);
assertThat(mController.isAvailable()).isFalse(); assertThat(mController.isAvailable()).isFalse();
} }
@@ -101,9 +109,9 @@ public class EmergencyBroadcastPreferenceControllerTest {
public void isAvailable_cellBroadcastAppLinkDisabled_shouldReturnFalse() { public void isAvailable_cellBroadcastAppLinkDisabled_shouldReturnFalse() {
when(mUserManager.isAdminUser()).thenReturn(true); when(mUserManager.isAdminUser()).thenReturn(true);
when(mContext.getResources().getBoolean( when(mContext.getResources().getBoolean(
com.android.internal.R.bool.config_cellBroadcastAppLinks)).thenReturn(false); com.android.internal.R.bool.config_cellBroadcastAppLinks)).thenReturn(false);
when(mPackageManager.getApplicationEnabledSetting(anyString())) when(mPackageManager.getApplicationEnabledSetting(anyString()))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_ENABLED); .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
when(mAccountHelper.hasBaseUserRestriction(anyString(), anyInt())).thenReturn(false); when(mAccountHelper.hasBaseUserRestriction(anyString(), anyInt())).thenReturn(false);
assertThat(mController.isAvailable()).isFalse(); assertThat(mController.isAvailable()).isFalse();
@@ -113,9 +121,9 @@ public class EmergencyBroadcastPreferenceControllerTest {
public void isAvailable_cellBroadcastReceiverDisabled_shouldReturnFalse() { public void isAvailable_cellBroadcastReceiverDisabled_shouldReturnFalse() {
when(mUserManager.isAdminUser()).thenReturn(true); when(mUserManager.isAdminUser()).thenReturn(true);
when(mContext.getResources().getBoolean( when(mContext.getResources().getBoolean(
com.android.internal.R.bool.config_cellBroadcastAppLinks)).thenReturn(true); com.android.internal.R.bool.config_cellBroadcastAppLinks)).thenReturn(true);
when(mPackageManager.getApplicationEnabledSetting(anyString())) when(mPackageManager.getApplicationEnabledSetting(anyString()))
.thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DISABLED); .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DISABLED);
when(mAccountHelper.hasBaseUserRestriction(anyString(), anyInt())).thenReturn(false); when(mAccountHelper.hasBaseUserRestriction(anyString(), anyInt())).thenReturn(false);
assertThat(mController.isAvailable()).isFalse(); assertThat(mController.isAvailable()).isFalse();