From e4c5357005482b95448867967ba351f46ce2d0d5 Mon Sep 17 00:00:00 2001 From: tmfang Date: Thu, 11 Apr 2019 23:20:33 +0800 Subject: [PATCH 01/16] Remove odd spacing after the divider Two strategies for this UI problem - If "PreferenceCategory" is an anchor for loading dynamical preferences, we keep this preference category and then assign a no spacing layout to it. - If the cases only want to have a divider, we remove this preference category. And then use allowDividerBelow or allowDividerAbove attribute. Test: visual Fixes: 130246959 Change-Id: I227fef20f5255159e4ab9a5add43a04b94e9b19a --- res/xml/app_and_notification.xml | 1 + res/xml/location_settings.xml | 5 ++++- res/xml/privacy_dashboard_settings.xml | 3 ++- res/xml/security_dashboard_settings.xml | 3 ++- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/res/xml/app_and_notification.xml b/res/xml/app_and_notification.xml index cdeb35eb0e0..5368f332504 100644 --- a/res/xml/app_and_notification.xml +++ b/res/xml/app_and_notification.xml @@ -43,6 +43,7 @@ diff --git a/res/xml/location_settings.xml b/res/xml/location_settings.xml index 2f43ce8cd88..9ab80a741cd 100644 --- a/res/xml/location_settings.xml +++ b/res/xml/location_settings.xml @@ -28,6 +28,7 @@ @@ -54,7 +55,8 @@ android:selectable="true" /> + android:key="location_services" + android:layout="@layout/preference_category_no_label"/> diff --git a/res/xml/privacy_dashboard_settings.xml b/res/xml/privacy_dashboard_settings.xml index 45b9d1955e3..aa789b90424 100644 --- a/res/xml/privacy_dashboard_settings.xml +++ b/res/xml/privacy_dashboard_settings.xml @@ -64,7 +64,8 @@ + android:key="privacy_services" + android:layout="@layout/preference_category_no_label"/> diff --git a/res/xml/security_dashboard_settings.xml b/res/xml/security_dashboard_settings.xml index 9fe3d5b2d22..6a896ced42c 100644 --- a/res/xml/security_dashboard_settings.xml +++ b/res/xml/security_dashboard_settings.xml @@ -96,7 +96,8 @@ + android:key="security_settings_device_admin_category" + android:layout="@layout/preference_category_no_label"> Date: Mon, 15 Apr 2019 10:55:56 -0400 Subject: [PATCH 02/16] Show correct text for old zen modes When the device is in total silence or alarms only dnd modes, DND settings for messages and calls should say that no callers and no messages are allowed through. Test: atest Fixes: 130152926 Change-Id: I980dea46ef29e736ada41755bf0ea395c198f851 --- .../ZenModeCallsPreferenceController.java | 14 +++++++++++++- .../ZenModeMessagesPreferenceController.java | 14 +++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/notification/ZenModeCallsPreferenceController.java b/src/com/android/settings/notification/ZenModeCallsPreferenceController.java index 0a8b931122f..d931f6c6fe2 100644 --- a/src/com/android/settings/notification/ZenModeCallsPreferenceController.java +++ b/src/com/android/settings/notification/ZenModeCallsPreferenceController.java @@ -16,7 +16,9 @@ package com.android.settings.notification; +import android.app.NotificationManager; import android.content.Context; +import android.provider.Settings; import androidx.preference.Preference; @@ -50,6 +52,16 @@ public class ZenModeCallsPreferenceController extends public void updateState(Preference preference) { super.updateState(preference); - preference.setSummary(mSummaryBuilder.getCallsSettingSummary(getPolicy())); + switch (getZenMode()) { + case Settings.Global.ZEN_MODE_NO_INTERRUPTIONS: + case Settings.Global.ZEN_MODE_ALARMS: + preference.setEnabled(false); + preference.setSummary(mBackend.getAlarmsTotalSilenceCallsMessagesSummary( + NotificationManager.Policy.PRIORITY_CATEGORY_CALLS)); + break; + default: + preference.setEnabled(true); + preference.setSummary(mSummaryBuilder.getCallsSettingSummary(getPolicy())); + } } } diff --git a/src/com/android/settings/notification/ZenModeMessagesPreferenceController.java b/src/com/android/settings/notification/ZenModeMessagesPreferenceController.java index 2e41f205f58..d51be27a206 100644 --- a/src/com/android/settings/notification/ZenModeMessagesPreferenceController.java +++ b/src/com/android/settings/notification/ZenModeMessagesPreferenceController.java @@ -16,7 +16,9 @@ package com.android.settings.notification; +import android.app.NotificationManager; import android.content.Context; +import android.provider.Settings; import androidx.preference.Preference; @@ -49,6 +51,16 @@ public class ZenModeMessagesPreferenceController extends public void updateState(Preference preference) { super.updateState(preference); - preference.setSummary(mSummaryBuilder.getMessagesSettingSummary(getPolicy())); + switch (getZenMode()) { + case Settings.Global.ZEN_MODE_NO_INTERRUPTIONS: + case Settings.Global.ZEN_MODE_ALARMS: + preference.setEnabled(false); + preference.setSummary(mBackend.getAlarmsTotalSilenceCallsMessagesSummary( + NotificationManager.Policy.PRIORITY_CATEGORY_MESSAGES)); + break; + default: + preference.setEnabled(true); + preference.setSummary(mSummaryBuilder.getMessagesSettingSummary(getPolicy())); + } } } From 634d8b3ee4597741f9cd84e4cee5c2b14862e515 Mon Sep 17 00:00:00 2001 From: lindatseng Date: Tue, 16 Apr 2019 16:07:36 -0700 Subject: [PATCH 03/16] Set max num of slices allowed in panel view Setup a max allowed num for PanelSlicesAdapter to prevent too many slices showing in single panel. Test: Manual verify Test: atest PanelSlicesAdapterTest Fixes: 129358092 Change-Id: I7b72a29489e597b8309d74841eaeab0fe42aace6 --- .../settings/panel/PanelSlicesAdapter.java | 17 +++++++- .../panel/PanelSlicesAdapterTest.java | 43 +++++++++++++------ 2 files changed, 44 insertions(+), 16 deletions(-) diff --git a/src/com/android/settings/panel/PanelSlicesAdapter.java b/src/com/android/settings/panel/PanelSlicesAdapter.java index e2444133970..dcd878e2291 100644 --- a/src/com/android/settings/panel/PanelSlicesAdapter.java +++ b/src/com/android/settings/panel/PanelSlicesAdapter.java @@ -44,6 +44,12 @@ import java.util.List; public class PanelSlicesAdapter extends RecyclerView.Adapter { + /** + * Maximum number of slices allowed on the panel view. + */ + @VisibleForTesting + static final int MAX_NUM_OF_SLICES = 5; + private final List> mSliceLiveData; private final int mMetricsCategory; private final PanelFragment mPanelFragment; @@ -70,14 +76,21 @@ public class PanelSlicesAdapter sliceRowViewHolder.onBind(mSliceLiveData.get(position)); } + /** + * Return the number of available items in the adapter with max number of slices enforced. + */ @Override public int getItemCount() { - return mSliceLiveData.size(); + return Math.min(mSliceLiveData.size(), MAX_NUM_OF_SLICES); } + /** + * Return the available data from the adapter. If the number of Slices over the max number + * allowed, the list will only have the first MAX_NUM_OF_SLICES of slices. + */ @VisibleForTesting List> getData() { - return mSliceLiveData; + return mSliceLiveData.subList(0, getItemCount()); } /** diff --git a/tests/robotests/src/com/android/settings/panel/PanelSlicesAdapterTest.java b/tests/robotests/src/com/android/settings/panel/PanelSlicesAdapterTest.java index 14a7db9581a..922e629d1a6 100644 --- a/tests/robotests/src/com/android/settings/panel/PanelSlicesAdapterTest.java +++ b/tests/robotests/src/com/android/settings/panel/PanelSlicesAdapterTest.java @@ -16,12 +16,14 @@ package com.android.settings.panel; +import static com.android.settings.panel.PanelSlicesAdapter.MAX_NUM_OF_SLICES; import static com.android.settings.slices.CustomSliceRegistry.MEDIA_OUTPUT_INDICATOR_SLICE_URI; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; @@ -40,7 +42,6 @@ import com.android.settings.testutils.FakeFeatureFactory; import org.junit.Before; import org.junit.runner.RunWith; import org.junit.Test; -import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; @@ -62,11 +63,6 @@ public class PanelSlicesAdapterTest { private FakePanelContent mFakePanelContent; private List> mData = new ArrayList<>(); - @Mock - private LiveData mLiveData; - - private Slice mSlice; - @Before public void setUp() { MockitoAnnotations.initMocks(this); @@ -91,17 +87,18 @@ public class PanelSlicesAdapterTest { } - private void constructTestLiveData(Uri uri) { + private void addTestLiveData(Uri uri) { // Create a slice to return for the LiveData - mSlice = spy(new Slice()); - doReturn(uri).when(mSlice).getUri(); - when(mLiveData.getValue()).thenReturn(mSlice); - mData.add(mLiveData); + final Slice slice = spy(new Slice()); + doReturn(uri).when(slice).getUri(); + final LiveData liveData = mock(LiveData.class); + when(liveData.getValue()).thenReturn(slice); + mData.add(liveData); } @Test public void onCreateViewHolder_returnsSliceRowViewHolder() { - constructTestLiveData(DATA_URI); + addTestLiveData(DATA_URI); final PanelSlicesAdapter adapter = new PanelSlicesAdapter(mPanelFragment, mData, 0 /* metrics category */); final ViewGroup view = new FrameLayout(mContext); @@ -111,9 +108,27 @@ public class PanelSlicesAdapterTest { assertThat(viewHolder.sliceView).isNotNull(); } + @Test + public void sizeOfAdapter_shouldNotExceedMaxNum() { + for (int i = 0; i < MAX_NUM_OF_SLICES + 2; i++) { + addTestLiveData(DATA_URI); + } + + assertThat(mData.size()).isEqualTo(MAX_NUM_OF_SLICES + 2); + + final PanelSlicesAdapter adapter = + new PanelSlicesAdapter(mPanelFragment, mData, 0 /* metrics category */); + final ViewGroup view = new FrameLayout(mContext); + final PanelSlicesAdapter.SliceRowViewHolder viewHolder = + adapter.onCreateViewHolder(view, 0); + + assertThat(adapter.getItemCount()).isEqualTo(MAX_NUM_OF_SLICES); + assertThat(adapter.getData().size()).isEqualTo(MAX_NUM_OF_SLICES); + } + @Test public void nonMediaOutputIndicatorSlice_shouldAllowDividerAboveAndBelow() { - constructTestLiveData(DATA_URI); + addTestLiveData(DATA_URI); final PanelSlicesAdapter adapter = new PanelSlicesAdapter(mPanelFragment, mData, 0 /* metrics category */); final int position = 0; @@ -129,7 +144,7 @@ public class PanelSlicesAdapterTest { @Test public void mediaOutputIndicatorSlice_shouldNotAllowDividerAbove() { - constructTestLiveData(MEDIA_OUTPUT_INDICATOR_SLICE_URI); + addTestLiveData(MEDIA_OUTPUT_INDICATOR_SLICE_URI); final PanelSlicesAdapter adapter = new PanelSlicesAdapter(mPanelFragment, mData, 0 /* metrics category */); From ed701572d76c6f358c33460b8eb170916149a2cf Mon Sep 17 00:00:00 2001 From: Jonathan Scott Date: Mon, 15 Apr 2019 15:36:17 +0100 Subject: [PATCH 04/16] Don't show policy transparency UI for cross-profile setting. Also removes the switch if cross-profile calendar is disabled by admin. Test: atest ManagedProfileSettingsTest Fixes: 123930863 Change-Id: Ieeb9266e8833d7ca730fedb5e947b03ec7d18d3c --- res/xml/managed_profile_settings.xml | 11 ++- ...eCalendarDisabledPreferenceController.java | 47 +++++++++ ...ssProfileCalendarPreferenceController.java | 51 ++++++---- .../accounts/ManagedProfileSettings.java | 8 ++ ...endarDisabledPreferenceControllerTest.java | 99 +++++++++++++++++++ ...ofileCalendarPreferenceControllerTest.java | 18 ++-- 6 files changed, 206 insertions(+), 28 deletions(-) create mode 100644 src/com/android/settings/accounts/CrossProfileCalendarDisabledPreferenceController.java create mode 100644 tests/robotests/src/com/android/settings/accounts/CrossProfileCalendarDisabledPreferenceControllerTest.java diff --git a/res/xml/managed_profile_settings.xml b/res/xml/managed_profile_settings.xml index bd44cc1a307..7b65a3d30b0 100644 --- a/res/xml/managed_profile_settings.xml +++ b/res/xml/managed_profile_settings.xml @@ -32,11 +32,18 @@ settings:useAdditionalSummary="true" settings:controller="com.android.settings.accounts.ContactSearchPreferenceController"/> - + + \ No newline at end of file diff --git a/src/com/android/settings/accounts/CrossProfileCalendarDisabledPreferenceController.java b/src/com/android/settings/accounts/CrossProfileCalendarDisabledPreferenceController.java new file mode 100644 index 00000000000..c0879823792 --- /dev/null +++ b/src/com/android/settings/accounts/CrossProfileCalendarDisabledPreferenceController.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.settings.accounts; +import static com.android.settings.accounts.CrossProfileCalendarPreferenceController.isCrossProfileCalendarDisallowedByAdmin; + +import android.content.Context; +import android.os.UserHandle; + +import com.android.settings.core.BasePreferenceController; + +public class CrossProfileCalendarDisabledPreferenceController extends BasePreferenceController { + private UserHandle mManagedUser; + + public void setManagedUser(UserHandle managedUser) { + mManagedUser = managedUser; + } + + public CrossProfileCalendarDisabledPreferenceController(Context context, + String preferenceKey) { + super(context, preferenceKey); + } + + @Override + public int getAvailabilityStatus() { + if (mManagedUser != null + && isCrossProfileCalendarDisallowedByAdmin( + mContext, mManagedUser.getIdentifier())) { + return AVAILABLE; + } + + return DISABLED_FOR_USER; + } +} diff --git a/src/com/android/settings/accounts/CrossProfileCalendarPreferenceController.java b/src/com/android/settings/accounts/CrossProfileCalendarPreferenceController.java index aa314d6974a..863e790719f 100644 --- a/src/com/android/settings/accounts/CrossProfileCalendarPreferenceController.java +++ b/src/com/android/settings/accounts/CrossProfileCalendarPreferenceController.java @@ -15,19 +15,21 @@ package com.android.settings.accounts; import static android.provider.Settings.Secure.CROSS_PROFILE_CALENDAR_ENABLED; +import android.app.admin.DevicePolicyManager; import android.content.Context; +import android.content.pm.PackageManager; import android.os.UserHandle; import android.provider.Settings; - -import androidx.preference.Preference; +import android.util.Log; import com.android.settings.core.TogglePreferenceController; -import com.android.settingslib.RestrictedLockUtils; -import com.android.settingslib.RestrictedLockUtilsInternal; -import com.android.settingslib.RestrictedSwitchPreference; + +import java.util.Set; public class CrossProfileCalendarPreferenceController extends TogglePreferenceController { + private static final String TAG = "CrossProfileCalendarPreferenceController"; + private UserHandle mManagedUser; public CrossProfileCalendarPreferenceController(Context context, String key) { @@ -40,19 +42,13 @@ public class CrossProfileCalendarPreferenceController extends TogglePreferenceCo @Override public int getAvailabilityStatus() { - return (mManagedUser != null) ? AVAILABLE : DISABLED_FOR_USER; - } - - @Override - public void updateState(Preference preference) { - super.updateState(preference); - if (preference instanceof RestrictedSwitchPreference && mManagedUser != null) { - final RestrictedSwitchPreference pref = (RestrictedSwitchPreference) preference; - final RestrictedLockUtils.EnforcedAdmin enforcedAdmin = - RestrictedLockUtilsInternal.getCrossProfileCalendarEnforcingAdmin( - mContext, mManagedUser.getIdentifier()); - pref.setDisabledByAdmin(enforcedAdmin); + if (mManagedUser != null + && !isCrossProfileCalendarDisallowedByAdmin( + mContext, mManagedUser.getIdentifier())) { + return AVAILABLE; } + + return DISABLED_FOR_USER; } @Override @@ -74,4 +70,25 @@ public class CrossProfileCalendarPreferenceController extends TogglePreferenceCo return Settings.Secure.putIntForUser(mContext.getContentResolver(), CROSS_PROFILE_CALENDAR_ENABLED, value, mManagedUser.getIdentifier()); } + + static boolean isCrossProfileCalendarDisallowedByAdmin(Context context, int userId) { + final Context managedProfileContext = createPackageContextAsUser(context, userId); + final DevicePolicyManager dpm = managedProfileContext.getSystemService( + DevicePolicyManager.class); + if (dpm == null) { + return true; + } + final Set packages = dpm.getCrossProfileCalendarPackages(); + return packages != null && packages.isEmpty(); + } + + private static Context createPackageContextAsUser(Context context, int userId) { + try { + return context.createPackageContextAsUser( + context.getPackageName(), 0 /* flags */, UserHandle.of(userId)); + } catch (PackageManager.NameNotFoundException e) { + Log.e(TAG, "Failed to create user context", e); + } + return null; + } } \ No newline at end of file diff --git a/src/com/android/settings/accounts/ManagedProfileSettings.java b/src/com/android/settings/accounts/ManagedProfileSettings.java index a4105efa779..1f18d07ec7e 100644 --- a/src/com/android/settings/accounts/ManagedProfileSettings.java +++ b/src/com/android/settings/accounts/ManagedProfileSettings.java @@ -16,17 +16,23 @@ package com.android.settings.accounts; +import android.app.admin.DevicePolicyManager; import android.app.settings.SettingsEnums; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.pm.PackageManager; import android.os.Bundle; import android.os.UserHandle; import android.os.UserManager; import android.provider.SearchIndexableResource; import android.util.Log; +import androidx.preference.Preference; +import androidx.preference.PreferenceGroup; +import androidx.preference.PreferenceManager; + import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.dashboard.DashboardFragment; @@ -36,6 +42,7 @@ import com.android.settingslib.search.SearchIndexable; import java.util.ArrayList; import java.util.List; +import java.util.Set; /** * Setting page for managed profile. @@ -72,6 +79,7 @@ public class ManagedProfileSettings extends DashboardFragment { use(WorkModePreferenceController.class).setManagedUser(mManagedUser); use(ContactSearchPreferenceController.class).setManagedUser(mManagedUser); use(CrossProfileCalendarPreferenceController.class).setManagedUser(mManagedUser); + use(CrossProfileCalendarDisabledPreferenceController.class).setManagedUser(mManagedUser); } @Override diff --git a/tests/robotests/src/com/android/settings/accounts/CrossProfileCalendarDisabledPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accounts/CrossProfileCalendarDisabledPreferenceControllerTest.java new file mode 100644 index 00000000000..2226e2c4e1d --- /dev/null +++ b/tests/robotests/src/com/android/settings/accounts/CrossProfileCalendarDisabledPreferenceControllerTest.java @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.settings.accounts; + +import static com.android.settings.core.BasePreferenceController.AVAILABLE; +import static com.android.settings.core.BasePreferenceController.DISABLED_FOR_USER; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; +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 static org.robolectric.RuntimeEnvironment.application; + +import android.app.admin.DevicePolicyManager; +import android.content.ComponentName; +import android.content.Context; +import android.os.UserHandle; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.Shadows; +import org.robolectric.shadows.ShadowDevicePolicyManager; + +import java.util.Collections; + +@RunWith(RobolectricTestRunner.class) +public class CrossProfileCalendarDisabledPreferenceControllerTest { + + private static final String PREF_KEY = "cross_profile_calendar_disabled"; + private static final int MANAGED_USER_ID = 10; + private static final String TEST_PACKAGE_NAME = "com.test"; + private static final ComponentName TEST_COMPONENT_NAME = new ComponentName("test", "test"); + + @Mock + private UserHandle mManagedUser; + + private Context mContext; + private CrossProfileCalendarDisabledPreferenceController mController; + private ShadowDevicePolicyManager mDpm; + + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + mContext = spy(RuntimeEnvironment.application); + mController = new CrossProfileCalendarDisabledPreferenceController(mContext, PREF_KEY); + mController.setManagedUser(mManagedUser); + mDpm = Shadows.shadowOf(application.getSystemService(DevicePolicyManager.class)); + + when(mManagedUser.getIdentifier()).thenReturn(MANAGED_USER_ID); + doReturn(mContext).when(mContext).createPackageContextAsUser( + any(String.class), anyInt(), any(UserHandle.class)); + } + + @Test + public void getAvailabilityStatus_noPackageAllowed_shouldBeAvailable() { + mDpm.setProfileOwner(TEST_COMPONENT_NAME); + + assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE); + } + + @Test + public void getAvailabilityStatus_somePackagesAllowed_shouldBeDisabledForUser() { + mDpm.setProfileOwner(TEST_COMPONENT_NAME); + mDpm.setCrossProfileCalendarPackages(TEST_COMPONENT_NAME, + Collections.singleton(TEST_PACKAGE_NAME)); + + assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER); + } + + @Test + public void getAvailabilityStatus_allPackagesAllowed_shouldBeDisabledForUser() { + mDpm.setProfileOwner(TEST_COMPONENT_NAME); + mDpm.setCrossProfileCalendarPackages(TEST_COMPONENT_NAME, null); + + assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER); + } +} \ No newline at end of file diff --git a/tests/robotests/src/com/android/settings/accounts/CrossProfileCalendarPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accounts/CrossProfileCalendarPreferenceControllerTest.java index c6a48a889a9..2cbed9782e6 100644 --- a/tests/robotests/src/com/android/settings/accounts/CrossProfileCalendarPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/accounts/CrossProfileCalendarPreferenceControllerTest.java @@ -17,6 +17,9 @@ package com.android.settings.accounts; import static android.provider.Settings.Secure.CROSS_PROFILE_CALENDAR_ENABLED; +import static com.android.settings.core.BasePreferenceController.AVAILABLE; +import static com.android.settings.core.BasePreferenceController.DISABLED_FOR_USER; + import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; @@ -117,30 +120,27 @@ public class CrossProfileCalendarPreferenceControllerTest { } @Test - public void updateState_noPackageAllowed_preferenceShouldBeDisabled() throws Exception { + public void getAvailabilityStatus_noPackageAllowed_shouldBeDisabledForUser() throws Exception { dpm.setProfileOwner(TEST_COMPONENT_NAME); - mController.updateState(mPreference); - verify(mPreference).setDisabledByAdmin(any()); + assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER); } @Test - public void updateState_somePackagesAllowed_preferenceShouldNotBeDisabled() throws Exception { + public void getAvailabilityStatus_somePackagesAllowed_shouldBeAvailable() throws Exception { dpm.setProfileOwner(TEST_COMPONENT_NAME); dpm.setCrossProfileCalendarPackages(TEST_COMPONENT_NAME, Collections.singleton(TEST_PACKAGE_NAME)); - mController.updateState(mPreference); - verify(mPreference).setDisabledByAdmin(null); + assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE); } @Test - public void updateState_allPackagesAllowed_preferenceShouldNotBeDisabled() throws Exception { + public void getAvailabilityStatus_allPackagesAllowed_shouldBeAvailable() throws Exception { dpm.setProfileOwner(TEST_COMPONENT_NAME); dpm.setCrossProfileCalendarPackages(TEST_COMPONENT_NAME, null); - mController.updateState(mPreference); - verify(mPreference).setDisabledByAdmin(null); + assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE); } @Test From 8667e01cf5871ce0bb078fcfb371ffd314114c6a Mon Sep 17 00:00:00 2001 From: markchien Date: Tue, 9 Apr 2019 19:51:33 +0800 Subject: [PATCH 05/16] Ignore the outdated entitlement check Don't run entitlement if the request is base on outdated subId. Bug: 129751453 Test: -build, flash, boot -atest TetherServiceTest -manual test with carrier SIM Change-Id: Id3157df1a5758f8c72acbc45c9fefd2215c87395 Merged-In: Id3157df1a5758f8c72acbc45c9fefd2215c87395 --- .../network/TetherProvisioningActivity.java | 12 ++++++++++-- .../settings/wifi/tether/TetherService.java | 14 ++++++++++++++ .../settings/wifi/tether/TetherServiceTest.java | 17 ++++++++++++++++- 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/network/TetherProvisioningActivity.java b/src/com/android/settings/network/TetherProvisioningActivity.java index b30950e5d17..48c570791b2 100644 --- a/src/com/android/settings/network/TetherProvisioningActivity.java +++ b/src/com/android/settings/network/TetherProvisioningActivity.java @@ -39,6 +39,7 @@ public class TetherProvisioningActivity extends Activity { private static final int PROVISION_REQUEST = 0; private static final String TAG = "TetherProvisioningAct"; private static final String EXTRA_TETHER_TYPE = "TETHER_TYPE"; + private static final String EXTRA_SUBID = "subId"; private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); private ResultReceiver mResultReceiver; @@ -49,14 +50,21 @@ public class TetherProvisioningActivity extends Activity { mResultReceiver = (ResultReceiver)getIntent().getParcelableExtra( ConnectivityManager.EXTRA_PROVISION_CALLBACK); - int tetherType = getIntent().getIntExtra(ConnectivityManager.EXTRA_ADD_TETHER_TYPE, + final int tetherType = getIntent().getIntExtra(ConnectivityManager.EXTRA_ADD_TETHER_TYPE, ConnectivityManager.TETHERING_INVALID); + + final int tetherSubId = getIntent().getIntExtra(EXTRA_SUBID, + SubscriptionManager.INVALID_SUBSCRIPTION_ID); final int subId = SubscriptionManager.getDefaultDataSubscriptionId(); + if (tetherSubId != subId) { + Log.e(TAG, "This Provisioning request is outdated, current subId: " + subId); + return; + } final Resources res = Utils.getResourcesForSubId(this, subId); final String[] provisionApp = res.getStringArray( com.android.internal.R.array.config_mobile_hotspot_provision_app); - Intent intent = new Intent(Intent.ACTION_MAIN); + final Intent intent = new Intent(Intent.ACTION_MAIN); intent.setClassName(provisionApp[0], provisionApp[1]); intent.putExtra(EXTRA_TETHER_TYPE, tetherType); if (DEBUG) { diff --git a/src/com/android/settings/wifi/tether/TetherService.java b/src/com/android/settings/wifi/tether/TetherService.java index 09781a8ed5b..34daccf6aea 100644 --- a/src/com/android/settings/wifi/tether/TetherService.java +++ b/src/com/android/settings/wifi/tether/TetherService.java @@ -55,6 +55,8 @@ public class TetherService extends Service { @VisibleForTesting public static final String EXTRA_RESULT = "EntitlementResult"; + @VisibleForTesting + public static final String EXTRA_SUBID = "subId"; // Activity results to match the activity provision protocol. // Default to something not ok. @@ -100,6 +102,18 @@ public class TetherService extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId) { + if (intent.hasExtra(EXTRA_SUBID)) { + final int tetherSubId = intent.getIntExtra(EXTRA_SUBID, + SubscriptionManager.INVALID_SUBSCRIPTION_ID); + final int subId = getTetherServiceWrapper().getDefaultDataSubscriptionId(); + if (tetherSubId != subId) { + Log.e(TAG, "This Provisioning request is outdated, current subId: " + subId); + if (!mInProvisionCheck) { + stopSelf(); + } + return START_NOT_STICKY; + } + } if (intent.hasExtra(ConnectivityManager.EXTRA_ADD_TETHER_TYPE)) { int type = intent.getIntExtra(ConnectivityManager.EXTRA_ADD_TETHER_TYPE, ConnectivityManager.TETHERING_INVALID); diff --git a/tests/unit/src/com/android/settings/wifi/tether/TetherServiceTest.java b/tests/unit/src/com/android/settings/wifi/tether/TetherServiceTest.java index 03320923d7a..0739ef0ce23 100644 --- a/tests/unit/src/com/android/settings/wifi/tether/TetherServiceTest.java +++ b/tests/unit/src/com/android/settings/wifi/tether/TetherServiceTest.java @@ -266,11 +266,26 @@ public class TetherServiceTest extends ServiceTestCase { assertEquals(TetherService.class.getName(), pi.getIntent().getComponent().getClassName()); } + public void testIgnoreOutdatedRequest() { + Intent intent = new Intent(); + intent.putExtra(EXTRA_ADD_TETHER_TYPE, TETHERING_WIFI); + intent.putExtra(EXTRA_RUN_PROVISION, true); + intent.putExtra(EXTRA_PROVISION_CALLBACK, mResultReceiver); + intent.putExtra(TetherService.EXTRA_SUBID, 1 /* Tested subId number */); + startService(intent); + + SystemClock.sleep(PROVISION_TIMEOUT); + assertEquals(TETHERING_INVALID, mLastTetherRequestType); + assertTrue(mWrapper.isAppInactive(ENTITLEMENT_PACKAGE_NAME)); + assertTrue(mWrapper.isAppInactive(FAKE_PACKAGE_NAME)); + } + private void runProvisioningForType(int type) { Intent intent = new Intent(); intent.putExtra(EXTRA_ADD_TETHER_TYPE, type); intent.putExtra(EXTRA_RUN_PROVISION, true); intent.putExtra(EXTRA_PROVISION_CALLBACK, mResultReceiver); + intent.putExtra(TetherService.EXTRA_SUBID, INVALID_SUBSCRIPTION_ID); startService(intent); } @@ -291,7 +306,7 @@ public class TetherServiceTest extends ServiceTestCase { long startTime = SystemClock.uptimeMillis(); while (true) { if (mLastTetherRequestType == expectedType) { - mLastTetherRequestType = -1; + mLastTetherRequestType = TETHERING_INVALID; return true; } if ((SystemClock.uptimeMillis() - startTime) > PROVISION_TIMEOUT) { From 15899e8b0efe6549cb2cb59fbce06d9e27a87c49 Mon Sep 17 00:00:00 2001 From: Lei Yu Date: Wed, 10 Apr 2019 16:05:27 -0700 Subject: [PATCH 06/16] Add SettingsPolicy to control BT feature Fixes: 130302238 Test: RunSettingsRoboTests Change-Id: I7e1bf55c476f8e4d3dec7a7dfc0e8d44e5bd53ae --- ...ancedBluetoothDetailsHeaderController.java | 8 ++-- .../BluetoothDetailsHeaderController.java | 9 +++- .../BluetoothDeviceDetailsFragment.java | 10 ++-- .../ConnectedDeviceDashboardFragment.java | 9 +++- .../settings/core/SettingsUIDeviceConfig.java | 36 ++++++++++++++ ...dBluetoothDetailsHeaderControllerTest.java | 47 ++++++++++++++++--- .../BluetoothDetailsHeaderControllerTest.java | 20 +++++++- 7 files changed, 119 insertions(+), 20 deletions(-) create mode 100644 src/com/android/settings/core/SettingsUIDeviceConfig.java diff --git a/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderController.java b/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderController.java index d6a668e61fe..112d7b81ee0 100644 --- a/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderController.java +++ b/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderController.java @@ -26,6 +26,7 @@ import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Handler; import android.os.Looper; +import android.provider.DeviceConfig; import android.provider.MediaStore; import android.util.Log; import android.view.View; @@ -38,6 +39,7 @@ import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.core.BasePreferenceController; +import com.android.settings.core.SettingsUIDeviceConfig; import com.android.settings.fuelgauge.BatteryMeterView; import com.android.settingslib.bluetooth.BluetoothUtils; import com.android.settingslib.bluetooth.CachedBluetoothDevice; @@ -64,7 +66,6 @@ public class AdvancedBluetoothDetailsHeaderController extends BasePreferenceCont @VisibleForTesting final Map mIconCache; private CachedBluetoothDevice mCachedDevice; - private BluetoothDevice mBluetoothDevice; @VisibleForTesting BluetoothAdapter mBluetoothAdapter; @VisibleForTesting @@ -88,9 +89,11 @@ public class AdvancedBluetoothDetailsHeaderController extends BasePreferenceCont @Override public int getAvailabilityStatus() { + final boolean advancedEnabled = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SETTINGS_UI, + SettingsUIDeviceConfig.BT_ADVANCED_HEADER_ENABLED, true); final boolean untetheredHeadset = BluetoothUtils.getBooleanMetaData( mCachedDevice.getDevice(), BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET); - return untetheredHeadset ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; + return advancedEnabled && untetheredHeadset ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; } @Override @@ -138,7 +141,6 @@ public class AdvancedBluetoothDetailsHeaderController extends BasePreferenceCont public void init(CachedBluetoothDevice cachedBluetoothDevice) { mCachedDevice = cachedBluetoothDevice; - mBluetoothDevice = mCachedDevice.getDevice(); } @VisibleForTesting diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsHeaderController.java b/src/com/android/settings/bluetooth/BluetoothDetailsHeaderController.java index ee630454dd9..f5096054c78 100644 --- a/src/com/android/settings/bluetooth/BluetoothDetailsHeaderController.java +++ b/src/com/android/settings/bluetooth/BluetoothDetailsHeaderController.java @@ -19,12 +19,14 @@ package com.android.settings.bluetooth; import android.bluetooth.BluetoothDevice; import android.content.Context; import android.graphics.drawable.Drawable; +import android.provider.DeviceConfig; import android.util.Pair; import androidx.preference.PreferenceFragmentCompat; import androidx.preference.PreferenceScreen; import com.android.settings.R; +import com.android.settings.core.SettingsUIDeviceConfig; import com.android.settings.widget.EntityHeaderController; import com.android.settingslib.bluetooth.BluetoothUtils; import com.android.settingslib.bluetooth.CachedBluetoothDevice; @@ -53,8 +55,11 @@ public class BluetoothDetailsHeaderController extends BluetoothDetailsController @Override public boolean isAvailable() { - return !BluetoothUtils.getBooleanMetaData(mCachedDevice.getDevice(), - BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET); + final boolean advancedEnabled = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SETTINGS_UI, + SettingsUIDeviceConfig.BT_ADVANCED_HEADER_ENABLED, true); + return !advancedEnabled + || !BluetoothUtils.getBooleanMetaData(mCachedDevice.getDevice(), + BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET); } @Override diff --git a/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java b/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java index 36cbd5d3fd8..c31b13ecb0f 100644 --- a/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java +++ b/src/com/android/settings/bluetooth/BluetoothDeviceDetailsFragment.java @@ -22,7 +22,7 @@ import android.app.settings.SettingsEnums; import android.bluetooth.BluetoothDevice; import android.content.Context; import android.os.Bundle; -import android.util.FeatureFlagUtils; +import android.provider.DeviceConfig; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; @@ -30,7 +30,7 @@ import android.view.MenuItem; import androidx.annotation.VisibleForTesting; import com.android.settings.R; -import com.android.settings.core.FeatureFlags; +import com.android.settings.core.SettingsUIDeviceConfig; import com.android.settings.dashboard.RestrictedDashboardFragment; import com.android.settings.overlay.FeatureFactory; import com.android.settings.slices.BlockingSlicePrefController; @@ -117,10 +117,10 @@ public class BluetoothDeviceDetailsFragment extends RestrictedDashboardFragment final BluetoothFeatureProvider featureProvider = FeatureFactory.getFactory( context).getBluetoothFeatureProvider(context); - final boolean injectionEnabled = FeatureFlagUtils.isEnabled(context, - FeatureFlags.SLICE_INJECTION); + final boolean sliceEnabled = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SETTINGS_UI, + SettingsUIDeviceConfig.BT_SLICE_SETTINGS_ENABLED, true); - use(BlockingSlicePrefController.class).setSliceUri(injectionEnabled + use(BlockingSlicePrefController.class).setSliceUri(sliceEnabled ? featureProvider.getBluetoothDeviceSettingsUri(mCachedDevice.getDevice()) : null); } diff --git a/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java b/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java index d5cfdcc1fa7..cbabb06eb61 100644 --- a/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java +++ b/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java @@ -18,11 +18,13 @@ package com.android.settings.connecteddevice; import android.app.settings.SettingsEnums; import android.content.Context; import android.net.Uri; +import android.provider.DeviceConfig; import android.provider.SearchIndexableResource; import androidx.annotation.VisibleForTesting; import com.android.settings.R; +import com.android.settings.core.SettingsUIDeviceConfig; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.slices.SlicePreferenceController; @@ -86,12 +88,15 @@ public class ConnectedDeviceDashboardFragment extends DashboardFragment { @Override public void onAttach(Context context) { super.onAttach(context); + final boolean nearbyEnabled = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SETTINGS_UI, + SettingsUIDeviceConfig.BT_NEAR_BY_SUGGESTION_ENABLED, true); use(AvailableMediaDeviceGroupController.class).init(this); use(ConnectedDeviceGroupController.class).init(this); use(PreviouslyConnectedDevicePreferenceController.class).init(this); use(DiscoverableFooterPreferenceController.class).init(this); - use(SlicePreferenceController.class).setSliceUri( - Uri.parse(getString(R.string.config_nearby_devices_slice_uri))); + use(SlicePreferenceController.class).setSliceUri(nearbyEnabled + ? Uri.parse(getString(R.string.config_nearby_devices_slice_uri)) + : null); } /** diff --git a/src/com/android/settings/core/SettingsUIDeviceConfig.java b/src/com/android/settings/core/SettingsUIDeviceConfig.java new file mode 100644 index 00000000000..b7aa281408d --- /dev/null +++ b/src/com/android/settings/core/SettingsUIDeviceConfig.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.core; + +/** + * Class to store keys for settings related features, which comes from + * {@link android.provider.DeviceConfig} + */ +public class SettingsUIDeviceConfig { + /** + * {@code true} if slice settings is enabled in BT device detail page + */ + public static final String BT_SLICE_SETTINGS_ENABLED = "bt_slice_settings_enabled"; + /** + * {@code true} if advanced header is enabled in BT device detail page + */ + public static final String BT_ADVANCED_HEADER_ENABLED = "bt_advanced_header_enabled"; + /** + * {@code true} if near by device suggestion is enabled in connected device page + */ + public static final String BT_NEAR_BY_SUGGESTION_ENABLED = "bt_near_by_suggestion_enabled"; +} diff --git a/tests/robotests/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderControllerTest.java index 362b0038d07..03e9b6f8158 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderControllerTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderControllerTest.java @@ -27,6 +27,7 @@ import android.bluetooth.BluetoothDevice; import android.content.Context; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; +import android.provider.DeviceConfig; import android.view.LayoutInflater; import android.view.View; import android.widget.ImageView; @@ -35,7 +36,9 @@ import android.widget.TextView; import com.android.settings.R; import com.android.settings.core.BasePreferenceController; +import com.android.settings.core.SettingsUIDeviceConfig; import com.android.settings.fuelgauge.BatteryMeterView; +import com.android.settings.testutils.shadow.ShadowDeviceConfig; import com.android.settings.testutils.shadow.ShadowEntityHeaderController; import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.settingslib.widget.LayoutPreference; @@ -50,8 +53,8 @@ import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; @RunWith(RobolectricTestRunner.class) -@Config(shadows = ShadowEntityHeaderController.class) -public class AdvancedBluetoothDetailsHeaderControllerTest{ +@Config(shadows = {ShadowEntityHeaderController.class, ShadowDeviceConfig.class}) +public class AdvancedBluetoothDetailsHeaderControllerTest { private static final int BATTERY_LEVEL_MAIN = 30; private static final int BATTERY_LEVEL_LEFT = 25; private static final int BATTERY_LEVEL_RIGHT = 45; @@ -141,7 +144,9 @@ public class AdvancedBluetoothDetailsHeaderControllerTest{ } @Test - public void getAvailabilityStatus_untetheredHeadset_returnAvailable() { + public void getAvailabilityStatus_untetheredHeadsetWithConfigOn_returnAvailable() { + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SETTINGS_UI, + SettingsUIDeviceConfig.BT_ADVANCED_HEADER_ENABLED, "true", true); when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET)) .thenReturn("true".getBytes()); @@ -150,7 +155,31 @@ public class AdvancedBluetoothDetailsHeaderControllerTest{ } @Test - public void getAvailabilityStatus_notUntetheredHeadset_returnUnavailable() { + public void getAvailabilityStatus_untetheredHeadsetWithConfigOff_returnUnavailable() { + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SETTINGS_UI, + SettingsUIDeviceConfig.BT_ADVANCED_HEADER_ENABLED, "false", true); + when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET)) + .thenReturn("true".getBytes()); + + assertThat(mController.getAvailabilityStatus()).isEqualTo( + BasePreferenceController.CONDITIONALLY_UNAVAILABLE); + } + + @Test + public void getAvailabilityStatus_notUntetheredHeadsetWithConfigOn_returnUnavailable() { + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SETTINGS_UI, + SettingsUIDeviceConfig.BT_ADVANCED_HEADER_ENABLED, "true", true); + when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET)) + .thenReturn("false".getBytes()); + + assertThat(mController.getAvailabilityStatus()).isEqualTo( + BasePreferenceController.CONDITIONALLY_UNAVAILABLE); + } + + @Test + public void getAvailabilityStatus_notUntetheredHeadsetWithConfigOff_returnUnavailable() { + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SETTINGS_UI, + SettingsUIDeviceConfig.BT_ADVANCED_HEADER_ENABLED, "false", true); when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET)) .thenReturn("false".getBytes()); @@ -169,17 +198,21 @@ public class AdvancedBluetoothDetailsHeaderControllerTest{ @Test public void onStart_isAvailable_registerCallback() { + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SETTINGS_UI, + SettingsUIDeviceConfig.BT_ADVANCED_HEADER_ENABLED, "true", true); when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET)) .thenReturn("true".getBytes()); mController.onStart(); verify(mBluetoothAdapter).addOnMetadataChangedListener(mBluetoothDevice, - mContext.getMainExecutor() ,mController.mMetadataListener); + mContext.getMainExecutor(), mController.mMetadataListener); } @Test public void onStop_isAvailable_unregisterCallback() { + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SETTINGS_UI, + SettingsUIDeviceConfig.BT_ADVANCED_HEADER_ENABLED, "true", true); when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET)) .thenReturn("true".getBytes()); @@ -197,7 +230,7 @@ public class AdvancedBluetoothDetailsHeaderControllerTest{ mController.onStart(); verify(mBluetoothAdapter, never()).addOnMetadataChangedListener(mBluetoothDevice, - mContext.getMainExecutor() ,mController.mMetadataListener); + mContext.getMainExecutor(), mController.mMetadataListener); } @Test @@ -213,6 +246,8 @@ public class AdvancedBluetoothDetailsHeaderControllerTest{ @Test public void onDestroy_isAvailable_recycleBitmap() { + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SETTINGS_UI, + SettingsUIDeviceConfig.BT_ADVANCED_HEADER_ENABLED, "true", true); when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET)) .thenReturn("true".getBytes()); mController.mIconCache.put(ICON_URI, mBitmap); diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsHeaderControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsHeaderControllerTest.java index 1ee1de6fd39..94f8cc52dc7 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsHeaderControllerTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsHeaderControllerTest.java @@ -27,7 +27,9 @@ import android.bluetooth.BluetoothDevice; import android.graphics.drawable.Drawable; import com.android.settings.R; +import com.android.settings.core.SettingsUIDeviceConfig; import com.android.settings.testutils.FakeFeatureFactory; +import com.android.settings.testutils.shadow.ShadowDeviceConfig; import com.android.settings.testutils.shadow.ShadowEntityHeaderController; import com.android.settings.widget.EntityHeaderController; import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager; @@ -44,7 +46,7 @@ import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; @RunWith(RobolectricTestRunner.class) -@Config(shadows = ShadowEntityHeaderController.class) +@Config(shadows = {ShadowEntityHeaderController.class, ShadowDeviceConfig.class}) public class BluetoothDetailsHeaderControllerTest extends BluetoothDetailsControllerTestBase { private BluetoothDetailsHeaderController mController; @@ -123,10 +125,24 @@ public class BluetoothDetailsHeaderControllerTest extends BluetoothDetailsContro } @Test - public void isAvailable_untetheredHeadset_returnFalse() { + public void isAvailable_untetheredHeadsetWithConfigOn_returnFalse() { + android.provider.DeviceConfig.setProperty( + android.provider.DeviceConfig.NAMESPACE_SETTINGS_UI, + SettingsUIDeviceConfig.BT_ADVANCED_HEADER_ENABLED, "true", true); when(mBluetoothDevice.getMetadata( BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET)).thenReturn("true".getBytes()); assertThat(mController.isAvailable()).isFalse(); } + + @Test + public void isAvailable_untetheredHeadsetWithConfigOff_returnTrue() { + android.provider.DeviceConfig.setProperty( + android.provider.DeviceConfig.NAMESPACE_SETTINGS_UI, + SettingsUIDeviceConfig.BT_ADVANCED_HEADER_ENABLED, "false", true); + when(mBluetoothDevice.getMetadata( + BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET)).thenReturn("true".getBytes()); + + assertThat(mController.isAvailable()).isTrue(); + } } From d39fbe0f23609a95b1c7c372ae4026a2ff14832b Mon Sep 17 00:00:00 2001 From: hughchen Date: Thu, 18 Apr 2019 17:48:15 +0800 Subject: [PATCH 07/16] Remove all device from preference when BT is disabled The issue is happened when BT is disabled then navigate to "Connected devices". BluetoothDeviceUpdater didn't update UI when BT is disabled. Remove all device from preference when BT is disabled. Bug: 80090956 Test: make -j42 RunSettingsRoboTests Change-Id: Ia1fd8cfbcf95d712a1a702fdf101ff98186b76cd --- .../android/settings/bluetooth/BluetoothDeviceUpdater.java | 2 ++ .../settings/bluetooth/BluetoothDeviceUpdaterTest.java | 7 +++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java b/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java index 2128b2f4bb1..61cdaf6f81d 100644 --- a/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java +++ b/src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java @@ -115,6 +115,8 @@ public abstract class BluetoothDeviceUpdater implements BluetoothCallback, for (CachedBluetoothDevice cachedBluetoothDevice : cachedDevices) { update(cachedBluetoothDevice); } + } else { + removeAllDevicesFromPreference(); } } diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceUpdaterTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceUpdaterTest.java index 24aae859a31..10665529a86 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceUpdaterTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDeviceUpdaterTest.java @@ -215,11 +215,14 @@ public class BluetoothDeviceUpdaterTest { } @Test - public void forceUpdate_bluetoothDisabled_doNothing() { + public void forceUpdate_bluetoothDisabled_removeAllDevicesFromPreference() { mShadowBluetoothAdapter.setEnabled(false); + mBluetoothDeviceUpdater.mPreferenceMap.put(mBluetoothDevice, mPreference); + mBluetoothDeviceUpdater.forceUpdate(); - verify(mDevicePreferenceCallback, never()).onDeviceAdded(any(Preference.class)); + verify(mDevicePreferenceCallback).onDeviceRemoved(mPreference); + assertThat(mBluetoothDeviceUpdater.mPreferenceMap).isEmpty(); } @Test From 0fdf78cff6702233575889a0e537a4611b5e69ac Mon Sep 17 00:00:00 2001 From: Stanley Wang Date: Thu, 18 Apr 2019 20:12:22 +0800 Subject: [PATCH 08/16] Hardware version should should support copy action Implement isSliceable method in HardwareRevisionPreferenceController Fixes: 130653205 Test: manual and robotests Change-Id: Ib872b9625c2c1984ff7b036fef5b3145c7fd8d2a --- .../HardwareRevisionPreferenceController.java | 12 ++++ ...dwareRevisionPreferenceControllerTest.java | 71 +++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 tests/robotests/src/com/android/settings/deviceinfo/hardwareinfo/HardwareRevisionPreferenceControllerTest.java diff --git a/src/com/android/settings/deviceinfo/hardwareinfo/HardwareRevisionPreferenceController.java b/src/com/android/settings/deviceinfo/hardwareinfo/HardwareRevisionPreferenceController.java index f88239061bf..e7f642316bc 100644 --- a/src/com/android/settings/deviceinfo/hardwareinfo/HardwareRevisionPreferenceController.java +++ b/src/com/android/settings/deviceinfo/hardwareinfo/HardwareRevisionPreferenceController.java @@ -21,6 +21,7 @@ import android.os.SystemProperties; import com.android.settings.R; import com.android.settings.core.BasePreferenceController; +import com.android.settings.slices.Sliceable; public class HardwareRevisionPreferenceController extends BasePreferenceController { @@ -44,6 +45,17 @@ public class HardwareRevisionPreferenceController extends BasePreferenceControll return true; } + @Override + public boolean isCopyableSlice() { + return true; + } + + @Override + public void copy() { + Sliceable.setCopyContent(mContext, getSummary(), + mContext.getText(R.string.hardware_revision)); + } + @Override public CharSequence getSummary() { return SystemProperties.get("ro.boot.hardware.revision"); diff --git a/tests/robotests/src/com/android/settings/deviceinfo/hardwareinfo/HardwareRevisionPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/hardwareinfo/HardwareRevisionPreferenceControllerTest.java new file mode 100644 index 00000000000..98ffbd01bbf --- /dev/null +++ b/tests/robotests/src/com/android/settings/deviceinfo/hardwareinfo/HardwareRevisionPreferenceControllerTest.java @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.settings.deviceinfo.hardwareinfo; + +import static android.content.Context.CLIPBOARD_SERVICE; + +import static com.google.common.truth.Truth.assertThat; + +import android.content.ClipboardManager; +import android.content.Context; +import android.os.SystemProperties; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.MockitoAnnotations; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; + +@RunWith(RobolectricTestRunner.class) +public class HardwareRevisionPreferenceControllerTest { + + private Context mContext; + private HardwareRevisionPreferenceController mController; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mContext = RuntimeEnvironment.application; + mController = new HardwareRevisionPreferenceController(mContext, + "hardware_info_device_revision"); + } + + @Test + public void isSliceable_shouldBeSliceable() { + assertThat(mController.isSliceable()).isTrue(); + } + + @Test + public void isCopyableSlice_shouldBeCopyableSlice() { + assertThat(mController.isCopyableSlice()).isTrue(); + } + + @Test + public void copy_shouldCopyHardwareRevisionToClipboard() { + final String fakeHardwareVer = "FakeVer1.0"; + SystemProperties.set("ro.boot.hardware.revision", fakeHardwareVer); + + mController.copy(); + + final ClipboardManager clipboard = (ClipboardManager) mContext.getSystemService( + CLIPBOARD_SERVICE); + final CharSequence data = clipboard.getPrimaryClip().getItemAt(0).getText(); + + assertThat(data.toString()).isEqualTo(fakeHardwareVer); + } +} \ No newline at end of file From db237a6adeda20341d327e38201ad8b7b0055114 Mon Sep 17 00:00:00 2001 From: Yi-Ling Chuang Date: Fri, 19 Apr 2019 13:52:25 +0800 Subject: [PATCH 09/16] Fix the break of repo hook color check. Add the missing color for notification importance button Fixes: 130850328 Test: manual Change-Id: I6c070fad42d5fb0e6d5e3aa00d66b32708dde605 --- color-check-baseline.xml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/color-check-baseline.xml b/color-check-baseline.xml index 02b00e24b33..e0a02067223 100644 --- a/color-check-baseline.xml +++ b/color-check-baseline.xml @@ -3357,4 +3357,20 @@ column="5"/> + + + + From 9c5a19319b02d2b9619790a9146b54e49fdfa87e Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Fri, 19 Apr 2019 10:01:53 -0400 Subject: [PATCH 10/16] Fix broken tests Test: robo tests Fixes: 130871450 Change-Id: If7b01147f5680392c7635f3a3b4e558aa56a633e --- .../AllowSoundPreferenceControllerTest.java | 4 ++-- .../BadgePreferenceControllerTest.java | 4 ++-- .../BubblePreferenceControllerTest.java | 4 ++-- .../notification/DndPreferenceControllerTest.java | 4 ++-- .../LightsPreferenceControllerTest.java | 15 +-------------- .../NotificationPreferenceControllerTest.java | 5 ++++- .../SoundPreferenceControllerTest.java | 4 ++-- .../VibrationPreferenceControllerTest.java | 4 ++-- 8 files changed, 17 insertions(+), 27 deletions(-) diff --git a/tests/robotests/src/com/android/settings/notification/AllowSoundPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/AllowSoundPreferenceControllerTest.java index 88f8303b179..9d2754139fe 100644 --- a/tests/robotests/src/com/android/settings/notification/AllowSoundPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/notification/AllowSoundPreferenceControllerTest.java @@ -139,7 +139,7 @@ public class AllowSoundPreferenceControllerTest { } @Test - public void testUpdateState_notConfigurable() { + public void testUpdateState_notBlockable() { String lockedId = "locked"; NotificationBackend.AppRow appRow = new NotificationBackend.AppRow(); appRow.lockedChannelId = lockedId; @@ -150,7 +150,7 @@ public class AllowSoundPreferenceControllerTest { Preference pref = new RestrictedSwitchPreference(mContext); mController.updateState(pref); - assertFalse(pref.isEnabled()); + assertTrue(pref.isEnabled()); } @Test diff --git a/tests/robotests/src/com/android/settings/notification/BadgePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/BadgePreferenceControllerTest.java index 8265295a76b..9ea201a531f 100644 --- a/tests/robotests/src/com/android/settings/notification/BadgePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/notification/BadgePreferenceControllerTest.java @@ -187,7 +187,7 @@ public class BadgePreferenceControllerTest { } @Test - public void testUpdateState_channelNotConfigurable() { + public void testUpdateState_channelNotBlockable() { String lockedId = "locked"; NotificationBackend.AppRow appRow = new NotificationBackend.AppRow(); appRow.lockedChannelId = lockedId; @@ -198,7 +198,7 @@ public class BadgePreferenceControllerTest { Preference pref = new RestrictedSwitchPreference(mContext); mController.updateState(pref); - assertFalse(pref.isEnabled()); + assertTrue(pref.isEnabled()); } @Test diff --git a/tests/robotests/src/com/android/settings/notification/BubblePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/BubblePreferenceControllerTest.java index 54bbd0874c7..0d0b4852b58 100644 --- a/tests/robotests/src/com/android/settings/notification/BubblePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/notification/BubblePreferenceControllerTest.java @@ -202,7 +202,7 @@ public class BubblePreferenceControllerTest { } @Test - public void testUpdateState_channelNotConfigurable() { + public void testUpdateState_channelNotBlockable() { String lockedId = "locked"; NotificationBackend.AppRow appRow = new NotificationBackend.AppRow(); appRow.lockedChannelId = lockedId; @@ -213,7 +213,7 @@ public class BubblePreferenceControllerTest { Preference pref = new RestrictedSwitchPreference(mContext); mController.updateState(pref); - assertFalse(pref.isEnabled()); + assertTrue(pref.isEnabled()); } @Test diff --git a/tests/robotests/src/com/android/settings/notification/DndPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/DndPreferenceControllerTest.java index 0b2af49e830..929c14d7db3 100644 --- a/tests/robotests/src/com/android/settings/notification/DndPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/notification/DndPreferenceControllerTest.java @@ -110,7 +110,7 @@ public class DndPreferenceControllerTest { } @Test - public void testUpdateState_notConfigurable() { + public void testUpdateState_notBlockable() { String lockedId = "locked"; NotificationBackend.AppRow appRow = new NotificationBackend.AppRow(); appRow.lockedChannelId = lockedId; @@ -121,7 +121,7 @@ public class DndPreferenceControllerTest { Preference pref = new RestrictedSwitchPreference(RuntimeEnvironment.application); mController.updateState(pref); - assertFalse(pref.isEnabled()); + assertTrue(pref.isEnabled()); } @Test diff --git a/tests/robotests/src/com/android/settings/notification/LightsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/LightsPreferenceControllerTest.java index dd6a6208381..3724ddb9c43 100644 --- a/tests/robotests/src/com/android/settings/notification/LightsPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/notification/LightsPreferenceControllerTest.java @@ -158,7 +158,7 @@ public class LightsPreferenceControllerTest { } @Test - public void testUpdateState_notConfigurable() { + public void testUpdateState_notBlockable() { String lockedId = "locked"; NotificationBackend.AppRow appRow = new NotificationBackend.AppRow(); appRow.lockedChannelId = lockedId; @@ -169,19 +169,6 @@ public class LightsPreferenceControllerTest { Preference pref = new RestrictedSwitchPreference(mContext); mController.updateState(pref); - assertFalse(pref.isEnabled()); - } - - @Test - public void testUpdateState_configurable() { - NotificationBackend.AppRow appRow = new NotificationBackend.AppRow(); - NotificationChannel channel = mock(NotificationChannel.class); - when(channel.getId()).thenReturn("something"); - mController.onResume(appRow, channel, null, null); - - Preference pref = new RestrictedSwitchPreference(mContext); - mController.updateState(pref); - assertTrue(pref.isEnabled()); } diff --git a/tests/robotests/src/com/android/settings/notification/NotificationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/NotificationPreferenceControllerTest.java index 8c743348875..a72597b4ba7 100644 --- a/tests/robotests/src/com/android/settings/notification/NotificationPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/notification/NotificationPreferenceControllerTest.java @@ -209,6 +209,7 @@ public class NotificationPreferenceControllerTest { appRow.lockedChannelId = sameId; NotificationChannel channel = mock(NotificationChannel.class); when(channel.getId()).thenReturn(sameId); + when(channel.getImportance()).thenReturn(IMPORTANCE_LOW); mController.onResume(appRow, channel, null, null); assertFalse(mController.isChannelBlockable()); @@ -223,8 +224,10 @@ public class NotificationPreferenceControllerTest { NotificationBackend.AppRow appRow = new NotificationBackend.AppRow(); appRow.lockedChannelId = "something"; appRow.lockedImportance = true; + NotificationChannel channel = mock(NotificationChannel.class); + when(channel.getImportance()).thenReturn(IMPORTANCE_LOW); - mController.onResume(appRow, mock(NotificationChannel.class), null, null); + mController.onResume(appRow, channel, null, null); assertFalse(mController.isChannelBlockable()); appRow.lockedImportance = false; diff --git a/tests/robotests/src/com/android/settings/notification/SoundPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/SoundPreferenceControllerTest.java index 866f8668a21..1d9836e2af1 100644 --- a/tests/robotests/src/com/android/settings/notification/SoundPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/notification/SoundPreferenceControllerTest.java @@ -161,7 +161,7 @@ public class SoundPreferenceControllerTest { } @Test - public void testUpdateState_notConfigurable() { + public void testUpdateState_notBlockable() { String lockedId = "locked"; NotificationBackend.AppRow appRow = new NotificationBackend.AppRow(); appRow.lockedChannelId = lockedId; @@ -173,7 +173,7 @@ public class SoundPreferenceControllerTest { Preference pref = new NotificationSoundPreference(mContext, attributeSet); mController.updateState(pref); - assertFalse(pref.isEnabled()); + assertTrue(pref.isEnabled()); } @Test diff --git a/tests/robotests/src/com/android/settings/notification/VibrationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/VibrationPreferenceControllerTest.java index e1d5b73574c..adc10f46180 100644 --- a/tests/robotests/src/com/android/settings/notification/VibrationPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/notification/VibrationPreferenceControllerTest.java @@ -140,7 +140,7 @@ public class VibrationPreferenceControllerTest { } @Test - public void testUpdateState_notConfigurable() { + public void testUpdateState_notBlockable() { String lockedId = "locked"; NotificationBackend.AppRow appRow = new NotificationBackend.AppRow(); appRow.lockedChannelId = lockedId; @@ -151,7 +151,7 @@ public class VibrationPreferenceControllerTest { Preference pref = new RestrictedSwitchPreference(RuntimeEnvironment.application); mController.updateState(pref); - assertFalse(pref.isEnabled()); + assertTrue(pref.isEnabled()); } @Test From 34bc05cceed1e22f7ce50e404a73b82dabcf8d86 Mon Sep 17 00:00:00 2001 From: Beverly Date: Fri, 19 Apr 2019 13:21:31 -0400 Subject: [PATCH 11/16] Allow up two lines of text on dnd restrict notif Test: manual Bug: 130848971 Change-Id: I1d32963f0e291d42c8b98ba8ca39eba749a26989 --- .../settings/widget/DisabledCheckBoxPreference.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/com/android/settings/widget/DisabledCheckBoxPreference.java b/src/com/android/settings/widget/DisabledCheckBoxPreference.java index be6deb3a0be..15c17dc88dd 100644 --- a/src/com/android/settings/widget/DisabledCheckBoxPreference.java +++ b/src/com/android/settings/widget/DisabledCheckBoxPreference.java @@ -20,6 +20,7 @@ import android.content.Context; import android.content.res.TypedArray; import android.util.AttributeSet; import android.view.View; +import android.widget.TextView; import androidx.preference.CheckBoxPreference; import androidx.preference.PreferenceViewHolder; @@ -89,6 +90,12 @@ public class DisabledCheckBoxPreference extends CheckBoxPreference { mCheckBox = holder.findViewById(android.R.id.checkbox); enableCheckbox(mEnabledCheckBox); + + TextView title = (TextView) holder.findViewById(android.R.id.title); + if (title != null) { + title.setSingleLine(false); + title.setMaxLines(2); + } } @Override From 4e56cb291733b4f89904f966148a5af898dd3a2a Mon Sep 17 00:00:00 2001 From: Yanting Yang Date: Thu, 18 Apr 2019 21:37:31 +0800 Subject: [PATCH 12/16] Add a way to suppress injected tiles for OEMs Create a config resource for OEMs to add suppressed tile's key, then DashboardFragment will filter related tiles out from Settings. OEMs can use this way to suppress security patch injected tile if they don't use Google OTA. Fixes: 130734771 Test: visual, robotests Change-Id: I4cab79c8672048fa543d39b2a8f38ffe338189c8 --- res/values/config.xml | 3 +++ .../AccountDetailDashboardFragment.java | 3 +++ .../settings/dashboard/DashboardFragment.java | 11 +++++++++++ tests/robotests/res/values-mcc999/config.xml | 5 +++++ .../dashboard/DashboardFragmentTest.java | 18 ++++++++++++++++++ 5 files changed, 40 insertions(+) diff --git a/res/values/config.xml b/res/values/config.xml index 496b5d2145e..1dbe079c57b 100755 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -363,4 +363,7 @@ + + + diff --git a/src/com/android/settings/accounts/AccountDetailDashboardFragment.java b/src/com/android/settings/accounts/AccountDetailDashboardFragment.java index ad6ecaff6c0..1485500931b 100644 --- a/src/com/android/settings/accounts/AccountDetailDashboardFragment.java +++ b/src/com/android/settings/accounts/AccountDetailDashboardFragment.java @@ -150,6 +150,9 @@ public class AccountDetailDashboardFragment extends DashboardFragment { @Override protected boolean displayTile(Tile tile) { + if (!super.displayTile(tile)) { + return false; + } if (mAccountType == null) { return false; } diff --git a/src/com/android/settings/dashboard/DashboardFragment.java b/src/com/android/settings/dashboard/DashboardFragment.java index 16303116432..f2e3d73c8fe 100644 --- a/src/com/android/settings/dashboard/DashboardFragment.java +++ b/src/com/android/settings/dashboard/DashboardFragment.java @@ -24,12 +24,14 @@ import android.util.ArrayMap; import android.util.ArraySet; import android.util.Log; +import androidx.annotation.CallSuper; import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; import androidx.preference.PreferenceGroup; import androidx.preference.PreferenceManager; import androidx.preference.PreferenceScreen; +import com.android.settings.R; import com.android.settings.SettingsPreferenceFragment; import com.android.settings.core.BasePreferenceController; import com.android.settings.core.PreferenceControllerListHelper; @@ -43,6 +45,7 @@ import com.android.settingslib.drawer.DashboardCategory; import com.android.settingslib.drawer.Tile; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Map; @@ -65,12 +68,15 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment private DashboardTilePlaceholderPreferenceController mPlaceholderPreferenceController; private boolean mListeningToCategoryChange; private SummaryLoader mSummaryLoader; + private List mSuppressInjectedTileKeys; @VisibleForTesting UiBlockerController mBlockerController; @Override public void onAttach(Context context) { super.onAttach(context); + mSuppressInjectedTileKeys = Arrays.asList(context.getResources().getStringArray( + R.array.config_suppress_injected_tile_keys)); mDashboardFeatureProvider = FeatureFactory.getFactory(context). getDashboardFeatureProvider(context); final List controllers = new ArrayList<>(); @@ -283,7 +289,12 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment /** * Returns true if this tile should be displayed */ + @CallSuper protected boolean displayTile(Tile tile) { + if (mSuppressInjectedTileKeys != null && tile.hasKey()) { + // For suppressing injected tiles for OEMs. + return !mSuppressInjectedTileKeys.contains(tile.getKey(getContext())); + } return true; } diff --git a/tests/robotests/res/values-mcc999/config.xml b/tests/robotests/res/values-mcc999/config.xml index 78c3c088487..a6a84c9c376 100644 --- a/tests/robotests/res/values-mcc999/config.xml +++ b/tests/robotests/res/values-mcc999/config.xml @@ -88,4 +88,9 @@ intent:#Intent;action=test.test;end + + + + injected_tile_key + diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java index 438dfc18caf..9aae249c79b 100644 --- a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java @@ -16,6 +16,7 @@ package com.android.settings.dashboard; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.DASHBOARD_CONTAINER; +import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_KEYHINT; import static com.google.common.truth.Truth.assertThat; @@ -53,6 +54,7 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; import org.robolectric.util.ReflectionHelpers; import java.util.ArrayList; @@ -79,6 +81,8 @@ public class DashboardFragmentTest { mActivityInfo = new ActivityInfo(); mActivityInfo.packageName = "pkg"; mActivityInfo.name = "class"; + mActivityInfo.metaData = new Bundle(); + mActivityInfo.metaData.putString(META_DATA_PREFERENCE_KEYHINT, "injected_tile_key"); mFakeFeatureFactory = FakeFeatureFactory.setupForTest(); mDashboardCategory = new DashboardCategory("key"); mDashboardCategory.addTile(new Tile(mActivityInfo, mDashboardCategory.key)); @@ -143,6 +147,20 @@ public class DashboardFragmentTest { verify(mTestFragment.mScreen, never()).addPreference(nullable(Preference.class)); } + @Test + @Config(qualifiers = "mcc999") + public void displayTilesAsPreference_shouldNotAddSuppressedTiles() { + when(mFakeFeatureFactory.dashboardFeatureProvider + .getTilesForCategory(nullable(String.class))) + .thenReturn(mDashboardCategory); + when(mFakeFeatureFactory.dashboardFeatureProvider + .getDashboardKeyForTile(nullable(Tile.class))) + .thenReturn("test_key"); + mTestFragment.onCreatePreferences(new Bundle(), "rootKey"); + + verify(mTestFragment.mScreen, never()).addPreference(nullable(Preference.class)); + } + @Test public void onAttach_shouldCreatePlaceholderPreferenceController() { final AbstractPreferenceController controller = mTestFragment.use( From 6a81e41c7cfd5459917d1976a4a989a2da4fd974 Mon Sep 17 00:00:00 2001 From: Salvador Martinez Date: Thu, 11 Apr 2019 17:12:44 -0700 Subject: [PATCH 13/16] Update battery stuff to use SettingsLib Estimate class This will make the upcoming consistency Cl easier to implement. Test: Robotests still pass Bug: 124030091 Change-Id: Ief4989e2b5f9b83b5c3b93d17f9f9fa12136f3ee --- .../settings/fuelgauge/BatteryInfo.java | 16 +++++++++------- .../settings/fuelgauge/BatteryUtils.java | 4 +++- .../fuelgauge/DebugEstimatesLoader.java | 4 +++- .../android/settings/fuelgauge/Estimate.java | 18 ------------------ .../fuelgauge/PowerUsageFeatureProvider.java | 1 + .../PowerUsageFeatureProviderImpl.java | 1 + .../settings/fuelgauge/PowerUsageSummary.java | 3 ++- .../fuelgauge/batterytip/BatteryTipLoader.java | 4 ++-- .../BatteryTipPreferenceController.java | 4 ++-- .../settings/fuelgauge/BatteryInfoTest.java | 1 + .../BatteryTipDialogFragmentTest.java | 4 ++-- 11 files changed, 26 insertions(+), 34 deletions(-) delete mode 100644 src/com/android/settings/fuelgauge/Estimate.java diff --git a/src/com/android/settings/fuelgauge/BatteryInfo.java b/src/com/android/settings/fuelgauge/BatteryInfo.java index c851a7178f7..33f25537327 100644 --- a/src/com/android/settings/fuelgauge/BatteryInfo.java +++ b/src/com/android/settings/fuelgauge/BatteryInfo.java @@ -34,6 +34,8 @@ import com.android.settings.Utils; import com.android.settings.overlay.FeatureFactory; import com.android.settings.widget.UsageView; import com.android.settingslib.R; +import com.android.settingslib.fuelgauge.Estimate; +import com.android.settingslib.fuelgauge.EstimateKt; import com.android.settingslib.utils.PowerUtil; import com.android.settingslib.utils.StringUtil; @@ -44,7 +46,7 @@ public class BatteryInfo { public int batteryLevel; public boolean discharging = true; public long remainingTimeUs = 0; - public long averageTimeToDischarge = Estimate.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN; + public long averageTimeToDischarge = EstimateKt.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN; public String batteryPercentString; public String statusLabel; public String suggestionLabel; @@ -202,7 +204,7 @@ public class BatteryInfo { final Estimate estimate = new Estimate( PowerUtil.convertUsToMs(prediction), false, /* isBasedOnUsage */ - Estimate.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN); + EstimateKt.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN); BatteryUtils.logRuntime(LOG_TAG, "time for regular BatteryInfo", startTime); return BatteryInfo.getBatteryInfo(context, batteryBroadcast, stats, estimate, elapsedRealtimeUs, shortString); @@ -214,7 +216,7 @@ public class BatteryInfo { Estimate estimate = new Estimate( PowerUtil.convertUsToMs(stats.computeBatteryTimeRemaining(elapsedRealtimeUs)), false, - Estimate.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN); + EstimateKt.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN); return getBatteryInfo(context, batteryBroadcast, stats, estimate, elapsedRealtimeUs, shortString); } @@ -228,7 +230,7 @@ public class BatteryInfo { info.batteryLevel = Utils.getBatteryLevel(batteryBroadcast); info.batteryPercentString = Utils.formatPercentage(info.batteryLevel); info.mCharging = batteryBroadcast.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0) != 0; - info.averageTimeToDischarge = estimate.averageDischargeTime; + info.averageTimeToDischarge = estimate.getAverageDischargeTime(); final Resources resources = context.getResources(); info.statusLabel = Utils.getBatteryStatus(resources, batteryBroadcast); @@ -269,20 +271,20 @@ public class BatteryInfo { private static void updateBatteryInfoDischarging(Context context, boolean shortString, Estimate estimate, BatteryInfo info) { - final long drainTimeUs = PowerUtil.convertMsToUs(estimate.estimateMillis); + final long drainTimeUs = PowerUtil.convertMsToUs(estimate.getEstimateMillis()); if (drainTimeUs > 0) { info.remainingTimeUs = drainTimeUs; info.remainingLabel = PowerUtil.getBatteryRemainingStringFormatted( context, PowerUtil.convertUsToMs(drainTimeUs), null /* percentageString */, - estimate.isBasedOnUsage && !shortString + estimate.isBasedOnUsage() && !shortString ); info.chargeLabel = PowerUtil.getBatteryRemainingStringFormatted( context, PowerUtil.convertUsToMs(drainTimeUs), info.batteryPercentString, - estimate.isBasedOnUsage && !shortString + estimate.isBasedOnUsage() && !shortString ); info.suggestionLabel = PowerUtil.getBatteryTipStringFormatted( context, PowerUtil.convertUsToMs(drainTimeUs)); diff --git a/src/com/android/settings/fuelgauge/BatteryUtils.java b/src/com/android/settings/fuelgauge/BatteryUtils.java index 6f779535943..cb22356aa90 100644 --- a/src/com/android/settings/fuelgauge/BatteryUtils.java +++ b/src/com/android/settings/fuelgauge/BatteryUtils.java @@ -47,6 +47,8 @@ import com.android.settings.fuelgauge.batterytip.AnomalyInfo; import com.android.settings.fuelgauge.batterytip.BatteryDatabaseManager; import com.android.settings.fuelgauge.batterytip.StatsManagerConfig; import com.android.settings.overlay.FeatureFactory; +import com.android.settingslib.fuelgauge.Estimate; +import com.android.settingslib.fuelgauge.EstimateKt; import com.android.settingslib.fuelgauge.PowerWhitelistBackend; import com.android.settingslib.utils.PowerUtil; import com.android.settingslib.utils.ThreadUtils; @@ -460,7 +462,7 @@ public class BatteryUtils { estimate = new Estimate( PowerUtil.convertUsToMs(stats.computeBatteryTimeRemaining(elapsedRealtimeUs)), false /* isBasedOnUsage */, - Estimate.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN); + EstimateKt.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN); } BatteryUtils.logRuntime(tag, "BatteryInfoLoader post query", startTime); diff --git a/src/com/android/settings/fuelgauge/DebugEstimatesLoader.java b/src/com/android/settings/fuelgauge/DebugEstimatesLoader.java index d27e4dcbcf7..c8dbb59a4bb 100644 --- a/src/com/android/settings/fuelgauge/DebugEstimatesLoader.java +++ b/src/com/android/settings/fuelgauge/DebugEstimatesLoader.java @@ -23,6 +23,8 @@ import android.os.SystemClock; import com.android.internal.os.BatteryStatsHelper; import com.android.settings.overlay.FeatureFactory; +import com.android.settingslib.fuelgauge.Estimate; +import com.android.settingslib.fuelgauge.EstimateKt; import com.android.settingslib.utils.AsyncLoaderCompat; import com.android.settingslib.utils.PowerUtil; @@ -60,7 +62,7 @@ public class DebugEstimatesLoader extends AsyncLoaderCompat> { Estimate estimate = powerUsageFeatureProvider.getEnhancedBatteryPrediction(context); if (estimate == null) { - estimate = new Estimate(0, false, Estimate.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN); + estimate = new Estimate(0, false, EstimateKt.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN); } BatteryInfo newInfo = BatteryInfo.getBatteryInfo(getContext(), batteryBroadcast, stats, estimate, elapsedRealtimeUs, false); diff --git a/src/com/android/settings/fuelgauge/Estimate.java b/src/com/android/settings/fuelgauge/Estimate.java deleted file mode 100644 index f59bbf15ac1..00000000000 --- a/src/com/android/settings/fuelgauge/Estimate.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.android.settings.fuelgauge; - -public class Estimate { - - // Value to indicate averageTimeToDischarge could not be obtained - public static final int AVERAGE_TIME_TO_DISCHARGE_UNKNOWN = -1; - - public final long estimateMillis; - public final boolean isBasedOnUsage; - public final long averageDischargeTime; - - public Estimate(long estimateMillis, boolean isBasedOnUsage, - long averageDischargeTime) { - this.estimateMillis = estimateMillis; - this.isBasedOnUsage = isBasedOnUsage; - this.averageDischargeTime = averageDischargeTime; - } -} diff --git a/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java b/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java index a6474fb21de..4f292dddacc 100644 --- a/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java +++ b/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java @@ -21,6 +21,7 @@ import android.content.Intent; import android.util.SparseIntArray; import com.android.internal.os.BatterySipper; +import com.android.settingslib.fuelgauge.Estimate; /** * Feature Provider used in power usage diff --git a/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java b/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java index b76aef087c1..ab71c97e141 100644 --- a/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java +++ b/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java @@ -24,6 +24,7 @@ import android.util.SparseIntArray; import com.android.internal.os.BatterySipper; import com.android.internal.util.ArrayUtils; +import com.android.settingslib.fuelgauge.Estimate; public class PowerUsageFeatureProviderImpl implements PowerUsageFeatureProvider { diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java index 75db2159dab..82ff4c227b8 100644 --- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java +++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java @@ -45,6 +45,7 @@ import com.android.settings.fuelgauge.batterytip.BatteryTipPreferenceController; import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settingslib.fuelgauge.EstimateKt; import com.android.settingslib.search.SearchIndexable; import com.android.settingslib.utils.PowerUtil; import com.android.settingslib.utils.StringUtil; @@ -313,7 +314,7 @@ public class PowerUsageSummary extends PowerUsageBase implements OnLongClickList @VisibleForTesting void updateLastFullChargePreference() { if (mBatteryInfo != null && mBatteryInfo.averageTimeToDischarge - != Estimate.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN) { + != EstimateKt.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN) { mLastFullChargePref.setTitle(R.string.battery_full_charge_last); mLastFullChargePref.setSubtitle( StringUtil.formatElapsedTime(getContext(), mBatteryInfo.averageTimeToDischarge, diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java index aa66aed8c61..a1fb076e648 100644 --- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java +++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipLoader.java @@ -23,7 +23,6 @@ import androidx.annotation.VisibleForTesting; import com.android.internal.os.BatteryStatsHelper; import com.android.settings.fuelgauge.BatteryInfo; import com.android.settings.fuelgauge.BatteryUtils; -import com.android.settings.fuelgauge.Estimate; import com.android.settings.fuelgauge.batterytip.detectors.EarlyWarningDetector; import com.android.settings.fuelgauge.batterytip.detectors.HighUsageDetector; import com.android.settings.fuelgauge.batterytip.detectors.LowBatteryDetector; @@ -33,6 +32,7 @@ import com.android.settings.fuelgauge.batterytip.detectors.SummaryDetector; import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; import com.android.settings.fuelgauge.batterytip.tips.LowBatteryTip; import com.android.settings.fuelgauge.batterytip.tips.SummaryTip; +import com.android.settingslib.fuelgauge.EstimateKt; import com.android.settingslib.utils.AsyncLoaderCompat; import java.util.ArrayList; @@ -87,7 +87,7 @@ public class BatteryTipLoader extends AsyncLoaderCompat> { private List getFakeData() { final List tips = new ArrayList<>(); tips.add(new SummaryTip(BatteryTip.StateType.NEW, - Estimate.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN)); + EstimateKt.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN)); tips.add(new LowBatteryTip(BatteryTip.StateType.NEW, false /* powerSaveModeOn */, "Fake data")); diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceController.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceController.java index b0dc926e0a4..d615db6db19 100644 --- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceController.java +++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceController.java @@ -26,13 +26,13 @@ import androidx.preference.PreferenceScreen; import com.android.settings.SettingsActivity; import com.android.settings.core.BasePreferenceController; import com.android.settings.core.InstrumentedPreferenceFragment; -import com.android.settings.fuelgauge.Estimate; import com.android.settings.fuelgauge.batterytip.actions.BatteryTipAction; import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; import com.android.settings.fuelgauge.batterytip.tips.SummaryTip; import com.android.settings.overlay.FeatureFactory; import com.android.settings.widget.CardPreference; import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; +import com.android.settingslib.fuelgauge.EstimateKt; import java.util.HashMap; import java.util.List; @@ -93,7 +93,7 @@ public class BatteryTipPreferenceController extends BasePreferenceController { // Add summary tip in advance to avoid UI flakiness final SummaryTip summaryTip = new SummaryTip(BatteryTip.StateType.NEW, - Estimate.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN); + EstimateKt.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN); summaryTip.updatePreference(mCardPreference); } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java index d5e0ed88177..6b917f0bf46 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryInfoTest.java @@ -41,6 +41,7 @@ import com.android.settings.testutils.BatteryTestUtils; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.widget.UsageView; import com.android.settingslib.R; +import com.android.settingslib.fuelgauge.Estimate; import org.junit.Before; import org.junit.Test; diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java index e91190224e1..df9a194f4e5 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipDialogFragmentTest.java @@ -28,7 +28,6 @@ import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.FragmentActivity; import com.android.settings.R; -import com.android.settings.fuelgauge.Estimate; import com.android.settings.fuelgauge.batterytip.tips.BatteryTip; import com.android.settings.fuelgauge.batterytip.tips.HighUsageTip; import com.android.settings.fuelgauge.batterytip.tips.RestrictAppTip; @@ -37,6 +36,7 @@ import com.android.settings.fuelgauge.batterytip.tips.UnrestrictAppTip; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; import com.android.settings.testutils.shadow.ShadowUtils; +import com.android.settingslib.fuelgauge.EstimateKt; import org.junit.Before; import org.junit.Test; @@ -96,7 +96,7 @@ public class BatteryTipDialogFragmentTest { mUnrestrictAppTip = new UnrestrictAppTip(BatteryTip.StateType.NEW, mAppInfo); mSummaryTip = spy(new SummaryTip(BatteryTip.StateType.NEW, - Estimate.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN)); + EstimateKt.AVERAGE_TIME_TO_DISCHARGE_UNKNOWN)); } @Test From ef2e91913b1ea7f6e28899cbe3956284b92fc49c Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Fri, 19 Apr 2019 13:23:29 -0700 Subject: [PATCH 14/16] Add @Ignore for all failing tests. Bug: 130896210 Bug: 130896218 Bug: 130896701 Bug: 130897882 Bug: 130897305 Bug: 130897640 Bug: 130896049 Test: robo Change-Id: I77143d504501b358c2103aa736cd2aad13ed4c5c --- .../CrossProfileCalendarPreferenceControllerTest.java | 2 ++ .../settings/core/codeinspection/CodeInspectionTest.java | 2 ++ .../display/AdaptiveSleepPreferenceControllerTest.java | 2 ++ .../settings/display/DarkUIInfoDialogFragmentTest.java | 2 ++ .../fuelgauge/BatteryHeaderPreferenceControllerTest.java | 3 +++ .../src/com/android/settings/panel/PanelFragmentTest.java | 4 ++++ .../com/android/settings/panel/SettingsPanelActivityTest.java | 2 ++ .../src/com/android/settings/panel/VolumePanelTest.java | 2 ++ .../wifi/details/WifiDetailPreferenceControllerTest.java | 2 ++ 9 files changed, 21 insertions(+) diff --git a/tests/robotests/src/com/android/settings/accounts/CrossProfileCalendarPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accounts/CrossProfileCalendarPreferenceControllerTest.java index 2cbed9782e6..7c6077440e6 100644 --- a/tests/robotests/src/com/android/settings/accounts/CrossProfileCalendarPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/accounts/CrossProfileCalendarPreferenceControllerTest.java @@ -40,6 +40,7 @@ import android.util.ArraySet; import com.android.settingslib.RestrictedSwitchPreference; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -91,6 +92,7 @@ public class CrossProfileCalendarPreferenceControllerTest { } @Test + @Ignore("b/130896049") public void getAvailabilityStatus_hasManagedUser_AVAILABLE() { mController.setManagedUser(mManagedUser); assertThat(mController.getAvailabilityStatus()) diff --git a/tests/robotests/src/com/android/settings/core/codeinspection/CodeInspectionTest.java b/tests/robotests/src/com/android/settings/core/codeinspection/CodeInspectionTest.java index 4062bfb8f6a..5fdadb48662 100644 --- a/tests/robotests/src/com/android/settings/core/codeinspection/CodeInspectionTest.java +++ b/tests/robotests/src/com/android/settings/core/codeinspection/CodeInspectionTest.java @@ -24,6 +24,7 @@ import com.android.settings.search.SearchIndexProviderCodeInspector; import com.android.settings.slices.SliceControllerInXmlCodeInspector; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @@ -46,6 +47,7 @@ public class CodeInspectionTest { } @Test + @Ignore("b/130897640") public void runInstrumentableFragmentCodeInspection() { new InstrumentableFragmentCodeInspector(mClasses).run(); } diff --git a/tests/robotests/src/com/android/settings/display/AdaptiveSleepPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/display/AdaptiveSleepPreferenceControllerTest.java index 9adb1ad2861..89388730742 100644 --- a/tests/robotests/src/com/android/settings/display/AdaptiveSleepPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/display/AdaptiveSleepPreferenceControllerTest.java @@ -32,6 +32,7 @@ import com.android.settings.R; import com.android.settingslib.RestrictedPreference; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -40,6 +41,7 @@ import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; @RunWith(RobolectricTestRunner.class) +@Ignore("b/130897305") public class AdaptiveSleepPreferenceControllerTest { private static final String PREFERENCE_KEY = "adaptive_sleep"; diff --git a/tests/robotests/src/com/android/settings/display/DarkUIInfoDialogFragmentTest.java b/tests/robotests/src/com/android/settings/display/DarkUIInfoDialogFragmentTest.java index 7a8bdedd63e..0e1c2f6f068 100644 --- a/tests/robotests/src/com/android/settings/display/DarkUIInfoDialogFragmentTest.java +++ b/tests/robotests/src/com/android/settings/display/DarkUIInfoDialogFragmentTest.java @@ -28,6 +28,7 @@ import android.content.DialogInterface; import android.content.SharedPreferences; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -49,6 +50,7 @@ public class DarkUIInfoDialogFragmentTest { } @Test + @@Ignore("b/130897882") public void dialogDismissedOnConfirmation() { doReturn(RuntimeEnvironment.application).when(mFragment).getContext(); SharedPreferences prefs = RuntimeEnvironment.application.getSharedPreferences( diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java index 5be72744f5c..97ea75fdaaa 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java @@ -50,6 +50,7 @@ import com.android.settingslib.widget.LayoutPreference; import org.junit.After; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -135,6 +136,7 @@ public class BatteryHeaderPreferenceControllerTest { } @Test + @Ignore("b/130896701") public void displayPreference_displayBatteryLevel() { mController.displayPreference(mPreferenceScreen); @@ -188,6 +190,7 @@ public class BatteryHeaderPreferenceControllerTest { } @Test + @Ignore("b/130896701") public void quickUpdateHeaderPreference_onlyUpdateBatteryLevelAndChargingState() { mSummary.setText(BATTERY_STATUS); mSummary2.setText(BATTERY_STATUS); diff --git a/tests/robotests/src/com/android/settings/panel/PanelFragmentTest.java b/tests/robotests/src/com/android/settings/panel/PanelFragmentTest.java index fd2e806be77..793b44d5ba2 100644 --- a/tests/robotests/src/com/android/settings/panel/PanelFragmentTest.java +++ b/tests/robotests/src/com/android/settings/panel/PanelFragmentTest.java @@ -36,6 +36,7 @@ import com.android.settings.R; import com.android.settings.testutils.FakeFeatureFactory; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @@ -105,6 +106,7 @@ public class PanelFragmentTest { } @Test + @Ignore("b/130896218") public void onDestroy_logCloseEvent() { mPanelFragment.onDestroy(); verify(mFakeFeatureFactory.metricsFeatureProvider).action( @@ -115,6 +117,7 @@ public class PanelFragmentTest { 0); } @Test + @Ignore("b/130896218") public void panelSeeMoreClick_logsCloseEvent() { final View.OnClickListener listener = mPanelFragment.getSeeMoreListener(); @@ -130,6 +133,7 @@ public class PanelFragmentTest { } @Test + @Ignore("b/130896218") public void panelDoneClick_logsCloseEvent() { final View.OnClickListener listener = mPanelFragment.getCloseListener(); diff --git a/tests/robotests/src/com/android/settings/panel/SettingsPanelActivityTest.java b/tests/robotests/src/com/android/settings/panel/SettingsPanelActivityTest.java index fa15aa02b1d..4ca6395400a 100644 --- a/tests/robotests/src/com/android/settings/panel/SettingsPanelActivityTest.java +++ b/tests/robotests/src/com/android/settings/panel/SettingsPanelActivityTest.java @@ -35,6 +35,7 @@ import android.view.MotionEvent; import com.android.settings.testutils.FakeFeatureFactory; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.Robolectric; @@ -89,6 +90,7 @@ public class SettingsPanelActivityTest { } @Test + @Ignore("b/130896218") public void onTouchEvent_outsideAction_logsPanelClosed() { final MotionEvent event = mock(MotionEvent.class); when(event.getAction()).thenReturn(MotionEvent.ACTION_OUTSIDE); diff --git a/tests/robotests/src/com/android/settings/panel/VolumePanelTest.java b/tests/robotests/src/com/android/settings/panel/VolumePanelTest.java index 11de7b31b60..154428de679 100644 --- a/tests/robotests/src/com/android/settings/panel/VolumePanelTest.java +++ b/tests/robotests/src/com/android/settings/panel/VolumePanelTest.java @@ -23,6 +23,7 @@ import android.net.Uri; import com.android.settings.slices.CustomSliceRegistry; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; @@ -41,6 +42,7 @@ public class VolumePanelTest { } @Test + @Ignore("b/130896218") public void getSlices_containsNecessarySlices() { final List uris = mPanel.getSlices(); diff --git a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java index 2acfc4a3a97..906c55c39f2 100644 --- a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java @@ -83,6 +83,7 @@ import com.android.settingslib.wifi.WifiTracker; import com.android.settingslib.wifi.WifiTrackerFactory; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Answers; @@ -105,6 +106,7 @@ import java.util.stream.Collectors; @RunWith(RobolectricTestRunner.class) @Config(shadows = {ShadowDevicePolicyManager.class, ShadowEntityHeaderController.class}) +@Ignore("b/130896210") public class WifiDetailPreferenceControllerTest { private static final int LEVEL = 1; From 5d705839f2c2bf2d0deade546bb89c0f583fbcd8 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Fri, 19 Apr 2019 13:31:36 -0700 Subject: [PATCH 15/16] Fix typo Bug: 130897882 Test: rebuild Change-Id: I066b69634214cd25c4acbd173e8fe82cd73d4e97 --- .../android/settings/display/DarkUIInfoDialogFragmentTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/robotests/src/com/android/settings/display/DarkUIInfoDialogFragmentTest.java b/tests/robotests/src/com/android/settings/display/DarkUIInfoDialogFragmentTest.java index 0e1c2f6f068..87284ede402 100644 --- a/tests/robotests/src/com/android/settings/display/DarkUIInfoDialogFragmentTest.java +++ b/tests/robotests/src/com/android/settings/display/DarkUIInfoDialogFragmentTest.java @@ -50,7 +50,7 @@ public class DarkUIInfoDialogFragmentTest { } @Test - @@Ignore("b/130897882") + @Ignore("b/130897882") public void dialogDismissedOnConfirmation() { doReturn(RuntimeEnvironment.application).when(mFragment).getContext(); SharedPreferences prefs = RuntimeEnvironment.application.getSharedPreferences( From 2632f45010ab74516bbe1c3b384de60f9da3bf27 Mon Sep 17 00:00:00 2001 From: Lei Yu Date: Fri, 19 Apr 2019 13:36:31 -0700 Subject: [PATCH 16/16] Fix battery robo test Fixes: 130896701 Test: RunSettingsRoboTests Change-Id: Iffb7874250335db81181b23f96fe7b50a2dd0062 --- src/com/android/settings/fuelgauge/BatteryMeterView.java | 2 +- .../fuelgauge/BatteryHeaderPreferenceControllerTest.java | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/com/android/settings/fuelgauge/BatteryMeterView.java b/src/com/android/settings/fuelgauge/BatteryMeterView.java index 44855087170..27923ef7efd 100644 --- a/src/com/android/settings/fuelgauge/BatteryMeterView.java +++ b/src/com/android/settings/fuelgauge/BatteryMeterView.java @@ -82,7 +82,7 @@ public class BatteryMeterView extends ImageView { } public int getBatteryLevel() { - return mDrawable.getLevel(); + return mDrawable.getBatteryLevel(); } public void setCharging(boolean charging) { diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java index 97ea75fdaaa..5be72744f5c 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryHeaderPreferenceControllerTest.java @@ -50,7 +50,6 @@ import com.android.settingslib.widget.LayoutPreference; import org.junit.After; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -136,7 +135,6 @@ public class BatteryHeaderPreferenceControllerTest { } @Test - @Ignore("b/130896701") public void displayPreference_displayBatteryLevel() { mController.displayPreference(mPreferenceScreen); @@ -190,7 +188,6 @@ public class BatteryHeaderPreferenceControllerTest { } @Test - @Ignore("b/130896701") public void quickUpdateHeaderPreference_onlyUpdateBatteryLevelAndChargingState() { mSummary.setText(BATTERY_STATUS); mSummary2.setText(BATTERY_STATUS);