diff --git a/src/com/android/settings/SmsDefaultDialog.java b/src/com/android/settings/SmsDefaultDialog.java index 830187ccab5..e4b49eedd99 100644 --- a/src/com/android/settings/SmsDefaultDialog.java +++ b/src/com/android/settings/SmsDefaultDialog.java @@ -125,6 +125,10 @@ public final class SmsDefaultDialog extends AlertActivity implements p.mOnClickListener = this; p.mNegativeButtonText = getString(R.string.cancel); p.mNegativeButtonListener = this; + if (p.mAdapter.isEmpty()) { + // If there is nothing to choose from, don't build the dialog. + return false; + } } setupAlert(); diff --git a/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceController.java b/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceController.java index 7077912ddc6..9a5c224cef1 100644 --- a/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceController.java +++ b/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceController.java @@ -39,7 +39,8 @@ public class DefaultBrowserPreferenceController extends DefaultAppPreferenceCont @Override public boolean isAvailable() { - return true; + final List candidates = getCandidates(); + return candidates != null && !candidates.isEmpty(); } @Override @@ -61,16 +62,6 @@ public class DefaultBrowserPreferenceController extends DefaultAppPreferenceCont } } - private String getOnlyAppLabel() { - // Resolve that intent and check that the handleAllWebDataURI boolean is set - final List list = mPackageManager.queryIntentActivitiesAsUser(BROWSE_PROBE, - PackageManager.MATCH_ALL, mUserId); - if (list != null && list.size() == 1) { - return list.get(0).loadLabel(mPackageManager.getPackageManager()).toString(); - } - return null; - } - @Override protected DefaultAppInfo getDefaultAppInfo() { try { @@ -81,6 +72,20 @@ public class DefaultBrowserPreferenceController extends DefaultAppPreferenceCont } } + private List getCandidates() { + return mPackageManager.queryIntentActivitiesAsUser(BROWSE_PROBE, PackageManager.MATCH_ALL, + mUserId); + } + + private String getOnlyAppLabel() { + // Resolve that intent and check that the handleAllWebDataURI boolean is set + final List list = getCandidates(); + if (list != null && list.size() == 1) { + return list.get(0).loadLabel(mPackageManager.getPackageManager()).toString(); + } + return null; + } + /** * Whether or not the pkg contains browser capability */ diff --git a/src/com/android/settings/applications/defaultapps/DefaultPhonePreferenceController.java b/src/com/android/settings/applications/defaultapps/DefaultPhonePreferenceController.java index fa0d28fb5bd..8a7346893d3 100644 --- a/src/com/android/settings/applications/defaultapps/DefaultPhonePreferenceController.java +++ b/src/com/android/settings/applications/defaultapps/DefaultPhonePreferenceController.java @@ -42,7 +42,11 @@ public class DefaultPhonePreferenceController extends DefaultAppPreferenceContro final boolean hasUserRestriction = um.hasUserRestriction(UserManager.DISALLOW_OUTGOING_CALLS); - return !hasUserRestriction; + if (hasUserRestriction) { + return false; + } + final List candidates = getCandidates(); + return candidates != null && !candidates.isEmpty(); } @Override @@ -60,6 +64,10 @@ public class DefaultPhonePreferenceController extends DefaultAppPreferenceContro } } + private List getCandidates() { + return DefaultDialerManager.getInstalledDialerApplications(mContext, mUserId); + } + public static boolean hasPhonePreference(String pkg, Context context) { List dialerPackages = DefaultDialerManager.getInstalledDialerApplications(context, UserHandle.myUserId()); diff --git a/src/com/android/settings/applications/defaultapps/DefaultWorkBrowserPreferenceController.java b/src/com/android/settings/applications/defaultapps/DefaultWorkBrowserPreferenceController.java index 0cee3c57209..0792ff90a02 100644 --- a/src/com/android/settings/applications/defaultapps/DefaultWorkBrowserPreferenceController.java +++ b/src/com/android/settings/applications/defaultapps/DefaultWorkBrowserPreferenceController.java @@ -23,21 +23,26 @@ import com.android.settings.Utils; public class DefaultWorkBrowserPreferenceController extends DefaultBrowserPreferenceController { + private final UserHandle mUserHandle; + public DefaultWorkBrowserPreferenceController(Context context) { super(context); - final UserHandle managedProfile = Utils.getManagedProfile(mUserManager); - if (managedProfile != null) { - mUserId = managedProfile.getIdentifier(); + mUserHandle = Utils.getManagedProfile(mUserManager); + if (mUserHandle != null) { + mUserId = mUserHandle.getIdentifier(); } } - @Override - public boolean isAvailable() { - return Utils.getManagedProfile(mUserManager) != null; - } - @Override public String getPreferenceKey() { return "work_default_browser"; } + + @Override + public boolean isAvailable() { + if (mUserHandle == null) { + return false; + } + return super.isAvailable(); + } } diff --git a/src/com/android/settings/applications/defaultapps/DefaultWorkPhonePreferenceController.java b/src/com/android/settings/applications/defaultapps/DefaultWorkPhonePreferenceController.java index f793fa33efa..c6d04faed76 100644 --- a/src/com/android/settings/applications/defaultapps/DefaultWorkPhonePreferenceController.java +++ b/src/com/android/settings/applications/defaultapps/DefaultWorkPhonePreferenceController.java @@ -17,11 +17,28 @@ package com.android.settings.applications.defaultapps; import android.content.Context; +import android.os.UserHandle; + +import com.android.settings.Utils; public class DefaultWorkPhonePreferenceController extends DefaultPhonePreferenceController { + private final UserHandle mUserHandle; + public DefaultWorkPhonePreferenceController(Context context) { super(context); + mUserHandle = Utils.getManagedProfile(mUserManager); + if (mUserHandle != null) { + mUserId = mUserHandle.getIdentifier(); + } + } + + @Override + public boolean isAvailable() { + if (mUserHandle == null) { + return false; + } + return super.isAvailable(); } @Override diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceControllerTest.java index 10cfba0be4e..644a9426475 100644 --- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceControllerTest.java @@ -36,7 +36,9 @@ import org.mockito.MockitoAnnotations; import org.robolectric.annotation.Config; import org.robolectric.util.ReflectionHelpers; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Matchers.any; @@ -68,7 +70,18 @@ public class DefaultBrowserPreferenceControllerTest { } @Test - public void isAlwaysAvailable() { + public void isAvailable_noBrowser_shouldReturnFalse() { + when(mPackageManager.queryIntentActivitiesAsUser(any(Intent.class), anyInt(), anyInt())) + .thenReturn(null); + assertThat(mController.isAvailable()).isFalse(); + } + + @Test + public void isAvailable_hasBrowser_shouldReturnTrue() { + final List candidates = new ArrayList<>(); + candidates.add(new ResolveInfo()); + when(mPackageManager.queryIntentActivitiesAsUser(any(Intent.class), anyInt(), anyInt())) + .thenReturn(candidates); assertThat(mController.isAvailable()).isTrue(); }