From dd3964986a238109fdf7464fd12cc8ea173566a2 Mon Sep 17 00:00:00 2001 From: Matthew Ng Date: Thu, 31 May 2018 13:30:27 -0700 Subject: [PATCH 01/13] Avoids systemui color tint flicker because no system ui flags set Systemui nav buttons set the insensity from launcher and -1 window but fallback home does not. This causes services to pass the wrong flags to system ui to apply the incorrect tint that would later be fixed by launcher and sometimes lead to color flicker. Fixes: 79776583 Test: use bright color wallpaper (nav dark icons) and reboot phone, unlock with pin/pass/finger and view nav buttons Change-Id: I86906cd1b5af5d078499a1392c260aa186b2eee8 --- src/com/android/settings/FallbackHome.java | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/com/android/settings/FallbackHome.java b/src/com/android/settings/FallbackHome.java index 5f7b6392369..84a3283b738 100644 --- a/src/com/android/settings/FallbackHome.java +++ b/src/com/android/settings/FallbackHome.java @@ -18,6 +18,8 @@ package com.android.settings; import android.app.Activity; import android.app.ProgressDialog; +import android.app.WallpaperColors; +import android.app.WallpaperManager; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -68,15 +70,27 @@ public class FallbackHome extends Activity { // we don't flash the wallpaper before SUW mProvisioned = Settings.Global.getInt(getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 0) != 0; + int flags; if (!mProvisioned) { setTheme(R.style.FallbackHome_SetupWizard); - getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN - | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); + flags = View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; } else { - getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN - | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); + flags = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION; } + // Set the system ui flags to light status bar if the wallpaper supports dark text to match + // current system ui color tints. + final WallpaperColors colors = getSystemService(WallpaperManager.class) + .getWallpaperColors(WallpaperManager.FLAG_SYSTEM); + if (colors != null + && (colors.getColorHints() & WallpaperColors.HINT_SUPPORTS_DARK_TEXT) != 0) { + flags |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR + | View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR; + } + getWindow().getDecorView().setSystemUiVisibility(flags); + registerReceiver(mReceiver, new IntentFilter(Intent.ACTION_USER_UNLOCKED)); maybeFinish(); } From a2a593dd3b1928442244262acaef1cb3a41bc8d6 Mon Sep 17 00:00:00 2001 From: yuemingw Date: Fri, 1 Jun 2018 17:11:31 +0100 Subject: [PATCH 02/13] Check EnforcedAdmin to see if location is locked down by device policy. Bug: 78563793 Test: m -j RunSettingsRoboTests and manually via TestDPC Change-Id: Iad2f11bde51bf6c321beb3c4709d53971a8e40c7 --- .../LocationServicePreferenceController.java | 6 +- ...cationServicePreferenceControllerTest.java | 65 ++++++++++++++++--- .../testutils/shadow/ShadowUserManager.java | 17 ++++- 3 files changed, 78 insertions(+), 10 deletions(-) diff --git a/src/com/android/settings/location/LocationServicePreferenceController.java b/src/com/android/settings/location/LocationServicePreferenceController.java index f865b449041..9860abd85d2 100644 --- a/src/com/android/settings/location/LocationServicePreferenceController.java +++ b/src/com/android/settings/location/LocationServicePreferenceController.java @@ -25,6 +25,7 @@ import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceScreen; import android.util.Log; +import com.android.settings.Utils; import com.android.settings.widget.RestrictedAppPreference; import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.core.lifecycle.LifecycleObserver; @@ -130,8 +131,11 @@ public class LocationServicePreferenceController extends LocationBasePreferenceC private List getLocationServices() { // If location access is locked down by device policy then we only show injected settings // for the primary profile. + final int profileUserId = Utils.getManagedProfileId(mUserManager, UserHandle.myUserId()); + return mInjector.getInjectedSettings(mFragment.getPreferenceManager().getContext(), - mLocationEnabler.isManagedProfileRestrictedByBase() + (profileUserId != UserHandle.USER_NULL + && mLocationEnabler.getShareLocationEnforcedAdmin(profileUserId) != null) ? UserHandle.myUserId() : UserHandle.USER_CURRENT); } } diff --git a/tests/robotests/src/com/android/settings/location/LocationServicePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/location/LocationServicePreferenceControllerTest.java index f3958f41d59..a6059a9e8c2 100644 --- a/tests/robotests/src/com/android/settings/location/LocationServicePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/location/LocationServicePreferenceControllerTest.java @@ -16,6 +16,7 @@ package com.android.settings.location; import static com.google.common.truth.Truth.assertThat; + import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; @@ -25,24 +26,17 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.admin.DevicePolicyManager; -import androidx.lifecycle.LifecycleOwner; import android.content.ComponentName; import android.content.Context; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; -import androidx.preference.Preference; -import androidx.preference.PreferenceCategory; -import androidx.preference.PreferenceScreen; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.shadow.ShadowUserManager; import com.android.settings.widget.RestrictedAppPreference; import com.android.settingslib.core.lifecycle.Lifecycle; -import java.util.ArrayList; -import java.util.List; - import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -52,6 +46,14 @@ import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; +import java.util.ArrayList; +import java.util.List; + +import androidx.lifecycle.LifecycleOwner; +import androidx.preference.Preference; +import androidx.preference.PreferenceCategory; +import androidx.preference.PreferenceScreen; + @RunWith(SettingsRobolectricTestRunner.class) @Config( shadows = { @@ -133,6 +135,8 @@ public class LocationServicePreferenceControllerTest { doReturn(preferences) .when(mSettingsInjector).getInjectedSettings(any(Context.class), anyInt()); when(mFragment.getPreferenceManager().getContext()).thenReturn(mContext); + ShadowUserManager.getShadow().setProfileIdsWithDisabled(new int[]{UserHandle.myUserId()}); + mController.displayPreference(mScreen); mController.updateState(mCategory); @@ -142,6 +146,50 @@ public class LocationServicePreferenceControllerTest { verify(mCategory).addPreference(pref2); } + @Test + public void workProfileDisallowShareLocationOn_getParentUserLocationServicesOnly() { + final int fakeWorkProfileId = 123; + ShadowUserManager.getShadow().setProfileIdsWithDisabled( + new int[]{UserHandle.myUserId(), fakeWorkProfileId}); + + // Mock RestrictedLockUtils.checkIfRestrictionEnforced and let it return non-null. + final List enforcingUsers = new ArrayList<>(); + enforcingUsers.add(new UserManager.EnforcingUser(fakeWorkProfileId, + UserManager.RESTRICTION_SOURCE_DEVICE_OWNER)); + final ComponentName componentName = new ComponentName("test", "test"); + // Ensure that RestrictedLockUtils.checkIfRestrictionEnforced doesn't return null. + ShadowUserManager.getShadow().setUserRestrictionSources( + UserManager.DISALLOW_SHARE_LOCATION, + UserHandle.of(fakeWorkProfileId), + enforcingUsers); + when(mDevicePolicyManager.getDeviceOwnerComponentOnAnyUser()).thenReturn(componentName); + + mController.displayPreference(mScreen); + mController.updateState(mCategory); + verify(mSettingsInjector).getInjectedSettings( + any(Context.class), eq(UserHandle.myUserId())); + } + + @Test + public void workProfileDisallowShareLocationOff_getAllUserLocationServices() { + final int fakeWorkProfileId = 123; + ShadowUserManager.getShadow().setProfileIdsWithDisabled( + new int[]{UserHandle.myUserId(), fakeWorkProfileId}); + + // Mock RestrictedLockUtils.checkIfRestrictionEnforced and let it return null. + // Empty enforcing users. + final List enforcingUsers = new ArrayList<>(); + ShadowUserManager.getShadow().setUserRestrictionSources( + UserManager.DISALLOW_SHARE_LOCATION, + UserHandle.of(fakeWorkProfileId), + enforcingUsers); + + mController.displayPreference(mScreen); + mController.updateState(mCategory); + verify(mSettingsInjector).getInjectedSettings( + any(Context.class), eq(UserHandle.USER_CURRENT)); + } + @Test public void onLocationModeChanged_shouldRequestReloadInjectedSettigns() { mController.onLocationModeChanged(Settings.Secure.LOCATION_MODE_BATTERY_SAVING, false); @@ -158,8 +206,9 @@ public class LocationServicePreferenceControllerTest { preferences.add(pref); doReturn(preferences).when(mSettingsInjector) .getInjectedSettings(any(Context.class), anyInt()); + ShadowUserManager.getShadow().setProfileIdsWithDisabled(new int[]{UserHandle.myUserId()}); - int userId = UserHandle.myUserId(); + final int userId = UserHandle.myUserId(); List enforcingUsers = new ArrayList<>(); enforcingUsers.add(new UserManager.EnforcingUser(userId, UserManager.RESTRICTION_SOURCE_DEVICE_OWNER)); diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java index d83c8148fff..df87536d33b 100644 --- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java +++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java @@ -30,6 +30,7 @@ import org.robolectric.annotation.Resetter; import org.robolectric.shadow.api.Shadow; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -45,6 +46,7 @@ public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager private final List mUserProfileInfos = new ArrayList<>(); private final Set mManagedProfiles = new HashSet<>(); private boolean mIsQuietModeEnabled = false; + private int[] profileIdsForUser; @Resetter public void reset() { @@ -96,7 +98,11 @@ public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager @Implementation public List getUserRestrictionSources( String restrictionKey, UserHandle userHandle) { - return mRestrictionSources.get(restrictionKey + userHandle.getIdentifier()); + // Return empty list when there is no enforcing user, otherwise might trigger + // NullPointer Exception in RestrictedLockUtils.checkIfRestrictionEnforced. + List enforcingUsers = + mRestrictionSources.get(restrictionKey + userHandle.getIdentifier()); + return enforcingUsers == null ? Collections.emptyList() : enforcingUsers; } public void setUserRestrictionSources( @@ -121,4 +127,13 @@ public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager public void setQuietModeEnabled(boolean enabled) { mIsQuietModeEnabled = enabled; } + + @Implementation + public int[] getProfileIdsWithDisabled(@UserIdInt int userId) { + return profileIdsForUser; + } + + public void setProfileIdsWithDisabled(int[] profileIds) { + profileIdsForUser = profileIds; + } } From bb0501c2fd1e208030b5b9e7fd48f9a98a542344 Mon Sep 17 00:00:00 2001 From: Beverly Date: Fri, 1 Jun 2018 13:17:34 -0400 Subject: [PATCH 03/13] Don't force lower case in ZenSettings Programatically lower casing letters is bad for translations Change-Id: Iea39186b9716f628ed96ad457b09440bd177d821 Fixes: 77961695 Test: ZenModeSettingsTest.java --- res/values/strings.xml | 24 +++ .../notification/ZenModeSettings.java | 144 +++++++++++------- 2 files changed, 113 insertions(+), 55 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index e64bd87f8a5..aaccf8b8c8b 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -7973,9 +7973,15 @@ Messages + + messages + Some messages + + some messages + From anyone @@ -8000,21 +8006,36 @@ Alarms + + alarms + Media + + media + Touch sounds + + touch sounds + Reminders + + reminders + Allow reminders Events + + events + Allow events @@ -8030,6 +8051,9 @@ Repeat callers + + repeat callers + Allow repeat callers diff --git a/src/com/android/settings/notification/ZenModeSettings.java b/src/com/android/settings/notification/ZenModeSettings.java index 240ab68c93a..e05dabe2b61 100644 --- a/src/com/android/settings/notification/ZenModeSettings.java +++ b/src/com/android/settings/notification/ZenModeSettings.java @@ -119,22 +119,22 @@ public class ZenModeSettings extends ZenModeSettingsBase { List enabledCategories = getEnabledCategories(policy, category -> PRIORITY_CATEGORY_ALARMS == category || PRIORITY_CATEGORY_MEDIA == category - || PRIORITY_CATEGORY_SYSTEM == category); + || PRIORITY_CATEGORY_SYSTEM == category, false); int numCategories = enabledCategories.size(); if (numCategories == 0) { return mContext.getString(R.string.zen_sound_all_muted); } else if (numCategories == 1) { return mContext.getString(R.string.zen_sound_one_allowed, - enabledCategories.get(0).toLowerCase()); + enabledCategories.get(0)); } else if (numCategories == 2) { return mContext.getString(R.string.zen_sound_two_allowed, - enabledCategories.get(0).toLowerCase(), - enabledCategories.get(1).toLowerCase()); + enabledCategories.get(0), + enabledCategories.get(1)); } else if (numCategories == 3) { return mContext.getString(R.string.zen_sound_three_allowed, - enabledCategories.get(0).toLowerCase(), - enabledCategories.get(1).toLowerCase(), - enabledCategories.get(2).toLowerCase()); + enabledCategories.get(0), + enabledCategories.get(1), + enabledCategories.get(2)); } else { return mContext.getString(R.string.zen_sound_none_muted); } @@ -143,17 +143,17 @@ public class ZenModeSettings extends ZenModeSettingsBase { String getCallsSettingSummary(Policy policy) { List enabledCategories = getEnabledCategories(policy, category -> PRIORITY_CATEGORY_CALLS == category - || PRIORITY_CATEGORY_REPEAT_CALLERS == category); + || PRIORITY_CATEGORY_REPEAT_CALLERS == category, false); int numCategories = enabledCategories.size(); if (numCategories == 0) { return mContext.getString(R.string.zen_mode_no_exceptions); } else if (numCategories == 1) { return mContext.getString(R.string.zen_mode_calls_summary_one, - enabledCategories.get(0).toLowerCase()); + enabledCategories.get(0)); } else { return mContext.getString(R.string.zen_mode_calls_summary_two, - enabledCategories.get(0).toLowerCase(), - enabledCategories.get(1).toLowerCase()); + enabledCategories.get(0), + enabledCategories.get(1)); } } @@ -161,7 +161,7 @@ public class ZenModeSettings extends ZenModeSettingsBase { List enabledCategories = getEnabledCategories(policy, category -> PRIORITY_CATEGORY_EVENTS == category || PRIORITY_CATEGORY_REMINDERS == category - || PRIORITY_CATEGORY_MESSAGES == category); + || PRIORITY_CATEGORY_MESSAGES == category, true); int numCategories = enabledCategories.size(); if (numCategories == 0) { return mContext.getString(R.string.zen_mode_no_exceptions); @@ -169,19 +169,19 @@ public class ZenModeSettings extends ZenModeSettingsBase { return enabledCategories.get(0); } else if (numCategories == 2) { return mContext.getString(R.string.join_two_items, enabledCategories.get(0), - enabledCategories.get(1).toLowerCase()); + enabledCategories.get(1)); } else if (numCategories == 3){ final List summaries = new ArrayList<>(); summaries.add(enabledCategories.get(0)); - summaries.add(enabledCategories.get(1).toLowerCase()); - summaries.add(enabledCategories.get(2).toLowerCase()); + summaries.add(enabledCategories.get(1)); + summaries.add(enabledCategories.get(2)); return ListFormatter.getInstance().format(summaries); } else { final List summaries = new ArrayList<>(); summaries.add(enabledCategories.get(0)); - summaries.add(enabledCategories.get(1).toLowerCase()); - summaries.add(enabledCategories.get(2).toLowerCase()); + summaries.add(enabledCategories.get(1)); + summaries.add(enabledCategories.get(2)); summaries.add(mContext.getString(R.string.zen_mode_other_options)); return ListFormatter.getInstance().format(summaries); @@ -251,48 +251,18 @@ public class ZenModeSettings extends ZenModeSettingsBase { } private List getEnabledCategories(Policy policy, - Predicate filteredCategories) { + Predicate filteredCategories, boolean capitalizeFirstInList) { List enabledCategories = new ArrayList<>(); for (int category : ALL_PRIORITY_CATEGORIES) { + boolean isFirst = capitalizeFirstInList && enabledCategories.isEmpty(); if (filteredCategories.test(category) && isCategoryEnabled(policy, category)) { - if (category == PRIORITY_CATEGORY_ALARMS) { - enabledCategories.add(mContext.getString(R.string.zen_mode_alarms)); - } else if (category == PRIORITY_CATEGORY_MEDIA) { - enabledCategories.add(mContext.getString( - R.string.zen_mode_media)); - } else if (category == PRIORITY_CATEGORY_SYSTEM) { - enabledCategories.add(mContext.getString( - R.string.zen_mode_system)); - } else if (category == Policy.PRIORITY_CATEGORY_MESSAGES) { - if (policy.priorityMessageSenders == Policy.PRIORITY_SENDERS_ANY) { - enabledCategories.add(mContext.getString( - R.string.zen_mode_all_messages)); - } else { - enabledCategories.add(mContext.getString( - R.string.zen_mode_selected_messages)); - } - } else if (category == Policy.PRIORITY_CATEGORY_EVENTS) { - enabledCategories.add(mContext.getString(R.string.zen_mode_events)); - } else if (category == Policy.PRIORITY_CATEGORY_REMINDERS) { - enabledCategories.add(mContext.getString(R.string.zen_mode_reminders)); - } else if (category == Policy.PRIORITY_CATEGORY_CALLS) { - if (policy.priorityCallSenders == Policy.PRIORITY_SENDERS_ANY) { - enabledCategories.add(mContext.getString( - R.string.zen_mode_all_callers)); - } else if (policy.priorityCallSenders == Policy.PRIORITY_SENDERS_CONTACTS){ - enabledCategories.add(mContext.getString( - R.string.zen_mode_contacts_callers)); - } else { - enabledCategories.add(mContext.getString( - R.string.zen_mode_starred_callers)); - } - } else if (category == Policy.PRIORITY_CATEGORY_REPEAT_CALLERS) { - if (!enabledCategories.contains(mContext.getString( - R.string.zen_mode_all_callers))) { - enabledCategories.add(mContext.getString( - R.string.zen_mode_repeat_callers)); - } + if (category == Policy.PRIORITY_CATEGORY_REPEAT_CALLERS + && isCategoryEnabled(policy, Policy.PRIORITY_CATEGORY_CALLS) + && policy.priorityCallSenders == Policy.PRIORITY_SENDERS_ANY) { + continue; } + + enabledCategories.add(getCategory(category, policy, isFirst)); } } return enabledCategories; @@ -301,6 +271,70 @@ public class ZenModeSettings extends ZenModeSettingsBase { private boolean isCategoryEnabled(Policy policy, int categoryType) { return (policy.priorityCategories & categoryType) != 0; } + + private String getCategory(int category, Policy policy, boolean isFirst) { + if (category == PRIORITY_CATEGORY_ALARMS) { + if (isFirst) { + return mContext.getString(R.string.zen_mode_alarms); + } else { + return mContext.getString(R.string.zen_mode_alarms_list); + } + } else if (category == PRIORITY_CATEGORY_MEDIA) { + if (isFirst) { + return mContext.getString(R.string.zen_mode_media); + } else { + return mContext.getString(R.string.zen_mode_media_list); + } + } else if (category == PRIORITY_CATEGORY_SYSTEM) { + if (isFirst) { + return mContext.getString(R.string.zen_mode_system); + } else { + return mContext.getString(R.string.zen_mode_system_list); + } + } else if (category == Policy.PRIORITY_CATEGORY_MESSAGES) { + if (policy.priorityMessageSenders == Policy.PRIORITY_SENDERS_ANY) { + if (isFirst) { + return mContext.getString(R.string.zen_mode_all_messages); + } else { + return mContext.getString(R.string.zen_mode_all_messages_list); + } + } else { + if (isFirst) { + return mContext.getString(R.string.zen_mode_selected_messages); + } else { + return mContext.getString(R.string.zen_mode_selected_messages_list); + } + } + } else if (category == Policy.PRIORITY_CATEGORY_EVENTS) { + if (isFirst) { + return mContext.getString(R.string.zen_mode_events); + } else { + return mContext.getString(R.string.zen_mode_events_list); + } + } else if (category == Policy.PRIORITY_CATEGORY_REMINDERS) { + if (isFirst) { + return mContext.getString(R.string.zen_mode_reminders); + } else { + return mContext.getString(R.string.zen_mode_reminders_list); + } + } else if (category == Policy.PRIORITY_CATEGORY_CALLS) { + if (policy.priorityCallSenders == Policy.PRIORITY_SENDERS_ANY) { + return mContext.getString(R.string.zen_mode_all_callers); + } else if (policy.priorityCallSenders == Policy.PRIORITY_SENDERS_CONTACTS){ + return mContext.getString(R.string.zen_mode_contacts_callers); + } else { + return mContext.getString(R.string.zen_mode_starred_callers); + } + } else if (category == Policy.PRIORITY_CATEGORY_REPEAT_CALLERS) { + if (isFirst) { + return mContext.getString(R.string.zen_mode_repeat_callers); + } else { + return mContext.getString(R.string.zen_mode_repeat_callers_list); + } + } + + return ""; + } } /** From 9e2ec5fa07738701ded59a171090e6078f478503 Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Thu, 7 Jun 2018 15:45:41 -0400 Subject: [PATCH 04/13] Hide block pref on non-configurable channels Test: robotests Bug: 109875297 Change-Id: I164ae2e07d178db9e84746e5c59f0968e6c77eae --- .../NotificationPreferenceController.java | 6 ++-- .../BlockPreferenceControllerTest.java | 1 + .../NotificationPreferenceControllerTest.java | 28 +++++++++++++++++++ 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/notification/NotificationPreferenceController.java b/src/com/android/settings/notification/NotificationPreferenceController.java index 49bb08ef154..1ce42c28433 100644 --- a/src/com/android/settings/notification/NotificationPreferenceController.java +++ b/src/com/android/settings/notification/NotificationPreferenceController.java @@ -138,11 +138,11 @@ public abstract class NotificationPreferenceController extends AbstractPreferenc protected boolean isChannelBlockable() { if (mChannel != null && mAppRow != null) { - if (!mAppRow.systemApp) { - return true; + if (!isChannelConfigurable()) { + return mChannel.getImportance() == IMPORTANCE_NONE; } - return mChannel.isBlockableSystem() + return mChannel.isBlockableSystem() || !mAppRow.systemApp || mChannel.getImportance() == IMPORTANCE_NONE; } return false; diff --git a/tests/robotests/src/com/android/settings/notification/BlockPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/BlockPreferenceControllerTest.java index a13946e775e..bdc7d69fe24 100644 --- a/tests/robotests/src/com/android/settings/notification/BlockPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/notification/BlockPreferenceControllerTest.java @@ -138,6 +138,7 @@ public class BlockPreferenceControllerTest { public void testIsAvailable_nonSystemApp() { NotificationBackend.AppRow appRow = new NotificationBackend.AppRow(); appRow.systemApp = false; + appRow.lockedChannelId = "not this"; NotificationChannel channel = mock(NotificationChannel.class); when(channel.getImportance()).thenReturn(IMPORTANCE_HIGH); mController.onResume(appRow, channel, null, null); diff --git a/tests/robotests/src/com/android/settings/notification/NotificationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/NotificationPreferenceControllerTest.java index 7eeee98982c..38790b3e32a 100644 --- a/tests/robotests/src/com/android/settings/notification/NotificationPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/notification/NotificationPreferenceControllerTest.java @@ -261,6 +261,34 @@ public class NotificationPreferenceControllerTest { assertTrue(mController.isChannelBlockable()); } + @Test + public void testIsChannelBlockable_notConfigurable() { + String sameId = "apples"; + NotificationBackend.AppRow appRow = new NotificationBackend.AppRow(); + appRow.systemApp = false; + appRow.lockedChannelId = sameId; + NotificationChannel channel = mock(NotificationChannel.class); + when(channel.getId()).thenReturn(sameId); + when(channel.getImportance()).thenReturn(IMPORTANCE_DEFAULT); + + mController.onResume(appRow, channel, null, null); + assertFalse(mController.isChannelBlockable()); + } + + @Test + public void testIsChannelBlockable_notConfigurableButBlocked() { + String sameId = "apples"; + NotificationBackend.AppRow appRow = new NotificationBackend.AppRow(); + appRow.systemApp = false; + appRow.lockedChannelId = sameId; + NotificationChannel channel = mock(NotificationChannel.class); + when(channel.getId()).thenReturn(sameId); + when(channel.getImportance()).thenReturn(IMPORTANCE_NONE); + + mController.onResume(appRow, channel, null, null); + assertTrue(mController.isChannelBlockable()); + } + @Test public void testIsChannelGroupBlockable_nonSystemBlockable() { NotificationBackend.AppRow appRow = new NotificationBackend.AppRow(); From 59287d40d1f4668de1beadb684d34e8509edded3 Mon Sep 17 00:00:00 2001 From: ryanywlin Date: Fri, 8 Jun 2018 14:36:34 +0800 Subject: [PATCH 05/13] 2nd attempt handle BT is not supported on emulator Error handle before using LocalBluetoothManager in the onStart and onStop Bug: 80491267 Test: make RunSettingsRoboTests ROBOTEST_FILTER="AudioOutputSwitchPreferenceControllerTest" -j42 Change-Id: I47f7d3b7cddc2fbbafb8fb5cf0fb6adb2d0d2d55 --- .../settings/sound/AudioSwitchPreferenceController.java | 8 ++++++++ .../sound/AudioOutputSwitchPreferenceControllerTest.java | 2 ++ 2 files changed, 10 insertions(+) diff --git a/src/com/android/settings/sound/AudioSwitchPreferenceController.java b/src/com/android/settings/sound/AudioSwitchPreferenceController.java index 67236608df8..11caf45fc77 100644 --- a/src/com/android/settings/sound/AudioSwitchPreferenceController.java +++ b/src/com/android/settings/sound/AudioSwitchPreferenceController.java @@ -170,12 +170,20 @@ public abstract class AudioSwitchPreferenceController extends BasePreferenceCont @Override public void onStart() { + if (mLocalBluetoothManager == null) { + Log.e(TAG, "Bluetooth is not supported on this device"); + return; + } mLocalBluetoothManager.setForegroundActivity(mContext); register(); } @Override public void onStop() { + if (mLocalBluetoothManager == null) { + Log.e(TAG, "Bluetooth is not supported on this device"); + return; + } mLocalBluetoothManager.setForegroundActivity(null); unregister(); } diff --git a/tests/robotests/src/com/android/settings/sound/AudioOutputSwitchPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/sound/AudioOutputSwitchPreferenceControllerTest.java index 1140aee98fb..bd11a159ba0 100644 --- a/tests/robotests/src/com/android/settings/sound/AudioOutputSwitchPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/sound/AudioOutputSwitchPreferenceControllerTest.java @@ -186,6 +186,8 @@ public class AudioOutputSwitchPreferenceControllerTest { AudioSwitchPreferenceController controller = new AudioSwitchPreferenceControllerTestable( mContext, TEST_KEY); + controller.onStart(); + controller.onStop(); assertThat(mLocalBluetoothManager).isNull(); } From 486d1facfab222c686e03c344619aaf19280ea2a Mon Sep 17 00:00:00 2001 From: Beverly Date: Thu, 7 Jun 2018 10:43:32 -0400 Subject: [PATCH 06/13] Add help uri for prevent ringing gesture Test: build Bug: 79270169 Change-Id: Iea5598f26649854521202363cad6ee297cef3057 --- res/values/strings.xml | 3 +++ .../settings/gestures/PreventRingingGestureSettings.java | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 773e17f8a4a..8518df99163 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -9918,6 +9918,9 @@ + + + Update Do Not Disturb diff --git a/src/com/android/settings/gestures/PreventRingingGestureSettings.java b/src/com/android/settings/gestures/PreventRingingGestureSettings.java index 58ff5fa660b..b8d157c0107 100644 --- a/src/com/android/settings/gestures/PreventRingingGestureSettings.java +++ b/src/com/android/settings/gestures/PreventRingingGestureSettings.java @@ -60,7 +60,7 @@ public class PreventRingingGestureSettings extends DashboardFragment { @Override public int getHelpResource() { - return 0; + return R.string.help_uri_prevent_ringing_gesture; } public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = From 91ab1338cbb18aa13afee7efb164480229120492 Mon Sep 17 00:00:00 2001 From: Beverly Date: Fri, 8 Jun 2018 10:44:05 -0400 Subject: [PATCH 07/13] Fix typo Test: manual Bug: 109925028 Change-Id: I87ec517249567123df1a8eace17109ed7e0bae2b --- res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 773e17f8a4a..65d6d0a4dbf 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -7410,7 +7410,7 @@ Messages, events & reminders - When Do Not Disturb is on, messages, reminders, and events will muted, except for the items you allow above. You can adjust messages settings to allow your friends, family, or other contacts to reach you. + When Do Not Disturb is on, messages, reminders, and events will be muted, except for the items you allow above. You can adjust messages settings to allow your friends, family, or other contacts to reach you. Done From 78f0f781fabe22f8dc8bdc61abc79aee41291524 Mon Sep 17 00:00:00 2001 From: Beverly Date: Fri, 8 Jun 2018 10:44:05 -0400 Subject: [PATCH 08/13] Fix typo Test: manual Bug: 109925028 Change-Id: I87ec517249567123df1a8eace17109ed7e0bae2b --- res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 22ae939225b..1b5f12571da 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -7421,7 +7421,7 @@ Messages, events & reminders - When Do Not Disturb is on, messages, reminders, and events will muted, except for the items you allow above. You can adjust messages settings to allow your friends, family, or other contacts to reach you. + When Do Not Disturb is on, messages, reminders, and events will be muted, except for the items you allow above. You can adjust messages settings to allow your friends, family, or other contacts to reach you. Done From 8ea60bfdbd0f15d50b9494e7386a21d336f82b03 Mon Sep 17 00:00:00 2001 From: Matthew Fritze Date: Fri, 8 Jun 2018 09:07:08 -0700 Subject: [PATCH 09/13] Remove bottom padding on screen saturation preview Change-Id: I5c43209d5711c32e6ab91f65a2fced4b0c9b4c23 Fixes: 80091062 Test: none, only visual changes. --- res/layout/color_mode_preview.xml | 1 - res/values/dimens.xml | 1 - 2 files changed, 2 deletions(-) diff --git a/res/layout/color_mode_preview.xml b/res/layout/color_mode_preview.xml index 2838345139f..88b8281152f 100644 --- a/res/layout/color_mode_preview.xml +++ b/res/layout/color_mode_preview.xml @@ -21,7 +21,6 @@ 200dp 320dp - 40dp 4dp 0dip From 6a03db093a0702fbf0bef039aeca658b5392b724 Mon Sep 17 00:00:00 2001 From: Matthew Fritze Date: Fri, 8 Jun 2018 10:49:06 -0700 Subject: [PATCH 10/13] Don't crash if IMEI is empty Change-Id: I5993d332dbd218c981ef5432aebb735d0000f67a Fixes: 109787187 Test: robotests --- .../deviceinfo/imei/ImeiInfoDialogController.java | 3 +++ .../imei/ImeiInfoDialogControllerTest.java | 15 +++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogController.java b/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogController.java index 71da4a3d5db..415788663c1 100644 --- a/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogController.java +++ b/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogController.java @@ -53,6 +53,9 @@ public class ImeiInfoDialogController { static final int ID_GSM_SETTINGS = R.id.gsm_settings; private static CharSequence getTextAsDigits(CharSequence text) { + if (TextUtils.isEmpty(text)) { + return ""; + } if (TextUtils.isDigitsOnly(text)) { final Spannable spannable = new SpannableStringBuilder(text); final TtsSpan span = new TtsSpan.DigitsBuilder(text.toString()).build(); diff --git a/tests/robotests/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogControllerTest.java index 658a60ad1b7..349eddc717e 100644 --- a/tests/robotests/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogControllerTest.java +++ b/tests/robotests/src/com/android/settings/deviceinfo/imei/ImeiInfoDialogControllerTest.java @@ -128,4 +128,19 @@ public class ImeiInfoDialogControllerTest { verify(mDialog).setText(eq(ID_IMEI_SV_VALUE), any()); verify(mDialog).removeViewFromScreen(ID_CDMA_SETTINGS); } + + @Test + public void populateImeiInfo_emptyImei_shouldSetMeid_imeiSetToEmptyString() { + doReturn(true).when(mController).isCdmaLteEnabled(); + when(mTelephonyManager.getPhoneType()).thenReturn(TelephonyManager.PHONE_TYPE_CDMA); + when(mTelephonyManager.getImei(anyInt())).thenReturn(null); + + mController.populateImeiInfo(); + + verify(mDialog).setText(ID_MEID_NUMBER_VALUE, MEID_NUMBER); + verify(mDialog).setText(ID_MIN_NUMBER_VALUE, MIN_NUMBER); + verify(mDialog).setText(ID_PRL_VERSION_VALUE, PRL_VERSION); + verify(mDialog).setText(eq(ID_IMEI_VALUE), eq("")); + verify(mDialog).setText(eq(ID_IMEI_SV_VALUE), any()); + } } From 838f6c7812521da627ce95d8f76428de759513c9 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Thu, 7 Jun 2018 11:33:48 -0700 Subject: [PATCH 11/13] Fix memory leaks in Settings Bug: 80507279 Test: inspected hprof before and after fix Change-Id: I6ea2925695deb6261263649e858484e1667ec522 --- .../settings/fuelgauge/BatteryUtils.java | 19 +++++----- .../settings/overlay/FeatureFactoryImpl.java | 35 +++++++++++-------- .../AudioSwitchPreferenceController.java | 9 ++--- ...roundActivityPreferenceControllerTest.java | 8 +++-- 4 files changed, 40 insertions(+), 31 deletions(-) diff --git a/src/com/android/settings/fuelgauge/BatteryUtils.java b/src/com/android/settings/fuelgauge/BatteryUtils.java index 4a3e6d42e88..83b0e1be267 100644 --- a/src/com/android/settings/fuelgauge/BatteryUtils.java +++ b/src/com/android/settings/fuelgauge/BatteryUtils.java @@ -24,18 +24,12 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.os.BatteryStats; -import android.os.Bundle; import android.os.Build; +import android.os.Bundle; import android.os.Process; import android.os.SystemClock; import android.os.UserHandle; import android.os.UserManager; -import androidx.annotation.IntDef; -import androidx.annotation.Nullable; -import androidx.annotation.StringRes; -import androidx.annotation.VisibleForTesting; -import androidx.annotation.WorkerThread; -import android.text.TextUtils; import android.text.format.DateUtils; import android.util.Log; import android.util.SparseLongArray; @@ -48,7 +42,6 @@ import com.android.settings.fuelgauge.anomaly.Anomaly; import com.android.settings.fuelgauge.batterytip.AnomalyInfo; import com.android.settings.fuelgauge.batterytip.StatsManagerConfig; import com.android.settings.overlay.FeatureFactory; - import com.android.settingslib.fuelgauge.PowerWhitelistBackend; import com.android.settingslib.utils.PowerUtil; @@ -58,6 +51,12 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; +import androidx.annotation.IntDef; +import androidx.annotation.Nullable; +import androidx.annotation.StringRes; +import androidx.annotation.VisibleForTesting; +import androidx.annotation.WorkerThread; + /** * Utils for battery operation */ @@ -93,14 +92,14 @@ public class BatteryUtils { public static BatteryUtils getInstance(Context context) { if (sInstance == null || sInstance.isDataCorrupted()) { - sInstance = new BatteryUtils(context); + sInstance = new BatteryUtils(context.getApplicationContext()); } return sInstance; } @VisibleForTesting BatteryUtils(Context context) { - mContext = context.getApplicationContext(); + mContext = context; mPackageManager = context.getPackageManager(); mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); mPowerUsageFeatureProvider = FeatureFactory.getFactory( diff --git a/src/com/android/settings/overlay/FeatureFactoryImpl.java b/src/com/android/settings/overlay/FeatureFactoryImpl.java index b64e540373b..48d563f71ba 100644 --- a/src/com/android/settings/overlay/FeatureFactoryImpl.java +++ b/src/com/android/settings/overlay/FeatureFactoryImpl.java @@ -21,7 +21,6 @@ import android.app.admin.DevicePolicyManager; import android.content.Context; import android.net.ConnectivityManager; import android.os.UserManager; -import androidx.annotation.Keep; import com.android.settings.accounts.AccountFeatureProvider; import com.android.settings.accounts.AccountFeatureProviderImpl; @@ -54,6 +53,8 @@ import com.android.settings.users.UserFeatureProvider; import com.android.settings.users.UserFeatureProviderImpl; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; +import androidx.annotation.Keep; + /** * {@link FeatureFactory} implementation for AOSP Settings. */ @@ -93,7 +94,8 @@ public class FeatureFactoryImpl extends FeatureFactory { @Override public PowerUsageFeatureProvider getPowerUsageFeatureProvider(Context context) { if (mPowerUsageFeatureProvider == null) { - mPowerUsageFeatureProvider = new PowerUsageFeatureProviderImpl(context); + mPowerUsageFeatureProvider = new PowerUsageFeatureProviderImpl( + context.getApplicationContext()); } return mPowerUsageFeatureProvider; } @@ -101,7 +103,8 @@ public class FeatureFactoryImpl extends FeatureFactory { @Override public DashboardFeatureProvider getDashboardFeatureProvider(Context context) { if (mDashboardFeatureProvider == null) { - mDashboardFeatureProvider = new DashboardFeatureProviderImpl(context); + mDashboardFeatureProvider = new DashboardFeatureProviderImpl( + context.getApplicationContext()); } return mDashboardFeatureProvider; } @@ -117,10 +120,11 @@ public class FeatureFactoryImpl extends FeatureFactory { @Override public ApplicationFeatureProvider getApplicationFeatureProvider(Context context) { if (mApplicationFeatureProvider == null) { - mApplicationFeatureProvider = new ApplicationFeatureProviderImpl(context, - context.getPackageManager(), + final Context appContext = context.getApplicationContext(); + mApplicationFeatureProvider = new ApplicationFeatureProviderImpl(appContext, + appContext.getPackageManager(), AppGlobals.getPackageManager(), - (DevicePolicyManager) context + (DevicePolicyManager) appContext .getSystemService(Context.DEVICE_POLICY_SERVICE)); } return mApplicationFeatureProvider; @@ -137,12 +141,14 @@ public class FeatureFactoryImpl extends FeatureFactory { @Override public EnterprisePrivacyFeatureProvider getEnterprisePrivacyFeatureProvider(Context context) { if (mEnterprisePrivacyFeatureProvider == null) { - mEnterprisePrivacyFeatureProvider = new EnterprisePrivacyFeatureProviderImpl(context, - (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE), - context.getPackageManager(), - UserManager.get(context), - (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE), - context.getResources()); + final Context appContext = context.getApplicationContext(); + mEnterprisePrivacyFeatureProvider = new EnterprisePrivacyFeatureProviderImpl(appContext, + (DevicePolicyManager) appContext.getSystemService( + Context.DEVICE_POLICY_SERVICE), + appContext.getPackageManager(), + UserManager.get(appContext), + (ConnectivityManager) appContext.getSystemService(Context.CONNECTIVITY_SERVICE), + appContext.getResources()); } return mEnterprisePrivacyFeatureProvider; } @@ -171,7 +177,8 @@ public class FeatureFactoryImpl extends FeatureFactory { @Override public SuggestionFeatureProvider getSuggestionFeatureProvider(Context context) { if (mSuggestionFeatureProvider == null) { - mSuggestionFeatureProvider = new SuggestionFeatureProviderImpl(context); + mSuggestionFeatureProvider = new SuggestionFeatureProviderImpl( + context.getApplicationContext()); } return mSuggestionFeatureProvider; } @@ -179,7 +186,7 @@ public class FeatureFactoryImpl extends FeatureFactory { @Override public UserFeatureProvider getUserFeatureProvider(Context context) { if (mUserFeatureProvider == null) { - mUserFeatureProvider = new UserFeatureProviderImpl(context); + mUserFeatureProvider = new UserFeatureProviderImpl(context.getApplicationContext()); } return mUserFeatureProvider; } diff --git a/src/com/android/settings/sound/AudioSwitchPreferenceController.java b/src/com/android/settings/sound/AudioSwitchPreferenceController.java index 119fadbd4ba..f49f08d7d4d 100644 --- a/src/com/android/settings/sound/AudioSwitchPreferenceController.java +++ b/src/com/android/settings/sound/AudioSwitchPreferenceController.java @@ -37,9 +37,6 @@ import android.media.MediaRouter; import android.media.MediaRouter.Callback; import android.os.Handler; import android.os.Looper; -import androidx.preference.ListPreference; -import androidx.preference.Preference; -import androidx.preference.PreferenceScreen; import android.text.TextUtils; import android.util.FeatureFlagUtils; import android.util.Log; @@ -64,6 +61,10 @@ import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; +import androidx.preference.ListPreference; +import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; + /** * Abstract class for audio switcher controller to notify subclass * updating the current status of switcher entry. Subclasses must overwrite @@ -74,7 +75,7 @@ public abstract class AudioSwitchPreferenceController extends BasePreferenceCont implements Preference.OnPreferenceChangeListener, BluetoothCallback, LifecycleObserver, OnStart, OnStop { - private static final String TAG = "AudioSwitchPreferenceController"; + private static final String TAG = "AudioSwitchPrefCtrl"; private static final int INVALID_INDEX = -1; protected final List mConnectedDevices; diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java index d5f3e2b58a7..3dee0a6a695 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BackgroundActivityPreferenceControllerTest.java @@ -32,7 +32,6 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.os.Build; import android.os.UserManager; -import androidx.preference.Preference; import com.android.settings.R; import com.android.settings.testutils.FakeFeatureFactory; @@ -50,6 +49,8 @@ import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; +import androidx.preference.Preference; + @RunWith(RobolectricTestRunner.class) @Config(shadows = {SettingsShadowResources.SettingsShadowTheme.class, ShadowFragment.class}) public class BackgroundActivityPreferenceControllerTest { @@ -89,6 +90,7 @@ public class BackgroundActivityPreferenceControllerTest { mShadowContext = RuntimeEnvironment.application; FakeFeatureFactory.setupForTest(); + when(mContext.getApplicationContext()).thenReturn(mContext); when(mContext.getPackageManager()).thenReturn(mPackageManager); when(mContext.getSystemService(Context.APP_OPS_SERVICE)).thenReturn(mAppOpsManager); when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager); @@ -118,7 +120,7 @@ public class BackgroundActivityPreferenceControllerTest { @Test public void testHandlePreferenceTreeClick_restrictApp_showDialog() { doReturn(AppOpsManager.MODE_ALLOWED).when(mAppOpsManager) - .checkOpNoThrow(anyInt(), anyInt(), anyString()); + .checkOpNoThrow(anyInt(), anyInt(), anyString()); mController.handlePreferenceTreeClick(mPreference); @@ -128,7 +130,7 @@ public class BackgroundActivityPreferenceControllerTest { @Test public void testHandlePreferenceTreeClick_unRestrictApp_showDialog() { doReturn(AppOpsManager.MODE_IGNORED).when(mAppOpsManager) - .checkOpNoThrow(anyInt(), anyInt(), anyString()); + .checkOpNoThrow(anyInt(), anyInt(), anyString()); mController.handlePreferenceTreeClick(mPreference); From b6584d0a5aa4ed832c4ce7b2d107b5bbe6cb48a9 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Fri, 8 Jun 2018 13:18:07 -0700 Subject: [PATCH 12/13] Check wifi password length by byte, not char. Change-Id: Ie6dc441780660c52ff01a2bced79a4e95200d731 Fixes: 79209073 Test: robotest --- src/com/android/settings/wifi/WifiUtils.java | 7 +++++-- .../src/com/android/settings/wifi/WifiUtilsTest.java | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/wifi/WifiUtils.java b/src/com/android/settings/wifi/WifiUtils.java index 1e8308b9607..ff8570e7a59 100644 --- a/src/com/android/settings/wifi/WifiUtils.java +++ b/src/com/android/settings/wifi/WifiUtils.java @@ -26,6 +26,8 @@ import android.net.wifi.WifiConfiguration; import android.provider.Settings; import android.text.TextUtils; +import java.nio.charset.StandardCharsets; + public class WifiUtils { private static final int SSID_ASCII_MIN_LENGTH = 1; @@ -38,7 +40,7 @@ public class WifiUtils { if (TextUtils.isEmpty(ssid)) { return false; } - return ssid.length() > SSID_ASCII_MAX_LENGTH; + return ssid.getBytes(StandardCharsets.UTF_8).length > SSID_ASCII_MAX_LENGTH; } public static boolean isSSIDTooShort(String ssid) { @@ -59,8 +61,9 @@ public class WifiUtils { /** * This method is a stripped and negated version of WifiConfigStore.canModifyNetwork. + * * @param context Context of caller - * @param config The WiFi config. + * @param config The WiFi config. * @return true if Settings cannot modify the config due to lockDown. */ public static boolean isNetworkLockedDown(Context context, WifiConfiguration config) { diff --git a/tests/robotests/src/com/android/settings/wifi/WifiUtilsTest.java b/tests/robotests/src/com/android/settings/wifi/WifiUtilsTest.java index 1f49654c402..806399d191f 100644 --- a/tests/robotests/src/com/android/settings/wifi/WifiUtilsTest.java +++ b/tests/robotests/src/com/android/settings/wifi/WifiUtilsTest.java @@ -29,7 +29,7 @@ public class WifiUtilsTest { @Test public void testSSID() { assertThat(WifiUtils.isSSIDTooLong("123")).isFalse(); - assertThat(WifiUtils.isSSIDTooLong("☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎")).isTrue(); + assertThat(WifiUtils.isSSIDTooLong("☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎☎")).isTrue(); assertThat(WifiUtils.isSSIDTooShort("123")).isFalse(); assertThat(WifiUtils.isSSIDTooShort("")).isTrue(); From 7f5692bdea5c6de81fb819e5b5c4cc3ac74585e1 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Fri, 8 Jun 2018 14:32:04 -0700 Subject: [PATCH 13/13] Misc search clean up - Make color mode page searchable and suppress its parent page. - Suppress entire DataUsageSummaryLegacy page in search. This page will be deleted soon Change-Id: I0f98c9073358934b98e986d034c89a9bf87e58ad Fixes: 70720645 Test: robotests --- res/xml/display_settings.xml | 1 + src/com/android/settings/DisplaySettings.java | 2 - .../datausage/DataUsageSummaryLegacy.java | 67 +++---------------- .../ColorModePreferenceController.java | 7 +- .../display/ColorModePreferenceFragment.java | 18 +++++ ...randfather_not_implementing_index_provider | 1 + .../ColorModePreferenceControllerTest.java | 31 +++++---- 7 files changed, 49 insertions(+), 78 deletions(-) diff --git a/res/xml/display_settings.xml b/res/xml/display_settings.xml index ec8a19733b3..683abd33f67 100644 --- a/res/xml/display_settings.xml +++ b/res/xml/display_settings.xml @@ -75,6 +75,7 @@ android:key="color_mode" android:title="@string/color_mode_title" android:fragment="com.android.settings.display.ColorModePreferenceFragment" + settings:controller="com.android.settings.display.ColorModePreferenceController" settings:keywords="@string/keywords_color_mode" /> getXmlResourcesToIndex(Context context, - boolean enabled) { - List resources = new ArrayList<>(); - SearchIndexableResource resource = new SearchIndexableResource(context); - resource.xmlResId = R.xml.data_usage_legacy; - resources.add(resource); - - resource = new SearchIndexableResource(context); - resource.xmlResId = R.xml.data_usage_cellular; - resources.add(resource); - - resource = new SearchIndexableResource(context); - resource.xmlResId = R.xml.data_usage_wifi; - resources.add(resource); - - return resources; - } - - @Override - public List getNonIndexableKeys(Context context) { - List keys = super.getNonIndexableKeys(context); - - if (!DataUsageUtils.hasMobileData(context)) { - keys.add(KEY_MOBILE_USAGE_TITLE); - keys.add(KEY_MOBILE_DATA_USAGE_TOGGLE); - keys.add(KEY_MOBILE_DATA_USAGE); - keys.add(KEY_MOBILE_BILLING_CYCLE); - } - - if (!DataUsageUtils.hasWifiRadio(context)) { - keys.add(KEY_WIFI_DATA_USAGE); - } - - // This title is named Wifi, and will confuse users. - keys.add(KEY_WIFI_USAGE_TITLE); - - return keys; - } - }; + = SummaryProvider::new; } diff --git a/src/com/android/settings/display/ColorModePreferenceController.java b/src/com/android/settings/display/ColorModePreferenceController.java index ebb4370098a..6a86cd93876 100644 --- a/src/com/android/settings/display/ColorModePreferenceController.java +++ b/src/com/android/settings/display/ColorModePreferenceController.java @@ -27,15 +27,14 @@ import com.android.settings.core.BasePreferenceController; public class ColorModePreferenceController extends BasePreferenceController { private static final String TAG = "ColorModePreference"; - private static final String KEY_COLOR_MODE = "color_mode"; private static final int SURFACE_FLINGER_TRANSACTION_QUERY_WIDE_COLOR = 1024; private final ConfigurationWrapper mConfigWrapper; private ColorDisplayController mColorDisplayController; - public ColorModePreferenceController(Context context) { - super(context, KEY_COLOR_MODE); + public ColorModePreferenceController(Context context, String key) { + super(context, key); mConfigWrapper = new ConfigurationWrapper(); } @@ -43,7 +42,7 @@ public class ColorModePreferenceController extends BasePreferenceController { public int getAvailabilityStatus() { return mConfigWrapper.isScreenWideColorGamut() && !getColorDisplayController().getAccessibilityTransformActivated() ? - AVAILABLE : DISABLED_FOR_USER; + AVAILABLE_UNSEARCHABLE : DISABLED_FOR_USER; } @Override diff --git a/src/com/android/settings/display/ColorModePreferenceFragment.java b/src/com/android/settings/display/ColorModePreferenceFragment.java index ab17c72051b..874dc71e80d 100644 --- a/src/com/android/settings/display/ColorModePreferenceFragment.java +++ b/src/com/android/settings/display/ColorModePreferenceFragment.java @@ -15,6 +15,8 @@ package com.android.settings.display; import android.content.Context; import android.graphics.drawable.Drawable; +import android.provider.SearchIndexableResource; + import androidx.annotation.VisibleForTesting; import androidx.preference.PreferenceScreen; @@ -23,13 +25,18 @@ import com.android.internal.logging.nano.MetricsProto; import com.android.settings.applications.LayoutPreference; import com.android.settings.R; +import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settings.search.Indexable; import com.android.settings.widget.RadioButtonPickerFragment; +import com.android.settingslib.search.SearchIndexable; import com.android.settingslib.widget.CandidateInfo; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; @SuppressWarnings("WeakerAccess") +@SearchIndexable public class ColorModePreferenceFragment extends RadioButtonPickerFragment implements ColorDisplayController.Callback { @@ -181,4 +188,15 @@ public class ColorModePreferenceFragment extends RadioButtonPickerFragment getActivity().onBackPressed(); } } + + public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = + new BaseSearchIndexProvider() { + @Override + public List getXmlResourcesToIndex( + Context context, boolean enabled) { + final SearchIndexableResource sir = new SearchIndexableResource(context); + sir.xmlResId = R.xml.color_mode_settings; + return Arrays.asList(sir); + } + }; } diff --git a/tests/robotests/assets/grandfather_not_implementing_index_provider b/tests/robotests/assets/grandfather_not_implementing_index_provider index a55f02483c8..655346b0a02 100644 --- a/tests/robotests/assets/grandfather_not_implementing_index_provider +++ b/tests/robotests/assets/grandfather_not_implementing_index_provider @@ -7,6 +7,7 @@ com.android.settings.accounts.AccountDetailDashboardFragment com.android.settings.accounts.ManagedProfileSettings com.android.settings.fuelgauge.PowerUsageAnomalyDetails com.android.settings.fuelgauge.AdvancedPowerUsageDetail +com.android.settings.datausage.DataUsageSummaryLegacy com.android.settings.development.featureflags.FeatureFlagsDashboard com.android.settings.development.qstile.DevelopmentTileConfigFragment com.android.settings.deviceinfo.StorageProfileFragment diff --git a/tests/robotests/src/com/android/settings/display/ColorModePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/ColorModePreferenceControllerTest.java index c7b65356c20..83343feb9e4 100644 --- a/tests/robotests/src/com/android/settings/display/ColorModePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/display/ColorModePreferenceControllerTest.java @@ -16,13 +16,12 @@ package com.android.settings.display; +import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.Context; -import androidx.preference.Preference; import com.android.internal.app.ColorDisplayController; import com.android.settings.R; @@ -35,63 +34,69 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; +import androidx.preference.Preference; + @RunWith(SettingsRobolectricTestRunner.class) public class ColorModePreferenceControllerTest { - @Mock - private Preference mPreference; @Mock private ColorDisplayController mColorDisplayController; private Context mContext; + private Preference mPreference; private ColorModePreferenceController mController; @Before public void setup() { MockitoAnnotations.initMocks(this); mContext = RuntimeEnvironment.application; - mController = spy(new ColorModePreferenceController(mContext)); + mController = spy(new ColorModePreferenceController(mContext, "test")); + mPreference = new Preference(mContext); doReturn(mColorDisplayController).when(mController).getColorDisplayController(); } @Test public void updateState_colorModeAutomatic_shouldSetSummaryToAutomatic() { when(mColorDisplayController.getColorMode()) - .thenReturn(ColorDisplayController.COLOR_MODE_AUTOMATIC); + .thenReturn(ColorDisplayController.COLOR_MODE_AUTOMATIC); mController.updateState(mPreference); - verify(mPreference).setSummary(mContext.getString(R.string.color_mode_option_automatic)); + assertThat(mPreference.getSummary()) + .isEqualTo(mContext.getText(R.string.color_mode_option_automatic)); } @Test public void updateState_colorModeSaturated_shouldSetSummaryToSaturated() { when(mColorDisplayController.getColorMode()) - .thenReturn(ColorDisplayController.COLOR_MODE_SATURATED); + .thenReturn(ColorDisplayController.COLOR_MODE_SATURATED); mController.updateState(mPreference); - verify(mPreference).setSummary(mContext.getString(R.string.color_mode_option_saturated)); + assertThat(mPreference.getSummary()) + .isEqualTo(mContext.getText(R.string.color_mode_option_saturated)); } @Test public void updateState_colorModeBoosted_shouldSetSummaryToBoosted() { when(mColorDisplayController.getColorMode()) - .thenReturn(ColorDisplayController.COLOR_MODE_BOOSTED); + .thenReturn(ColorDisplayController.COLOR_MODE_BOOSTED); mController.updateState(mPreference); - verify(mPreference).setSummary(mContext.getString(R.string.color_mode_option_boosted)); + assertThat(mPreference.getSummary()) + .isEqualTo(mContext.getText(R.string.color_mode_option_boosted)); } @Test public void updateState_colorModeNatural_shouldSetSummaryToNatural() { when(mColorDisplayController.getColorMode()) - .thenReturn(ColorDisplayController.COLOR_MODE_NATURAL); + .thenReturn(ColorDisplayController.COLOR_MODE_NATURAL); mController.updateState(mPreference); - verify(mPreference).setSummary(mContext.getString(R.string.color_mode_option_natural)); + assertThat(mPreference.getSummary()) + .isEqualTo(mContext.getText(R.string.color_mode_option_natural)); } }